summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMinteck <contact@minteck.org>2022-11-28 17:33:21 +0100
committerMinteck <contact@minteck.org>2022-11-28 17:33:21 +0100
commit6767b88a5206c5e730190c798b59e1cad6d82ef6 (patch)
tree321bcc97ea0f3214d1f9f9d71d33d995cc4a1f9f
downloadmistyos-installer-6767b88a5206c5e730190c798b59e1cad6d82ef6.tar.gz
mistyos-installer-6767b88a5206c5e730190c798b59e1cad6d82ef6.tar.bz2
mistyos-installer-6767b88a5206c5e730190c798b59e1cad6d82ef6.zip
Initial commitHEADmane
-rw-r--r--.idea/.gitignore8
-rw-r--r--.idea/deployment.xml15
-rw-r--r--.idea/jsLibraryMappings.xml6
-rw-r--r--.idea/mistyos-installer.iml12
-rw-r--r--.idea/modules.xml8
-rw-r--r--assets/Credits.rtf8
-rw-r--r--assets/languages27
-rw-r--r--assets/mistyos-logo.svg3227
-rw-r--r--assets/wallpaper.pngbin0 -> 691646 bytes
-rw-r--r--colors.js21
-rw-r--r--colors.sh28
-rwxr-xr-xhelpers/localegen.js25
-rw-r--r--index.js46
-rw-r--r--installer/install.js613
-rw-r--r--lang/en-it.json718
-rw-r--r--lang/fr.json718
-rw-r--r--locales/keymaps.json146
-rwxr-xr-xlocales/locales.json354
-rwxr-xr-xlocales/timezones.json531
-rw-r--r--modules/banner.js17
-rw-r--r--modules/size.js47
l---------node_modules/.bin/systeminformation1
l---------node_modules/.bin/wifi1
-rw-r--r--node_modules/.package-lock.json432
-rw-r--r--node_modules/ansi-styles/index.d.ts345
-rw-r--r--node_modules/ansi-styles/index.js163
-rw-r--r--node_modules/ansi-styles/license9
-rw-r--r--node_modules/ansi-styles/package.json56
-rw-r--r--node_modules/ansi-styles/readme.md152
-rw-r--r--node_modules/array-back/LICENSE21
-rw-r--r--node_modules/array-back/README.hbs40
-rw-r--r--node_modules/array-back/README.md81
-rw-r--r--node_modules/array-back/dist/index.js70
-rw-r--r--node_modules/array-back/index.mjs62
-rw-r--r--node_modules/array-back/package.json46
-rw-r--r--node_modules/asynckit/LICENSE21
-rw-r--r--node_modules/asynckit/README.md233
-rw-r--r--node_modules/asynckit/bench.js76
-rw-r--r--node_modules/asynckit/index.js6
-rw-r--r--node_modules/asynckit/lib/abort.js29
-rw-r--r--node_modules/asynckit/lib/async.js34
-rw-r--r--node_modules/asynckit/lib/defer.js26
-rw-r--r--node_modules/asynckit/lib/iterate.js75
-rw-r--r--node_modules/asynckit/lib/readable_asynckit.js91
-rw-r--r--node_modules/asynckit/lib/readable_parallel.js25
-rw-r--r--node_modules/asynckit/lib/readable_serial.js25
-rw-r--r--node_modules/asynckit/lib/readable_serial_ordered.js29
-rw-r--r--node_modules/asynckit/lib/state.js37
-rw-r--r--node_modules/asynckit/lib/streamify.js141
-rw-r--r--node_modules/asynckit/lib/terminator.js29
-rw-r--r--node_modules/asynckit/package.json63
-rw-r--r--node_modules/asynckit/parallel.js43
-rw-r--r--node_modules/asynckit/serial.js17
-rw-r--r--node_modules/asynckit/serialOrdered.js75
-rw-r--r--node_modules/asynckit/stream.js21
-rw-r--r--node_modules/axios/CHANGELOG.md255
-rw-r--r--node_modules/axios/LICENSE7
-rw-r--r--node_modules/axios/README.md1274
-rw-r--r--node_modules/axios/SECURITY.md6
-rw-r--r--node_modules/axios/UPGRADE_GUIDE.md3
-rw-r--r--node_modules/axios/bin/ssl_hotfix.js22
-rw-r--r--node_modules/axios/dist/axios.js2658
-rw-r--r--node_modules/axios/dist/axios.js.map1
-rw-r--r--node_modules/axios/dist/axios.min.js2
-rw-r--r--node_modules/axios/dist/axios.min.js.map1
-rw-r--r--node_modules/axios/dist/esm/axios.js2950
-rw-r--r--node_modules/axios/dist/esm/axios.js.map1
-rw-r--r--node_modules/axios/dist/esm/axios.min.js2
-rw-r--r--node_modules/axios/dist/esm/axios.min.js.map1
-rw-r--r--node_modules/axios/dist/node/axios.cjs3764
-rw-r--r--node_modules/axios/dist/node/axios.cjs.map1
-rw-r--r--node_modules/axios/gulpfile.js88
-rw-r--r--node_modules/axios/index.d.ts483
-rw-r--r--node_modules/axios/index.js32
-rw-r--r--node_modules/axios/karma.conf.cjs250
-rw-r--r--node_modules/axios/lib/adapters/README.md37
-rwxr-xr-xnode_modules/axios/lib/adapters/http.js591
-rw-r--r--node_modules/axios/lib/adapters/index.js33
-rw-r--r--node_modules/axios/lib/adapters/xhr.js246
-rw-r--r--node_modules/axios/lib/axios.js76
-rw-r--r--node_modules/axios/lib/cancel/CancelToken.js121
-rw-r--r--node_modules/axios/lib/cancel/CanceledError.js25
-rw-r--r--node_modules/axios/lib/cancel/isCancel.js5
-rw-r--r--node_modules/axios/lib/core/Axios.js195
-rw-r--r--node_modules/axios/lib/core/AxiosError.js100
-rw-r--r--node_modules/axios/lib/core/AxiosHeaders.js268
-rw-r--r--node_modules/axios/lib/core/InterceptorManager.js71
-rw-r--r--node_modules/axios/lib/core/README.md8
-rw-r--r--node_modules/axios/lib/core/buildFullPath.js21
-rw-r--r--node_modules/axios/lib/core/dispatchRequest.js76
-rw-r--r--node_modules/axios/lib/core/mergeConfig.js101
-rw-r--r--node_modules/axios/lib/core/settle.js27
-rw-r--r--node_modules/axios/lib/core/transformData.js28
-rw-r--r--node_modules/axios/lib/defaults/index.js185
-rw-r--r--node_modules/axios/lib/defaults/transitional.js7
-rw-r--r--node_modules/axios/lib/env/README.md3
-rw-r--r--node_modules/axios/lib/env/classes/FormData.js2
-rw-r--r--node_modules/axios/lib/env/data.js1
-rw-r--r--node_modules/axios/lib/helpers/AxiosTransformStream.js191
-rw-r--r--node_modules/axios/lib/helpers/AxiosURLSearchParams.js58
-rw-r--r--node_modules/axios/lib/helpers/README.md7
-rw-r--r--node_modules/axios/lib/helpers/bind.js7
-rw-r--r--node_modules/axios/lib/helpers/buildURL.js63
-rw-r--r--node_modules/axios/lib/helpers/combineURLs.js15
-rw-r--r--node_modules/axios/lib/helpers/cookies.js52
-rw-r--r--node_modules/axios/lib/helpers/deprecatedMethod.js26
-rw-r--r--node_modules/axios/lib/helpers/formDataToJSON.js92
-rw-r--r--node_modules/axios/lib/helpers/fromDataURI.js53
-rw-r--r--node_modules/axios/lib/helpers/isAbsoluteURL.js15
-rw-r--r--node_modules/axios/lib/helpers/isAxiosError.js14
-rw-r--r--node_modules/axios/lib/helpers/isURLSameOrigin.js67
-rw-r--r--node_modules/axios/lib/helpers/null.js2
-rw-r--r--node_modules/axios/lib/helpers/parseHeaders.js55
-rw-r--r--node_modules/axios/lib/helpers/parseProtocol.js6
-rw-r--r--node_modules/axios/lib/helpers/speedometer.js55
-rw-r--r--node_modules/axios/lib/helpers/spread.js28
-rw-r--r--node_modules/axios/lib/helpers/throttle.js33
-rw-r--r--node_modules/axios/lib/helpers/toFormData.js229
-rw-r--r--node_modules/axios/lib/helpers/toURLEncodedForm.js18
-rw-r--r--node_modules/axios/lib/helpers/validator.js91
-rw-r--r--node_modules/axios/lib/platform/browser/classes/FormData.js3
-rw-r--r--node_modules/axios/lib/platform/browser/classes/URLSearchParams.js4
-rw-r--r--node_modules/axios/lib/platform/browser/index.js43
-rw-r--r--node_modules/axios/lib/platform/index.js3
-rw-r--r--node_modules/axios/lib/platform/node/classes/FormData.js3
-rw-r--r--node_modules/axios/lib/platform/node/classes/URLSearchParams.js4
-rw-r--r--node_modules/axios/lib/platform/node/index.js12
-rw-r--r--node_modules/axios/lib/utils.js613
-rw-r--r--node_modules/axios/package.json134
-rw-r--r--node_modules/axios/rollup.config.js90
-rw-r--r--node_modules/axios/tsconfig.json14
-rw-r--r--node_modules/axios/tslint.json6
-rw-r--r--node_modules/chalk/index.d.ts415
-rw-r--r--node_modules/chalk/license9
-rw-r--r--node_modules/chalk/package.json68
-rw-r--r--node_modules/chalk/readme.md341
-rw-r--r--node_modules/chalk/source/index.js229
-rw-r--r--node_modules/chalk/source/templates.js134
-rw-r--r--node_modules/chalk/source/util.js39
-rw-r--r--node_modules/color-convert/CHANGELOG.md54
-rw-r--r--node_modules/color-convert/LICENSE21
-rw-r--r--node_modules/color-convert/README.md68
-rw-r--r--node_modules/color-convert/conversions.js839
-rw-r--r--node_modules/color-convert/index.js81
-rw-r--r--node_modules/color-convert/package.json48
-rw-r--r--node_modules/color-convert/route.js97
-rw-r--r--node_modules/color-name/LICENSE8
-rw-r--r--node_modules/color-name/README.md11
-rw-r--r--node_modules/color-name/index.js152
-rw-r--r--node_modules/color-name/package.json28
-rw-r--r--node_modules/combined-stream/License19
-rw-r--r--node_modules/combined-stream/Readme.md138
-rw-r--r--node_modules/combined-stream/lib/combined_stream.js208
-rw-r--r--node_modules/combined-stream/package.json25
-rw-r--r--node_modules/combined-stream/yarn.lock17
-rw-r--r--node_modules/command-line-args/LICENSE21
-rw-r--r--node_modules/command-line-args/README.md105
-rw-r--r--node_modules/command-line-args/dist/index.js1399
-rw-r--r--node_modules/command-line-args/dist/index.mjs1395
-rw-r--r--node_modules/command-line-args/index.mjs86
-rw-r--r--node_modules/command-line-args/lib/argv-parser.mjs139
-rw-r--r--node_modules/command-line-args/lib/argv-tools.mjs173
-rw-r--r--node_modules/command-line-args/lib/option-definition.mjs265
-rw-r--r--node_modules/command-line-args/lib/option-definitions.mjs187
-rw-r--r--node_modules/command-line-args/lib/option-flag.mjs13
-rw-r--r--node_modules/command-line-args/lib/option.mjs92
-rw-r--r--node_modules/command-line-args/lib/output-grouped.mjs40
-rw-r--r--node_modules/command-line-args/lib/output.mjs38
-rw-r--r--node_modules/command-line-args/package.json58
-rw-r--r--node_modules/command-line-usage/LICENSE21
-rw-r--r--node_modules/command-line-usage/README.md120
-rw-r--r--node_modules/command-line-usage/index.js30
-rw-r--r--node_modules/command-line-usage/lib/chalk-format.js11
-rw-r--r--node_modules/command-line-usage/lib/section.js29
-rw-r--r--node_modules/command-line-usage/lib/section/content.js154
-rw-r--r--node_modules/command-line-usage/lib/section/option-list.js128
-rw-r--r--node_modules/command-line-usage/node_modules/ansi-styles/index.js165
-rw-r--r--node_modules/command-line-usage/node_modules/ansi-styles/license9
-rw-r--r--node_modules/command-line-usage/node_modules/ansi-styles/package.json56
-rw-r--r--node_modules/command-line-usage/node_modules/ansi-styles/readme.md147
-rw-r--r--node_modules/command-line-usage/node_modules/array-back/LICENSE21
-rw-r--r--node_modules/command-line-usage/node_modules/array-back/README.hbs40
-rw-r--r--node_modules/command-line-usage/node_modules/array-back/README.md81
-rw-r--r--node_modules/command-line-usage/node_modules/array-back/dist/index.js70
-rw-r--r--node_modules/command-line-usage/node_modules/array-back/index.mjs62
-rw-r--r--node_modules/command-line-usage/node_modules/array-back/package.json46
-rw-r--r--node_modules/command-line-usage/node_modules/chalk/index.js228
-rw-r--r--node_modules/command-line-usage/node_modules/chalk/index.js.flow93
-rw-r--r--node_modules/command-line-usage/node_modules/chalk/license9
-rw-r--r--node_modules/command-line-usage/node_modules/chalk/package.json71
-rw-r--r--node_modules/command-line-usage/node_modules/chalk/readme.md314
-rw-r--r--node_modules/command-line-usage/node_modules/chalk/templates.js128
-rw-r--r--node_modules/command-line-usage/node_modules/chalk/types/index.d.ts97
-rw-r--r--node_modules/command-line-usage/node_modules/color-convert/CHANGELOG.md54
-rw-r--r--node_modules/command-line-usage/node_modules/color-convert/LICENSE21
-rw-r--r--node_modules/command-line-usage/node_modules/color-convert/README.md68
-rw-r--r--node_modules/command-line-usage/node_modules/color-convert/conversions.js868
-rw-r--r--node_modules/command-line-usage/node_modules/color-convert/index.js78
-rw-r--r--node_modules/command-line-usage/node_modules/color-convert/package.json46
-rw-r--r--node_modules/command-line-usage/node_modules/color-convert/route.js97
-rw-r--r--node_modules/command-line-usage/node_modules/color-name/.eslintrc.json43
-rw-r--r--node_modules/command-line-usage/node_modules/color-name/.npmignore107
-rw-r--r--node_modules/command-line-usage/node_modules/color-name/LICENSE8
-rw-r--r--node_modules/command-line-usage/node_modules/color-name/README.md11
-rw-r--r--node_modules/command-line-usage/node_modules/color-name/index.js152
-rw-r--r--node_modules/command-line-usage/node_modules/color-name/package.json25
-rw-r--r--node_modules/command-line-usage/node_modules/color-name/test.js7
-rw-r--r--node_modules/command-line-usage/node_modules/has-flag/index.js8
-rw-r--r--node_modules/command-line-usage/node_modules/has-flag/license9
-rw-r--r--node_modules/command-line-usage/node_modules/has-flag/package.json44
-rw-r--r--node_modules/command-line-usage/node_modules/has-flag/readme.md70
-rw-r--r--node_modules/command-line-usage/node_modules/supports-color/browser.js5
-rw-r--r--node_modules/command-line-usage/node_modules/supports-color/index.js131
-rw-r--r--node_modules/command-line-usage/node_modules/supports-color/license9
-rw-r--r--node_modules/command-line-usage/node_modules/supports-color/package.json53
-rw-r--r--node_modules/command-line-usage/node_modules/supports-color/readme.md66
-rw-r--r--node_modules/command-line-usage/node_modules/typical/LICENSE22
-rw-r--r--node_modules/command-line-usage/node_modules/typical/README.hbs40
-rw-r--r--node_modules/command-line-usage/node_modules/typical/README.md302
-rw-r--r--node_modules/command-line-usage/node_modules/typical/dist/index.js295
-rw-r--r--node_modules/command-line-usage/node_modules/typical/index.mjs269
-rw-r--r--node_modules/command-line-usage/node_modules/typical/package.json63
-rw-r--r--node_modules/command-line-usage/package.json41
-rw-r--r--node_modules/deep-extend/CHANGELOG.md46
-rw-r--r--node_modules/deep-extend/LICENSE20
-rw-r--r--node_modules/deep-extend/README.md91
-rw-r--r--node_modules/deep-extend/index.js1
-rw-r--r--node_modules/deep-extend/lib/deep-extend.js150
-rw-r--r--node_modules/deep-extend/package.json62
-rw-r--r--node_modules/delayed-stream/.npmignore1
-rw-r--r--node_modules/delayed-stream/License19
-rw-r--r--node_modules/delayed-stream/Makefile7
-rw-r--r--node_modules/delayed-stream/Readme.md141
-rw-r--r--node_modules/delayed-stream/lib/delayed_stream.js107
-rw-r--r--node_modules/delayed-stream/package.json27
-rw-r--r--node_modules/escape-string-regexp/index.js11
-rw-r--r--node_modules/escape-string-regexp/license21
-rw-r--r--node_modules/escape-string-regexp/package.json41
-rw-r--r--node_modules/escape-string-regexp/readme.md27
-rw-r--r--node_modules/find-replace/LICENSE21
-rw-r--r--node_modules/find-replace/README.hbs11
-rw-r--r--node_modules/find-replace/README.md43
-rw-r--r--node_modules/find-replace/dist/index.js124
-rw-r--r--node_modules/find-replace/dist/index.mjs116
-rw-r--r--node_modules/find-replace/index.mjs62
-rw-r--r--node_modules/find-replace/package.json36
-rw-r--r--node_modules/follow-redirects/LICENSE18
-rw-r--r--node_modules/follow-redirects/README.md155
-rw-r--r--node_modules/follow-redirects/debug.js15
-rw-r--r--node_modules/follow-redirects/http.js1
-rw-r--r--node_modules/follow-redirects/https.js1
-rw-r--r--node_modules/follow-redirects/index.js621
-rw-r--r--node_modules/follow-redirects/package.json59
-rw-r--r--node_modules/form-data/License19
-rw-r--r--node_modules/form-data/README.md.bak358
-rw-r--r--node_modules/form-data/Readme.md358
-rw-r--r--node_modules/form-data/index.d.ts62
-rw-r--r--node_modules/form-data/lib/browser.js2
-rw-r--r--node_modules/form-data/lib/form_data.js501
-rw-r--r--node_modules/form-data/lib/populate.js10
-rw-r--r--node_modules/form-data/package.json68
-rw-r--r--node_modules/has-flag/index.d.ts39
-rw-r--r--node_modules/has-flag/index.js8
-rw-r--r--node_modules/has-flag/license9
-rw-r--r--node_modules/has-flag/package.json46
-rw-r--r--node_modules/has-flag/readme.md89
-rw-r--r--node_modules/kleur/index.js104
-rw-r--r--node_modules/kleur/kleur.d.ts45
-rw-r--r--node_modules/kleur/license21
-rw-r--r--node_modules/kleur/package.json35
-rw-r--r--node_modules/kleur/readme.md172
-rw-r--r--node_modules/lodash.camelcase/LICENSE47
-rw-r--r--node_modules/lodash.camelcase/README.md18
-rw-r--r--node_modules/lodash.camelcase/index.js599
-rw-r--r--node_modules/lodash.camelcase/package.json17
-rw-r--r--node_modules/mime-db/HISTORY.md507
-rw-r--r--node_modules/mime-db/LICENSE23
-rw-r--r--node_modules/mime-db/README.md100
-rw-r--r--node_modules/mime-db/db.json8519
-rw-r--r--node_modules/mime-db/index.js12
-rw-r--r--node_modules/mime-db/package.json60
-rw-r--r--node_modules/mime-types/HISTORY.md397
-rw-r--r--node_modules/mime-types/LICENSE23
-rw-r--r--node_modules/mime-types/README.md113
-rw-r--r--node_modules/mime-types/index.js188
-rw-r--r--node_modules/mime-types/package.json44
-rw-r--r--node_modules/node-wifi/.eslintrc.json7
-rw-r--r--node_modules/node-wifi/.prettierignore1
-rw-r--r--node_modules/node-wifi/.prettierrc.json7
-rw-r--r--node_modules/node-wifi/CHANGELOG.md145
-rw-r--r--node_modules/node-wifi/CONTRIBUTING.md99
-rw-r--r--node_modules/node-wifi/LICENSE21
-rw-r--r--node_modules/node-wifi/README.md196
-rw-r--r--node_modules/node-wifi/bin/help.js78
-rwxr-xr-xnode_modules/node-wifi/bin/wifi.js128
-rw-r--r--node_modules/node-wifi/package.json57
-rw-r--r--node_modules/node-wifi/src/__test__/unlogger.js12
-rw-r--r--node_modules/node-wifi/src/env.js5
-rw-r--r--node_modules/node-wifi/src/index.js52
-rw-r--r--node_modules/node-wifi/src/linux-connect.js45
-rw-r--r--node_modules/node-wifi/src/linux-current-connections.js75
-rw-r--r--node_modules/node-wifi/src/linux-delete.js33
-rw-r--r--node_modules/node-wifi/src/linux-disconnect.js34
-rw-r--r--node_modules/node-wifi/src/linux-scan.js9
-rw-r--r--node_modules/node-wifi/src/linux/__logs__/scan-01.log16
-rw-r--r--node_modules/node-wifi/src/linux/index.js3
-rw-r--r--node_modules/node-wifi/src/linux/scan/__logs__/scan-01.log16
-rw-r--r--node_modules/node-wifi/src/linux/scan/__test__/command.spec.js33
-rw-r--r--node_modules/node-wifi/src/linux/scan/__test__/parser.spec.js196
-rw-r--r--node_modules/node-wifi/src/linux/scan/command.js22
-rw-r--r--node_modules/node-wifi/src/linux/scan/index.js4
-rw-r--r--node_modules/node-wifi/src/linux/scan/parser.js51
-rw-r--r--node_modules/node-wifi/src/mac-connect.js8
-rw-r--r--node_modules/node-wifi/src/mac-current-connections.js9
-rw-r--r--node_modules/node-wifi/src/mac-delete.js9
-rw-r--r--node_modules/node-wifi/src/mac-scan.js9
-rw-r--r--node_modules/node-wifi/src/macOS/__logs__/current-connections-01.log17
-rw-r--r--node_modules/node-wifi/src/macOS/__logs__/delete-01.log3
-rw-r--r--node_modules/node-wifi/src/macOS/__logs__/scan-01.log6
-rw-r--r--node_modules/node-wifi/src/macOS/__logs__/scan-shifted.log7
-rw-r--r--node_modules/node-wifi/src/macOS/__logs__/scan-space.log5
-rw-r--r--node_modules/node-wifi/src/macOS/connect/__test__/command.spec.js23
-rw-r--r--node_modules/node-wifi/src/macOS/connect/command.js15
-rw-r--r--node_modules/node-wifi/src/macOS/connect/index.js3
-rw-r--r--node_modules/node-wifi/src/macOS/current-connections/__logs__/current-connections-01.log17
-rw-r--r--node_modules/node-wifi/src/macOS/current-connections/__test__/command.spec.js10
-rw-r--r--node_modules/node-wifi/src/macOS/current-connections/__test__/parser.spec.js27
-rw-r--r--node_modules/node-wifi/src/macOS/current-connections/command.js6
-rw-r--r--node_modules/node-wifi/src/macOS/current-connections/index.js4
-rw-r--r--node_modules/node-wifi/src/macOS/current-connections/parser.js61
-rw-r--r--node_modules/node-wifi/src/macOS/delete/__logs__/delete-01.log3
-rw-r--r--node_modules/node-wifi/src/macOS/delete/__test__/command.spec.js21
-rw-r--r--node_modules/node-wifi/src/macOS/delete/__test__/parser.spec.js15
-rw-r--r--node_modules/node-wifi/src/macOS/delete/command.js14
-rw-r--r--node_modules/node-wifi/src/macOS/delete/index.js3
-rw-r--r--node_modules/node-wifi/src/macOS/delete/parser.js10
-rw-r--r--node_modules/node-wifi/src/macOS/index.js6
-rw-r--r--node_modules/node-wifi/src/macOS/scan/__logs__/airport-xml-2.log3104
-rw-r--r--node_modules/node-wifi/src/macOS/scan/__logs__/scan-01.log6
-rw-r--r--node_modules/node-wifi/src/macOS/scan/__logs__/scan-monterey.log6
-rw-r--r--node_modules/node-wifi/src/macOS/scan/__logs__/scan-shifted.log7
-rw-r--r--node_modules/node-wifi/src/macOS/scan/__logs__/scan-space.log5
-rw-r--r--node_modules/node-wifi/src/macOS/scan/__test__/command.spec.js10
-rw-r--r--node_modules/node-wifi/src/macOS/scan/__test__/parser.spec.js208
-rw-r--r--node_modules/node-wifi/src/macOS/scan/command.js6
-rw-r--r--node_modules/node-wifi/src/macOS/scan/index.js4
-rw-r--r--node_modules/node-wifi/src/macOS/scan/parser.js73
-rw-r--r--node_modules/node-wifi/src/platform.js21
-rw-r--r--node_modules/node-wifi/src/utils/__test__/frequency-from-channel.spec.js11
-rw-r--r--node_modules/node-wifi/src/utils/__test__/percentage-db.spec.js13
-rw-r--r--node_modules/node-wifi/src/utils/__test__/promiser.spec.js66
-rw-r--r--node_modules/node-wifi/src/utils/executer.js13
-rw-r--r--node_modules/node-wifi/src/utils/frequency-from-channel.js40
-rw-r--r--node_modules/node-wifi/src/utils/network-utils.js54
-rw-r--r--node_modules/node-wifi/src/utils/percentage-db.js10
-rw-r--r--node_modules/node-wifi/src/utils/promiser.js33
-rw-r--r--node_modules/node-wifi/src/wifi.js94
-rw-r--r--node_modules/node-wifi/src/windows-connect.js136
-rw-r--r--node_modules/node-wifi/src/windows-current-connections.js89
-rw-r--r--node_modules/node-wifi/src/windows-disconnect.js31
-rw-r--r--node_modules/node-wifi/src/windows-scan.js100
-rw-r--r--node_modules/prompts/dist/dateparts/datepart.js39
-rw-r--r--node_modules/prompts/dist/dateparts/day.js35
-rw-r--r--node_modules/prompts/dist/dateparts/hours.js30
-rw-r--r--node_modules/prompts/dist/dateparts/index.js13
-rw-r--r--node_modules/prompts/dist/dateparts/meridiem.js25
-rw-r--r--node_modules/prompts/dist/dateparts/milliseconds.js28
-rw-r--r--node_modules/prompts/dist/dateparts/minutes.js29
-rw-r--r--node_modules/prompts/dist/dateparts/month.js31
-rw-r--r--node_modules/prompts/dist/dateparts/seconds.js29
-rw-r--r--node_modules/prompts/dist/dateparts/year.js29
-rw-r--r--node_modules/prompts/dist/elements/autocomplete.js285
-rw-r--r--node_modules/prompts/dist/elements/autocompleteMultiselect.js201
-rw-r--r--node_modules/prompts/dist/elements/confirm.js93
-rw-r--r--node_modules/prompts/dist/elements/date.js250
-rw-r--r--node_modules/prompts/dist/elements/index.js13
-rw-r--r--node_modules/prompts/dist/elements/multiselect.js289
-rw-r--r--node_modules/prompts/dist/elements/number.js250
-rw-r--r--node_modules/prompts/dist/elements/prompt.js82
-rw-r--r--node_modules/prompts/dist/elements/select.js190
-rw-r--r--node_modules/prompts/dist/elements/text.js245
-rw-r--r--node_modules/prompts/dist/elements/toggle.js124
-rw-r--r--node_modules/prompts/dist/index.js154
-rw-r--r--node_modules/prompts/dist/prompts.js222
-rw-r--r--node_modules/prompts/dist/util/action.js38
-rw-r--r--node_modules/prompts/dist/util/clear.js42
-rw-r--r--node_modules/prompts/dist/util/entriesToDisplay.js21
-rw-r--r--node_modules/prompts/dist/util/figures.js32
-rw-r--r--node_modules/prompts/dist/util/index.js12
-rw-r--r--node_modules/prompts/dist/util/lines.js14
-rw-r--r--node_modules/prompts/dist/util/strip.js7
-rw-r--r--node_modules/prompts/dist/util/style.js51
-rw-r--r--node_modules/prompts/dist/util/wrap.js16
-rw-r--r--node_modules/prompts/index.js14
-rw-r--r--node_modules/prompts/lib/dateparts/datepart.js35
-rw-r--r--node_modules/prompts/lib/dateparts/day.js42
-rw-r--r--node_modules/prompts/lib/dateparts/hours.js30
-rw-r--r--node_modules/prompts/lib/dateparts/index.js13
-rw-r--r--node_modules/prompts/lib/dateparts/meridiem.js24
-rw-r--r--node_modules/prompts/lib/dateparts/milliseconds.js28
-rw-r--r--node_modules/prompts/lib/dateparts/minutes.js28
-rw-r--r--node_modules/prompts/lib/dateparts/month.js33
-rw-r--r--node_modules/prompts/lib/dateparts/seconds.js28
-rw-r--r--node_modules/prompts/lib/dateparts/year.js28
-rw-r--r--node_modules/prompts/lib/elements/autocomplete.js264
-rw-r--r--node_modules/prompts/lib/elements/autocompleteMultiselect.js194
-rw-r--r--node_modules/prompts/lib/elements/confirm.js89
-rw-r--r--node_modules/prompts/lib/elements/date.js209
-rw-r--r--node_modules/prompts/lib/elements/index.js13
-rw-r--r--node_modules/prompts/lib/elements/multiselect.js271
-rw-r--r--node_modules/prompts/lib/elements/number.js213
-rw-r--r--node_modules/prompts/lib/elements/prompt.js68
-rw-r--r--node_modules/prompts/lib/elements/select.js175
-rw-r--r--node_modules/prompts/lib/elements/text.js208
-rw-r--r--node_modules/prompts/lib/elements/toggle.js118
-rw-r--r--node_modules/prompts/lib/index.js98
-rw-r--r--node_modules/prompts/lib/prompts.js206
-rw-r--r--node_modules/prompts/lib/util/action.js39
-rw-r--r--node_modules/prompts/lib/util/clear.js22
-rw-r--r--node_modules/prompts/lib/util/entriesToDisplay.js21
-rw-r--r--node_modules/prompts/lib/util/figures.js33
-rw-r--r--node_modules/prompts/lib/util/index.js12
-rw-r--r--node_modules/prompts/lib/util/lines.js15
-rw-r--r--node_modules/prompts/lib/util/strip.js11
-rw-r--r--node_modules/prompts/lib/util/style.js40
-rw-r--r--node_modules/prompts/lib/util/wrap.js27
-rw-r--r--node_modules/prompts/license21
-rw-r--r--node_modules/prompts/package.json53
-rwxr-xr-xnode_modules/prompts/readme.md882
-rw-r--r--node_modules/proxy-from-env/.eslintrc29
-rw-r--r--node_modules/proxy-from-env/.travis.yml10
-rw-r--r--node_modules/proxy-from-env/LICENSE20
-rw-r--r--node_modules/proxy-from-env/README.md131
-rw-r--r--node_modules/proxy-from-env/index.js108
-rw-r--r--node_modules/proxy-from-env/package.json34
-rw-r--r--node_modules/proxy-from-env/test.js483
-rw-r--r--node_modules/reduce-flatten/.travis.yml7
-rw-r--r--node_modules/reduce-flatten/LICENSE21
-rw-r--r--node_modules/reduce-flatten/README.hbs11
-rw-r--r--node_modules/reduce-flatten/README.md29
-rw-r--r--node_modules/reduce-flatten/index.js19
-rw-r--r--node_modules/reduce-flatten/package.json24
-rw-r--r--node_modules/reduce-flatten/test.js11
-rw-r--r--node_modules/sisteransi/license21
-rwxr-xr-xnode_modules/sisteransi/package.json34
-rwxr-xr-xnode_modules/sisteransi/readme.md113
-rw-r--r--node_modules/sisteransi/src/index.js58
-rw-r--r--node_modules/sisteransi/src/sisteransi.d.ts35
-rw-r--r--node_modules/supports-color/browser.js5
-rw-r--r--node_modules/supports-color/index.js135
-rw-r--r--node_modules/supports-color/license9
-rw-r--r--node_modules/supports-color/package.json53
-rw-r--r--node_modules/supports-color/readme.md76
-rw-r--r--node_modules/systeminformation/LICENSE20
-rw-r--r--node_modules/systeminformation/README.md1088
-rw-r--r--node_modules/systeminformation/lib/audio.js216
-rw-r--r--node_modules/systeminformation/lib/battery.js308
-rw-r--r--node_modules/systeminformation/lib/bluetooth.js229
-rwxr-xr-xnode_modules/systeminformation/lib/cli.js31
-rw-r--r--node_modules/systeminformation/lib/cpu.js1702
-rw-r--r--node_modules/systeminformation/lib/docker.js751
-rw-r--r--node_modules/systeminformation/lib/dockerSocket.js327
-rw-r--r--node_modules/systeminformation/lib/filesystem.js1301
-rw-r--r--node_modules/systeminformation/lib/graphics.js1066
-rw-r--r--node_modules/systeminformation/lib/index.d.ts996
-rw-r--r--node_modules/systeminformation/lib/index.js504
-rw-r--r--node_modules/systeminformation/lib/internet.js240
-rw-r--r--node_modules/systeminformation/lib/memory.js547
-rw-r--r--node_modules/systeminformation/lib/network.js1736
-rw-r--r--node_modules/systeminformation/lib/osinfo.js1154
-rw-r--r--node_modules/systeminformation/lib/printer.js210
-rw-r--r--node_modules/systeminformation/lib/processes.js1274
-rw-r--r--node_modules/systeminformation/lib/system.js831
-rw-r--r--node_modules/systeminformation/lib/usb.js258
-rw-r--r--node_modules/systeminformation/lib/users.js393
-rw-r--r--node_modules/systeminformation/lib/util.js1281
-rw-r--r--node_modules/systeminformation/lib/virtualbox.js107
-rw-r--r--node_modules/systeminformation/lib/wifi.js744
-rw-r--r--node_modules/systeminformation/package.json99
-rw-r--r--node_modules/table-layout/LICENSE21
-rw-r--r--node_modules/table-layout/README.hbs84
-rw-r--r--node_modules/table-layout/README.md154
-rw-r--r--node_modules/table-layout/index.js197
-rw-r--r--node_modules/table-layout/lib/ansi.js15
-rw-r--r--node_modules/table-layout/lib/cell.js28
-rw-r--r--node_modules/table-layout/lib/column.js67
-rw-r--r--node_modules/table-layout/lib/columns.js156
-rw-r--r--node_modules/table-layout/lib/padding.js14
-rw-r--r--node_modules/table-layout/lib/rows.js52
-rw-r--r--node_modules/table-layout/node_modules/array-back/LICENSE21
-rw-r--r--node_modules/table-layout/node_modules/array-back/README.hbs40
-rw-r--r--node_modules/table-layout/node_modules/array-back/README.md81
-rw-r--r--node_modules/table-layout/node_modules/array-back/dist/index.js70
-rw-r--r--node_modules/table-layout/node_modules/array-back/index.mjs62
-rw-r--r--node_modules/table-layout/node_modules/array-back/package.json46
-rw-r--r--node_modules/table-layout/node_modules/typical/LICENSE22
-rw-r--r--node_modules/table-layout/node_modules/typical/README.hbs40
-rw-r--r--node_modules/table-layout/node_modules/typical/README.md302
-rw-r--r--node_modules/table-layout/node_modules/typical/dist/index.js295
-rw-r--r--node_modules/table-layout/node_modules/typical/index.mjs269
-rw-r--r--node_modules/table-layout/node_modules/typical/package.json63
-rw-r--r--node_modules/table-layout/package.json41
-rw-r--r--node_modules/typical/LICENSE22
-rw-r--r--node_modules/typical/README.hbs40
-rw-r--r--node_modules/typical/README.md277
-rw-r--r--node_modules/typical/dist/index.js255
-rw-r--r--node_modules/typical/index.mjs245
-rw-r--r--node_modules/typical/package.json55
-rw-r--r--node_modules/wordwrapjs/LICENSE21
-rw-r--r--node_modules/wordwrapjs/README.hbs61
-rw-r--r--node_modules/wordwrapjs/README.md115
-rw-r--r--node_modules/wordwrapjs/index.js148
-rw-r--r--node_modules/wordwrapjs/node_modules/typical/LICENSE22
-rw-r--r--node_modules/wordwrapjs/node_modules/typical/README.hbs40
-rw-r--r--node_modules/wordwrapjs/node_modules/typical/README.md302
-rw-r--r--node_modules/wordwrapjs/node_modules/typical/dist/index.js295
-rw-r--r--node_modules/wordwrapjs/node_modules/typical/index.mjs269
-rw-r--r--node_modules/wordwrapjs/node_modules/typical/package.json63
-rw-r--r--node_modules/wordwrapjs/package.json34
-rw-r--r--package-lock.json735
-rw-r--r--package.json9
-rw-r--r--pages/disks/index.js173
-rw-r--r--pages/done/index.js24
-rw-r--r--pages/install/index.js191
-rw-r--r--pages/keyboard/index.js38
-rw-r--r--pages/language/index.js38
-rw-r--r--pages/locale/index.js24
-rw-r--r--pages/network/index.js163
-rw-r--r--pages/requirements/index.js120
-rw-r--r--pages/timezone/index.js52
-rw-r--r--pages/user/index.js116
-rw-r--r--pages/welcome/index.js24
532 files changed, 89474 insertions, 0 deletions
diff --git a/.idea/.gitignore b/.idea/.gitignore
new file mode 100644
index 0000000..13566b8
--- /dev/null
+++ b/.idea/.gitignore
@@ -0,0 +1,8 @@
+# Default ignored files
+/shelf/
+/workspace.xml
+# Editor-based HTTP Client requests
+/httpRequests/
+# Datasource local storage ignored files
+/dataSources/
+/dataSources.local.xml
diff --git a/.idea/deployment.xml b/.idea/deployment.xml
new file mode 100644
index 0000000..88bc57b
--- /dev/null
+++ b/.idea/deployment.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+ <component name="PublishConfigData" autoUpload="Always" serverName="Minteck.org" remoteFilesAllowedToDisappearOnAutoupload="false">
+ <serverData>
+ <paths name="Minteck.org">
+ <serverdata>
+ <mappings>
+ <mapping deploy="/nas/web/cdn/mistyos/installer" local="$PROJECT_DIR$/installer" web="/" />
+ </mappings>
+ </serverdata>
+ </paths>
+ </serverData>
+ <option name="myAutoUpload" value="ALWAYS" />
+ </component>
+</project> \ No newline at end of file
diff --git a/.idea/jsLibraryMappings.xml b/.idea/jsLibraryMappings.xml
new file mode 100644
index 0000000..d23208f
--- /dev/null
+++ b/.idea/jsLibraryMappings.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+ <component name="JavaScriptLibraryMappings">
+ <includedPredefinedLibrary name="Node.js Core" />
+ </component>
+</project> \ No newline at end of file
diff --git a/.idea/mistyos-installer.iml b/.idea/mistyos-installer.iml
new file mode 100644
index 0000000..0c8867d
--- /dev/null
+++ b/.idea/mistyos-installer.iml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module type="WEB_MODULE" version="4">
+ <component name="NewModuleRootManager">
+ <content url="file://$MODULE_DIR$">
+ <excludeFolder url="file://$MODULE_DIR$/temp" />
+ <excludeFolder url="file://$MODULE_DIR$/.tmp" />
+ <excludeFolder url="file://$MODULE_DIR$/tmp" />
+ </content>
+ <orderEntry type="inheritedJdk" />
+ <orderEntry type="sourceFolder" forTests="false" />
+ </component>
+</module> \ No newline at end of file
diff --git a/.idea/modules.xml b/.idea/modules.xml
new file mode 100644
index 0000000..2a9666b
--- /dev/null
+++ b/.idea/modules.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+ <component name="ProjectModuleManager">
+ <modules>
+ <module fileurl="file://$PROJECT_DIR$/.idea/mistyos-installer.iml" filepath="$PROJECT_DIR$/.idea/mistyos-installer.iml" />
+ </modules>
+ </component>
+</project> \ No newline at end of file
diff --git a/assets/Credits.rtf b/assets/Credits.rtf
new file mode 100644
index 0000000..1f9316f
--- /dev/null
+++ b/assets/Credits.rtf
@@ -0,0 +1,8 @@
+{\rtf1\ansi\ansicpg1252\cocoartf2707
+\cocoatextscaling0\cocoaplatform0{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+{\*\expandedcolortbl;;}
+\paperw11900\paperh16840\margl1440\margr1440\vieww11520\viewh8400\viewkind0
+\pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\pardirnatural\partightenfactor0
+
+\f0\fs24 \cf0 https://www.derpibooru.org/images/2957339?q=misty} \ No newline at end of file
diff --git a/assets/languages b/assets/languages
new file mode 100644
index 0000000..0ebe6e9
--- /dev/null
+++ b/assets/languages
@@ -0,0 +1,27 @@
+Afrikaans (af)
+Belarusian (be)
+Catalan (ca)
+Czech (cs)
+Chinese (zh)
+Danish (da)
+Dutch (nl)
+English (en)
+Finnish (fi)
+French (fr)
+German (de)
+Greek (el)
+Hindi (hi)
+Indonesian (id)
+Italian (it)
+Japanese (ja)
+Korean (ko)
+Polish (pl)
+Portuguese (pt)
+Romanian (ro)
+Russian (ru)
+Slovak (sk)
+Spanish (es)
+Swedish (sv)
+Thai (th)
+Ukrainian (uk)
+Vietnamese (vi) \ No newline at end of file
diff --git a/assets/mistyos-logo.svg b/assets/mistyos-logo.svg
new file mode 100644
index 0000000..662ef91
--- /dev/null
+++ b/assets/mistyos-logo.svg
@@ -0,0 +1,3227 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 26.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 752 752" style="enable-background:new 0 0 752 752;" xml:space="preserve">
+<image style="overflow:visible;" width="752" height="718" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAvAAAALOCAYAAADP1ienAAAACXBIWXMAAAsTAAALEwEAmpwYAABF
+zWlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0w
+TXBDZWhpSHpyZVN6TlRjemtjOWQiPz4KPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRh
+LyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS42LWMxMzggNzkuMTU5ODI0LCAyMDE2LzA5LzE0
+LTAxOjA5OjAxICAgICAgICAiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMu
+b3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJk
+ZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94
+YXAvMS4wL21tLyIKICAgICAgICAgICAgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20v
+eGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIKICAgICAgICAgICAgeG1sbnM6c3RSZWY9Imh0
+dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiCiAgICAgICAgICAg
+IHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKICAgICAgICAgICAg
+eG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIgogICAg
+ICAgICAgICB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iCiAgICAgICAg
+ICAgIHhtbG5zOnRpZmY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vdGlmZi8xLjAvIgogICAgICAgICAg
+ICB4bWxuczpleGlmPSJodHRwOi8vbnMuYWRvYmUuY29tL2V4aWYvMS4wLyI+CiAgICAgICAgIDx4
+bXBNTTpEb2N1bWVudElEPmFkb2JlOmRvY2lkOnBob3Rvc2hvcDplNjNiZjQxNC00MDc2LTExZWQt
+ODg2YS1jODkxNmY1NjcxNWU8L3htcE1NOkRvY3VtZW50SUQ+CiAgICAgICAgIDx4bXBNTTpJbnN0
+YW5jZUlEPnhtcC5paWQ6ZTI3MzAzYjYtODI3Ni01NDQyLTlkN2QtNGEyMTFlMjc0NTcwPC94bXBN
+TTpJbnN0YW5jZUlEPgogICAgICAgICA8eG1wTU06T3JpZ2luYWxEb2N1bWVudElEPjBGQTEyQTg3
+QzFFQjMzNTlBRkI4RjI1RTlCNkI4RkYxPC94bXBNTTpPcmlnaW5hbERvY3VtZW50SUQ+CiAgICAg
+ICAgIDx4bXBNTTpIaXN0b3J5PgogICAgICAgICAgICA8cmRmOlNlcT4KICAgICAgICAgICAgICAg
+PHJkZjpsaSByZGY6cGFyc2VUeXBlPSJSZXNvdXJjZSI+CiAgICAgICAgICAgICAgICAgIDxzdEV2
+dDphY3Rpb24+c2F2ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0Omlu
+c3RhbmNlSUQ+eG1wLmlpZDpkMDk2ODEzNS02Mjg3LTc5NGUtOTNkOS0xMjFiZjEzODdiNjI8L3N0
+RXZ0Omluc3RhbmNlSUQ+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDp3aGVuPjIwMjItMDktMjlU
+MTY6MzE6MDUtMDc6MDA8L3N0RXZ0OndoZW4+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDpzb2Z0
+d2FyZUFnZW50PkFkb2JlIFBob3Rvc2hvcCBDQyAyMDE3IChXaW5kb3dzKTwvc3RFdnQ6c29mdHdh
+cmVBZ2VudD4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmNoYW5nZWQ+Lzwvc3RFdnQ6Y2hhbmdl
+ZD4KICAgICAgICAgICAgICAgPC9yZGY6bGk+CiAgICAgICAgICAgICAgIDxyZGY6bGkgcmRmOnBh
+cnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6YWN0aW9uPmNvbnZl
+cnRlZDwvc3RFdnQ6YWN0aW9uPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6cGFyYW1ldGVycz5m
+cm9tIGltYWdlL2pwZWcgdG8gYXBwbGljYXRpb24vdm5kLmFkb2JlLnBob3Rvc2hvcDwvc3RFdnQ6
+cGFyYW1ldGVycz4KICAgICAgICAgICAgICAgPC9yZGY6bGk+CiAgICAgICAgICAgICAgIDxyZGY6
+bGkgcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6YWN0
+aW9uPmRlcml2ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OnBhcmFt
+ZXRlcnM+Y29udmVydGVkIGZyb20gaW1hZ2UvanBlZyB0byBhcHBsaWNhdGlvbi92bmQuYWRvYmUu
+cGhvdG9zaG9wPC9zdEV2dDpwYXJhbWV0ZXJzPgogICAgICAgICAgICAgICA8L3JkZjpsaT4KICAg
+ICAgICAgICAgICAgPHJkZjpsaSByZGY6cGFyc2VUeXBlPSJSZXNvdXJjZSI+CiAgICAgICAgICAg
+ICAgICAgIDxzdEV2dDphY3Rpb24+c2F2ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAg
+ICAgPHN0RXZ0Omluc3RhbmNlSUQ+eG1wLmlpZDpmMjBiNWRjNi1kNjgzLTRhNDMtYmFlMi05YjJh
+ZGY2YTRlY2I8L3N0RXZ0Omluc3RhbmNlSUQ+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDp3aGVu
+PjIwMjItMDktMjlUMTY6MzE6MDUtMDc6MDA8L3N0RXZ0OndoZW4+CiAgICAgICAgICAgICAgICAg
+IDxzdEV2dDpzb2Z0d2FyZUFnZW50PkFkb2JlIFBob3Rvc2hvcCBDQyAyMDE3IChXaW5kb3dzKTwv
+c3RFdnQ6c29mdHdhcmVBZ2VudD4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmNoYW5nZWQ+Lzwv
+c3RFdnQ6Y2hhbmdlZD4KICAgICAgICAgICAgICAgPC9yZGY6bGk+CiAgICAgICAgICAgICAgIDxy
+ZGY6bGkgcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6
+YWN0aW9uPnNhdmVkPC9zdEV2dDphY3Rpb24+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDppbnN0
+YW5jZUlEPnhtcC5paWQ6ZTQwMDE1OGItYzM4Yi1kYzQ2LWFmYzktZGRhMGQxYjVhNTJhPC9zdEV2
+dDppbnN0YW5jZUlEPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6d2hlbj4yMDIyLTA5LTI5VDIx
+OjE4OjM5LTA3OjAwPC9zdEV2dDp3aGVuPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6c29mdHdh
+cmVBZ2VudD5BZG9iZSBQaG90b3Nob3AgQ0MgMjAxNyAoV2luZG93cyk8L3N0RXZ0OnNvZnR3YXJl
+QWdlbnQ+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDpjaGFuZ2VkPi88L3N0RXZ0OmNoYW5nZWQ+
+CiAgICAgICAgICAgICAgIDwvcmRmOmxpPgogICAgICAgICAgICAgICA8cmRmOmxpIHJkZjpwYXJz
+ZVR5cGU9IlJlc291cmNlIj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmFjdGlvbj5jb252ZXJ0
+ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OnBhcmFtZXRlcnM+ZnJv
+bSBhcHBsaWNhdGlvbi92bmQuYWRvYmUucGhvdG9zaG9wIHRvIGltYWdlL3BuZzwvc3RFdnQ6cGFy
+YW1ldGVycz4KICAgICAgICAgICAgICAgPC9yZGY6bGk+CiAgICAgICAgICAgICAgIDxyZGY6bGkg
+cmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6YWN0aW9u
+PmRlcml2ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OnBhcmFtZXRl
+cnM+Y29udmVydGVkIGZyb20gYXBwbGljYXRpb24vdm5kLmFkb2JlLnBob3Rvc2hvcCB0byBpbWFn
+ZS9wbmc8L3N0RXZ0OnBhcmFtZXRlcnM+CiAgICAgICAgICAgICAgIDwvcmRmOmxpPgogICAgICAg
+ICAgICAgICA8cmRmOmxpIHJkZjpwYXJzZVR5cGU9IlJlc291cmNlIj4KICAgICAgICAgICAgICAg
+ICAgPHN0RXZ0OmFjdGlvbj5zYXZlZDwvc3RFdnQ6YWN0aW9uPgogICAgICAgICAgICAgICAgICA8
+c3RFdnQ6aW5zdGFuY2VJRD54bXAuaWlkOmUyNzMwM2I2LTgyNzYtNTQ0Mi05ZDdkLTRhMjExZTI3
+NDU3MDwvc3RFdnQ6aW5zdGFuY2VJRD4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OndoZW4+MjAy
+Mi0wOS0yOVQyMToxODozOS0wNzowMDwvc3RFdnQ6d2hlbj4KICAgICAgICAgICAgICAgICAgPHN0
+RXZ0OnNvZnR3YXJlQWdlbnQ+QWRvYmUgUGhvdG9zaG9wIENDIDIwMTcgKFdpbmRvd3MpPC9zdEV2
+dDpzb2Z0d2FyZUFnZW50PgogICAgICAgICAgICAgICAgICA8c3RFdnQ6Y2hhbmdlZD4vPC9zdEV2
+dDpjaGFuZ2VkPgogICAgICAgICAgICAgICA8L3JkZjpsaT4KICAgICAgICAgICAgPC9yZGY6U2Vx
+PgogICAgICAgICA8L3htcE1NOkhpc3Rvcnk+CiAgICAgICAgIDx4bXBNTTpEZXJpdmVkRnJvbSBy
+ZGY6cGFyc2VUeXBlPSJSZXNvdXJjZSI+CiAgICAgICAgICAgIDxzdFJlZjppbnN0YW5jZUlEPnht
+cC5paWQ6ZTQwMDE1OGItYzM4Yi1kYzQ2LWFmYzktZGRhMGQxYjVhNTJhPC9zdFJlZjppbnN0YW5j
+ZUlEPgogICAgICAgICAgICA8c3RSZWY6ZG9jdW1lbnRJRD54bXAuZGlkOmYyMGI1ZGM2LWQ2ODMt
+NGE0My1iYWUyLTliMmFkZjZhNGVjYjwvc3RSZWY6ZG9jdW1lbnRJRD4KICAgICAgICAgICAgPHN0
+UmVmOm9yaWdpbmFsRG9jdW1lbnRJRD4wRkExMkE4N0MxRUIzMzU5QUZCOEYyNUU5QjZCOEZGMTwv
+c3RSZWY6b3JpZ2luYWxEb2N1bWVudElEPgogICAgICAgICA8L3htcE1NOkRlcml2ZWRGcm9tPgog
+ICAgICAgICA8ZGM6Zm9ybWF0PmltYWdlL3BuZzwvZGM6Zm9ybWF0PgogICAgICAgICA8cGhvdG9z
+aG9wOkNvbG9yTW9kZT4zPC9waG90b3Nob3A6Q29sb3JNb2RlPgogICAgICAgICA8cGhvdG9zaG9w
+OklDQ1Byb2ZpbGUvPgogICAgICAgICA8cGhvdG9zaG9wOkRvY3VtZW50QW5jZXN0b3JzPgogICAg
+ICAgICAgICA8cmRmOkJhZz4KICAgICAgICAgICAgICAgPHJkZjpsaT4wRkExMkE4N0MxRUIzMzU5
+QUZCOEYyNUU5QjZCOEZGMTwvcmRmOmxpPgogICAgICAgICAgICA8L3JkZjpCYWc+CiAgICAgICAg
+IDwvcGhvdG9zaG9wOkRvY3VtZW50QW5jZXN0b3JzPgogICAgICAgICA8eG1wOkNyZWF0ZURhdGU+
+MjAyMi0wOS0yOVQxNjoxNTo0Mi0wNzowMDwveG1wOkNyZWF0ZURhdGU+CiAgICAgICAgIDx4bXA6
+TW9kaWZ5RGF0ZT4yMDIyLTA5LTI5VDIxOjE4OjM5LTA3OjAwPC94bXA6TW9kaWZ5RGF0ZT4KICAg
+ICAgICAgPHhtcDpNZXRhZGF0YURhdGU+MjAyMi0wOS0yOVQyMToxODozOS0wNzowMDwveG1wOk1l
+dGFkYXRhRGF0ZT4KICAgICAgICAgPHhtcDpDcmVhdG9yVG9vbD5BZG9iZSBQaG90b3Nob3AgQ0Mg
+MjAxNyAoV2luZG93cyk8L3htcDpDcmVhdG9yVG9vbD4KICAgICAgICAgPHRpZmY6SW1hZ2VXaWR0
+aD4yMjIwPC90aWZmOkltYWdlV2lkdGg+CiAgICAgICAgIDx0aWZmOkltYWdlTGVuZ3RoPjEyNDg8
+L3RpZmY6SW1hZ2VMZW5ndGg+CiAgICAgICAgIDx0aWZmOkJpdHNQZXJTYW1wbGU+CiAgICAgICAg
+ICAgIDxyZGY6U2VxPgogICAgICAgICAgICAgICA8cmRmOmxpPjg8L3JkZjpsaT4KICAgICAgICAg
+ICAgICAgPHJkZjpsaT44PC9yZGY6bGk+CiAgICAgICAgICAgICAgIDxyZGY6bGk+ODwvcmRmOmxp
+PgogICAgICAgICAgICA8L3JkZjpTZXE+CiAgICAgICAgIDwvdGlmZjpCaXRzUGVyU2FtcGxlPgog
+ICAgICAgICA8dGlmZjpQaG90b21ldHJpY0ludGVycHJldGF0aW9uPjI8L3RpZmY6UGhvdG9tZXRy
+aWNJbnRlcnByZXRhdGlvbj4KICAgICAgICAgPHRpZmY6T3JpZW50YXRpb24+MTwvdGlmZjpPcmll
+bnRhdGlvbj4KICAgICAgICAgPHRpZmY6U2FtcGxlc1BlclBpeGVsPjM8L3RpZmY6U2FtcGxlc1Bl
+clBpeGVsPgogICAgICAgICA8dGlmZjpYUmVzb2x1dGlvbj43MjAwMDAvMTAwMDA8L3RpZmY6WFJl
+c29sdXRpb24+CiAgICAgICAgIDx0aWZmOllSZXNvbHV0aW9uPjcyMDAwMC8xMDAwMDwvdGlmZjpZ
+UmVzb2x1dGlvbj4KICAgICAgICAgPHRpZmY6UmVzb2x1dGlvblVuaXQ+MjwvdGlmZjpSZXNvbHV0
+aW9uVW5pdD4KICAgICAgICAgPGV4aWY6RXhpZlZlcnNpb24+MDIyMTwvZXhpZjpFeGlmVmVyc2lv
+bj4KICAgICAgICAgPGV4aWY6Q29sb3JTcGFjZT42NTUzNTwvZXhpZjpDb2xvclNwYWNlPgogICAg
+ICAgICA8ZXhpZjpQaXhlbFhEaW1lbnNpb24+NzUyPC9leGlmOlBpeGVsWERpbWVuc2lvbj4KICAg
+ICAgICAgPGV4aWY6UGl4ZWxZRGltZW5zaW9uPjcxODwvZXhpZjpQaXhlbFlEaW1lbnNpb24+CiAg
+ICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICA8L3JkZjpSREY+CjwveDp4bXBtZXRhPgogICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAK
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAog
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAK
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAog
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgIAo8P3hwYWNrZXQgZW5kPSJ3Ij8+ApFEYwAAACBjSFJNAAB6JQAAgIMAAPn/
+AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAKGr0lEQVR42uy96ZNk13mn95xz782t9r16AxprA8RG
+AiC4gCAB7iREg1pIEZRGhIa0ZjRjOewIhx3zhXbwX/AnL7QZYYcY43FwhpKoCYqjsUiK4iIuEEkQ
++9JYeq+u7lpzufccfzjnZp68ldVd3V3VlVn1/iIycqmszLzbuc957+99X2WtRSQSiUQikUgkEg2G
+tKwCkUgkEolEIpFIAF4kEolEIpFIJBIJwItEIpFIJBKJRALwIpFIJBKJRCKRSABeJBKJRCKRSCQS
+CcCLRCKRSCQSiUQC8CKRSCQSiUQikUgAXiQSiUQikUgkEgnAi0QikUgkEolEAvAikUgkEolEIpFI
+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
+HCYAAAAASUVORK5CYII=" transform="matrix(1 0 0 1 0 17)">
+</image>
+</svg>
diff --git a/assets/wallpaper.png b/assets/wallpaper.png
new file mode 100644
index 0000000..865dd8b
--- /dev/null
+++ b/assets/wallpaper.png
Binary files differ
diff --git a/colors.js b/colors.js
new file mode 100644
index 0000000..b0c041a
--- /dev/null
+++ b/colors.js
@@ -0,0 +1,21 @@
+const chalk = require('chalk');
+
+console.log(chalk.white(" ╔═════════╦═════════╦═════════╦═════════╦═════════╦═════════╦═════════╦═════════╗"));
+console.log(chalk.white(" ║ RED ║ GREEN ║ YELLOW ║ BLUE ║ MAGENTA ║ CYAN ║ WHITE ║ GRAY ║"))
+console.log(chalk.white("╔═════╬═════════╬═════════╬═════════╬═════════╬═════════╬═════════╬═════════╬═════════╝"))
+console.log(chalk.white("║ BG3 ║ " + chalk.redBright("███████") + " ║ " + chalk.greenBright("███████") + " ║ " + chalk.yellowBright("███████") + " ║ " + chalk.blueBright("███████") + " ║ " + chalk.magentaBright("███████") + " ║ " + chalk.cyanBright("███████") + " ║ " + chalk.whiteBright("███████") + " ║"))
+console.log(chalk.white("╠═════╬═════════╬═════════╬═════════╬═════════╬═════════╬═════════╬═════════╣"))
+console.log(chalk.white("║ FG3 ║ " + chalk.redBright("Ponies!") + " ║ " + chalk.greenBright("Ponies!") + " ║ " + chalk.yellowBright("Ponies!") + " ║ " + chalk.blueBright("Ponies!") + " ║ " + chalk.magentaBright("Ponies!") + " ║ " + chalk.cyanBright("Ponies!") + " ║ " + chalk.whiteBright("Ponies!") + " ║"))
+console.log(chalk.white("╠═════╬═════════╬═════════╬═════════╬═════════╬═════════╬═════════╬═════════╬═════════╗"))
+console.log(chalk.white("║ BC2 ║ " + chalk.red("███████") + " ║ " + chalk.green("███████") + " ║ " + chalk.yellow("███████") + " ║ " + chalk.blue("███████") + " ║ " + chalk.magenta("███████") + " ║ " + chalk.cyan("███████") + " ║ " + chalk.white("███████") + " ║ " + chalk.gray("███████") + " ║"))
+console.log(chalk.white("╠═════╬═════════╬═════════╬═════════╬═════════╬═════════╬═════════╬═════════╬═════════╣"))
+console.log(chalk.white("║ FR2 ║ " + chalk.red("Ponies!") + " ║ " + chalk.green("Ponies!") + " ║ " + chalk.yellow("Ponies!") + " ║ " + chalk.blue("Ponies!") + " ║ " + chalk.magenta("Ponies!") + " ║ " + chalk.cyan("Ponies!") + " ║ " + chalk.white("Ponies!") + " ║ " + chalk.gray("Ponies!") + " ║"))
+console.log(chalk.white("╠═════╬═════════╬═════════╬═════════╬═════════╬═════════╬═════════╬═════════╬═════════╝"))
+console.log(chalk.white("║ BG1 ║ " + chalk.redBright.dim("███████") + " ║ " + chalk.greenBright.dim("███████") + " ║ " + chalk.yellowBright.dim("███████") + " ║ " + chalk.blueBright.dim("███████") + " ║ " + chalk.magentaBright.dim("███████") + " ║ " + chalk.cyanBright.dim("███████") + " ║ " + chalk.whiteBright.dim("███████") + " ║"))
+console.log(chalk.white("╠═════╬═════════╬═════════╬═════════╬═════════╬═════════╬═════════╬═════════╣"))
+console.log(chalk.white("║ FG1 ║ " + chalk.red.dim("Ponies!") + " ║ " + chalk.greenBright.dim("Ponies!") + " ║ " + chalk.yellowBright.dim("Ponies!") + " ║ " + chalk.blueBright.dim("Ponies!") + " ║ " + chalk.magentaBright.dim("Ponies!") + " ║ " + chalk.cyanBright.dim("Ponies!") + " ║ " + chalk.whiteBright.dim("Ponies!") + " ║"))
+console.log(chalk.white("╠═════╬═════════╬═════════╬═════════╬═════════╬═════════╬═════════╬═════════╬═════════╗"))
+console.log(chalk.white("║ BG0 ║ " + chalk.red.dim("███████") + " ║ " + chalk.green.dim("███████") + " ║ " + chalk.yellow.dim("███████") + " ║ " + chalk.blue.dim("███████") + " ║ " + chalk.magenta.dim("███████") + " ║ " + chalk.cyan.dim("███████") + " ║ " + chalk.white.dim("███████") + " ║ " + chalk.gray.dim("███████") + " ║"))
+console.log(chalk.white("╠═════╬═════════╬═════════╬═════════╬═════════╬═════════╬═════════╬═════════╬═════════╣"))
+console.log(chalk.white("║ FG0 ║ " + chalk.red.dim("Ponies!") + " ║ " + chalk.green.dim("Ponies!") + " ║ " + chalk.yellow.dim("Ponies!") + " ║ " + chalk.blue.dim("Ponies!") + " ║ " + chalk.magenta.dim("Ponies!") + " ║ " + chalk.cyan.dim("Ponies!") + " ║ " + chalk.white.dim("Ponies!") + " ║ " + chalk.gray.dim("Ponies!") + " ║"))
+console.log(chalk.white("╚═════╩═════════╩═════════╩═════════╩═════════╩═════════╩═════════╩═════════╩═════════╝")); \ No newline at end of file
diff --git a/colors.sh b/colors.sh
new file mode 100644
index 0000000..fe0310a
--- /dev/null
+++ b/colors.sh
@@ -0,0 +1,28 @@
+#!/bin/bash
+
+black="271f66"
+grey="5B5B5B"
+red="e4abff"
+green="00cc78"
+yellow="ffd635"
+blue="b44ac0"
+magenta="493ac1"
+cyan="51e9f4"
+
+echo -en "\e]P0$black" # black
+echo -en "\e]P8$grey" # darkgrey
+echo -en "\e]P1$red" # darkred
+echo -en "\e]P9$red" # red
+echo -en "\e]P2$green" # darkgreen
+echo -en "\e]PA$green" # green
+echo -en "\e]P3$yellow" # brown
+echo -en "\e]PB$yellow" # yellow
+echo -en "\e]P4$blue" # darkblue
+echo -en "\e]PC$blue" # blue
+echo -en "\e]P5$magenta" # darkmagenta
+echo -en "\e]PD$magenta" # magenta
+echo -en "\e]P6$cyan" # darkcyan
+echo -en "\e]PE$cyan" # cyan
+echo -en "\e]P7FFFFFF" # lightgrey
+echo -en "\e]PFFFFFFF" # white
+clear \ No newline at end of file
diff --git a/helpers/localegen.js b/helpers/localegen.js
new file mode 100755
index 0000000..6e81748
--- /dev/null
+++ b/helpers/localegen.js
@@ -0,0 +1,25 @@
+const fs = require('fs');
+list = [];
+
+for (let file of fs.readdirSync(".")) {
+ try {
+ l = fs.readFileSync(file).toString().split("\nLC_ADDRESS\n")[1].split("\n").filter(i => i.startsWith("lang_name") || i.startsWith("country_name")).map(i => i.split('"')[1]).map((i, j) => { if (j == 0) { return "(" + i + ")"; } else { return i; } }).reverse().join(" ");
+
+ out = l.replace(/<U([0-9a-f]{1,4})>/gi, function (match, numStr) {
+ var num = parseInt(numStr, 16);
+ return String.fromCharCode(num);
+ });
+
+ if (out.trim() === "") throw new Error();
+ } catch (e) {
+ out = file;
+ }
+
+ if (out !== file) {
+ list.push({ title: out.replace(/^\((.*)\)$/gm, "$1"), value: file });
+ }
+}
+
+fs.writeFileSync("/var/users/mistyos/locales.json", JSON.stringify(list.sort((a, b) => {
+ return a.title.localeCompare(b.title);
+}), null, 2));
diff --git a/index.js b/index.js
new file mode 100644
index 0000000..7cdd497
--- /dev/null
+++ b/index.js
@@ -0,0 +1,46 @@
+global.version = "0.3.23-equestria.dev-DEBUG";
+global.unstable = true;
+
+try {
+ require('child_process').execSync("chmod +x ./colors.sh", { cwd: __dirname });
+} catch (e) {}
+require('child_process').execSync("./colors.sh", { cwd: __dirname, stdio: "inherit" });
+
+global.keymapsList = require("./locales/keymaps.json");
+global.locales = require("./locales/locales.json");
+global.timezones = require("./locales/timezones.json");
+
+global.setupConfig = {
+ language: null,
+ keyboard: null,
+ locale: null,
+ timezone: null,
+ wifi: false,
+ wifi_ssid: null,
+ wifi_password: null,
+ disk: null,
+ format_disk: false,
+ partition: null,
+ esp: null,
+ user_name: null,
+ user_full: null,
+ user_password: null,
+ hostname: null
+}
+
+global.size = require('./modules/size');
+global.banner = require('./modules/banner');
+
+global.language = require('./pages/language');
+global.welcome = require('./pages/welcome');
+global.keyboard = require('./pages/keyboard');
+global.locale = require('./pages/locale');
+global.timezone = require('./pages/timezone');
+global.network = require('./pages/network');
+global.requirements = require('./pages/requirements');
+global.disks = require('./pages/disks');
+global.user = require('./pages/user');
+global.install = require('./pages/install');
+global.done = require('./pages/done');
+
+language(); \ No newline at end of file
diff --git a/installer/install.js b/installer/install.js
new file mode 100644
index 0000000..ec9ef70
--- /dev/null
+++ b/installer/install.js
@@ -0,0 +1,613 @@
+#!/opt/node/bin/node
+global.version = "1.4.4";
+global.date = "2022-11-04";
+
+const fs = require('fs');
+const os = require('os');
+
+function sleep(ms) {
+ return new Promise((res) => {
+ setTimeout(res, ms)
+ });
+}
+
+let ramMB = Math.round(os.totalmem() / 1024 ** 2);
+
+const child_process = require("child_process");
+const si = require(`/opt/installer/node_modules/systeminformation`);
+const axios = require(`/opt/installer/node_modules/axios/dist/node/axios.cjs`);
+
+let keymaps = require(`/opt/installer/locales/keymaps.json`);
+let doneSteps = 0;
+let actualDoneSteps = 0;
+let totalSteps = 38;
+
+let additionalStepsFormat = 8;
+let additionalStepsNoFormat = 4;
+
+function step() {
+ doneSteps++;
+ actualDoneSteps = doneSteps;
+ console.log("$" + JSON.stringify({
+ type: "global_status",
+ value: Math.round((doneSteps / (totalSteps + (config.format_disk ? additionalStepsFormat : additionalStepsNoFormat))) * 100)
+ }))
+}
+
+console.log("╔═════════════════════════════" + "═".repeat(version.length + date.length) + "════╗");
+console.log("║ MistyCore Online Installer v" + version + " (" + date + ")" + " ║");
+console.log("╚═════════════════════════════" + "═".repeat(version.length + date.length) + "════╝\n");
+let config = JSON.parse(fs.readFileSync("./config.json").toString());
+
+console.log("-------------------");
+
+console.log("Configuration options:");
+
+for (let key in config) {
+ console.log(" " + key + ": " + config[key]);
+}
+
+console.log("-------------------\n");
+
+(async () => {
+
+ console.log(" :: Cleaning up unfinished install...");
+ try {
+ child_process.execSync("umount -a", {stdio: "inherit"});
+ } catch (e) {
+ }
+ try {
+ child_process.execSync("mount -o remount,rw /", {stdio: "inherit"});
+ } catch (e) {
+ }
+ try {
+ child_process.execSync("mount -t tmpfs tmpfs /dev/shm", {stdio: "inherit"});
+ } catch (e) {
+ }
+ try {
+ child_process.execSync("mount -t efivarfs efivarfs /sys/firmware/efi/efivars", {stdio: "inherit"});
+ } catch (e) {
+ }
+ console.log(" :: Cleaned up"); step();
+
+ // Partitioning
+ console.log(" == Reached step: Partition disk");
+ console.log("$" + JSON.stringify({ type: "update_step", step: "partition" }));
+
+ console.log("$" + JSON.stringify({ type: "update_step", step: "partsetup" }));
+ console.log(" :: Installing partitioning tools");
+ child_process.execSync("xbps-install -y parted gptfdisk encfs", {stdio: "inherit"});
+ step();
+
+ if (config.format_disk) {
+ console.log("$" + JSON.stringify({ type: "update_step", step: "format" }));
+
+ console.log(" :: Disk must be formatted");
+ console.log(" :: Selected disk: " + config.disk);
+
+ console.log(" :: Getting disk size...");
+ let diskSize = (await si.diskLayout()).filter((i) => {
+ return i.device === config.disk;
+ })[0].size;
+ console.log(" :: Disk is " + (diskSize / 1024 ** 2).toFixed(2) + "MB");
+
+ console.log(" :: Initializing as GPT...");
+ child_process.execFileSync("parted", ["-s", "-j", "--", config.disk, "mklabel", "GPT"], {stdio: "inherit"});
+ console.log(" :: Disk initialized successfully"); step();
+
+ console.log(" :: Creating new FAT32 partition (0% -> 200MB)...");
+ child_process.execFileSync("parted", ["-s", "-j", "--", config.disk, "mkpart", "ESP", "fat32", "2048s", "200M"], {stdio: "inherit"});
+ console.log(" :: Created new FAT32 partition with ID 1"); step();
+
+ console.log(" :: Marking partition 1 as EFI System...");
+ child_process.execFileSync("parted", ["-s", "-j", "--", config.disk, "set", "1", "esp", "on"], {stdio: "inherit"});
+ console.log(" :: Marked partition 1 as EFI System"); step();
+
+ console.log(" :: Detected " + ramMB + "MB of system memory, swap partition should be " + (ramMB * 0.5) + "MB");
+ let swapSize = (ramMB * 0.5) + 200
+
+ console.log(" :: Creating new Linux swap partition (200MB -> " + swapSize + "MB)...");
+ child_process.execFileSync("parted", ["-s", "-j", "--", config.disk, "mkpart", "MistySwap", "linux-swap", "200M", swapSize + "M"], {stdio: "inherit"});
+ console.log(" :: Created new Linux swap partition with ID 2"); step();
+
+ console.log(" :: Using the rest of free space for the system partition.");
+ console.log(" :: Creating new Btrfs partition (" + swapSize + "MB -> 100%)...");
+ child_process.execFileSync("parted", ["-s", "-j", "--", config.disk, "mkpart", "MistyOS", "btrfs", swapSize + "M", "100%"], {stdio: "inherit"});
+ console.log(" :: Created new Btrfs partition with ID 3"); step();
+
+ console.log(" :: Marking partition 3 as Linux root (x86-64)...");
+ child_process.execSync('echo "t\n3\n8304\nw\nY\n" | gdisk ' + config.disk, {stdio: "inherit"});
+ console.log("\n :: Marked partition 3 as Linux root (x86-64)"); step();
+
+ console.log("$" + JSON.stringify({ type: "update_step", step: "partupdate" }));
+ console.log(" :: Updating kernel partitions listing...");
+ child_process.execFileSync("partprobe", [], {stdio: "inherit"});
+ console.log(" :: Updated kernel partitions listing"); step();
+
+ console.log(" :: Waiting 10 seconds (so the kernel can take changes)...");
+ await sleep(10000);
+
+ if (config.disk.split("/")[2].length === 3) {
+ config.partition = config.disk + "3";
+ config.esp = config.disk + "1";
+ } else {
+ config.partition = config.disk + "p3";
+ config.esp = config.disk + "p1";
+ }
+
+ console.log(" :: System partition is now " + config.partition);
+ console.log(" :: ESP partition is now " + config.esp);
+
+ console.log("$" + JSON.stringify({ type: "update_step", step: "formatesp" }));
+ console.log(" :: Creating new FAT32 partition on " + config.esp + "...");
+ child_process.execFileSync("mkfs.vfat", ["-F", "32", config.esp], {stdio: "inherit"});
+ console.log(" :: Created new FAT32 partition on " + config.esp); step();
+ } else {
+ console.log(" :: Disk must have the partition erased");
+ console.log(" :: Selected partition: " + config.partition);
+ console.log(" :: Selected ESP: " + config.esp);
+
+ let partitionID = parseInt(config.partition.replace(/\/dev\/.*(.(\d+)|(.*p(\d+)))/gm, "$2$4"));
+ let espID = parseInt(config.esp.replace(/\/dev\/.*(.(\d+)|(.*p(\d+)))/gm, "$2$4"));
+
+ console.log(" :: System partition has ID " + partitionID);
+ console.log(" :: ESP partition has ID " + espID);
+
+ console.log(" :: Marking partition " + espID + " as EFI System...");
+ child_process.execFileSync("parted", ["-s", "-j", "--", config.disk, "set", espID.toString(), "esp", "on"], {stdio: "inherit"});
+ console.log(" :: Marked partition " + espID + " as EFI System"); step();
+
+ console.log("$" + JSON.stringify({ type: "update_step", step: "partchtype" }));
+ console.log(" :: Marking partition " + partitionID + " as Linux root (x86-64)...");
+ child_process.execSync('echo "t\n' + partitionID + '\n8304\nw\nY\n" | gdisk ' + config.disk, {stdio: "inherit"});
+ console.log("\n :: Marked partition " + partitionID + " as Linux root (x86-64)"); step();
+
+ console.log(" :: Naming partition " + partitionID + "...");
+ child_process.execFileSync("parted", ["-s", "-j", "--", config.disk, "name", partitionID.toString(), "MistyOS"], {stdio: "inherit"});
+ console.log("\n :: Named partition " + partitionID); step();
+
+ console.log("$" + JSON.stringify({ type: "update_step", step: "partupdate" }));
+ console.log(" :: Updating kernel partitions listing...");
+ child_process.execFileSync("partprobe", [], {stdio: "inherit"});
+ console.log(" :: Updated kernel partitions listing"); step();
+ }
+
+ // Filesystems
+ console.log(" == Reached step: Filesystems setup");
+
+ console.log("$" + JSON.stringify({ type: "update_step", step: "btrfscont" }));
+ console.log(" :: Creating new Btrfs container on " + config.partition + "...");
+ child_process.execFileSync("mkfs.btrfs", ["-f", config.partition], {stdio: "inherit"});
+ console.log(" :: Created new Btrfs container on " + config.partition); step();
+
+ console.log(" :: Creating mount points...");
+ if (!fs.existsSync("/tmp/mistyos-install/sys")) fs.mkdirSync("/tmp/mistyos-install/sys");
+ if (!fs.existsSync("/tmp/mistyos-install/efi")) fs.mkdirSync("/tmp/mistyos-install/efi");
+ console.log(" :: Created mount points"); step();
+
+ console.log(" :: Mounting Btrfs container " + config.partition + "...");
+ child_process.execFileSync("mount", ["-t", "btrfs", "--", config.partition, "/tmp/mistyos-install/sys"], {stdio: "inherit"});
+ console.log(" :: Mounted Btrfs container " + config.partition); step();
+
+ console.log(" :: Creating Btrfs volumes on " + config.partition + "...");
+
+ for (let volume of [
+ "boot",
+ "boot_b",
+ "boot_r",
+ "recovery_a",
+ "recovery_b",
+ "rw_admin",
+ "rw_config",
+ "rw_config_r",
+ "rw_local",
+ "rw_mnt",
+ "rw_opt",
+ "rw_shared",
+ "rw_shared_r",
+ "rw_srv",
+ "rw_users",
+ "system_a",
+ "system_b",
+ "system_r",
+ "utils_a",
+ "utils_b",
+ "utils_r"
+ ]) {
+ console.log(" :: " + volume);
+ child_process.execFileSync("btrfs", ["subvolume", "create", "/tmp/mistyos-install/sys/" + volume], {stdio: "inherit"});
+ }
+
+ console.log(" :: Created Btrfs volumes"); step();
+
+ console.log(" :: Mounting EFI partition " + config.esp + "...");
+ child_process.execFileSync("mount", ["--", config.esp, "/tmp/mistyos-install/efi"], {stdio: "inherit"});
+ console.log(" :: Mounted EFI partition " + config.esp); step();
+
+ // OS Download
+ console.log(" == Reached step: Downloading OS image");
+ console.log("$" + JSON.stringify({ type: "update_step", step: "osdownload" }));
+
+ console.log(" :: Fetching release information...");
+ let releaseInfo = (await axios.get("https://static.equestria.horse/mistyos/build.json")).data;
+ console.log(" :: Release information:");
+ console.log(" :: name: " + releaseInfo['osName']);
+ console.log(" :: version: " + releaseInfo['version']);
+ console.log(" :: build: " + releaseInfo['build']);
+
+ console.log("$" + JSON.stringify({
+ type: "os_version",
+ version: releaseInfo['version']
+ }))
+
+ let osSource = "https://static.equestria.horse/mistyos/" + releaseInfo['version'] + "/mistyos-" + releaseInfo['version'] + "-install.mistyosimage";
+ console.log(" :: Downloading OS from " + osSource + "...");
+
+ let sourceExtract = "/tmp/mistyos-install/sys/base.mistyosimage";
+ let download = child_process.spawn("wget", ["--progress=bar:force", "-O", "/tmp/mistyos-install/sys/base.mistyosimage", "--", osSource], {stdio: "pipe"});
+
+ download.stderr.on('data', (data) => {
+ let progress = data.toString().replace(/^(.*) (.*)%\[(.*)$/gm, "$2");
+
+ if (progress !== data.toString()) {
+ if (!isNaN(parseInt(progress)) && parseInt(progress) !== null && progress <= 100) {
+ console.log("$" + JSON.stringify({
+ type: "current_step",
+ value: parseInt(progress),
+ file: null
+ }));
+ actualDoneSteps = doneSteps + parseInt(progress) / 100;
+ console.log("$" + JSON.stringify({
+ type: "global_status",
+ value: Math.round((doneSteps / (totalSteps + (config.format_disk ? additionalStepsFormat : additionalStepsNoFormat))) * 100)
+ }))
+ } else {
+ console.log(" :: " + data.toString().trim())
+ }
+ } else {
+ console.log(" :: " + data.toString().trim());
+ }
+ })
+
+ download.on('exit', async () => {
+ step();
+
+ // OS Extract
+ console.log(" == Reached step: Extracting OS image");
+ console.log("$" + JSON.stringify({
+ type: "current_step",
+ value: null,
+ file: null
+ }));
+
+ console.log(" :: Extracting base image...");
+ console.log("$" + JSON.stringify({ type: "update_step", step: "baseextract" }));
+ if (!fs.existsSync("/tmp/mistyos-install/sys/_extract")) fs.mkdirSync("/tmp/mistyos-install/sys/_extract");
+ child_process.execFileSync("unzip", [sourceExtract], {
+ cwd: "/tmp/mistyos-install/sys/_extract",
+ stdio: "inherit"
+ });
+ console.log(" :: Extracted base image"); step();
+ if (fs.existsSync("/tmp/mistyos-install/sys/base.mistyosimage")) fs.unlinkSync("/tmp/mistyos-install/sys/base.mistyosimage");
+
+ // Files copy
+ console.log(" == Reached step: Copying files");
+ console.log("$" + JSON.stringify({ type: "update_step", step: "copy" }));
+
+ function extractArchive(source, target, name) {
+ return new Promise((res) => {
+ let currentFile = null;
+ let proc = child_process.spawn("unzip", [source], { cwd: target, stdio: "pipe" });
+
+ let currentFileUpdater = setInterval(() => {
+ console.log("$" + JSON.stringify({
+ type: "current_step",
+ value: null,
+ file: currentFile
+ }));
+ }, 100);
+
+ proc.stdout.on('data', (data) => {
+ let f = data.toString().replace(/(.*): ([^ ]*)( .*|)/gm, name + ":/$2");
+
+ if (f !== data.toString()) {
+ currentFile = f;
+ }
+ })
+
+ proc.on('exit', () => {
+ clearInterval(currentFileUpdater);
+ console.log("$" + JSON.stringify({
+ type: "current_step",
+ value: null,
+ file: null
+ }));
+ res();
+ });
+ });
+ }
+
+ console.log(" :: Copying boot");
+ await extractArchive("/tmp/mistyos-install/sys/_extract/boot.mistycoresystem", "/tmp/mistyos-install/sys/boot", "boot");
+ step();
+
+ console.log(" :: Copying init-config");
+ await extractArchive("/tmp/mistyos-install/sys/_extract/init-config.mistycoresystem", "/tmp/mistyos-install/sys/rw_config", "rw_config");
+ step();
+
+ console.log(" :: Copying init-local");
+ await extractArchive("/tmp/mistyos-install/sys/_extract/init-local.mistycoresystem", "/tmp/mistyos-install/sys/rw_local", "rw_local");
+ step();
+
+ console.log(" :: Copying init-shared");
+ await extractArchive("/tmp/mistyos-install/sys/_extract/init-shared.mistycoresystem", "/tmp/mistyos-install/sys/rw_shared", "rw_shared");
+ step();
+
+ console.log(" :: Copying recovery");
+ await extractArchive("/tmp/mistyos-install/sys/_extract/recovery.mistycoresystem", "/tmp/mistyos-install/sys/recovery_a", "recovery_a");
+ step();
+
+ console.log(" :: Copying system");
+ await extractArchive("/tmp/mistyos-install/sys/_extract/system.mistycoresystem", "/tmp/mistyos-install/sys/system_a", "system_a");
+ step();
+
+ console.log(" :: Copying utils");
+ await extractArchive("/tmp/mistyos-install/sys/_extract/utils.mistycoresystem", "/tmp/mistyos-install/sys/utils_a", "utils_a");
+ step();
+
+ console.log(" :: Cleaning up downloads");
+ child_process.execFileSync("rm", ["-rf", "/tmp/mistyos-install/sys/_extract"], {stdio: "inherit"});
+ step();
+
+ console.log(" :: Done copying");
+
+ // fstab
+ console.log(" == Reached step: Updating fstab");
+ console.log("$" + JSON.stringify({ type: "update_step", step: "conffstab" }));
+
+ let uuid = (await si.blockDevices()).filter(i => i.mount === "/tmp/mistyos-install/sys")[0].uuid;
+ let espUUID = (await si.blockDevices()).filter(i => i.mount === "/tmp/mistyos-install/efi")[0].uuid;
+ let swapUUID = null;
+
+ if (config.format_disk) {
+ swapUUID = (await si.blockDevices()).filter(i => i.name === config.disk.split("/")[2])[0].uuid;
+ }
+
+ console.log(" :: Updating fstab...");
+ fs.writeFileSync("/tmp/mistyos-install/sys/system_a/etc/fstab", fs.readFileSync("/tmp/mistyos-install/sys/system_a/etc/fstab").toString().replace(/^(UUID=)([\da-fA-F]{8}-[\da-fA-F]{4}-[\da-fA-F]{4}-[\da-fA-F]{4}-[\da-fA-F]{12})( \/)( |var|usr|boot|mistyos)(.*)/gm, "$1" + uuid + "$3$4$5").replace(/^(UUID=)([\da-fA-F]{4}-[\da-fA-F]{4})( \/)( |var|usr|boot|mistyos)(.*)/gm, "$1" + espUUID + "$3$4$5"));
+
+ if (swapUUID) {
+ fs.writeFileSync("/tmp/mistyos-install/sys/system_a/etc/fstab", fs.readFileSync("/tmp/mistyos-install/sys/system_a/etc/fstab").toString().replace(/^(UUID=)([\da-fA-F]{8}-[\da-fA-F]{4}-[\da-fA-F]{4}-[\da-fA-F]{4}-[\da-fA-F]{12}) none swap(.*)/gm, "$1" + uuid + " none swap$3"));
+ } else {
+ fs.writeFileSync("/tmp/mistyos-install/sys/system_a/etc/fstab", fs.readFileSync("/tmp/mistyos-install/sys/system_a/etc/fstab").toString().replace(/^(UUID=)([\da-fA-F]{8}-[\da-fA-F]{4}-[\da-fA-F]{4}-[\da-fA-F]{4}-[\da-fA-F]{12}) none swap(.*)/gm, "#$1$2 none swap$3"));
+ }
+
+ console.log(" :: Updated fstab"); step();
+
+ // Boot firmware
+ console.log(" == Reached step: Configuring EFI firmware");
+ console.log("$" + JSON.stringify({ type: "update_step", step: "confefi" }));
+
+ console.log(" :: Downloading boot firmware...");
+ if (!fs.existsSync("/tmp/mistyos-install/efi/EFI")) fs.mkdirSync("/tmp/mistyos-install/efi/EFI");
+ if (!fs.existsSync("/tmp/mistyos-install/efi/EFI/MistyOS")) fs.mkdirSync("/tmp/mistyos-install/efi/EFI/MistyOS");
+ child_process.execFileSync("wget", ["-O", "/tmp/mistyos-install/efi/EFI/MistyOS/mistyboot.efi", "--", "https://static.equestria.horse/mistyos/mistyos-firmware.efi"]);
+ step();
+
+ console.log(" :: Copying kernel...");
+ let kernels = fs.readdirSync("/tmp/mistyos-install/sys/boot").filter(i => i.startsWith("vmlinuz"));
+ let latestKernel = kernels[kernels.length - 1];
+ console.log(" :: from " + latestKernel);
+ if (!fs.existsSync("/tmp/mistyos-install/efi/EFI/MistyOS/base")) fs.mkdirSync("/tmp/mistyos-install/efi/EFI/MistyOS/base");
+ child_process.execFileSync("cp", ["/tmp/mistyos-install/sys/boot/" + latestKernel, "/tmp/mistyos-install/efi/EFI/MistyOS/base/kernel"]);
+ step();
+
+ console.log(" :: Copying initial RAM disk...");
+ let initrds = fs.readdirSync("/tmp/mistyos-install/sys/boot").filter(i => i.startsWith("initramfs"));
+ let latestInit = initrds[initrds.length - 1];
+ console.log(" :: from " + latestInit);
+ child_process.execFileSync("cp", ["/tmp/mistyos-install/sys/boot/" + latestInit, "/tmp/mistyos-install/efi/EFI/MistyOS/base/initrd"]);
+ step();
+
+ console.log(" :: Removing old systemd-boot config...");
+ child_process.execFileSync("rm", ["-rf", "/tmp/mistyos-install/efi/loader"]);
+ console.log(" :: Done"); step();
+
+ console.log(" :: Writing bootloader config...");
+
+ console.log(" :: <folders>");
+ if (!fs.existsSync("/tmp/mistyos-install/efi/loader")) fs.mkdirSync("/tmp/mistyos-install/efi/loader");
+ if (!fs.existsSync("/tmp/mistyos-install/efi/loader/entries")) fs.mkdirSync("/tmp/mistyos-install/efi/loader/entries");
+
+ console.log(" :: loader.conf");
+ fs.writeFileSync("/tmp/mistyos-install/efi/loader/loader.conf", "timeout 3\nconsole-mode keep\ndefault mistyos.conf");
+
+ console.log(" :: mistyos.conf");
+ fs.writeFileSync("/tmp/mistyos-install/efi/loader/entries/mistyos.conf", "title MistyOS " + releaseInfo['version'] + "\nlinux /EFI/MistyOS/base/kernel\ninitrd /EFI/MistyOS/base/initrd\noptions root=UUID=" + uuid + " ro rootflags=subvol=/system_a,ro loglevel=4 init_on_free=1");
+
+ console.log(" :: recovery.conf");
+ fs.writeFileSync("/tmp/mistyos-install/efi/loader/entries/recovery.conf", "title MistyCore Recovery (for MistyOS " + releaseInfo['version'] + ")\nlinux /EFI/MistyOS/base/kernel\ninitrd /EFI/MistyOS/base/initrd\noptions root=UUID=" + uuid + " ro rootflags=subvol=/recovery_a,ro loglevel=4 mistycore.recovery=update");
+
+ console.log(" :: Done configuring bootloader"); step();
+
+ console.log(" :: Adding entry to UEFI menu...");
+ child_process.execFileSync("efibootmgr", ["--create", "--disk", config.disk, "--part", config.esp.substring(config.esp.length - 1, config.esp.length), "--loader", "\\EFI\\MistyOS\\mistyboot.efi", "--label", "MistyOS Startup Firmware", "--unicode"]);
+ console.log(" :: Added entry"); step();
+
+ // Additional permissions
+ console.log(" == Reached step: Additional permissions");
+ console.log("$" + JSON.stringify({ type: "update_step", step: "confexec" }));
+
+ console.log(" :: Getting list of setuid executables...");
+ let setuid = (await axios.get("https://static.equestria.horse/mistyos/setuid.json")).data;
+
+ console.log(" :: Restoring setuid bit...");
+
+ for (let program of setuid) {
+ console.log(" :: " + program);
+ child_process.execFileSync("chmod", ["u+s", "/tmp/mistyos-install/sys/system_a/bin/" + program]);
+ }
+
+ console.log(" :: Restored setuid bit"); step();
+
+ console.log(" :: Getting list of setgid executables...");
+ let setgid = (await axios.get("https://static.equestria.horse/mistyos/setgid.json")).data;
+
+ console.log(" :: Restoring setgid bit...");
+
+ for (let program of setgid) {
+ console.log(" :: " + program);
+ child_process.execFileSync("chmod", ["g+s", "/tmp/mistyos-install/sys/system_a/bin/" + program]);
+ }
+
+ console.log(" :: Restored setgid bit"); step();
+
+ console.log(" :: Getting list of special capabilities...");
+ let caps = (await axios.get("https://static.equestria.horse/mistyos/capabilities.json")).data;
+
+ console.log(" :: Restoring special capabilities...");
+
+ for (let program in caps) {
+ let capabilities = caps[program];
+ console.log(" :: " + program);
+
+ child_process.execFileSync("setcap", [capabilities, "/tmp/mistyos-install/sys/system_a/bin/" + program]);
+ }
+
+ console.log(" :: Restored special capabilities bit"); step();
+
+ console.log(" == Reached step: Reconfigure packages");
+ console.log("$" + JSON.stringify({ type: "update_step", step: "confpack" }));
+
+ console.log(" :: Getting ready to reconfigure...");
+ child_process.execFileSync("mount", ["-o", "bind", "/dev", "/tmp/mistyos-install/sys/system_a/dev"], { stdio: "inherit" });
+ child_process.execFileSync("mount", ["-o", "bind", "/tmp", "/tmp/mistyos-install/sys/system_a/tmp"], { stdio: "inherit" });
+ child_process.execFileSync("mount", ["-o", "bind", "/run", "/tmp/mistyos-install/sys/system_a/run"], { stdio: "inherit" });
+ child_process.execFileSync("mount", ["-o", "bind", "/proc", "/tmp/mistyos-install/sys/system_a/proc"], { stdio: "inherit" });
+ child_process.execFileSync("mount", ["-o", "bind", "/sys", "/tmp/mistyos-install/sys/system_a/sys"], { stdio: "inherit" });
+ child_process.execFileSync("mount", ["-o", "bind", "/tmp/mistyos-install/sys/rw_shared", "/tmp/mistyos-install/sys/system_a/var"], { stdio: "inherit" });
+ child_process.execFileSync("mount", ["-o", "bind", "/tmp/mistyos-install/sys/rw_local", "/tmp/mistyos-install/sys/system_a/usr/local"], { stdio: "inherit" });
+ child_process.execFileSync("mount", ["-o", "bind", "/tmp/mistyos-install/sys/rw_config", "/tmp/mistyos-install/sys/system_a/var/etc"], { stdio: "inherit" });
+ console.log(" :: Ready to reconfigure");
+
+ console.log(" :: Reconfiguring dbus...");
+ child_process.execFileSync("chroot", ["/tmp/mistyos-install/sys/system_a", "xbps-install", "-fy", "dbus"], { stdio: "inherit" });
+ child_process.execFileSync("chroot", ["/tmp/mistyos-install/sys/system_a", "xbps-reconfigure", "-f", "dbus"], { stdio: "inherit" });
+ console.log(" :: Reconfigured dbus"); step();
+
+ console.log(" :: Reconfiguring polkit...");
+ child_process.execFileSync("chroot", ["/tmp/mistyos-install/sys/system_a", "xbps-install", "-fy", "polkit"], { stdio: "inherit" });
+ child_process.execFileSync("chroot", ["/tmp/mistyos-install/sys/system_a", "xbps-reconfigure", "-f", "polkit"], { stdio: "inherit" });
+ console.log(" :: Reconfigured polkit"); step();
+
+ // Region and language
+ console.log(" == Reached step: Configure region and language");
+ console.log("$" + JSON.stringify({ type: "update_step", step: "conflang" }));
+
+ console.log(" :: Configuring system locale...");
+ let lang = require(`/opt/installer/lang/${config.language}`);
+ fs.writeFileSync("/tmp/mistyos-install/sys/system_a/etc/locale.conf", "LANG=" + lang['_system'] + "\nLC_ALL=" + config.locale + "\nLC_CTYPE=" + config.locale + "\nLC_NUMERIC=" + config.locale + "\nLC_TIME=" + config.locale + "\nLC_COLLATE=" + config.locale + "\nLC_MONETARY=" + config.locale + "\nLC_MESSAGES=" + lang['_system'] + "\nLC_PAPER=" + config.locale + "\nLC_NAME=" + config.locale + "\nLC_ADDRESS=" + config.locale + "\nLC_TELEPHONE=" + config.locale + "\nLC_MEASUREMENT=" + config.locale + "\nLC_IDENTIFICATION=" + config.locale);
+ fs.writeFileSync("/tmp/mistyos-install/sys/system_a/etc/skel/.config/plasma-localerc", "[Formats]\nLANG=" + lang['_system'] + "\nLC_ALL=" + config.locale + "\nLC_CTYPE=" + config.locale + "\nLC_NUMERIC=" + config.locale + "\nLC_TIME=" + config.locale + "\nLC_COLLATE=" + config.locale + "\nLC_MONETARY=" + config.locale + "\nLC_MESSAGES=" + lang['_system'] + "\nLC_PAPER=" + config.locale + "\nLC_NAME=" + config.locale + "\nLC_ADDRESS=" + config.locale + "\nLC_TELEPHONE=" + config.locale + "\nLC_MEASUREMENT=" + config.locale + "\nLC_IDENTIFICATION=" + config.locale);
+ step();
+
+ console.log(" :: Configuring keyboard...");
+ let keymap = keymaps[config.keyboard];
+ fs.writeFileSync("/tmp/mistyos-install/sys/system_a/etc/skel/.config/kxkbrc", fs.readFileSync("/tmp/mistyos-install/sys/system_a/etc/skel/.config/kxkbrc").toString().replace(/^LayoutList=(.*)$/gm, "LayoutList=" + keymap["gui"]));
+ fs.writeFileSync("/tmp/mistyos-install/sys/system_a/etc/rc.conf", fs.readFileSync("/tmp/mistyos-install/sys/system_a/etc/rc.conf").toString().replace(/^KEYMAP=(.*)$/gm, "KEYMAP=" + keymap["console"].replace(/(.*)\/(.*).map.gz/gm, "$2")));
+ fs.writeFileSync("/tmp/mistyos-install/sys/system_a/usr/share/sddm/scripts/Xsetup", "#!/bin/sh\nsetxkbmap " + keymap["gui"]);
+ step();
+
+ console.log(" :: Configuring timezone...");
+ fs.unlinkSync("/tmp/mistyos-install/sys/system_a/etc/localtime");
+ child_process.execFileSync("ln", ["-s", "/usr/share/zoneinfo/" + config.timezone, "/tmp/mistyos-install/sys/system_a/etc/localtime"], {stdio: "inherit"});
+ step();
+
+ console.log(" :: Configured region and language");
+
+ // Create user
+ console.log(" == Reached step: Creating initial user");
+ console.log("$" + JSON.stringify({ type: "update_step", step: "user" }));
+
+ console.log(" :: Creating encrypted user home directory rw_users:/" + config.user_name + "...");
+
+ fs.writeFileSync("/tmp/mistyos-install/password.sh", "#!/bin/bash\nprintf \"" + config.user_password + "\"");
+ child_process.execFileSync("chmod", ["+x", "/tmp/mistyos-install/password.sh"], {stdio: "inherit"});
+ fs.mkdirSync("/tmp/mistyos-install/sys/rw_users/container." + config.user_name + ".encrypted");
+ fs.mkdirSync("/tmp/mistyos-install/sys/rw_users/" + config.user_name);
+ child_process.execSync('echo -e "\\n" | encfs --extpass=/tmp/mistyos-install/password.sh /tmp/mistyos-install/sys/rw_users/container.' + config.user_name + '.encrypted /tmp/mistyos-install/sys/rw_users/' + config.user_name);
+
+ for (let file of fs.readdirSync("/tmp/mistyos-install/sys/system_a/etc/skel")) {
+ child_process.execFileSync("cp", ["-rv", "/tmp/mistyos-install/sys/system_a/etc/skel/" + file, "/tmp/mistyos-install/sys/rw_users/" + config.user_name], {stdio: "inherit"});
+ }
+
+ child_process.execFileSync("chown", ["-R", "1000:1000", "/tmp/mistyos-install/sys/rw_users/" + config.user_name], {stdio: "inherit"});
+ child_process.execFileSync("chown", ["-R", "1000:1000", "/tmp/mistyos-install/sys/rw_users/container." + config.user_name + ".encrypted"], {stdio: "inherit"});
+
+ fs.writeFileSync("/tmp/mistyos-install/sys/rw_users/" + config.user_name + "/.local/share/user-places.xbel", fs.readFileSync("/tmp/mistyos-install/sys/rw_users/" + config.user_name + "/.local/share/user-places.xbel").toString().replaceAll("/var/users/mistyos", "/var/users/" + config.user_name));
+
+ console.log(" :: Created user home directory"); step();
+
+ console.log(" :: Adding entry to rw_config:/passwd...");
+ fs.writeFileSync("/tmp/mistyos-install/sys/rw_config/passwd", fs.readFileSync("/tmp/mistyos-install/sys/rw_config/passwd").toString().split("\n").map((i) => {
+ if (i.startsWith("mistyos:")) {
+ return config.user_name + ":x:1000:1000:" + config.user_full.replace(":", "-") + ":/var/users/" + config.user_name + ":/bin/bash";
+ } else {
+ return i;
+ }
+ }).join("\n"));
+ console.log(" :: Added entry"); step();
+
+ console.log(" :: Setting password to rw_config:/shadow...");
+ fs.writeFileSync("/tmp/mistyos-install/sys/rw_config/shadow", fs.readFileSync("/tmp/mistyos-install/sys/rw_config/shadow").toString().split("\n").map((i) => {
+ if (i.startsWith("mistyos:")) {
+ let password = child_process.execSync('echo "' + config.user_password.replace('"', '\\"') + '" | openssl passwd -6 -in -').toString().trim();
+ return config.user_name + ":" + password + ":19295:0:999999:7:::";
+ } else {
+ return i;
+ }
+ }).join("\n"));
+ console.log(" :: Set password"); step();
+
+ console.log(" :: Amending rw_config:/group...");
+ fs.writeFileSync("/tmp/mistyos-install/sys/rw_config/group", fs.readFileSync("/tmp/mistyos-install/sys/rw_config/group").toString().replaceAll("mistyos", config.user_name));
+ console.log(" :: Amended groups"); step();
+
+ console.log(" :: Writing rw_config:/hostname...");
+ fs.writeFileSync("/tmp/mistyos-install/sys/rw_config/hostname", config.hostname);
+ console.log(" :: Done"); step();
+
+ // MistyGuard
+ console.log(" == Reached step: MistyGuard");
+ console.log("$" + JSON.stringify({ type: "update_step", step: "mistyguard" }));
+
+ console.log(" :: Enabling MistyGuard for system_a...");
+ child_process.execFileSync("btrfs", ["property", "set", "-ts", "/tmp/mistyos-install/sys/system_a/", "ro", "true"], { stdio: "inherit" });
+ console.log(" :: Enabled MistyGuard for system_a");
+
+ console.log(" :: Enabling MistyGuard for utils_a...");
+ child_process.execFileSync("btrfs", ["property", "set", "-ts", "/tmp/mistyos-install/sys/utils_a/", "ro", "true"], { stdio: "inherit" });
+ console.log(" :: Enabled MistyGuard for utils_a");
+
+ console.log(" :: Enabling MistyGuard for recovery_a...");
+ child_process.execFileSync("btrfs", ["property", "set", "-ts", "/tmp/mistyos-install/sys/recovery_a/", "ro", "true"], { stdio: "inherit" });
+ console.log(" :: Enabled MistyGuard for recovery_a");
+
+ console.log(" :: Enabling MistyGuard for boot...");
+ child_process.execFileSync("btrfs", ["property", "set", "-ts", "/tmp/mistyos-install/sys/boot/", "ro", "true"], { stdio: "inherit" });
+ console.log(" :: Enabled MistyGuard for boot");
+
+ console.log(" :: Saving MistyGuard state...");
+ fs.writeFileSync("/tmp/mistyos-install/sys/_MistyGuard", "2");
+ fs.writeFileSync("/tmp/mistyos-install/sys/_Language", JSON.stringify({
+ language: config.language,
+ keyboard: config.keyboard
+ }));
+ console.log(" :: Saved MistyGuard state");
+
+ step();
+
+ // Completion
+ console.log(" == Reached step: Installation complete");
+ console.log("$" + JSON.stringify({ type: "update_step", step: "complete" }));
+ })
+})(); \ No newline at end of file
diff --git a/lang/en-it.json b/lang/en-it.json
new file mode 100644
index 0000000..debfd6a
--- /dev/null
+++ b/lang/en-it.json
@@ -0,0 +1,718 @@
+{
+ "_name": "English (Earth)",
+ "_system": "en_GB",
+ "wait": "Just a moment...",
+ "lang": "Press Enter to use this language to install MistyOS",
+ "list": "Use arrow keys to navigate, Enter to select.",
+ "units": {
+ "size": {
+ "b": "byte",
+ "bs": "bytes",
+ "kb": "kilobyte",
+ "kbs": "kilobytes",
+ "mb": "megabyte",
+ "mbs": "megabytes",
+ "gb": "gigabyte",
+ "gbs": "gigabytes",
+ "tb": "terabyte",
+ "tbs": "terabytes"
+ }
+ },
+ "keyboard": {
+ "title": "Keyboard layout",
+ "message": "Select your keyboard layout",
+ "layouts": {
+ "ansi": "ANSI PC QWERTY",
+ "bg": "Bulgarian",
+ "br": "Brazilian",
+ "by": "Belarusian",
+ "ca": "Canadian",
+ "cz": "Czech",
+ "de": "German",
+ "dk": "Danish",
+ "es": "Spanish",
+ "et": "Ethiopian",
+ "fi": "Finish",
+ "gr": "Greek",
+ "ie": "Irish",
+ "il": "Israeli",
+ "is": "Icelandic",
+ "it": "Italian",
+ "jp": "Japanese",
+ "la": "Laotian",
+ "lt": "Lithuanian",
+ "lv": "Latvian",
+ "mk": "Macedonian",
+ "nl": "Dutch",
+ "no": "Norwegian",
+ "pl": "Polish",
+ "pt": "Portuguese",
+ "ro": "Romanian",
+ "ru": "Russian",
+ "se": "Swedish",
+ "sk": "Slovak",
+ "tj": "Tajikistani",
+ "tr": "Turkish",
+ "ua": "Ukrainian",
+ "uk": "British English",
+ "us": "American English",
+ "be": "Belgian",
+ "fr": "French"
+ }
+ },
+ "locale": {
+ "title": "Region",
+ "message": "Select a region to use for formats such as time, numbers, currency."
+ },
+ "timezone": {
+ "title": "Time and date",
+ "message_1": "Select the region of the world you are in.",
+ "message_2": "Select the correct timezone for where you are.",
+ "list": {
+ "Africa/Abidjan": "Abidjan",
+ "Africa/Accra": "Accra",
+ "Africa/Addis_Ababa": "Addis Ababa",
+ "Africa/Algiers": "Algiers",
+ "Africa/Asmara": "Asmara",
+ "Africa/Asmera": "Asmera",
+ "Africa/Bamako": "Bamako",
+ "Africa/Bangui": "Bangui",
+ "Africa/Banjul": "Banjul",
+ "Africa/Bissau": "Bissau",
+ "Africa/Blantyre": "Blantyre",
+ "Africa/Brazzaville": "Brazzaville",
+ "Africa/Bujumbura": "Bujumbura",
+ "Africa/Cairo": "Cairo",
+ "Africa/Casablanca": "Casablanca",
+ "Africa/Ceuta": "Ceuta",
+ "Africa/Conakry": "Conakry",
+ "Africa/Dakar": "Dakar",
+ "Africa/Dar_es_Salaam": "Dar es_Salaam",
+ "Africa/Djibouti": "Djibouti",
+ "Africa/Douala": "Douala",
+ "Africa/El_Aaiun": "El Aaiun",
+ "Africa/Freetown": "Freetown",
+ "Africa/Gaborone": "Gaborone",
+ "Africa/Harare": "Harare",
+ "Africa/Johannesburg": "Johannesburg",
+ "Africa/Juba": "Juba",
+ "Africa/Kampala": "Kampala",
+ "Africa/Khartoum": "Khartoum",
+ "Africa/Kigali": "Kigali",
+ "Africa/Kinshasa": "Kinshasa",
+ "Africa/Lagos": "Lagos",
+ "Africa/Libreville": "Libreville",
+ "Africa/Lome": "Lome",
+ "Africa/Luanda": "Luanda",
+ "Africa/Lubumbashi": "Lubumbashi",
+ "Africa/Lusaka": "Lusaka",
+ "Africa/Malabo": "Malabo",
+ "Africa/Maputo": "Maputo",
+ "Africa/Maseru": "Maseru",
+ "Africa/Mbabane": "Mbabane",
+ "Africa/Mogadishu": "Mogadishu",
+ "Africa/Monrovia": "Monrovia",
+ "Africa/Nairobi": "Nairobi",
+ "Africa/Ndjamena": "Ndjamena",
+ "Africa/Niamey": "Niamey",
+ "Africa/Nouakchott": "Nouakchott",
+ "Africa/Ouagadougou": "Ouagadougou",
+ "Africa/Porto-Novo": "Porto-Novo",
+ "Africa/Sao_Tome": "Sao Tome",
+ "Africa/Timbuktu": "Timbuktu",
+ "Africa/Tripoli": "Tripoli",
+ "Africa/Tunis": "Tunis",
+ "Africa/Windhoek": "Windhoek",
+ "America/Adak": "Adak",
+ "America/Anchorage": "Anchorage",
+ "America/Anguilla": "Anguilla",
+ "America/Antigua": "Antigua",
+ "America/Araguaina": "Araguaina",
+ "America/Argentina": "Argentina",
+ "America/Aruba": "Aruba",
+ "America/Asuncion": "Asuncion",
+ "America/Atikokan": "Atikokan",
+ "America/Atka": "Atka",
+ "America/Bahia": "Bahia",
+ "America/Bahia_Banderas": "Bahia Banderas",
+ "America/Barbados": "Barbados",
+ "America/Belem": "Belem",
+ "America/Belize": "Belize",
+ "America/Blanc-Sablon": "Blanc-Sablon",
+ "America/Boa_Vista": "Boa Vista",
+ "America/Bogota": "Bogota",
+ "America/Boise": "Boise",
+ "America/Buenos_Aires": "Buenos Aires",
+ "America/Cambridge_Bay": "Cambridge Bay",
+ "America/Campo_Grande": "Campo Grande",
+ "America/Cancun": "Cancun",
+ "America/Caracas": "Caracas",
+ "America/Catamarca": "Catamarca",
+ "America/Cayenne": "Cayenne",
+ "America/Cayman": "Cayman",
+ "America/Chicago": "Chicago",
+ "America/Chihuahua": "Chihuahua",
+ "America/Coral_Harbour": "Coral Harbour",
+ "America/Cordoba": "Cordoba",
+ "America/Costa_Rica": "Costa Rica",
+ "America/Creston": "Creston",
+ "America/Cuiaba": "Cuiaba",
+ "America/Curacao": "Curacao",
+ "America/Danmarkshavn": "Danmarkshavn",
+ "America/Dawson": "Dawson",
+ "America/Dawson_Creek": "Dawson Creek",
+ "America/Denver": "Denver",
+ "America/Detroit": "Detroit",
+ "America/Dominica": "Dominica",
+ "America/Edmonton": "Edmonton",
+ "America/Eirunepe": "Eirunepe",
+ "America/El_Salvador": "El Salvador",
+ "America/Ensenada": "Ensenada",
+ "America/Fort_Nelson": "Fort Nelson",
+ "America/Fort_Wayne": "Fort Wayne",
+ "America/Fortaleza": "Fortaleza",
+ "America/Glace_Bay": "Glace Bay",
+ "America/Godthab": "Godthab",
+ "America/Goose_Bay": "Goose Bay",
+ "America/Grand_Turk": "Grand Turk",
+ "America/Grenada": "Grenada",
+ "America/Guadeloupe": "Guadeloupe",
+ "America/Guatemala": "Guatemala",
+ "America/Guayaquil": "Guayaquil",
+ "America/Guyana": "Guyana",
+ "America/Halifax": "Halifax",
+ "America/Havana": "Havana",
+ "America/Hermosillo": "Hermosillo",
+ "America/Indiana": "Indiana",
+ "America/Indianapolis": "Indianapolis",
+ "America/Inuvik": "Inuvik",
+ "America/Iqaluit": "Iqaluit",
+ "America/Jamaica": "Jamaica",
+ "America/Jujuy": "Jujuy",
+ "America/Juneau": "Juneau",
+ "America/Kentucky": "Kentucky",
+ "America/Knox_IN": "Knox IN",
+ "America/Kralendijk": "Kralendijk",
+ "America/La_Paz": "La Paz",
+ "America/Lima": "Lima",
+ "America/Los_Angeles": "Los Angeles",
+ "America/Louisville": "Louisville",
+ "America/Lower_Princes": "Lower Princes",
+ "America/Maceio": "Maceio",
+ "America/Managua": "Managua",
+ "America/Manaus": "Manaus",
+ "America/Marigot": "Marigot",
+ "America/Martinique": "Martinique",
+ "America/Matamoros": "Matamoros",
+ "America/Mazatlan": "Mazatlan",
+ "America/Mendoza": "Mendoza",
+ "America/Menominee": "Menominee",
+ "America/Merida": "Merida",
+ "America/Metlakatla": "Metlakatla",
+ "America/Mexico_City": "Mexico City",
+ "America/Miquelon": "Miquelon",
+ "America/Moncton": "Moncton",
+ "America/Monterrey": "Monterrey",
+ "America/Montevideo": "Montevideo",
+ "America/Montreal": "Montreal",
+ "America/Montserrat": "Montserrat",
+ "America/Nassau": "Nassau",
+ "America/New_York": "New York",
+ "America/Nipigon": "Nipigon",
+ "America/Nome": "Nome",
+ "America/Noronha": "Noronha",
+ "America/North_Dakota": "North Dakota",
+ "America/Nuuk": "Nuuk",
+ "America/Ojinaga": "Ojinaga",
+ "America/Panama": "Panama",
+ "America/Pangnirtung": "Pangnirtung",
+ "America/Paramaribo": "Paramaribo",
+ "America/Phoenix": "Phoenix",
+ "America/Port-au-Prince": "Port-au-Prince",
+ "America/Port_of_Spain": "Port of_Spain",
+ "America/Porto_Acre": "Porto Acre",
+ "America/Porto_Velho": "Porto Velho",
+ "America/Puerto_Rico": "Puerto Rico",
+ "America/Punta_Arenas": "Punta Arenas",
+ "America/Rainy_River": "Rainy River",
+ "America/Rankin_Inlet": "Rankin Inlet",
+ "America/Recife": "Recife",
+ "America/Regina": "Regina",
+ "America/Resolute": "Resolute",
+ "America/Rio_Branco": "Rio Branco",
+ "America/Rosario": "Rosario",
+ "America/Santa_Isabel": "Santa Isabel",
+ "America/Santarem": "Santarem",
+ "America/Santiago": "Santiago",
+ "America/Santo_Domingo": "Santo Domingo",
+ "America/Sao_Paulo": "Sao Paulo",
+ "America/Scoresbysund": "Scoresbysund",
+ "America/Shiprock": "Shiprock",
+ "America/Sitka": "Sitka",
+ "America/St_Barthelemy": "St Barthelemy",
+ "America/St_Johns": "St Johns",
+ "America/St_Kitts": "St Kitts",
+ "America/St_Lucia": "St Lucia",
+ "America/St_Thomas": "St Thomas",
+ "America/St_Vincent": "St Vincent",
+ "America/Swift_Current": "Swift Current",
+ "America/Tegucigalpa": "Tegucigalpa",
+ "America/Thule": "Thule",
+ "America/Thunder_Bay": "Thunder Bay",
+ "America/Tijuana": "Tijuana",
+ "America/Toronto": "Toronto",
+ "America/Tortola": "Tortola",
+ "America/Vancouver": "Vancouver",
+ "America/Virgin": "Virgin",
+ "America/Whitehorse": "Whitehorse",
+ "America/Winnipeg": "Winnipeg",
+ "America/Yakutat": "Yakutat",
+ "America/Yellowknife": "Yellowknife",
+ "Antarctica/Casey": "Casey",
+ "Antarctica/Davis": "Davis",
+ "Antarctica/DumontDUrville": "DumontDUrville",
+ "Antarctica/Macquarie": "Macquarie",
+ "Antarctica/Mawson": "Mawson",
+ "Antarctica/McMurdo": "McMurdo",
+ "Antarctica/Palmer": "Palmer",
+ "Antarctica/Rothera": "Rothera",
+ "Antarctica/South_Pole": "South Pole",
+ "Antarctica/Syowa": "Syowa",
+ "Antarctica/Troll": "Troll",
+ "Antarctica/Vostok": "Vostok",
+ "Arctic/Longyearbyen": "Longyearbyen",
+ "Asia/Aden": "Aden",
+ "Asia/Almaty": "Almaty",
+ "Asia/Amman": "Amman",
+ "Asia/Anadyr": "Anadyr",
+ "Asia/Aqtau": "Aqtau",
+ "Asia/Aqtobe": "Aqtobe",
+ "Asia/Ashgabat": "Ashgabat",
+ "Asia/Ashkhabad": "Ashkhabad",
+ "Asia/Atyrau": "Atyrau",
+ "Asia/Baghdad": "Baghdad",
+ "Asia/Bahrain": "Bahrain",
+ "Asia/Baku": "Baku",
+ "Asia/Bangkok": "Bangkok",
+ "Asia/Barnaul": "Barnaul",
+ "Asia/Beirut": "Beirut",
+ "Asia/Bishkek": "Bishkek",
+ "Asia/Brunei": "Brunei",
+ "Asia/Calcutta": "Calcutta",
+ "Asia/Chita": "Chita",
+ "Asia/Choibalsan": "Choibalsan",
+ "Asia/Chongqing": "Chongqing",
+ "Asia/Chungking": "Chungking",
+ "Asia/Colombo": "Colombo",
+ "Asia/Dacca": "Dacca",
+ "Asia/Damascus": "Damascus",
+ "Asia/Dhaka": "Dhaka",
+ "Asia/Dili": "Dili",
+ "Asia/Dubai": "Dubai",
+ "Asia/Dushanbe": "Dushanbe",
+ "Asia/Famagusta": "Famagusta",
+ "Asia/Gaza": "Gaza",
+ "Asia/Harbin": "Harbin",
+ "Asia/Hebron": "Hebron",
+ "Asia/Ho_Chi_Minh": "Ho Chi_Minh",
+ "Asia/Hong_Kong": "Hong Kong",
+ "Asia/Hovd": "Hovd",
+ "Asia/Irkutsk": "Irkutsk",
+ "Asia/Istanbul": "Istanbul",
+ "Asia/Jakarta": "Jakarta",
+ "Asia/Jayapura": "Jayapura",
+ "Asia/Jerusalem": "Jerusalem",
+ "Asia/Kabul": "Kabul",
+ "Asia/Kamchatka": "Kamchatka",
+ "Asia/Karachi": "Karachi",
+ "Asia/Kashgar": "Kashgar",
+ "Asia/Kathmandu": "Kathmandu",
+ "Asia/Katmandu": "Katmandu",
+ "Asia/Khandyga": "Khandyga",
+ "Asia/Kolkata": "Kolkata",
+ "Asia/Krasnoyarsk": "Krasnoyarsk",
+ "Asia/Kuala_Lumpur": "Kuala Lumpur",
+ "Asia/Kuching": "Kuching",
+ "Asia/Kuwait": "Kuwait",
+ "Asia/Macao": "Macao",
+ "Asia/Macau": "Macau",
+ "Asia/Magadan": "Magadan",
+ "Asia/Makassar": "Makassar",
+ "Asia/Manila": "Manila",
+ "Asia/Muscat": "Muscat",
+ "Asia/Nicosia": "Nicosia",
+ "Asia/Novokuznetsk": "Novokuznetsk",
+ "Asia/Novosibirsk": "Novosibirsk",
+ "Asia/Omsk": "Omsk",
+ "Asia/Oral": "Oral",
+ "Asia/Phnom_Penh": "Phnom Penh",
+ "Asia/Pontianak": "Pontianak",
+ "Asia/Pyongyang": "Pyongyang",
+ "Asia/Qatar": "Qatar",
+ "Asia/Qostanay": "Qostanay",
+ "Asia/Qyzylorda": "Qyzylorda",
+ "Asia/Rangoon": "Rangoon",
+ "Asia/Riyadh": "Riyadh",
+ "Asia/Saigon": "Saigon",
+ "Asia/Sakhalin": "Sakhalin",
+ "Asia/Samarkand": "Samarkand",
+ "Asia/Seoul": "Seoul",
+ "Asia/Shanghai": "Shanghai",
+ "Asia/Singapore": "Singapore",
+ "Asia/Srednekolymsk": "Srednekolymsk",
+ "Asia/Taipei": "Taipei",
+ "Asia/Tashkent": "Tashkent",
+ "Asia/Tbilisi": "Tbilisi",
+ "Asia/Tehran": "Tehran",
+ "Asia/Tel_Aviv": "Tel Aviv",
+ "Asia/Thimbu": "Thimbu",
+ "Asia/Thimphu": "Thimphu",
+ "Asia/Tokyo": "Tokyo",
+ "Asia/Tomsk": "Tomsk",
+ "Asia/Ujung_Pandang": "Ujung Pandang",
+ "Asia/Ulaanbaatar": "Ulaanbaatar",
+ "Asia/Ulan_Bator": "Ulan Bator",
+ "Asia/Urumqi": "Urumqi",
+ "Asia/Ust-Nera": "Ust-Nera",
+ "Asia/Vientiane": "Vientiane",
+ "Asia/Vladivostok": "Vladivostok",
+ "Asia/Yakutsk": "Yakutsk",
+ "Asia/Yangon": "Yangon",
+ "Asia/Yekaterinburg": "Yekaterinburg",
+ "Asia/Yerevan": "Yerevan",
+ "Atlantic/Azores": "Azores",
+ "Atlantic/Bermuda": "Bermuda",
+ "Atlantic/Canary": "Canary",
+ "Atlantic/Cape_Verde": "Cape Verde",
+ "Atlantic/Faeroe": "Faeroe",
+ "Atlantic/Faroe": "Faroe",
+ "Atlantic/Jan_Mayen": "Jan Mayen",
+ "Atlantic/Madeira": "Madeira",
+ "Atlantic/Reykjavik": "Reykjavik",
+ "Atlantic/South_Georgia": "South Georgia",
+ "Atlantic/St_Helena": "St Helena",
+ "Atlantic/Stanley": "Stanley",
+ "Australia/ACT": "ACT",
+ "Australia/Adelaide": "Adelaide",
+ "Australia/Brisbane": "Brisbane",
+ "Australia/Broken_Hill": "Broken Hill",
+ "Australia/Canberra": "Canberra",
+ "Australia/Currie": "Currie",
+ "Australia/Darwin": "Darwin",
+ "Australia/Eucla": "Eucla",
+ "Australia/Hobart": "Hobart",
+ "Australia/LHI": "LHI",
+ "Australia/Lindeman": "Lindeman",
+ "Australia/Lord_Howe": "Lord Howe",
+ "Australia/Melbourne": "Melbourne",
+ "Australia/NSW": "NSW",
+ "Australia/North": "North",
+ "Australia/Perth": "Perth",
+ "Australia/Queensland": "Queensland",
+ "Australia/South": "South",
+ "Australia/Sydney": "Sydney",
+ "Australia/Tasmania": "Tasmania",
+ "Australia/Victoria": "Victoria",
+ "Australia/West": "West",
+ "Australia/Yancowinna": "Yancowinna",
+ "Brazil/Acre": "Acre",
+ "Brazil/DeNoronha": "DeNoronha",
+ "Brazil/East": "East",
+ "Brazil/West": "West",
+ "Canada/Atlantic": "Atlantic",
+ "Canada/Central": "Central",
+ "Canada/Eastern": "Eastern",
+ "Canada/Mountain": "Mountain",
+ "Canada/Newfoundland": "Newfoundland",
+ "Canada/Pacific": "Pacific",
+ "Canada/Saskatchewan": "Saskatchewan",
+ "Canada/Yukon": "Yukon",
+ "Chile/Continental": "Continental",
+ "Chile/EasterIsland": "EasterIsland",
+ "Etc/GMT": "GMT",
+ "Etc/GMT+0": "GMT+0",
+ "Etc/GMT+1": "GMT+1",
+ "Etc/GMT+10": "GMT+10",
+ "Etc/GMT+11": "GMT+11",
+ "Etc/GMT+12": "GMT+12",
+ "Etc/GMT+2": "GMT+2",
+ "Etc/GMT+3": "GMT+3",
+ "Etc/GMT+4": "GMT+4",
+ "Etc/GMT+5": "GMT+5",
+ "Etc/GMT+6": "GMT+6",
+ "Etc/GMT+7": "GMT+7",
+ "Etc/GMT+8": "GMT+8",
+ "Etc/GMT+9": "GMT+9",
+ "Etc/GMT-0": "GMT-0",
+ "Etc/GMT-1": "GMT-1",
+ "Etc/GMT-10": "GMT-10",
+ "Etc/GMT-11": "GMT-11",
+ "Etc/GMT-12": "GMT-12",
+ "Etc/GMT-13": "GMT-13",
+ "Etc/GMT-14": "GMT-14",
+ "Etc/GMT-2": "GMT-2",
+ "Etc/GMT-3": "GMT-3",
+ "Etc/GMT-4": "GMT-4",
+ "Etc/GMT-5": "GMT-5",
+ "Etc/GMT-6": "GMT-6",
+ "Etc/GMT-7": "GMT-7",
+ "Etc/GMT-8": "GMT-8",
+ "Etc/GMT-9": "GMT-9",
+ "Etc/GMT0": "GMT0",
+ "Etc/Greenwich": "Greenwich",
+ "Etc/UCT": "UCT",
+ "Etc/UTC": "UTC",
+ "Etc/Universal": "Universal",
+ "Etc/Zulu": "Zulu",
+ "Europe/Amsterdam": "Amsterdam",
+ "Europe/Andorra": "Andorra",
+ "Europe/Astrakhan": "Astrakhan",
+ "Europe/Athens": "Athens",
+ "Europe/Belfast": "Belfast",
+ "Europe/Belgrade": "Belgrade",
+ "Europe/Berlin": "Berlin",
+ "Europe/Bratislava": "Bratislava",
+ "Europe/Brussels": "Brussels",
+ "Europe/Bucharest": "Bucharest",
+ "Europe/Budapest": "Budapest",
+ "Europe/Busingen": "Busingen",
+ "Europe/Chisinau": "Chisinau",
+ "Europe/Copenhagen": "Copenhagen",
+ "Europe/Dublin": "Dublin",
+ "Europe/Gibraltar": "Gibraltar",
+ "Europe/Guernsey": "Guernsey",
+ "Europe/Helsinki": "Helsinki",
+ "Europe/Isle_of_Man": "Isle of_Man",
+ "Europe/Istanbul": "Istanbul",
+ "Europe/Jersey": "Jersey",
+ "Europe/Kaliningrad": "Kaliningrad",
+ "Europe/Kiev": "Kiev",
+ "Europe/Kirov": "Kirov",
+ "Europe/Kyiv": "Kyiv",
+ "Europe/Lisbon": "Lisbon",
+ "Europe/Ljubljana": "Ljubljana",
+ "Europe/London": "London",
+ "Europe/Luxembourg": "Luxembourg",
+ "Europe/Madrid": "Madrid",
+ "Europe/Malta": "Malta",
+ "Europe/Mariehamn": "Mariehamn",
+ "Europe/Minsk": "Minsk",
+ "Europe/Monaco": "Monaco",
+ "Europe/Moscow": "Moscow",
+ "Europe/Nicosia": "Nicosia",
+ "Europe/Oslo": "Oslo",
+ "Europe/Paris": "Paris",
+ "Europe/Podgorica": "Podgorica",
+ "Europe/Prague": "Prague",
+ "Europe/Riga": "Riga",
+ "Europe/Rome": "Rome",
+ "Europe/Samara": "Samara",
+ "Europe/San_Marino": "San Marino",
+ "Europe/Sarajevo": "Sarajevo",
+ "Europe/Saratov": "Saratov",
+ "Europe/Simferopol": "Simferopol",
+ "Europe/Skopje": "Skopje",
+ "Europe/Sofia": "Sofia",
+ "Europe/Stockholm": "Stockholm",
+ "Europe/Tallinn": "Tallinn",
+ "Europe/Tirane": "Tirane",
+ "Europe/Tiraspol": "Tiraspol",
+ "Europe/Ulyanovsk": "Ulyanovsk",
+ "Europe/Uzhgorod": "Uzhgorod",
+ "Europe/Vaduz": "Vaduz",
+ "Europe/Vatican": "Vatican",
+ "Europe/Vienna": "Vienna",
+ "Europe/Vilnius": "Vilnius",
+ "Europe/Volgograd": "Volgograd",
+ "Europe/Warsaw": "Warsaw",
+ "Europe/Zagreb": "Zagreb",
+ "Europe/Zaporozhye": "Zaporozhye",
+ "Europe/Zurich": "Zurich",
+ "Indian/Antananarivo": "Antananarivo",
+ "Indian/Chagos": "Chagos",
+ "Indian/Christmas": "Christmas",
+ "Indian/Cocos": "Cocos",
+ "Indian/Comoro": "Comoro",
+ "Indian/Kerguelen": "Kerguelen",
+ "Indian/Mahe": "Mahe",
+ "Indian/Maldives": "Maldives",
+ "Indian/Mauritius": "Mauritius",
+ "Indian/Mayotte": "Mayotte",
+ "Indian/Reunion": "Reunion",
+ "Mexico/BajaNorte": "BajaNorte",
+ "Mexico/BajaSur": "BajaSur",
+ "Mexico/General": "General",
+ "Pacific/Apia": "Apia",
+ "Pacific/Auckland": "Auckland",
+ "Pacific/Bougainville": "Bougainville",
+ "Pacific/Chatham": "Chatham",
+ "Pacific/Chuuk": "Chuuk",
+ "Pacific/Easter": "Easter",
+ "Pacific/Efate": "Efate",
+ "Pacific/Enderbury": "Enderbury",
+ "Pacific/Fakaofo": "Fakaofo",
+ "Pacific/Fiji": "Fiji",
+ "Pacific/Funafuti": "Funafuti",
+ "Pacific/Galapagos": "Galapagos",
+ "Pacific/Gambier": "Gambier",
+ "Pacific/Guadalcanal": "Guadalcanal",
+ "Pacific/Guam": "Guam",
+ "Pacific/Honolulu": "Honolulu",
+ "Pacific/Johnston": "Johnston",
+ "Pacific/Kanton": "Kanton",
+ "Pacific/Kiritimati": "Kiritimati",
+ "Pacific/Kosrae": "Kosrae",
+ "Pacific/Kwajalein": "Kwajalein",
+ "Pacific/Majuro": "Majuro",
+ "Pacific/Marquesas": "Marquesas",
+ "Pacific/Midway": "Midway",
+ "Pacific/Nauru": "Nauru",
+ "Pacific/Niue": "Niue",
+ "Pacific/Norfolk": "Norfolk",
+ "Pacific/Noumea": "Noumea",
+ "Pacific/Pago_Pago": "Pago Pago",
+ "Pacific/Palau": "Palau",
+ "Pacific/Pitcairn": "Pitcairn",
+ "Pacific/Pohnpei": "Pohnpei",
+ "Pacific/Ponape": "Ponape",
+ "Pacific/Port_Moresby": "Port Moresby",
+ "Pacific/Rarotonga": "Rarotonga",
+ "Pacific/Saipan": "Saipan",
+ "Pacific/Samoa": "Samoa",
+ "Pacific/Tahiti": "Tahiti",
+ "Pacific/Tarawa": "Tarawa",
+ "Pacific/Tongatapu": "Tongatapu",
+ "Pacific/Truk": "Truk",
+ "Pacific/Wake": "Wake",
+ "Pacific/Wallis": "Wallis",
+ "Pacific/Yap": "Yap",
+ "US/Alaska": "Alaska",
+ "US/Aleutian": "Aleutian",
+ "US/Arizona": "Arizona",
+ "US/Central": "Central",
+ "US/East-Indiana": "East-Indiana",
+ "US/Eastern": "Eastern",
+ "US/Hawaii": "Hawaii",
+ "US/Indiana-Starke": "Indiana-Starke",
+ "US/Michigan": "Michigan",
+ "US/Mountain": "Mountain",
+ "US/Pacific": "Pacific",
+ "US/Samoa": "Samoa"
+ }
+ },
+ "welcome": {
+ "title": "Welcome to MistyOS!",
+ "intro": "MistyOS is a next-generation simple, secure and stable operating system for everyone. Using new technologies, such as the Wayland display server, the Flatpak application layer, or the MistyCore instant rollback technology, MistyOS will make your computer shine bright (sparkle and glow).",
+ "disclaimer": "MistyOS is not affiliated with Hasbro. My Little Pony is a registered trademark of Hasbro. Misty is copyright © Hasbro. MistyOS contains artwork that is © to their respective artists.",
+ "continue": "Start the installation"
+ },
+ "internet": {
+ "title": "Network access",
+ "intro": "To complete the installation, MistyOS needs to be connected to the Internet. Your connection will be used to download and install the system.",
+ "estimate": "Estimated bandwidth usage: 3GB",
+ "message": "Select how you want to connect to the network.",
+ "methods": {
+ "ethernet": {
+ "title": "Ethernet",
+ "message": "Make sure your cable is plugged in before continuing."
+ },
+ "wlan": {
+ "title": "WLAN",
+ "message": "You will be asked to connect to your network."
+ }
+ },
+ "check": "Checking connectivity... This may take a while.",
+ "scan": "Searching for WLAN networks... This may take a while.",
+ "connect": "Connecting to the WLAN network... This may take a while.",
+ "error": {
+ "ethernet": "An error occurred while connecting to the Internet. Make sure the cable is properly plugged in on both sides and that your router is working.",
+ "wlan": "An error occurred while connecting to the Internet. Make sure you are close enough to the network, that the password (if any) is valid and that your router is working.",
+ "wlan_check": "We are able to connect to the WLAN network, but no Internet connection is available. Make sure your router is not blocking requests from this device.",
+ "hardware": "An error occurred while attempting to setup an Internet connection. Make sure your hardware is working. This may indicate an incompatibility between your network card and MistyOS."
+ },
+ "wlan_message": "Select the WLAN network you want to connect to.",
+ "wlan_secure": "Secure",
+ "wlan_open": "Open",
+ "wlan_password": "Enter a password to connect to the network."
+ },
+ "requirements": {
+ "title": "Technical requirements",
+ "intro": "We have checked whether MistyOS can run on this computer or not. The \"minimal\" hardware is a requirement, while the \"recommended\" hardware is suggested to get the best out of MistyOS.",
+ "cpu": "Processor:",
+ "gpu": "Graphics processor:",
+ "dynamic": "dynamic video memory",
+ "battery": "Battery:",
+ "battery_health": "health",
+ "ram": "System memory:",
+ "success": "MistyOS will run on this computer without any issues.",
+ "warning": "MistyOS will run on this computer, but performance may be decreased.",
+ "none": "MistyOS will not run on this computer.",
+ "confirm_yes": "Continue.",
+ "confirm_no": "Continue despite degraded performance."
+ },
+ "disks": {
+ "title": "Disks",
+ "intro": "You now need to select the disk you want to install MistyOS on. Some existing data on this disk may be permanently deleted once you start the installation. If you need advanced partitioning options, you can use an external program and restart the installation later.",
+ "disk": "Select the disk you want to install MistyOS on.",
+ "partition": "Select the partition on % you want to install MistyOS on.",
+ "unknown": "unknown",
+ "small": "This partition is too small for MistyOS",
+ "warning": "WARNING: ALL data on this partition will be PERMANENTLY DELETED. Make sure you backup all important data before the installation. Do you want to continue?",
+ "format": "Format this disk",
+ "format_warning": "WARNING: ALL data on this disk will be PERMANENTLY DELETED. Make sure you backup all important data before the installation. Do you want to continue?",
+ "format_description": "Delete all data on this disk and install MistyOS on the entire disk.",
+ "esp": "Select the partition your computer uses to start up from %.",
+ "esp_small": "This partition is too small to be used for starting up MistyOS",
+ "esp_no": "None (advanced)",
+ "esp_no_description": "Don't use a specific partition for start up. This is for advanced users only.",
+ "systemd": "If this disk is already using the systemd-boot firmware (or MistyBoot or another alternative based on systemd-boot), you won't be able to use systemd-boot with another Linux or MistyOS install. Are you sure you want to continue?"
+ },
+ "user": {
+ "intro": "You now need to enter information for the first user of the installed system. This user will have administrator permissions, which can then be given to other users created at a later time.",
+ "title": "User information",
+ "name": "Enter your full name.",
+ "user": "Enter a user name.",
+ "invalid": "The user name you entered is not valid. A user name can only contain lowercase letters, numbers, and . _ -",
+ "invalid_2": "The computer name you entered is not valid. A computer name can only contain lowercase letters, numbers, and . _ -",
+ "long": "Either your user name, your full name or the system's name is too long. User names are limited to 15 characters, full names are limited to 50 characters, and system names are limited to 100 characters.",
+ "computer": "Enter a system name.",
+ "password_length": "Your password needs to be at least 6 characters long.",
+ "password_different": "The two passwords you entered do not match.",
+ "password_quote": "Your password cannot contain the character \".",
+ "password_1": "Enter a password.",
+ "password_2": "Confirm your password."
+ },
+ "install": {
+ "title": "Installation",
+ "intro": "Downloading installer files... This may take a while.",
+ "start": "Starting installer...",
+ "wait": "MistyOS is now being installed onto this computer, this will take several minutes, please be patient.",
+ "complete": "completed",
+ "installer": "Installing MistyOS",
+ "steps": {
+ "partition": "Partitioning disk",
+ "partsetup": "Configuring partitions",
+ "format": "Formatting partitions",
+ "partupdate": "Updating the partitions list",
+ "formatesp": "Formatting the EFI partition",
+ "partchtype": "Changing partitions types",
+ "btrfscont": "Creating system container",
+ "osdownload": "Downloading MistyOS image",
+ "baseextract": "Preparing to copy files, this may take a while",
+ "copy": "Copying files",
+ "conffstab": "Configuring mounting table",
+ "confefi": "Configuring startup firmware",
+ "confexec": "Configuring system executables",
+ "conflang": "Configuring language and region",
+ "confpack": "Configuring required software",
+ "user": "Creating initial user",
+ "mistyguard": "Installing MistyGuard",
+ "complete": "Installation complete"
+ }
+ },
+ "done": {
+ "title": "Installation complete",
+ "intro": "MistyOS has been successfully installed into this computer. You may now restart your computer to start using MistyOS. Thank you for choosing MistyOS, we hope you enjoy it.",
+ "reboot": "Would you like to restart your computer now?"
+ }
+} \ No newline at end of file
diff --git a/lang/fr.json b/lang/fr.json
new file mode 100644
index 0000000..f36274c
--- /dev/null
+++ b/lang/fr.json
@@ -0,0 +1,718 @@
+{
+ "_name": "français",
+ "_system": "fr_FR",
+ "wait": "Juste un instant...",
+ "lang": "Appuyez sur Entrée pour utiliser cette langue pour installer MistyOS",
+ "list": "Touches fléchées pour naviguer, Entrée pour valider.",
+ "units": {
+ "size": {
+ "b": "octet",
+ "bs": "octets",
+ "kb": "kilo-octet",
+ "kbs": "kilo-octets",
+ "mb": "méga-octet",
+ "mbs": "méga-octets",
+ "gb": "giga-octet",
+ "gbs": "giga-octets",
+ "tb": "téra-octet",
+ "tbs": "téra-octets"
+ }
+ },
+ "keyboard": {
+ "title": "Disposition du clavier",
+ "message": "Sélectionnez votre disposition de clavier",
+ "layouts": {
+ "ansi": "ANSI PC QWERTY",
+ "bg": "Bulgarian",
+ "br": "Brazilian",
+ "by": "Belarusian",
+ "ca": "Canadian",
+ "cz": "Czech",
+ "de": "German",
+ "dk": "Danish",
+ "es": "Spanish",
+ "et": "Ethiopian",
+ "fi": "Finish",
+ "gr": "Greek",
+ "ie": "Irish",
+ "il": "Israeli",
+ "is": "Icelandic",
+ "it": "Italian",
+ "jp": "Japanese",
+ "la": "Laotian",
+ "lt": "Lithuanian",
+ "lv": "Latvian",
+ "mk": "Macedonian",
+ "nl": "Dutch",
+ "no": "Norwegian",
+ "pl": "Polish",
+ "pt": "Portuguese",
+ "ro": "Romanian",
+ "ru": "Russian",
+ "se": "Swedish",
+ "sk": "Slovak",
+ "tj": "Tajikistani",
+ "tr": "Turkish",
+ "ua": "Ukrainian",
+ "uk": "British English",
+ "us": "American English",
+ "be": "Belgian",
+ "fr": "French"
+ }
+ },
+ "locale": {
+ "title": "Zone géographique",
+ "message": "Sélectionnez la zone géographique a utiliser pour les formats tels que l'heure, les nombre et la monnaie."
+ },
+ "timezone": {
+ "title": "Heure et date",
+ "message_1": "Sélectionnez la zone géographique dans laquelle vous êtes.",
+ "message_2": "Sélectionnez le fuseau horaire correspondant à vous.",
+ "list": {
+ "Africa/Abidjan": "Abidjan",
+ "Africa/Accra": "Accra",
+ "Africa/Addis_Ababa": "Addis Ababa",
+ "Africa/Algiers": "Algiers",
+ "Africa/Asmara": "Asmara",
+ "Africa/Asmera": "Asmera",
+ "Africa/Bamako": "Bamako",
+ "Africa/Bangui": "Bangui",
+ "Africa/Banjul": "Banjul",
+ "Africa/Bissau": "Bissau",
+ "Africa/Blantyre": "Blantyre",
+ "Africa/Brazzaville": "Brazzaville",
+ "Africa/Bujumbura": "Bujumbura",
+ "Africa/Cairo": "Cairo",
+ "Africa/Casablanca": "Casablanca",
+ "Africa/Ceuta": "Ceuta",
+ "Africa/Conakry": "Conakry",
+ "Africa/Dakar": "Dakar",
+ "Africa/Dar_es_Salaam": "Dar es_Salaam",
+ "Africa/Djibouti": "Djibouti",
+ "Africa/Douala": "Douala",
+ "Africa/El_Aaiun": "El Aaiun",
+ "Africa/Freetown": "Freetown",
+ "Africa/Gaborone": "Gaborone",
+ "Africa/Harare": "Harare",
+ "Africa/Johannesburg": "Johannesburg",
+ "Africa/Juba": "Juba",
+ "Africa/Kampala": "Kampala",
+ "Africa/Khartoum": "Khartoum",
+ "Africa/Kigali": "Kigali",
+ "Africa/Kinshasa": "Kinshasa",
+ "Africa/Lagos": "Lagos",
+ "Africa/Libreville": "Libreville",
+ "Africa/Lome": "Lome",
+ "Africa/Luanda": "Luanda",
+ "Africa/Lubumbashi": "Lubumbashi",
+ "Africa/Lusaka": "Lusaka",
+ "Africa/Malabo": "Malabo",
+ "Africa/Maputo": "Maputo",
+ "Africa/Maseru": "Maseru",
+ "Africa/Mbabane": "Mbabane",
+ "Africa/Mogadishu": "Mogadishu",
+ "Africa/Monrovia": "Monrovia",
+ "Africa/Nairobi": "Nairobi",
+ "Africa/Ndjamena": "Ndjamena",
+ "Africa/Niamey": "Niamey",
+ "Africa/Nouakchott": "Nouakchott",
+ "Africa/Ouagadougou": "Ouagadougou",
+ "Africa/Porto-Novo": "Porto-Novo",
+ "Africa/Sao_Tome": "Sao Tome",
+ "Africa/Timbuktu": "Timbuktu",
+ "Africa/Tripoli": "Tripoli",
+ "Africa/Tunis": "Tunis",
+ "Africa/Windhoek": "Windhoek",
+ "America/Adak": "Adak",
+ "America/Anchorage": "Anchorage",
+ "America/Anguilla": "Anguilla",
+ "America/Antigua": "Antigua",
+ "America/Araguaina": "Araguaina",
+ "America/Argentina": "Argentina",
+ "America/Aruba": "Aruba",
+ "America/Asuncion": "Asuncion",
+ "America/Atikokan": "Atikokan",
+ "America/Atka": "Atka",
+ "America/Bahia": "Bahia",
+ "America/Bahia_Banderas": "Bahia Banderas",
+ "America/Barbados": "Barbados",
+ "America/Belem": "Belem",
+ "America/Belize": "Belize",
+ "America/Blanc-Sablon": "Blanc-Sablon",
+ "America/Boa_Vista": "Boa Vista",
+ "America/Bogota": "Bogota",
+ "America/Boise": "Boise",
+ "America/Buenos_Aires": "Buenos Aires",
+ "America/Cambridge_Bay": "Cambridge Bay",
+ "America/Campo_Grande": "Campo Grande",
+ "America/Cancun": "Cancun",
+ "America/Caracas": "Caracas",
+ "America/Catamarca": "Catamarca",
+ "America/Cayenne": "Cayenne",
+ "America/Cayman": "Cayman",
+ "America/Chicago": "Chicago",
+ "America/Chihuahua": "Chihuahua",
+ "America/Coral_Harbour": "Coral Harbour",
+ "America/Cordoba": "Cordoba",
+ "America/Costa_Rica": "Costa Rica",
+ "America/Creston": "Creston",
+ "America/Cuiaba": "Cuiaba",
+ "America/Curacao": "Curacao",
+ "America/Danmarkshavn": "Danmarkshavn",
+ "America/Dawson": "Dawson",
+ "America/Dawson_Creek": "Dawson Creek",
+ "America/Denver": "Denver",
+ "America/Detroit": "Detroit",
+ "America/Dominica": "Dominica",
+ "America/Edmonton": "Edmonton",
+ "America/Eirunepe": "Eirunepe",
+ "America/El_Salvador": "El Salvador",
+ "America/Ensenada": "Ensenada",
+ "America/Fort_Nelson": "Fort Nelson",
+ "America/Fort_Wayne": "Fort Wayne",
+ "America/Fortaleza": "Fortaleza",
+ "America/Glace_Bay": "Glace Bay",
+ "America/Godthab": "Godthab",
+ "America/Goose_Bay": "Goose Bay",
+ "America/Grand_Turk": "Grand Turk",
+ "America/Grenada": "Grenada",
+ "America/Guadeloupe": "Guadeloupe",
+ "America/Guatemala": "Guatemala",
+ "America/Guayaquil": "Guayaquil",
+ "America/Guyana": "Guyana",
+ "America/Halifax": "Halifax",
+ "America/Havana": "Havana",
+ "America/Hermosillo": "Hermosillo",
+ "America/Indiana": "Indiana",
+ "America/Indianapolis": "Indianapolis",
+ "America/Inuvik": "Inuvik",
+ "America/Iqaluit": "Iqaluit",
+ "America/Jamaica": "Jamaica",
+ "America/Jujuy": "Jujuy",
+ "America/Juneau": "Juneau",
+ "America/Kentucky": "Kentucky",
+ "America/Knox_IN": "Knox IN",
+ "America/Kralendijk": "Kralendijk",
+ "America/La_Paz": "La Paz",
+ "America/Lima": "Lima",
+ "America/Los_Angeles": "Los Angeles",
+ "America/Louisville": "Louisville",
+ "America/Lower_Princes": "Lower Princes",
+ "America/Maceio": "Maceio",
+ "America/Managua": "Managua",
+ "America/Manaus": "Manaus",
+ "America/Marigot": "Marigot",
+ "America/Martinique": "Martinique",
+ "America/Matamoros": "Matamoros",
+ "America/Mazatlan": "Mazatlan",
+ "America/Mendoza": "Mendoza",
+ "America/Menominee": "Menominee",
+ "America/Merida": "Merida",
+ "America/Metlakatla": "Metlakatla",
+ "America/Mexico_City": "Mexico City",
+ "America/Miquelon": "Miquelon",
+ "America/Moncton": "Moncton",
+ "America/Monterrey": "Monterrey",
+ "America/Montevideo": "Montevideo",
+ "America/Montreal": "Montreal",
+ "America/Montserrat": "Montserrat",
+ "America/Nassau": "Nassau",
+ "America/New_York": "New York",
+ "America/Nipigon": "Nipigon",
+ "America/Nome": "Nome",
+ "America/Noronha": "Noronha",
+ "America/North_Dakota": "North Dakota",
+ "America/Nuuk": "Nuuk",
+ "America/Ojinaga": "Ojinaga",
+ "America/Panama": "Panama",
+ "America/Pangnirtung": "Pangnirtung",
+ "America/Paramaribo": "Paramaribo",
+ "America/Phoenix": "Phoenix",
+ "America/Port-au-Prince": "Port-au-Prince",
+ "America/Port_of_Spain": "Port of_Spain",
+ "America/Porto_Acre": "Porto Acre",
+ "America/Porto_Velho": "Porto Velho",
+ "America/Puerto_Rico": "Puerto Rico",
+ "America/Punta_Arenas": "Punta Arenas",
+ "America/Rainy_River": "Rainy River",
+ "America/Rankin_Inlet": "Rankin Inlet",
+ "America/Recife": "Recife",
+ "America/Regina": "Regina",
+ "America/Resolute": "Resolute",
+ "America/Rio_Branco": "Rio Branco",
+ "America/Rosario": "Rosario",
+ "America/Santa_Isabel": "Santa Isabel",
+ "America/Santarem": "Santarem",
+ "America/Santiago": "Santiago",
+ "America/Santo_Domingo": "Santo Domingo",
+ "America/Sao_Paulo": "Sao Paulo",
+ "America/Scoresbysund": "Scoresbysund",
+ "America/Shiprock": "Shiprock",
+ "America/Sitka": "Sitka",
+ "America/St_Barthelemy": "St Barthelemy",
+ "America/St_Johns": "St Johns",
+ "America/St_Kitts": "St Kitts",
+ "America/St_Lucia": "St Lucia",
+ "America/St_Thomas": "St Thomas",
+ "America/St_Vincent": "St Vincent",
+ "America/Swift_Current": "Swift Current",
+ "America/Tegucigalpa": "Tegucigalpa",
+ "America/Thule": "Thule",
+ "America/Thunder_Bay": "Thunder Bay",
+ "America/Tijuana": "Tijuana",
+ "America/Toronto": "Toronto",
+ "America/Tortola": "Tortola",
+ "America/Vancouver": "Vancouver",
+ "America/Virgin": "Virgin",
+ "America/Whitehorse": "Whitehorse",
+ "America/Winnipeg": "Winnipeg",
+ "America/Yakutat": "Yakutat",
+ "America/Yellowknife": "Yellowknife",
+ "Antarctica/Casey": "Casey",
+ "Antarctica/Davis": "Davis",
+ "Antarctica/DumontDUrville": "DumontDUrville",
+ "Antarctica/Macquarie": "Macquarie",
+ "Antarctica/Mawson": "Mawson",
+ "Antarctica/McMurdo": "McMurdo",
+ "Antarctica/Palmer": "Palmer",
+ "Antarctica/Rothera": "Rothera",
+ "Antarctica/South_Pole": "South Pole",
+ "Antarctica/Syowa": "Syowa",
+ "Antarctica/Troll": "Troll",
+ "Antarctica/Vostok": "Vostok",
+ "Arctic/Longyearbyen": "Longyearbyen",
+ "Asia/Aden": "Aden",
+ "Asia/Almaty": "Almaty",
+ "Asia/Amman": "Amman",
+ "Asia/Anadyr": "Anadyr",
+ "Asia/Aqtau": "Aqtau",
+ "Asia/Aqtobe": "Aqtobe",
+ "Asia/Ashgabat": "Ashgabat",
+ "Asia/Ashkhabad": "Ashkhabad",
+ "Asia/Atyrau": "Atyrau",
+ "Asia/Baghdad": "Baghdad",
+ "Asia/Bahrain": "Bahrain",
+ "Asia/Baku": "Baku",
+ "Asia/Bangkok": "Bangkok",
+ "Asia/Barnaul": "Barnaul",
+ "Asia/Beirut": "Beirut",
+ "Asia/Bishkek": "Bishkek",
+ "Asia/Brunei": "Brunei",
+ "Asia/Calcutta": "Calcutta",
+ "Asia/Chita": "Chita",
+ "Asia/Choibalsan": "Choibalsan",
+ "Asia/Chongqing": "Chongqing",
+ "Asia/Chungking": "Chungking",
+ "Asia/Colombo": "Colombo",
+ "Asia/Dacca": "Dacca",
+ "Asia/Damascus": "Damascus",
+ "Asia/Dhaka": "Dhaka",
+ "Asia/Dili": "Dili",
+ "Asia/Dubai": "Dubai",
+ "Asia/Dushanbe": "Dushanbe",
+ "Asia/Famagusta": "Famagusta",
+ "Asia/Gaza": "Gaza",
+ "Asia/Harbin": "Harbin",
+ "Asia/Hebron": "Hebron",
+ "Asia/Ho_Chi_Minh": "Ho Chi_Minh",
+ "Asia/Hong_Kong": "Hong Kong",
+ "Asia/Hovd": "Hovd",
+ "Asia/Irkutsk": "Irkutsk",
+ "Asia/Istanbul": "Istanbul",
+ "Asia/Jakarta": "Jakarta",
+ "Asia/Jayapura": "Jayapura",
+ "Asia/Jerusalem": "Jerusalem",
+ "Asia/Kabul": "Kabul",
+ "Asia/Kamchatka": "Kamchatka",
+ "Asia/Karachi": "Karachi",
+ "Asia/Kashgar": "Kashgar",
+ "Asia/Kathmandu": "Kathmandu",
+ "Asia/Katmandu": "Katmandu",
+ "Asia/Khandyga": "Khandyga",
+ "Asia/Kolkata": "Kolkata",
+ "Asia/Krasnoyarsk": "Krasnoyarsk",
+ "Asia/Kuala_Lumpur": "Kuala Lumpur",
+ "Asia/Kuching": "Kuching",
+ "Asia/Kuwait": "Kuwait",
+ "Asia/Macao": "Macao",
+ "Asia/Macau": "Macau",
+ "Asia/Magadan": "Magadan",
+ "Asia/Makassar": "Makassar",
+ "Asia/Manila": "Manila",
+ "Asia/Muscat": "Muscat",
+ "Asia/Nicosia": "Nicosia",
+ "Asia/Novokuznetsk": "Novokuznetsk",
+ "Asia/Novosibirsk": "Novosibirsk",
+ "Asia/Omsk": "Omsk",
+ "Asia/Oral": "Oral",
+ "Asia/Phnom_Penh": "Phnom Penh",
+ "Asia/Pontianak": "Pontianak",
+ "Asia/Pyongyang": "Pyongyang",
+ "Asia/Qatar": "Qatar",
+ "Asia/Qostanay": "Qostanay",
+ "Asia/Qyzylorda": "Qyzylorda",
+ "Asia/Rangoon": "Rangoon",
+ "Asia/Riyadh": "Riyadh",
+ "Asia/Saigon": "Saigon",
+ "Asia/Sakhalin": "Sakhalin",
+ "Asia/Samarkand": "Samarkand",
+ "Asia/Seoul": "Seoul",
+ "Asia/Shanghai": "Shanghai",
+ "Asia/Singapore": "Singapore",
+ "Asia/Srednekolymsk": "Srednekolymsk",
+ "Asia/Taipei": "Taipei",
+ "Asia/Tashkent": "Tashkent",
+ "Asia/Tbilisi": "Tbilisi",
+ "Asia/Tehran": "Tehran",
+ "Asia/Tel_Aviv": "Tel Aviv",
+ "Asia/Thimbu": "Thimbu",
+ "Asia/Thimphu": "Thimphu",
+ "Asia/Tokyo": "Tokyo",
+ "Asia/Tomsk": "Tomsk",
+ "Asia/Ujung_Pandang": "Ujung Pandang",
+ "Asia/Ulaanbaatar": "Ulaanbaatar",
+ "Asia/Ulan_Bator": "Ulan Bator",
+ "Asia/Urumqi": "Urumqi",
+ "Asia/Ust-Nera": "Ust-Nera",
+ "Asia/Vientiane": "Vientiane",
+ "Asia/Vladivostok": "Vladivostok",
+ "Asia/Yakutsk": "Yakutsk",
+ "Asia/Yangon": "Yangon",
+ "Asia/Yekaterinburg": "Yekaterinburg",
+ "Asia/Yerevan": "Yerevan",
+ "Atlantic/Azores": "Azores",
+ "Atlantic/Bermuda": "Bermuda",
+ "Atlantic/Canary": "Canary",
+ "Atlantic/Cape_Verde": "Cape Verde",
+ "Atlantic/Faeroe": "Faeroe",
+ "Atlantic/Faroe": "Faroe",
+ "Atlantic/Jan_Mayen": "Jan Mayen",
+ "Atlantic/Madeira": "Madeira",
+ "Atlantic/Reykjavik": "Reykjavik",
+ "Atlantic/South_Georgia": "South Georgia",
+ "Atlantic/St_Helena": "St Helena",
+ "Atlantic/Stanley": "Stanley",
+ "Australia/ACT": "ACT",
+ "Australia/Adelaide": "Adelaide",
+ "Australia/Brisbane": "Brisbane",
+ "Australia/Broken_Hill": "Broken Hill",
+ "Australia/Canberra": "Canberra",
+ "Australia/Currie": "Currie",
+ "Australia/Darwin": "Darwin",
+ "Australia/Eucla": "Eucla",
+ "Australia/Hobart": "Hobart",
+ "Australia/LHI": "LHI",
+ "Australia/Lindeman": "Lindeman",
+ "Australia/Lord_Howe": "Lord Howe",
+ "Australia/Melbourne": "Melbourne",
+ "Australia/NSW": "NSW",
+ "Australia/North": "North",
+ "Australia/Perth": "Perth",
+ "Australia/Queensland": "Queensland",
+ "Australia/South": "South",
+ "Australia/Sydney": "Sydney",
+ "Australia/Tasmania": "Tasmania",
+ "Australia/Victoria": "Victoria",
+ "Australia/West": "West",
+ "Australia/Yancowinna": "Yancowinna",
+ "Brazil/Acre": "Acre",
+ "Brazil/DeNoronha": "DeNoronha",
+ "Brazil/East": "East",
+ "Brazil/West": "West",
+ "Canada/Atlantic": "Atlantic",
+ "Canada/Central": "Central",
+ "Canada/Eastern": "Eastern",
+ "Canada/Mountain": "Mountain",
+ "Canada/Newfoundland": "Newfoundland",
+ "Canada/Pacific": "Pacific",
+ "Canada/Saskatchewan": "Saskatchewan",
+ "Canada/Yukon": "Yukon",
+ "Chile/Continental": "Continental",
+ "Chile/EasterIsland": "EasterIsland",
+ "Etc/GMT": "GMT",
+ "Etc/GMT+0": "GMT+0",
+ "Etc/GMT+1": "GMT+1",
+ "Etc/GMT+10": "GMT+10",
+ "Etc/GMT+11": "GMT+11",
+ "Etc/GMT+12": "GMT+12",
+ "Etc/GMT+2": "GMT+2",
+ "Etc/GMT+3": "GMT+3",
+ "Etc/GMT+4": "GMT+4",
+ "Etc/GMT+5": "GMT+5",
+ "Etc/GMT+6": "GMT+6",
+ "Etc/GMT+7": "GMT+7",
+ "Etc/GMT+8": "GMT+8",
+ "Etc/GMT+9": "GMT+9",
+ "Etc/GMT-0": "GMT-0",
+ "Etc/GMT-1": "GMT-1",
+ "Etc/GMT-10": "GMT-10",
+ "Etc/GMT-11": "GMT-11",
+ "Etc/GMT-12": "GMT-12",
+ "Etc/GMT-13": "GMT-13",
+ "Etc/GMT-14": "GMT-14",
+ "Etc/GMT-2": "GMT-2",
+ "Etc/GMT-3": "GMT-3",
+ "Etc/GMT-4": "GMT-4",
+ "Etc/GMT-5": "GMT-5",
+ "Etc/GMT-6": "GMT-6",
+ "Etc/GMT-7": "GMT-7",
+ "Etc/GMT-8": "GMT-8",
+ "Etc/GMT-9": "GMT-9",
+ "Etc/GMT0": "GMT0",
+ "Etc/Greenwich": "Greenwich",
+ "Etc/UCT": "UCT",
+ "Etc/UTC": "UTC",
+ "Etc/Universal": "Universal",
+ "Etc/Zulu": "Zulu",
+ "Europe/Amsterdam": "Amsterdam",
+ "Europe/Andorra": "Andorra",
+ "Europe/Astrakhan": "Astrakhan",
+ "Europe/Athens": "Athens",
+ "Europe/Belfast": "Belfast",
+ "Europe/Belgrade": "Belgrade",
+ "Europe/Berlin": "Berlin",
+ "Europe/Bratislava": "Bratislava",
+ "Europe/Brussels": "Brussels",
+ "Europe/Bucharest": "Bucharest",
+ "Europe/Budapest": "Budapest",
+ "Europe/Busingen": "Busingen",
+ "Europe/Chisinau": "Chisinau",
+ "Europe/Copenhagen": "Copenhagen",
+ "Europe/Dublin": "Dublin",
+ "Europe/Gibraltar": "Gibraltar",
+ "Europe/Guernsey": "Guernsey",
+ "Europe/Helsinki": "Helsinki",
+ "Europe/Isle_of_Man": "Isle of_Man",
+ "Europe/Istanbul": "Istanbul",
+ "Europe/Jersey": "Jersey",
+ "Europe/Kaliningrad": "Kaliningrad",
+ "Europe/Kiev": "Kiev",
+ "Europe/Kirov": "Kirov",
+ "Europe/Kyiv": "Kyiv",
+ "Europe/Lisbon": "Lisbon",
+ "Europe/Ljubljana": "Ljubljana",
+ "Europe/London": "London",
+ "Europe/Luxembourg": "Luxembourg",
+ "Europe/Madrid": "Madrid",
+ "Europe/Malta": "Malta",
+ "Europe/Mariehamn": "Mariehamn",
+ "Europe/Minsk": "Minsk",
+ "Europe/Monaco": "Monaco",
+ "Europe/Moscow": "Moscow",
+ "Europe/Nicosia": "Nicosia",
+ "Europe/Oslo": "Oslo",
+ "Europe/Paris": "Paris",
+ "Europe/Podgorica": "Podgorica",
+ "Europe/Prague": "Prague",
+ "Europe/Riga": "Riga",
+ "Europe/Rome": "Rome",
+ "Europe/Samara": "Samara",
+ "Europe/San_Marino": "San Marino",
+ "Europe/Sarajevo": "Sarajevo",
+ "Europe/Saratov": "Saratov",
+ "Europe/Simferopol": "Simferopol",
+ "Europe/Skopje": "Skopje",
+ "Europe/Sofia": "Sofia",
+ "Europe/Stockholm": "Stockholm",
+ "Europe/Tallinn": "Tallinn",
+ "Europe/Tirane": "Tirane",
+ "Europe/Tiraspol": "Tiraspol",
+ "Europe/Ulyanovsk": "Ulyanovsk",
+ "Europe/Uzhgorod": "Uzhgorod",
+ "Europe/Vaduz": "Vaduz",
+ "Europe/Vatican": "Vatican",
+ "Europe/Vienna": "Vienna",
+ "Europe/Vilnius": "Vilnius",
+ "Europe/Volgograd": "Volgograd",
+ "Europe/Warsaw": "Warsaw",
+ "Europe/Zagreb": "Zagreb",
+ "Europe/Zaporozhye": "Zaporozhye",
+ "Europe/Zurich": "Zurich",
+ "Indian/Antananarivo": "Antananarivo",
+ "Indian/Chagos": "Chagos",
+ "Indian/Christmas": "Christmas",
+ "Indian/Cocos": "Cocos",
+ "Indian/Comoro": "Comoro",
+ "Indian/Kerguelen": "Kerguelen",
+ "Indian/Mahe": "Mahe",
+ "Indian/Maldives": "Maldives",
+ "Indian/Mauritius": "Mauritius",
+ "Indian/Mayotte": "Mayotte",
+ "Indian/Reunion": "Reunion",
+ "Mexico/BajaNorte": "BajaNorte",
+ "Mexico/BajaSur": "BajaSur",
+ "Mexico/General": "General",
+ "Pacific/Apia": "Apia",
+ "Pacific/Auckland": "Auckland",
+ "Pacific/Bougainville": "Bougainville",
+ "Pacific/Chatham": "Chatham",
+ "Pacific/Chuuk": "Chuuk",
+ "Pacific/Easter": "Easter",
+ "Pacific/Efate": "Efate",
+ "Pacific/Enderbury": "Enderbury",
+ "Pacific/Fakaofo": "Fakaofo",
+ "Pacific/Fiji": "Fiji",
+ "Pacific/Funafuti": "Funafuti",
+ "Pacific/Galapagos": "Galapagos",
+ "Pacific/Gambier": "Gambier",
+ "Pacific/Guadalcanal": "Guadalcanal",
+ "Pacific/Guam": "Guam",
+ "Pacific/Honolulu": "Honolulu",
+ "Pacific/Johnston": "Johnston",
+ "Pacific/Kanton": "Kanton",
+ "Pacific/Kiritimati": "Kiritimati",
+ "Pacific/Kosrae": "Kosrae",
+ "Pacific/Kwajalein": "Kwajalein",
+ "Pacific/Majuro": "Majuro",
+ "Pacific/Marquesas": "Marquesas",
+ "Pacific/Midway": "Midway",
+ "Pacific/Nauru": "Nauru",
+ "Pacific/Niue": "Niue",
+ "Pacific/Norfolk": "Norfolk",
+ "Pacific/Noumea": "Noumea",
+ "Pacific/Pago_Pago": "Pago Pago",
+ "Pacific/Palau": "Palau",
+ "Pacific/Pitcairn": "Pitcairn",
+ "Pacific/Pohnpei": "Pohnpei",
+ "Pacific/Ponape": "Ponape",
+ "Pacific/Port_Moresby": "Port Moresby",
+ "Pacific/Rarotonga": "Rarotonga",
+ "Pacific/Saipan": "Saipan",
+ "Pacific/Samoa": "Samoa",
+ "Pacific/Tahiti": "Tahiti",
+ "Pacific/Tarawa": "Tarawa",
+ "Pacific/Tongatapu": "Tongatapu",
+ "Pacific/Truk": "Truk",
+ "Pacific/Wake": "Wake",
+ "Pacific/Wallis": "Wallis",
+ "Pacific/Yap": "Yap",
+ "US/Alaska": "Alaska",
+ "US/Aleutian": "Aleutian",
+ "US/Arizona": "Arizona",
+ "US/Central": "Central",
+ "US/East-Indiana": "East-Indiana",
+ "US/Eastern": "Eastern",
+ "US/Hawaii": "Hawaii",
+ "US/Indiana-Starke": "Indiana-Starke",
+ "US/Michigan": "Michigan",
+ "US/Mountain": "Mountain",
+ "US/Pacific": "Pacific",
+ "US/Samoa": "Samoa"
+ }
+ },
+ "welcome": {
+ "title": "Bienvenue sur MistyOS !",
+ "intro": "MistyOS est un système d'exploitation pour tous nouvelle génération qui est simple, sécurisé et stable. Utilisant des nouvelles technologies, telles que le serveur d'affichage Wayland, la couche d'application Flatpak, ou la technologie de retour instantané de MistyCore, MistyOS va rendre votre ordinateur brillant.",
+ "disclaimer": "MistyOS n'est pas affilié à Hasbro. My Little Pony est une marque déposée de Hasbro. Misty est copyright © Hasbro. MistyOS contient des œuvres qui sont © à leurs artistes respectifs.",
+ "continue": "Commencer l'installation"
+ },
+ "internet": {
+ "title": "Accès réseau",
+ "intro": "Pour effectuer l'installation, MistyOS nécessite que vous soyez connecté à Internet. Votre connexion sera utilisée pour télécharger et installer le système.",
+ "estimate": "Utilisation de bande passante estimée : 3 Go",
+ "message": "Sélectionnez comment vous voulez vous connecter au réseau.",
+ "methods": {
+ "ethernet": {
+ "title": "Ethernet",
+ "message": "Assurez-vous que le cable est connecté avant de continuer."
+ },
+ "wlan": {
+ "title": "Wi-Fi",
+ "message": "Vous devrez fournir les informations sur votre réseau."
+ }
+ },
+ "check": "Vérification de la connectivité... Cela peut prendre un certain temps.",
+ "scan": "Recherche de réseaux Wi-Fi... Cela peut prendre un certain temps.",
+ "connect": "Connection au réseau Wi-Fi... Cela peut prendre un certain temps.",
+ "error": {
+ "ethernet": "Une erreur s'est produite durant la tentative de connexion à Internet. Assurez-vous que le cable est correctement connecté des deux côtés et que votre routeur est fonctionnel.",
+ "wlan": "Une erreur s'est produite durant la tentative de connexion à Internet. Assurez-vous d'être suffisament proche du point d'accès, que le mot de passe (le cas échéant) est correct et que le routeur est fonctionnel.",
+ "wlan_check": "La connexion au réseau Wi-Fi a réussi, mais aucune connexion Internet n'est disponible. Assurez-vous que le routeur ne bloque pas les requêtes provenant de cet appareil.",
+ "hardware": "Une erreur s'est produite en essayant de configurer votre réseau. Assurez-vous que le matériel est fonctionnel. Cela peut indiquer une incompatibilité entre votre carte réseau et MistyOS."
+ },
+ "wlan_message": "Sélectionnez le réseau Wi-Fi auquel vous connecter.",
+ "wlan_secure": "Sécurisé",
+ "wlan_open": "Ouvert",
+ "wlan_password": "Entrez un mot de passe pour vous connecter au réseau."
+ },
+ "requirements": {
+ "title": "Caractéristiques techniques",
+ "intro": "Nous avons vérifier si MistyOS peut fonctionner sur cet ordinateur. Le matériel \"minimal\" est un prérequis, tandis que le matériel \"recommandé\" est suggéré pour tirer meilleur parti de MistyOS.",
+ "cpu": "Processeur :",
+ "gpu": "Processeur graphique :",
+ "dynamic": "mémoire vidéo dynamique",
+ "battery": "Batterie :",
+ "battery_health": "de capacité",
+ "ram": "Mémoire système :",
+ "success": "MistyOS fonctionnera sur cet ordinateur sans problèmes.",
+ "warning": "MistyOS fonctionnera sur cet ordinateur, mais les performances peuvent être réduites.",
+ "none": "MistyOS ne fonctionnera pas sur cet ordinateur.",
+ "confirm_yes": "Continuer.",
+ "confirm_no": "Continuer malgré les performances réduites."
+ },
+ "disks": {
+ "title": "Disques",
+ "intro": "Vous devez maintenant sélectionner le disque sur lequel installer MistyOS. Certaines données présentes sur ce disque pourront être supprimées de façon irréversible lorsque vous lancez l'installation. Si vous avez besoin d'options de partitionnement avancés, vous pouvez utiliser un outil externe et relancer l'installation plus tard.",
+ "disk": "Sélectionnez le disque sur lequel installer MistyOS.",
+ "partition": "Sélectionnez la partition de % sur laquelle installer MistyOS.",
+ "unknown": "inconnu",
+ "small": "Cette partition est trop petite pour MistyOS",
+ "warning": "ATTENTION : TOUTES les données sur cette partition seront SUPPRIMÉES IRRÉMÉDIABLEMENT. Assurez-vous d'avoir une sauvegarde de toutes les données importantes avant l'installation. Voulez-vous vraiment continuer ?",
+ "format": "Formatter ce disque",
+ "format_warning": "ATTENTION : TOUTES les données sur ce disque seront SUPPRIMÉES IRRÉMÉDIABLEMENT. Assurez-vous d'avoir une sauvegarde de toutes les données importantes avant l'installation. Voulez-vous vraiment continuer ?",
+ "format_description": "Supprimer toutes les données sur le disque et installer MistyOS sur le disque entier.",
+ "esp": "Sélectionnez la partition que votre ordinateur utilise pour démarrer à partir %.",
+ "esp_small": "Cette partition est trop petite pour être utiliser pour démarrer MistyOS",
+ "esp_no": "Aucune (avancée)",
+ "esp_no_description": "Ne pas utiliser de partition spécifique pour le démarrage. Ceci est pour les utilisateurs expérimentés uniquement.",
+ "systemd": "Si le disque utilise déjà le microprogramme systemd-boot (ou MistyBoot ou une autre alternative basée sur systemd-boot), vous ne pourrez plus utiliser systemd-boot avec une autre installation de Linux ou MistyOS. Voulez-vous vraiment continuer ?"
+ },
+ "user": {
+ "intro": "Vous devez maintenant entrer des informations pour créer le premier utilisateur du système installé. Cet utilisateur disposera de permissions administrateur, qui pourront être données à d'autres utilisateurs plus tard.",
+ "title": "Informations utilisateur",
+ "name": "Entrez un nom complet.",
+ "user": "Entrez un nom d'utilisateur.",
+ "invalid": "Le nom d'utilisateur que vous avez entré n'est pas valide. Un nom d'utilisateur ne peut contenir que des lettres minuscules, des nombres, et . _ -",
+ "invalid_2": "Le nom d'ordinateur que vous avez entré n'est pas valide. Un nom d'ordinateur ne peut contenir que des lettres minuscules, des nombres, et . _ -",
+ "long": "Soit votre nom d'utilisateur, nom réel ou nom d'ordinateur est trop long. Les noms d'utilisateur sont limités à 15 caractères, les noms réels sont limités à 50 caractères, et les noms d'ordinateur sont limités à 100 caractères.",
+ "computer": "Entrez un nom d'ordinateur.",
+ "password_length": "Votre mot de passe doit être long d'au moins 6 caractères.",
+ "password_different": "Les deux mots de passes entrés ne correspondent pas.",
+ "password_quote": "Votre mot de passe ne peut pas contenir le caractère \".",
+ "password_1": "Entrez un mot de passe.",
+ "password_2": "Confirmez votre mot de passe."
+ },
+ "install": {
+ "title": "Installation",
+ "intro": "Téléchargement des fichiers d'installation... Cela peut prendre un certain temps.",
+ "start": "Lancement de l'installation...",
+ "wait": "MistyOS est maintenant en cours d'installation sur cet ordinateur, cela va prendre plusieurs minutes, soyez patient.",
+ "complete": "terminé",
+ "installer": "Installation de MistyOS",
+ "steps": {
+ "partition": "Partitionnement du disque",
+ "partsetup": "Configuration des partitions",
+ "format": "Formatage des partitions",
+ "partupdate": "Mise à jour de la liste des partitions",
+ "formatesp": "Formatage de la partition EFI",
+ "partchtype": "Changement des types de partition",
+ "btrfscont": "Création du conteneur système",
+ "osdownload": "Téléchargement de l'image de MistyOS",
+ "baseextract": "Préparation à la copie de fichiers, cela peut prendre un certain temps",
+ "copy": "Copie des fichiers",
+ "conffstab": "Configuration de la table de montage",
+ "confefi": "Configuration du microprogramme de démarrage",
+ "confexec": "Configuration des exécutables systèmes",
+ "conflang": "Configuration des paramètres linguistiques",
+ "confpack": "Configuration du logiciel nécessaire",
+ "user": "Création de l'utilisateur principal",
+ "mistyguard": "Installation de MistyGuard",
+ "complete": "Installation terminée"
+ }
+ },
+ "done": {
+ "title": "Installation terminée",
+ "intro": "MistyOS a été installé sur cet ordinateur avec succès. Vous pouvez maintenant redémarrer ce dernier afin de commencer à utiliser MistyOS. Merci d'avoir choisi MistyOS, nous espérons que vous l'apprécierez.",
+ "reboot": "Voulez-vous redémarrer votre ordinateur maintenant ?"
+ }
+} \ No newline at end of file
diff --git a/locales/keymaps.json b/locales/keymaps.json
new file mode 100644
index 0000000..850c887
--- /dev/null
+++ b/locales/keymaps.json
@@ -0,0 +1,146 @@
+{
+ "ansi": {
+ "console": "qwerty/pc110.map.gz",
+ "gui": "pc"
+ },
+ "bg": {
+ "console": "qwerty/bg_bds-utf8.map.gz",
+ "gui": "bg"
+ },
+ "br": {
+ "console": "qwerty/br-latin1-abnt2.map.gz",
+ "gui": "br"
+ },
+ "by": {
+ "console": "qwerty/by.map.gz",
+ "gui": "by"
+ },
+ "ca": {
+ "console": "qwerty/ca.map.gz",
+ "gui": "ca"
+ },
+ "cz": {
+ "console": "qwerty/cz.map.gz",
+ "gui": "cz"
+ },
+ "de": {
+ "console": "qwertz/de.map.gz",
+ "gui": "de"
+ },
+ "dk": {
+ "console": "qwerty/dk.map.gz",
+ "gui": "dk"
+ },
+ "es": {
+ "console": "qwerty/es.map.gz",
+ "gui": "es"
+ },
+ "fr": {
+ "console": "azerty/fr.map.gz",
+ "gui": "fr"
+ },
+ "be": {
+ "console": "azerty/be-latin1.map.gz",
+ "gui": "be"
+ },
+ "et": {
+ "console": "qwerty/et.map.gz",
+ "gui": "et"
+ },
+ "fi": {
+ "console": "qwerty/fi.map.gz",
+ "gui": "fi"
+ },
+ "gr": {
+ "console": "qwerty/gr-pc.map.gz",
+ "gui": "gr"
+ },
+ "ie": {
+ "console": "qwerty/ie.map.gz",
+ "gui": "ie"
+ },
+ "il": {
+ "console": "qwerty/il.map.gz",
+ "gui": "il"
+ },
+ "is": {
+ "console": "qwerty/is.map.gz",
+ "gui": "is"
+ },
+ "it": {
+ "console": "qwerty/it2.map.gz",
+ "gui": "it"
+ },
+ "jp": {
+ "console": "qwerty/jp106.map.gz",
+ "gui": "jp"
+ },
+ "la": {
+ "console": "qwerty/la-latin1.map.gz",
+ "gui": "la"
+ },
+ "lt": {
+ "console": "qwerty/lt.map.gz",
+ "gui": "lt"
+ },
+ "lv": {
+ "console": "qwerty/lv.map.gz",
+ "gui": "lv"
+ },
+ "mk": {
+ "console": "qwerty/mk.map.gz",
+ "gui": "mk"
+ },
+ "nl": {
+ "console": "qwerty/nl.map.gz",
+ "gui": "nl"
+ },
+ "no": {
+ "console": "qwerty/no.map.gz",
+ "gui": "no"
+ },
+ "pl": {
+ "console": "qwerty/pl.map.gz",
+ "gui": "pl"
+ },
+ "pt": {
+ "console": "qwerty/pt.map.gz",
+ "gui": "pt"
+ },
+ "ro": {
+ "console": "qwerty/ro.map.gz",
+ "gui": "ro"
+ },
+ "ru": {
+ "console": "qwerty/ru.map.gz",
+ "gui": "ru"
+ },
+ "se": {
+ "console": "qwerty/se-lat6.map.gz",
+ "gui": "se"
+ },
+ "sk": {
+ "console": "qwerty/sk-qwerty.map.gz",
+ "gui": "sk"
+ },
+ "tj": {
+ "console": "qwerty/tj_alt-UTF8.map.gz",
+ "gui": "tj"
+ },
+ "tr": {
+ "console": "qwerty/tralt.map.gz",
+ "gui": "tr"
+ },
+ "ua": {
+ "console": "qwerty/ua.map.gz",
+ "gui": "ua"
+ },
+ "uk": {
+ "console": "qwerty/uk.map.gz",
+ "gui": "gb"
+ },
+ "us": {
+ "console": "qwerty/us.map.gz",
+ "gui": "us"
+ }
+} \ No newline at end of file
diff --git a/locales/locales.json b/locales/locales.json
new file mode 100755
index 0000000..5559a31
--- /dev/null
+++ b/locales/locales.json
@@ -0,0 +1,354 @@
+[
+ {
+ "title": "Afrikaans (Suid-Afrika)",
+ "value": "af_ZA"
+ },
+ {
+ "title": "biełaruskaja (Biełaruś)",
+ "value": "be_BY@latin"
+ },
+ {
+ "title": "català (Espanya)",
+ "value": "ca_ES"
+ },
+ {
+ "title": "čeština (Česká republika)",
+ "value": "cs_CZ"
+ },
+ {
+ "title": "dansk (Danmark)",
+ "value": "da_DK"
+ },
+ {
+ "title": "Deutsch (Belgien)",
+ "value": "de_BE"
+ },
+ {
+ "title": "Deutsch (Deutschland)",
+ "value": "de_DE"
+ },
+ {
+ "title": "Deutsch (Italien)",
+ "value": "de_IT"
+ },
+ {
+ "title": "Deutsch (Liechtenstein)",
+ "value": "de_LI"
+ },
+ {
+ "title": "Deutsch (Luxemburg)",
+ "value": "de_LU"
+ },
+ {
+ "title": "Deutsch (Österreich)",
+ "value": "de_AT"
+ },
+ {
+ "title": "Deutsch (Schweiz)",
+ "value": "de_CH"
+ },
+ {
+ "title": "English (Antigua & Barbuda)",
+ "value": "en_AG"
+ },
+ {
+ "title": "English (Australia)",
+ "value": "en_AU"
+ },
+ {
+ "title": "English (Botswana)",
+ "value": "en_BW"
+ },
+ {
+ "title": "English (Canada)",
+ "value": "en_CA"
+ },
+ {
+ "title": "English (Denmark)",
+ "value": "en_DK"
+ },
+ {
+ "title": "English (Hong Kong SAR China)",
+ "value": "en_HK"
+ },
+ {
+ "title": "English (India)",
+ "value": "en_IN"
+ },
+ {
+ "title": "English (Ireland)",
+ "value": "en_IE"
+ },
+ {
+ "title": "English (Israel)",
+ "value": "en_IL"
+ },
+ {
+ "title": "English (New Zealand)",
+ "value": "en_NZ"
+ },
+ {
+ "title": "English (Nigeria)",
+ "value": "en_NG"
+ },
+ {
+ "title": "English (Philippines)",
+ "value": "en_PH"
+ },
+ {
+ "title": "English (Seychelles)",
+ "value": "en_SC"
+ },
+ {
+ "title": "English (Singapore)",
+ "value": "en_SG"
+ },
+ {
+ "title": "English (South Africa)",
+ "value": "en_ZA"
+ },
+ {
+ "title": "English (United Kingdom)",
+ "value": "en_GB"
+ },
+ {
+ "title": "English (United States)",
+ "value": "en_US"
+ },
+ {
+ "title": "English (Zambia)",
+ "value": "en_ZM"
+ },
+ {
+ "title": "English (Zimbabwe)",
+ "value": "en_ZW"
+ },
+ {
+ "title": "español (Argentina)",
+ "value": "es_AR"
+ },
+ {
+ "title": "español (Bolivia)",
+ "value": "es_BO"
+ },
+ {
+ "title": "español (Chile)",
+ "value": "es_CL"
+ },
+ {
+ "title": "español (Colombia)",
+ "value": "es_CO"
+ },
+ {
+ "title": "español (Costa Rica)",
+ "value": "es_CR"
+ },
+ {
+ "title": "español (Cuba)",
+ "value": "es_CU"
+ },
+ {
+ "title": "español (Ecuador)",
+ "value": "es_EC"
+ },
+ {
+ "title": "español (El Salvador)",
+ "value": "es_SV"
+ },
+ {
+ "title": "español (España)",
+ "value": "es_ES"
+ },
+ {
+ "title": "español (Estados Unidos)",
+ "value": "es_US"
+ },
+ {
+ "title": "español (Guatemala)",
+ "value": "es_GT"
+ },
+ {
+ "title": "español (Honduras)",
+ "value": "es_HN"
+ },
+ {
+ "title": "español (México)",
+ "value": "es_MX"
+ },
+ {
+ "title": "español (Nicaragua)",
+ "value": "es_NI"
+ },
+ {
+ "title": "español (Panamá)",
+ "value": "es_PA"
+ },
+ {
+ "title": "español (Paraguay)",
+ "value": "es_PY"
+ },
+ {
+ "title": "español (Perú)",
+ "value": "es_PE"
+ },
+ {
+ "title": "español (Puerto Rico)",
+ "value": "es_PR"
+ },
+ {
+ "title": "español (República Dominicana)",
+ "value": "es_DO"
+ },
+ {
+ "title": "español (Uruguay)",
+ "value": "es_UY"
+ },
+ {
+ "title": "español (Venezuela)",
+ "value": "es_VE"
+ },
+ {
+ "title": "français (Belgique)",
+ "value": "fr_BE"
+ },
+ {
+ "title": "français (Canada)",
+ "value": "fr_CA"
+ },
+ {
+ "title": "français (France)",
+ "value": "fr_FR"
+ },
+ {
+ "title": "français (Luxembourg)",
+ "value": "fr_LU"
+ },
+ {
+ "title": "français (Suisse)",
+ "value": "fr_CH"
+ },
+ {
+ "title": "Indonesia (Indonesia)",
+ "value": "id_ID"
+ },
+ {
+ "title": "italiano (Italia)",
+ "value": "it_IT"
+ },
+ {
+ "title": "italiano (Svizzera)",
+ "value": "it_CH"
+ },
+ {
+ "title": "Nederlands (Aruba)",
+ "value": "nl_AW"
+ },
+ {
+ "title": "Nederlands (België)",
+ "value": "nl_BE"
+ },
+ {
+ "title": "Nederlands (Nederland)",
+ "value": "nl_NL"
+ },
+ {
+ "title": "polski (Polska)",
+ "value": "pl_PL"
+ },
+ {
+ "title": "português (Brasil)",
+ "value": "pt_BR"
+ },
+ {
+ "title": "português (Portugal)",
+ "value": "pt_PT"
+ },
+ {
+ "title": "română (România)",
+ "value": "ro_RO"
+ },
+ {
+ "title": "slovenčina (Slovensko)",
+ "value": "sk_SK"
+ },
+ {
+ "title": "suomi (Suomi)",
+ "value": "fi_FI"
+ },
+ {
+ "title": "svenska (Finland)",
+ "value": "sv_FI"
+ },
+ {
+ "title": "svenska (Sverige)",
+ "value": "sv_SE"
+ },
+ {
+ "title": "Tiếng Việt (Việt Nam)",
+ "value": "vi_VN"
+ },
+ {
+ "title": "Türkçe (Kıbrıs)",
+ "value": "tr_CY"
+ },
+ {
+ "title": "Türkçe (Türkiye)",
+ "value": "tr_TR"
+ },
+ {
+ "title": "Ελληνικά (Ελλάδα)",
+ "value": "el_GR"
+ },
+ {
+ "title": "Ελληνικά (Κύπρος)",
+ "value": "el_CY"
+ },
+ {
+ "title": "беларуская (Беларусь)",
+ "value": "be_BY"
+ },
+ {
+ "title": "русский (Россия)",
+ "value": "ru_RU"
+ },
+ {
+ "title": "русский (Украина)",
+ "value": "ru_UA"
+ },
+ {
+ "title": "українська (Україна)",
+ "value": "uk_UA"
+ },
+ {
+ "title": "हिन्दी (भारत)",
+ "value": "hi_IN"
+ },
+ {
+ "title": "ไทย (ไทย)",
+ "value": "th_TH"
+ },
+ {
+ "title": "한국어 (대한민국)",
+ "value": "ko_KR"
+ },
+ {
+ "title": "中文 (中华人民共和国)",
+ "value": "zh_CN"
+ },
+ {
+ "title": "中文 (中華民國)",
+ "value": "zh_TW"
+ },
+ {
+ "title": "日本語 (日本)",
+ "value": "ja_JP"
+ },
+ {
+ "title": "简体中文 (新加坡)",
+ "value": "zh_SG"
+ },
+ {
+ "title": "繁體中文",
+ "value": "zh_HK"
+ }
+] \ No newline at end of file
diff --git a/locales/timezones.json b/locales/timezones.json
new file mode 100755
index 0000000..2263c5e
--- /dev/null
+++ b/locales/timezones.json
@@ -0,0 +1,531 @@
+[
+ "Africa/Abidjan",
+ "Africa/Accra",
+ "Africa/Addis_Ababa",
+ "Africa/Algiers",
+ "Africa/Asmara",
+ "Africa/Asmera",
+ "Africa/Bamako",
+ "Africa/Bangui",
+ "Africa/Banjul",
+ "Africa/Bissau",
+ "Africa/Blantyre",
+ "Africa/Brazzaville",
+ "Africa/Bujumbura",
+ "Africa/Cairo",
+ "Africa/Casablanca",
+ "Africa/Ceuta",
+ "Africa/Conakry",
+ "Africa/Dakar",
+ "Africa/Dar_es_Salaam",
+ "Africa/Djibouti",
+ "Africa/Douala",
+ "Africa/El_Aaiun",
+ "Africa/Freetown",
+ "Africa/Gaborone",
+ "Africa/Harare",
+ "Africa/Johannesburg",
+ "Africa/Juba",
+ "Africa/Kampala",
+ "Africa/Khartoum",
+ "Africa/Kigali",
+ "Africa/Kinshasa",
+ "Africa/Lagos",
+ "Africa/Libreville",
+ "Africa/Lome",
+ "Africa/Luanda",
+ "Africa/Lubumbashi",
+ "Africa/Lusaka",
+ "Africa/Malabo",
+ "Africa/Maputo",
+ "Africa/Maseru",
+ "Africa/Mbabane",
+ "Africa/Mogadishu",
+ "Africa/Monrovia",
+ "Africa/Nairobi",
+ "Africa/Ndjamena",
+ "Africa/Niamey",
+ "Africa/Nouakchott",
+ "Africa/Ouagadougou",
+ "Africa/Porto-Novo",
+ "Africa/Sao_Tome",
+ "Africa/Timbuktu",
+ "Africa/Tripoli",
+ "Africa/Tunis",
+ "Africa/Windhoek",
+ "America/Adak",
+ "America/Anchorage",
+ "America/Anguilla",
+ "America/Antigua",
+ "America/Araguaina",
+ "America/Argentina",
+ "America/Aruba",
+ "America/Asuncion",
+ "America/Atikokan",
+ "America/Atka",
+ "America/Bahia",
+ "America/Bahia_Banderas",
+ "America/Barbados",
+ "America/Belem",
+ "America/Belize",
+ "America/Blanc-Sablon",
+ "America/Boa_Vista",
+ "America/Bogota",
+ "America/Boise",
+ "America/Buenos_Aires",
+ "America/Cambridge_Bay",
+ "America/Campo_Grande",
+ "America/Cancun",
+ "America/Caracas",
+ "America/Catamarca",
+ "America/Cayenne",
+ "America/Cayman",
+ "America/Chicago",
+ "America/Chihuahua",
+ "America/Coral_Harbour",
+ "America/Cordoba",
+ "America/Costa_Rica",
+ "America/Creston",
+ "America/Cuiaba",
+ "America/Curacao",
+ "America/Danmarkshavn",
+ "America/Dawson",
+ "America/Dawson_Creek",
+ "America/Denver",
+ "America/Detroit",
+ "America/Dominica",
+ "America/Edmonton",
+ "America/Eirunepe",
+ "America/El_Salvador",
+ "America/Ensenada",
+ "America/Fort_Nelson",
+ "America/Fort_Wayne",
+ "America/Fortaleza",
+ "America/Glace_Bay",
+ "America/Godthab",
+ "America/Goose_Bay",
+ "America/Grand_Turk",
+ "America/Grenada",
+ "America/Guadeloupe",
+ "America/Guatemala",
+ "America/Guayaquil",
+ "America/Guyana",
+ "America/Halifax",
+ "America/Havana",
+ "America/Hermosillo",
+ "America/Indiana",
+ "America/Indianapolis",
+ "America/Inuvik",
+ "America/Iqaluit",
+ "America/Jamaica",
+ "America/Jujuy",
+ "America/Juneau",
+ "America/Kentucky",
+ "America/Knox_IN",
+ "America/Kralendijk",
+ "America/La_Paz",
+ "America/Lima",
+ "America/Los_Angeles",
+ "America/Louisville",
+ "America/Lower_Princes",
+ "America/Maceio",
+ "America/Managua",
+ "America/Manaus",
+ "America/Marigot",
+ "America/Martinique",
+ "America/Matamoros",
+ "America/Mazatlan",
+ "America/Mendoza",
+ "America/Menominee",
+ "America/Merida",
+ "America/Metlakatla",
+ "America/Mexico_City",
+ "America/Miquelon",
+ "America/Moncton",
+ "America/Monterrey",
+ "America/Montevideo",
+ "America/Montreal",
+ "America/Montserrat",
+ "America/Nassau",
+ "America/New_York",
+ "America/Nipigon",
+ "America/Nome",
+ "America/Noronha",
+ "America/North_Dakota",
+ "America/Nuuk",
+ "America/Ojinaga",
+ "America/Panama",
+ "America/Pangnirtung",
+ "America/Paramaribo",
+ "America/Phoenix",
+ "America/Port-au-Prince",
+ "America/Port_of_Spain",
+ "America/Porto_Acre",
+ "America/Porto_Velho",
+ "America/Puerto_Rico",
+ "America/Punta_Arenas",
+ "America/Rainy_River",
+ "America/Rankin_Inlet",
+ "America/Recife",
+ "America/Regina",
+ "America/Resolute",
+ "America/Rio_Branco",
+ "America/Rosario",
+ "America/Santa_Isabel",
+ "America/Santarem",
+ "America/Santiago",
+ "America/Santo_Domingo",
+ "America/Sao_Paulo",
+ "America/Scoresbysund",
+ "America/Shiprock",
+ "America/Sitka",
+ "America/St_Barthelemy",
+ "America/St_Johns",
+ "America/St_Kitts",
+ "America/St_Lucia",
+ "America/St_Thomas",
+ "America/St_Vincent",
+ "America/Swift_Current",
+ "America/Tegucigalpa",
+ "America/Thule",
+ "America/Thunder_Bay",
+ "America/Tijuana",
+ "America/Toronto",
+ "America/Tortola",
+ "America/Vancouver",
+ "America/Virgin",
+ "America/Whitehorse",
+ "America/Winnipeg",
+ "America/Yakutat",
+ "America/Yellowknife",
+ "Antarctica/Casey",
+ "Antarctica/Davis",
+ "Antarctica/DumontDUrville",
+ "Antarctica/Macquarie",
+ "Antarctica/Mawson",
+ "Antarctica/McMurdo",
+ "Antarctica/Palmer",
+ "Antarctica/Rothera",
+ "Antarctica/South_Pole",
+ "Antarctica/Syowa",
+ "Antarctica/Troll",
+ "Antarctica/Vostok",
+ "Arctic/Longyearbyen",
+ "Asia/Aden",
+ "Asia/Almaty",
+ "Asia/Amman",
+ "Asia/Anadyr",
+ "Asia/Aqtau",
+ "Asia/Aqtobe",
+ "Asia/Ashgabat",
+ "Asia/Ashkhabad",
+ "Asia/Atyrau",
+ "Asia/Baghdad",
+ "Asia/Bahrain",
+ "Asia/Baku",
+ "Asia/Bangkok",
+ "Asia/Barnaul",
+ "Asia/Beirut",
+ "Asia/Bishkek",
+ "Asia/Brunei",
+ "Asia/Calcutta",
+ "Asia/Chita",
+ "Asia/Choibalsan",
+ "Asia/Chongqing",
+ "Asia/Chungking",
+ "Asia/Colombo",
+ "Asia/Dacca",
+ "Asia/Damascus",
+ "Asia/Dhaka",
+ "Asia/Dili",
+ "Asia/Dubai",
+ "Asia/Dushanbe",
+ "Asia/Famagusta",
+ "Asia/Gaza",
+ "Asia/Harbin",
+ "Asia/Hebron",
+ "Asia/Ho_Chi_Minh",
+ "Asia/Hong_Kong",
+ "Asia/Hovd",
+ "Asia/Irkutsk",
+ "Asia/Istanbul",
+ "Asia/Jakarta",
+ "Asia/Jayapura",
+ "Asia/Jerusalem",
+ "Asia/Kabul",
+ "Asia/Kamchatka",
+ "Asia/Karachi",
+ "Asia/Kashgar",
+ "Asia/Kathmandu",
+ "Asia/Katmandu",
+ "Asia/Khandyga",
+ "Asia/Kolkata",
+ "Asia/Krasnoyarsk",
+ "Asia/Kuala_Lumpur",
+ "Asia/Kuching",
+ "Asia/Kuwait",
+ "Asia/Macao",
+ "Asia/Macau",
+ "Asia/Magadan",
+ "Asia/Makassar",
+ "Asia/Manila",
+ "Asia/Muscat",
+ "Asia/Nicosia",
+ "Asia/Novokuznetsk",
+ "Asia/Novosibirsk",
+ "Asia/Omsk",
+ "Asia/Oral",
+ "Asia/Phnom_Penh",
+ "Asia/Pontianak",
+ "Asia/Pyongyang",
+ "Asia/Qatar",
+ "Asia/Qostanay",
+ "Asia/Qyzylorda",
+ "Asia/Rangoon",
+ "Asia/Riyadh",
+ "Asia/Saigon",
+ "Asia/Sakhalin",
+ "Asia/Samarkand",
+ "Asia/Seoul",
+ "Asia/Shanghai",
+ "Asia/Singapore",
+ "Asia/Srednekolymsk",
+ "Asia/Taipei",
+ "Asia/Tashkent",
+ "Asia/Tbilisi",
+ "Asia/Tehran",
+ "Asia/Tel_Aviv",
+ "Asia/Thimbu",
+ "Asia/Thimphu",
+ "Asia/Tokyo",
+ "Asia/Tomsk",
+ "Asia/Ujung_Pandang",
+ "Asia/Ulaanbaatar",
+ "Asia/Ulan_Bator",
+ "Asia/Urumqi",
+ "Asia/Ust-Nera",
+ "Asia/Vientiane",
+ "Asia/Vladivostok",
+ "Asia/Yakutsk",
+ "Asia/Yangon",
+ "Asia/Yekaterinburg",
+ "Asia/Yerevan",
+ "Atlantic/Azores",
+ "Atlantic/Bermuda",
+ "Atlantic/Canary",
+ "Atlantic/Cape_Verde",
+ "Atlantic/Faeroe",
+ "Atlantic/Faroe",
+ "Atlantic/Jan_Mayen",
+ "Atlantic/Madeira",
+ "Atlantic/Reykjavik",
+ "Atlantic/South_Georgia",
+ "Atlantic/St_Helena",
+ "Atlantic/Stanley",
+ "Australia/ACT",
+ "Australia/Adelaide",
+ "Australia/Brisbane",
+ "Australia/Broken_Hill",
+ "Australia/Canberra",
+ "Australia/Currie",
+ "Australia/Darwin",
+ "Australia/Eucla",
+ "Australia/Hobart",
+ "Australia/LHI",
+ "Australia/Lindeman",
+ "Australia/Lord_Howe",
+ "Australia/Melbourne",
+ "Australia/NSW",
+ "Australia/North",
+ "Australia/Perth",
+ "Australia/Queensland",
+ "Australia/South",
+ "Australia/Sydney",
+ "Australia/Tasmania",
+ "Australia/Victoria",
+ "Australia/West",
+ "Australia/Yancowinna",
+ "Brazil/Acre",
+ "Brazil/DeNoronha",
+ "Brazil/East",
+ "Brazil/West",
+ "Canada/Atlantic",
+ "Canada/Central",
+ "Canada/Eastern",
+ "Canada/Mountain",
+ "Canada/Newfoundland",
+ "Canada/Pacific",
+ "Canada/Saskatchewan",
+ "Canada/Yukon",
+ "Chile/Continental",
+ "Chile/EasterIsland",
+ "Etc/GMT",
+ "Etc/GMT+0",
+ "Etc/GMT+1",
+ "Etc/GMT+10",
+ "Etc/GMT+11",
+ "Etc/GMT+12",
+ "Etc/GMT+2",
+ "Etc/GMT+3",
+ "Etc/GMT+4",
+ "Etc/GMT+5",
+ "Etc/GMT+6",
+ "Etc/GMT+7",
+ "Etc/GMT+8",
+ "Etc/GMT+9",
+ "Etc/GMT-0",
+ "Etc/GMT-1",
+ "Etc/GMT-10",
+ "Etc/GMT-11",
+ "Etc/GMT-12",
+ "Etc/GMT-13",
+ "Etc/GMT-14",
+ "Etc/GMT-2",
+ "Etc/GMT-3",
+ "Etc/GMT-4",
+ "Etc/GMT-5",
+ "Etc/GMT-6",
+ "Etc/GMT-7",
+ "Etc/GMT-8",
+ "Etc/GMT-9",
+ "Etc/GMT0",
+ "Etc/Greenwich",
+ "Etc/UCT",
+ "Etc/UTC",
+ "Etc/Universal",
+ "Etc/Zulu",
+ "Europe/Amsterdam",
+ "Europe/Andorra",
+ "Europe/Astrakhan",
+ "Europe/Athens",
+ "Europe/Belfast",
+ "Europe/Belgrade",
+ "Europe/Berlin",
+ "Europe/Bratislava",
+ "Europe/Brussels",
+ "Europe/Bucharest",
+ "Europe/Budapest",
+ "Europe/Busingen",
+ "Europe/Chisinau",
+ "Europe/Copenhagen",
+ "Europe/Dublin",
+ "Europe/Gibraltar",
+ "Europe/Guernsey",
+ "Europe/Helsinki",
+ "Europe/Isle_of_Man",
+ "Europe/Istanbul",
+ "Europe/Jersey",
+ "Europe/Kaliningrad",
+ "Europe/Kiev",
+ "Europe/Kirov",
+ "Europe/Kyiv",
+ "Europe/Lisbon",
+ "Europe/Ljubljana",
+ "Europe/London",
+ "Europe/Luxembourg",
+ "Europe/Madrid",
+ "Europe/Malta",
+ "Europe/Mariehamn",
+ "Europe/Minsk",
+ "Europe/Monaco",
+ "Europe/Moscow",
+ "Europe/Nicosia",
+ "Europe/Oslo",
+ "Europe/Paris",
+ "Europe/Podgorica",
+ "Europe/Prague",
+ "Europe/Riga",
+ "Europe/Rome",
+ "Europe/Samara",
+ "Europe/San_Marino",
+ "Europe/Sarajevo",
+ "Europe/Saratov",
+ "Europe/Simferopol",
+ "Europe/Skopje",
+ "Europe/Sofia",
+ "Europe/Stockholm",
+ "Europe/Tallinn",
+ "Europe/Tirane",
+ "Europe/Tiraspol",
+ "Europe/Ulyanovsk",
+ "Europe/Uzhgorod",
+ "Europe/Vaduz",
+ "Europe/Vatican",
+ "Europe/Vienna",
+ "Europe/Vilnius",
+ "Europe/Volgograd",
+ "Europe/Warsaw",
+ "Europe/Zagreb",
+ "Europe/Zaporozhye",
+ "Europe/Zurich",
+ "Indian/Antananarivo",
+ "Indian/Chagos",
+ "Indian/Christmas",
+ "Indian/Cocos",
+ "Indian/Comoro",
+ "Indian/Kerguelen",
+ "Indian/Mahe",
+ "Indian/Maldives",
+ "Indian/Mauritius",
+ "Indian/Mayotte",
+ "Indian/Reunion",
+ "Mexico/BajaNorte",
+ "Mexico/BajaSur",
+ "Mexico/General",
+ "Pacific/Apia",
+ "Pacific/Auckland",
+ "Pacific/Bougainville",
+ "Pacific/Chatham",
+ "Pacific/Chuuk",
+ "Pacific/Easter",
+ "Pacific/Efate",
+ "Pacific/Enderbury",
+ "Pacific/Fakaofo",
+ "Pacific/Fiji",
+ "Pacific/Funafuti",
+ "Pacific/Galapagos",
+ "Pacific/Gambier",
+ "Pacific/Guadalcanal",
+ "Pacific/Guam",
+ "Pacific/Honolulu",
+ "Pacific/Johnston",
+ "Pacific/Kanton",
+ "Pacific/Kiritimati",
+ "Pacific/Kosrae",
+ "Pacific/Kwajalein",
+ "Pacific/Majuro",
+ "Pacific/Marquesas",
+ "Pacific/Midway",
+ "Pacific/Nauru",
+ "Pacific/Niue",
+ "Pacific/Norfolk",
+ "Pacific/Noumea",
+ "Pacific/Pago_Pago",
+ "Pacific/Palau",
+ "Pacific/Pitcairn",
+ "Pacific/Pohnpei",
+ "Pacific/Ponape",
+ "Pacific/Port_Moresby",
+ "Pacific/Rarotonga",
+ "Pacific/Saipan",
+ "Pacific/Samoa",
+ "Pacific/Tahiti",
+ "Pacific/Tarawa",
+ "Pacific/Tongatapu",
+ "Pacific/Truk",
+ "Pacific/Wake",
+ "Pacific/Wallis",
+ "Pacific/Yap",
+ "US/Alaska",
+ "US/Aleutian",
+ "US/Arizona",
+ "US/Central",
+ "US/East-Indiana",
+ "US/Eastern",
+ "US/Hawaii",
+ "US/Indiana-Starke",
+ "US/Michigan",
+ "US/Mountain",
+ "US/Pacific",
+ "US/Samoa"
+] \ No newline at end of file
diff --git a/modules/banner.js b/modules/banner.js
new file mode 100644
index 0000000..d7d5230
--- /dev/null
+++ b/modules/banner.js
@@ -0,0 +1,17 @@
+const chalk = require("chalk");
+
+module.exports = (text, versionNumberOnRelease) => {
+ let showVersionNumber = versionNumberOnRelease || unstable;
+
+ console.clear();
+ console.log(chalk.bgMagenta(" ".repeat(process.stdout.columns)));
+
+ if (showVersionNumber) {
+ console.log(chalk.bgMagenta(" " + chalk.white(text + " [mistycore-installer@" + version + "]") + " ".repeat(process.stdout.columns - text.length - version.length - 25)));
+ } else {
+ console.log(chalk.bgMagenta(" " + chalk.white(text) + " ".repeat(process.stdout.columns - text.length - 2)));
+ }
+
+ console.log(chalk.bgMagenta(" ".repeat(process.stdout.columns)));
+ console.log("");
+} \ No newline at end of file
diff --git a/modules/size.js b/modules/size.js
new file mode 100644
index 0000000..9d8a225
--- /dev/null
+++ b/modules/size.js
@@ -0,0 +1,47 @@
+module.exports = (bytes) => {
+ if (bytes > 1024) {
+ if (bytes > 1024**2) {
+ if (bytes > 1024**3) {
+ if (bytes > 1024**4) {
+ let tb = bytes / 1024**4;
+
+ if (tb === 1) {
+ return "1 " + lang["units"]["size"]["tb"];
+ } else {
+ return tb.toFixed(2) + " " + lang["units"]["size"]["tbs"];
+ }
+ } else {
+ let gb = bytes / 1024**3;
+
+ if (gb === 1) {
+ return "1 " + lang["units"]["size"]["gb"];
+ } else {
+ return gb.toFixed(2) + " " + lang["units"]["size"]["gbs"];
+ }
+ }
+ } else {
+ let mb = bytes / 1024**2;
+
+ if (mb === 1) {
+ return "1 " + lang["units"]["size"]["mb"];
+ } else {
+ return mb.toFixed(2) + " " + lang["units"]["size"]["mbs"];
+ }
+ }
+ } else {
+ let kb = bytes / 1024**1;
+
+ if (kb === 1) {
+ return "1 " + lang["units"]["size"]["kb"];
+ } else {
+ return kb.toFixed(2) + " " + lang["units"]["size"]["kbs"];
+ }
+ }
+ } else {
+ if (bytes === 1) {
+ return "1 " + lang["units"]["size"]["b"];
+ } else {
+ return bytes.toFixed(2) + " " + lang["units"]["size"]["bs"];
+ }
+ }
+} \ No newline at end of file
diff --git a/node_modules/.bin/systeminformation b/node_modules/.bin/systeminformation
new file mode 120000
index 0000000..681d01e
--- /dev/null
+++ b/node_modules/.bin/systeminformation
@@ -0,0 +1 @@
+../systeminformation/lib/cli.js \ No newline at end of file
diff --git a/node_modules/.bin/wifi b/node_modules/.bin/wifi
new file mode 120000
index 0000000..c8959c1
--- /dev/null
+++ b/node_modules/.bin/wifi
@@ -0,0 +1 @@
+../node-wifi/bin/wifi.js \ No newline at end of file
diff --git a/node_modules/.package-lock.json b/node_modules/.package-lock.json
new file mode 100644
index 0000000..12a827d
--- /dev/null
+++ b/node_modules/.package-lock.json
@@ -0,0 +1,432 @@
+{
+ "name": "mistyos-installer",
+ "lockfileVersion": 2,
+ "requires": true,
+ "packages": {
+ "node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/array-back": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/array-back/-/array-back-3.1.0.tgz",
+ "integrity": "sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/asynckit": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
+ },
+ "node_modules/axios": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/axios/-/axios-1.1.3.tgz",
+ "integrity": "sha512-00tXVRwKx/FZr/IDVFt4C+f9FYairX517WoGCL6dpOntqLkZofjhu43F/Xl44UOpqa+9sLFDrG/XAnFsUYgkDA==",
+ "dependencies": {
+ "follow-redirects": "^1.15.0",
+ "form-data": "^4.0.0",
+ "proxy-from-env": "^1.1.0"
+ }
+ },
+ "node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+ },
+ "node_modules/combined-stream": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
+ "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+ "dependencies": {
+ "delayed-stream": "~1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/command-line-args": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.2.1.tgz",
+ "integrity": "sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==",
+ "dependencies": {
+ "array-back": "^3.1.0",
+ "find-replace": "^3.0.0",
+ "lodash.camelcase": "^4.3.0",
+ "typical": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=4.0.0"
+ }
+ },
+ "node_modules/command-line-usage": {
+ "version": "6.1.3",
+ "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-6.1.3.tgz",
+ "integrity": "sha512-sH5ZSPr+7UStsloltmDh7Ce5fb8XPlHyoPzTpyyMuYCtervL65+ubVZ6Q61cFtFl62UyJlc8/JwERRbAFPUqgw==",
+ "dependencies": {
+ "array-back": "^4.0.2",
+ "chalk": "^2.4.2",
+ "table-layout": "^1.0.2",
+ "typical": "^5.2.0"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/command-line-usage/node_modules/ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dependencies": {
+ "color-convert": "^1.9.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/command-line-usage/node_modules/array-back": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz",
+ "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/command-line-usage/node_modules/chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "dependencies": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/command-line-usage/node_modules/color-convert": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+ "dependencies": {
+ "color-name": "1.1.3"
+ }
+ },
+ "node_modules/command-line-usage/node_modules/color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="
+ },
+ "node_modules/command-line-usage/node_modules/has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/command-line-usage/node_modules/supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "dependencies": {
+ "has-flag": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/command-line-usage/node_modules/typical": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz",
+ "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/deep-extend": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
+ "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==",
+ "engines": {
+ "node": ">=4.0.0"
+ }
+ },
+ "node_modules/delayed-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+ "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/find-replace": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-3.0.0.tgz",
+ "integrity": "sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==",
+ "dependencies": {
+ "array-back": "^3.0.1"
+ },
+ "engines": {
+ "node": ">=4.0.0"
+ }
+ },
+ "node_modules/follow-redirects": {
+ "version": "1.15.2",
+ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz",
+ "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://github.com/sponsors/RubenVerborgh"
+ }
+ ],
+ "engines": {
+ "node": ">=4.0"
+ },
+ "peerDependenciesMeta": {
+ "debug": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/form-data": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
+ "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
+ "dependencies": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.8",
+ "mime-types": "^2.1.12"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/kleur": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz",
+ "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/lodash.camelcase": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
+ "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA=="
+ },
+ "node_modules/mime-db": {
+ "version": "1.52.0",
+ "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",
+ "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"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/node-wifi": {
+ "version": "2.0.16",
+ "resolved": "https://registry.npmjs.org/node-wifi/-/node-wifi-2.0.16.tgz",
+ "integrity": "sha512-WOgs7kqTvijHij1GLMVW/ReIZHEtcvJuZSMDExEDhBhLquQJPUbBOIsQxavnhJJ06MQnGXnW1qJKe9ADibOTIA==",
+ "dependencies": {
+ "command-line-args": "^5.2.0",
+ "command-line-usage": "^6.1.1"
+ },
+ "bin": {
+ "wifi": "bin/wifi.js"
+ },
+ "engines": {
+ "node": ">=10.0.0"
+ }
+ },
+ "node_modules/prompts": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz",
+ "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==",
+ "dependencies": {
+ "kleur": "^3.0.3",
+ "sisteransi": "^1.0.5"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/proxy-from-env": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
+ "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="
+ },
+ "node_modules/reduce-flatten": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-2.0.0.tgz",
+ "integrity": "sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w==",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/sisteransi": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz",
+ "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg=="
+ },
+ "node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/systeminformation": {
+ "version": "5.12.11",
+ "resolved": "https://registry.npmjs.org/systeminformation/-/systeminformation-5.12.11.tgz",
+ "integrity": "sha512-4N5nT4BFWqRyadTLO8c/t8/gM6wqgg26/WNjjZCS/UU7VuURuBy/pR6Z6+j0nD3ff+zCpX/sdVfyn+EoIg9saQ==",
+ "os": [
+ "darwin",
+ "linux",
+ "win32",
+ "freebsd",
+ "openbsd",
+ "netbsd",
+ "sunos",
+ "android"
+ ],
+ "bin": {
+ "systeminformation": "lib/cli.js"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ },
+ "funding": {
+ "type": "Buy me a coffee",
+ "url": "https://www.buymeacoffee.com/systeminfo"
+ }
+ },
+ "node_modules/table-layout": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-1.0.2.tgz",
+ "integrity": "sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A==",
+ "dependencies": {
+ "array-back": "^4.0.1",
+ "deep-extend": "~0.6.0",
+ "typical": "^5.2.0",
+ "wordwrapjs": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/table-layout/node_modules/array-back": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz",
+ "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/table-layout/node_modules/typical": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz",
+ "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/typical": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/typical/-/typical-4.0.0.tgz",
+ "integrity": "sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/wordwrapjs": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-4.0.1.tgz",
+ "integrity": "sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA==",
+ "dependencies": {
+ "reduce-flatten": "^2.0.0",
+ "typical": "^5.2.0"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/wordwrapjs/node_modules/typical": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz",
+ "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==",
+ "engines": {
+ "node": ">=8"
+ }
+ }
+ }
+}
diff --git a/node_modules/ansi-styles/index.d.ts b/node_modules/ansi-styles/index.d.ts
new file mode 100644
index 0000000..44a907e
--- /dev/null
+++ b/node_modules/ansi-styles/index.d.ts
@@ -0,0 +1,345 @@
+declare type CSSColor =
+ | 'aliceblue'
+ | 'antiquewhite'
+ | 'aqua'
+ | 'aquamarine'
+ | 'azure'
+ | 'beige'
+ | 'bisque'
+ | 'black'
+ | 'blanchedalmond'
+ | 'blue'
+ | 'blueviolet'
+ | 'brown'
+ | 'burlywood'
+ | 'cadetblue'
+ | 'chartreuse'
+ | 'chocolate'
+ | 'coral'
+ | 'cornflowerblue'
+ | 'cornsilk'
+ | 'crimson'
+ | 'cyan'
+ | 'darkblue'
+ | 'darkcyan'
+ | 'darkgoldenrod'
+ | 'darkgray'
+ | 'darkgreen'
+ | 'darkgrey'
+ | 'darkkhaki'
+ | 'darkmagenta'
+ | 'darkolivegreen'
+ | 'darkorange'
+ | 'darkorchid'
+ | 'darkred'
+ | 'darksalmon'
+ | 'darkseagreen'
+ | 'darkslateblue'
+ | 'darkslategray'
+ | 'darkslategrey'
+ | 'darkturquoise'
+ | 'darkviolet'
+ | 'deeppink'
+ | 'deepskyblue'
+ | 'dimgray'
+ | 'dimgrey'
+ | 'dodgerblue'
+ | 'firebrick'
+ | 'floralwhite'
+ | 'forestgreen'
+ | 'fuchsia'
+ | 'gainsboro'
+ | 'ghostwhite'
+ | 'gold'
+ | 'goldenrod'
+ | 'gray'
+ | 'green'
+ | 'greenyellow'
+ | 'grey'
+ | 'honeydew'
+ | 'hotpink'
+ | 'indianred'
+ | 'indigo'
+ | 'ivory'
+ | 'khaki'
+ | 'lavender'
+ | 'lavenderblush'
+ | 'lawngreen'
+ | 'lemonchiffon'
+ | 'lightblue'
+ | 'lightcoral'
+ | 'lightcyan'
+ | 'lightgoldenrodyellow'
+ | 'lightgray'
+ | 'lightgreen'
+ | 'lightgrey'
+ | 'lightpink'
+ | 'lightsalmon'
+ | 'lightseagreen'
+ | 'lightskyblue'
+ | 'lightslategray'
+ | 'lightslategrey'
+ | 'lightsteelblue'
+ | 'lightyellow'
+ | 'lime'
+ | 'limegreen'
+ | 'linen'
+ | 'magenta'
+ | 'maroon'
+ | 'mediumaquamarine'
+ | 'mediumblue'
+ | 'mediumorchid'
+ | 'mediumpurple'
+ | 'mediumseagreen'
+ | 'mediumslateblue'
+ | 'mediumspringgreen'
+ | 'mediumturquoise'
+ | 'mediumvioletred'
+ | 'midnightblue'
+ | 'mintcream'
+ | 'mistyrose'
+ | 'moccasin'
+ | 'navajowhite'
+ | 'navy'
+ | 'oldlace'
+ | 'olive'
+ | 'olivedrab'
+ | 'orange'
+ | 'orangered'
+ | 'orchid'
+ | 'palegoldenrod'
+ | 'palegreen'
+ | 'paleturquoise'
+ | 'palevioletred'
+ | 'papayawhip'
+ | 'peachpuff'
+ | 'peru'
+ | 'pink'
+ | 'plum'
+ | 'powderblue'
+ | 'purple'
+ | 'rebeccapurple'
+ | 'red'
+ | 'rosybrown'
+ | 'royalblue'
+ | 'saddlebrown'
+ | 'salmon'
+ | 'sandybrown'
+ | 'seagreen'
+ | 'seashell'
+ | 'sienna'
+ | 'silver'
+ | 'skyblue'
+ | 'slateblue'
+ | 'slategray'
+ | 'slategrey'
+ | 'snow'
+ | 'springgreen'
+ | 'steelblue'
+ | 'tan'
+ | 'teal'
+ | 'thistle'
+ | 'tomato'
+ | 'turquoise'
+ | 'violet'
+ | 'wheat'
+ | 'white'
+ | 'whitesmoke'
+ | 'yellow'
+ | 'yellowgreen';
+
+declare namespace ansiStyles {
+ interface ColorConvert {
+ /**
+ The RGB color space.
+
+ @param red - (`0`-`255`)
+ @param green - (`0`-`255`)
+ @param blue - (`0`-`255`)
+ */
+ rgb(red: number, green: number, blue: number): string;
+
+ /**
+ The RGB HEX color space.
+
+ @param hex - A hexadecimal string containing RGB data.
+ */
+ hex(hex: string): string;
+
+ /**
+ @param keyword - A CSS color name.
+ */
+ keyword(keyword: CSSColor): string;
+
+ /**
+ The HSL color space.
+
+ @param hue - (`0`-`360`)
+ @param saturation - (`0`-`100`)
+ @param lightness - (`0`-`100`)
+ */
+ hsl(hue: number, saturation: number, lightness: number): string;
+
+ /**
+ The HSV color space.
+
+ @param hue - (`0`-`360`)
+ @param saturation - (`0`-`100`)
+ @param value - (`0`-`100`)
+ */
+ hsv(hue: number, saturation: number, value: number): string;
+
+ /**
+ The HSV color space.
+
+ @param hue - (`0`-`360`)
+ @param whiteness - (`0`-`100`)
+ @param blackness - (`0`-`100`)
+ */
+ hwb(hue: number, whiteness: number, blackness: number): string;
+
+ /**
+ Use a [4-bit unsigned number](https://en.wikipedia.org/wiki/ANSI_escape_code#3/4-bit) to set text color.
+ */
+ ansi(ansi: number): string;
+
+ /**
+ Use an [8-bit unsigned number](https://en.wikipedia.org/wiki/ANSI_escape_code#8-bit) to set text color.
+ */
+ ansi256(ansi: number): string;
+ }
+
+ interface CSPair {
+ /**
+ The ANSI terminal control sequence for starting this style.
+ */
+ readonly open: string;
+
+ /**
+ The ANSI terminal control sequence for ending this style.
+ */
+ readonly close: string;
+ }
+
+ interface ColorBase {
+ readonly ansi: ColorConvert;
+ readonly ansi256: ColorConvert;
+ readonly ansi16m: ColorConvert;
+
+ /**
+ The ANSI terminal control sequence for ending this color.
+ */
+ readonly close: string;
+ }
+
+ interface Modifier {
+ /**
+ Resets the current color chain.
+ */
+ readonly reset: CSPair;
+
+ /**
+ Make text bold.
+ */
+ readonly bold: CSPair;
+
+ /**
+ Emitting only a small amount of light.
+ */
+ readonly dim: CSPair;
+
+ /**
+ Make text italic. (Not widely supported)
+ */
+ readonly italic: CSPair;
+
+ /**
+ Make text underline. (Not widely supported)
+ */
+ readonly underline: CSPair;
+
+ /**
+ Inverse background and foreground colors.
+ */
+ readonly inverse: CSPair;
+
+ /**
+ Prints the text, but makes it invisible.
+ */
+ readonly hidden: CSPair;
+
+ /**
+ Puts a horizontal line through the center of the text. (Not widely supported)
+ */
+ readonly strikethrough: CSPair;
+ }
+
+ interface ForegroundColor {
+ readonly black: CSPair;
+ readonly red: CSPair;
+ readonly green: CSPair;
+ readonly yellow: CSPair;
+ readonly blue: CSPair;
+ readonly cyan: CSPair;
+ readonly magenta: CSPair;
+ readonly white: CSPair;
+
+ /**
+ Alias for `blackBright`.
+ */
+ readonly gray: CSPair;
+
+ /**
+ Alias for `blackBright`.
+ */
+ readonly grey: CSPair;
+
+ readonly blackBright: CSPair;
+ readonly redBright: CSPair;
+ readonly greenBright: CSPair;
+ readonly yellowBright: CSPair;
+ readonly blueBright: CSPair;
+ readonly cyanBright: CSPair;
+ readonly magentaBright: CSPair;
+ readonly whiteBright: CSPair;
+ }
+
+ interface BackgroundColor {
+ readonly bgBlack: CSPair;
+ readonly bgRed: CSPair;
+ readonly bgGreen: CSPair;
+ readonly bgYellow: CSPair;
+ readonly bgBlue: CSPair;
+ readonly bgCyan: CSPair;
+ readonly bgMagenta: CSPair;
+ readonly bgWhite: CSPair;
+
+ /**
+ Alias for `bgBlackBright`.
+ */
+ readonly bgGray: CSPair;
+
+ /**
+ Alias for `bgBlackBright`.
+ */
+ readonly bgGrey: CSPair;
+
+ readonly bgBlackBright: CSPair;
+ readonly bgRedBright: CSPair;
+ readonly bgGreenBright: CSPair;
+ readonly bgYellowBright: CSPair;
+ readonly bgBlueBright: CSPair;
+ readonly bgCyanBright: CSPair;
+ readonly bgMagentaBright: CSPair;
+ readonly bgWhiteBright: CSPair;
+ }
+}
+
+declare const ansiStyles: {
+ readonly modifier: ansiStyles.Modifier;
+ readonly color: ansiStyles.ForegroundColor & ansiStyles.ColorBase;
+ readonly bgColor: ansiStyles.BackgroundColor & ansiStyles.ColorBase;
+ readonly codes: ReadonlyMap<number, number>;
+} & ansiStyles.BackgroundColor & ansiStyles.ForegroundColor & ansiStyles.Modifier;
+
+export = ansiStyles;
diff --git a/node_modules/ansi-styles/index.js b/node_modules/ansi-styles/index.js
new file mode 100644
index 0000000..5d82581
--- /dev/null
+++ b/node_modules/ansi-styles/index.js
@@ -0,0 +1,163 @@
+'use strict';
+
+const wrapAnsi16 = (fn, offset) => (...args) => {
+ const code = fn(...args);
+ return `\u001B[${code + offset}m`;
+};
+
+const wrapAnsi256 = (fn, offset) => (...args) => {
+ const code = fn(...args);
+ return `\u001B[${38 + offset};5;${code}m`;
+};
+
+const wrapAnsi16m = (fn, offset) => (...args) => {
+ const rgb = fn(...args);
+ return `\u001B[${38 + offset};2;${rgb[0]};${rgb[1]};${rgb[2]}m`;
+};
+
+const ansi2ansi = n => n;
+const rgb2rgb = (r, g, b) => [r, g, b];
+
+const setLazyProperty = (object, property, get) => {
+ Object.defineProperty(object, property, {
+ get: () => {
+ const value = get();
+
+ Object.defineProperty(object, property, {
+ value,
+ enumerable: true,
+ configurable: true
+ });
+
+ return value;
+ },
+ enumerable: true,
+ configurable: true
+ });
+};
+
+/** @type {typeof import('color-convert')} */
+let colorConvert;
+const makeDynamicStyles = (wrap, targetSpace, identity, isBackground) => {
+ if (colorConvert === undefined) {
+ colorConvert = require('color-convert');
+ }
+
+ const offset = isBackground ? 10 : 0;
+ const styles = {};
+
+ for (const [sourceSpace, suite] of Object.entries(colorConvert)) {
+ const name = sourceSpace === 'ansi16' ? 'ansi' : sourceSpace;
+ if (sourceSpace === targetSpace) {
+ styles[name] = wrap(identity, offset);
+ } else if (typeof suite === 'object') {
+ styles[name] = wrap(suite[targetSpace], offset);
+ }
+ }
+
+ return styles;
+};
+
+function assembleStyles() {
+ const codes = new Map();
+ const styles = {
+ modifier: {
+ reset: [0, 0],
+ // 21 isn't widely supported and 22 does the same thing
+ bold: [1, 22],
+ dim: [2, 22],
+ italic: [3, 23],
+ underline: [4, 24],
+ inverse: [7, 27],
+ hidden: [8, 28],
+ strikethrough: [9, 29]
+ },
+ color: {
+ black: [30, 39],
+ red: [31, 39],
+ green: [32, 39],
+ yellow: [33, 39],
+ blue: [34, 39],
+ magenta: [35, 39],
+ cyan: [36, 39],
+ white: [37, 39],
+
+ // Bright color
+ blackBright: [90, 39],
+ redBright: [91, 39],
+ greenBright: [92, 39],
+ yellowBright: [93, 39],
+ blueBright: [94, 39],
+ magentaBright: [95, 39],
+ cyanBright: [96, 39],
+ whiteBright: [97, 39]
+ },
+ bgColor: {
+ bgBlack: [40, 49],
+ bgRed: [41, 49],
+ bgGreen: [42, 49],
+ bgYellow: [43, 49],
+ bgBlue: [44, 49],
+ bgMagenta: [45, 49],
+ bgCyan: [46, 49],
+ bgWhite: [47, 49],
+
+ // Bright color
+ bgBlackBright: [100, 49],
+ bgRedBright: [101, 49],
+ bgGreenBright: [102, 49],
+ bgYellowBright: [103, 49],
+ bgBlueBright: [104, 49],
+ bgMagentaBright: [105, 49],
+ bgCyanBright: [106, 49],
+ bgWhiteBright: [107, 49]
+ }
+ };
+
+ // Alias bright black as gray (and grey)
+ styles.color.gray = styles.color.blackBright;
+ styles.bgColor.bgGray = styles.bgColor.bgBlackBright;
+ styles.color.grey = styles.color.blackBright;
+ styles.bgColor.bgGrey = styles.bgColor.bgBlackBright;
+
+ for (const [groupName, group] of Object.entries(styles)) {
+ for (const [styleName, style] of Object.entries(group)) {
+ styles[styleName] = {
+ open: `\u001B[${style[0]}m`,
+ close: `\u001B[${style[1]}m`
+ };
+
+ group[styleName] = styles[styleName];
+
+ codes.set(style[0], style[1]);
+ }
+
+ Object.defineProperty(styles, groupName, {
+ value: group,
+ enumerable: false
+ });
+ }
+
+ Object.defineProperty(styles, 'codes', {
+ value: codes,
+ enumerable: false
+ });
+
+ styles.color.close = '\u001B[39m';
+ styles.bgColor.close = '\u001B[49m';
+
+ setLazyProperty(styles.color, 'ansi', () => makeDynamicStyles(wrapAnsi16, 'ansi16', ansi2ansi, false));
+ setLazyProperty(styles.color, 'ansi256', () => makeDynamicStyles(wrapAnsi256, 'ansi256', ansi2ansi, false));
+ setLazyProperty(styles.color, 'ansi16m', () => makeDynamicStyles(wrapAnsi16m, 'rgb', rgb2rgb, false));
+ setLazyProperty(styles.bgColor, 'ansi', () => makeDynamicStyles(wrapAnsi16, 'ansi16', ansi2ansi, true));
+ setLazyProperty(styles.bgColor, 'ansi256', () => makeDynamicStyles(wrapAnsi256, 'ansi256', ansi2ansi, true));
+ setLazyProperty(styles.bgColor, 'ansi16m', () => makeDynamicStyles(wrapAnsi16m, 'rgb', rgb2rgb, true));
+
+ return styles;
+}
+
+// Make the export immutable
+Object.defineProperty(module, 'exports', {
+ enumerable: true,
+ get: assembleStyles
+});
diff --git a/node_modules/ansi-styles/license b/node_modules/ansi-styles/license
new file mode 100644
index 0000000..e7af2f7
--- /dev/null
+++ b/node_modules/ansi-styles/license
@@ -0,0 +1,9 @@
+MIT License
+
+Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/node_modules/ansi-styles/package.json b/node_modules/ansi-styles/package.json
new file mode 100644
index 0000000..7539328
--- /dev/null
+++ b/node_modules/ansi-styles/package.json
@@ -0,0 +1,56 @@
+{
+ "name": "ansi-styles",
+ "version": "4.3.0",
+ "description": "ANSI escape codes for styling strings in the terminal",
+ "license": "MIT",
+ "repository": "chalk/ansi-styles",
+ "funding": "https://github.com/chalk/ansi-styles?sponsor=1",
+ "author": {
+ "name": "Sindre Sorhus",
+ "email": "sindresorhus@gmail.com",
+ "url": "sindresorhus.com"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "scripts": {
+ "test": "xo && ava && tsd",
+ "screenshot": "svg-term --command='node screenshot' --out=screenshot.svg --padding=3 --width=55 --height=3 --at=1000 --no-cursor"
+ },
+ "files": [
+ "index.js",
+ "index.d.ts"
+ ],
+ "keywords": [
+ "ansi",
+ "styles",
+ "color",
+ "colour",
+ "colors",
+ "terminal",
+ "console",
+ "cli",
+ "string",
+ "tty",
+ "escape",
+ "formatting",
+ "rgb",
+ "256",
+ "shell",
+ "xterm",
+ "log",
+ "logging",
+ "command-line",
+ "text"
+ ],
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "devDependencies": {
+ "@types/color-convert": "^1.9.0",
+ "ava": "^2.3.0",
+ "svg-term-cli": "^2.1.1",
+ "tsd": "^0.11.0",
+ "xo": "^0.25.3"
+ }
+}
diff --git a/node_modules/ansi-styles/readme.md b/node_modules/ansi-styles/readme.md
new file mode 100644
index 0000000..24883de
--- /dev/null
+++ b/node_modules/ansi-styles/readme.md
@@ -0,0 +1,152 @@
+# ansi-styles [![Build Status](https://travis-ci.org/chalk/ansi-styles.svg?branch=master)](https://travis-ci.org/chalk/ansi-styles)
+
+> [ANSI escape codes](https://en.wikipedia.org/wiki/ANSI_escape_code#Colors_and_Styles) for styling strings in the terminal
+
+You probably want the higher-level [chalk](https://github.com/chalk/chalk) module for styling your strings.
+
+<img src="screenshot.svg" width="900">
+
+## Install
+
+```
+$ npm install ansi-styles
+```
+
+## Usage
+
+```js
+const style = require('ansi-styles');
+
+console.log(`${style.green.open}Hello world!${style.green.close}`);
+
+
+// Color conversion between 16/256/truecolor
+// NOTE: If conversion goes to 16 colors or 256 colors, the original color
+// may be degraded to fit that color palette. This means terminals
+// that do not support 16 million colors will best-match the
+// original color.
+console.log(style.bgColor.ansi.hsl(120, 80, 72) + 'Hello world!' + style.bgColor.close);
+console.log(style.color.ansi256.rgb(199, 20, 250) + 'Hello world!' + style.color.close);
+console.log(style.color.ansi16m.hex('#abcdef') + 'Hello world!' + style.color.close);
+```
+
+## API
+
+Each style has an `open` and `close` property.
+
+## Styles
+
+### Modifiers
+
+- `reset`
+- `bold`
+- `dim`
+- `italic` *(Not widely supported)*
+- `underline`
+- `inverse`
+- `hidden`
+- `strikethrough` *(Not widely supported)*
+
+### Colors
+
+- `black`
+- `red`
+- `green`
+- `yellow`
+- `blue`
+- `magenta`
+- `cyan`
+- `white`
+- `blackBright` (alias: `gray`, `grey`)
+- `redBright`
+- `greenBright`
+- `yellowBright`
+- `blueBright`
+- `magentaBright`
+- `cyanBright`
+- `whiteBright`
+
+### Background colors
+
+- `bgBlack`
+- `bgRed`
+- `bgGreen`
+- `bgYellow`
+- `bgBlue`
+- `bgMagenta`
+- `bgCyan`
+- `bgWhite`
+- `bgBlackBright` (alias: `bgGray`, `bgGrey`)
+- `bgRedBright`
+- `bgGreenBright`
+- `bgYellowBright`
+- `bgBlueBright`
+- `bgMagentaBright`
+- `bgCyanBright`
+- `bgWhiteBright`
+
+## Advanced usage
+
+By default, you get a map of styles, but the styles are also available as groups. They are non-enumerable so they don't show up unless you access them explicitly. This makes it easier to expose only a subset in a higher-level module.
+
+- `style.modifier`
+- `style.color`
+- `style.bgColor`
+
+###### Example
+
+```js
+console.log(style.color.green.open);
+```
+
+Raw escape codes (i.e. without the CSI escape prefix `\u001B[` and render mode postfix `m`) are available under `style.codes`, which returns a `Map` with the open codes as keys and close codes as values.
+
+###### Example
+
+```js
+console.log(style.codes.get(36));
+//=> 39
+```
+
+## [256 / 16 million (TrueColor) support](https://gist.github.com/XVilka/8346728)
+
+`ansi-styles` uses the [`color-convert`](https://github.com/Qix-/color-convert) package to allow for converting between various colors and ANSI escapes, with support for 256 and 16 million colors.
+
+The following color spaces from `color-convert` are supported:
+
+- `rgb`
+- `hex`
+- `keyword`
+- `hsl`
+- `hsv`
+- `hwb`
+- `ansi`
+- `ansi256`
+
+To use these, call the associated conversion function with the intended output, for example:
+
+```js
+style.color.ansi.rgb(100, 200, 15); // RGB to 16 color ansi foreground code
+style.bgColor.ansi.rgb(100, 200, 15); // RGB to 16 color ansi background code
+
+style.color.ansi256.hsl(120, 100, 60); // HSL to 256 color ansi foreground code
+style.bgColor.ansi256.hsl(120, 100, 60); // HSL to 256 color ansi foreground code
+
+style.color.ansi16m.hex('#C0FFEE'); // Hex (RGB) to 16 million color foreground code
+style.bgColor.ansi16m.hex('#C0FFEE'); // Hex (RGB) to 16 million color background code
+```
+
+## Related
+
+- [ansi-escapes](https://github.com/sindresorhus/ansi-escapes) - ANSI escape codes for manipulating the terminal
+
+## Maintainers
+
+- [Sindre Sorhus](https://github.com/sindresorhus)
+- [Josh Junon](https://github.com/qix-)
+
+## For enterprise
+
+Available as part of the Tidelift Subscription.
+
+The maintainers of `ansi-styles` and thousands of other packages are working with Tidelift to deliver commercial support and maintenance for the open source dependencies you use to build your applications. Save time, reduce risk, and improve code health, while paying the maintainers of the exact dependencies you use. [Learn more.](https://tidelift.com/subscription/pkg/npm-ansi-styles?utm_source=npm-ansi-styles&utm_medium=referral&utm_campaign=enterprise&utm_term=repo)
diff --git a/node_modules/array-back/LICENSE b/node_modules/array-back/LICENSE
new file mode 100644
index 0000000..203018f
--- /dev/null
+++ b/node_modules/array-back/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2015-19 Lloyd Brookes <75pound@gmail.com>
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/node_modules/array-back/README.hbs b/node_modules/array-back/README.hbs
new file mode 100644
index 0000000..dc32d2a
--- /dev/null
+++ b/node_modules/array-back/README.hbs
@@ -0,0 +1,40 @@
+[![view on npm](https://img.shields.io/npm/v/array-back.svg)](https://www.npmjs.org/package/array-back)
+[![npm module downloads](https://img.shields.io/npm/dt/array-back.svg)](https://www.npmjs.org/package/array-back)
+[![Build Status](https://travis-ci.org/75lb/array-back.svg?branch=master)](https://travis-ci.org/75lb/array-back)
+[![Coverage Status](https://coveralls.io/repos/github/75lb/array-back/badge.svg?branch=master)](https://coveralls.io/github/75lb/array-back?branch=master)
+[![Dependency Status](https://david-dm.org/75lb/array-back.svg)](https://david-dm.org/75lb/array-back)
+[![js-standard-style](https://img.shields.io/badge/code%20style-standard-brightgreen.svg)](https://github.com/feross/standard)
+
+{{>main}}
+
+### Load anywhere
+
+This library is compatible with Node.js, the Web and any style of module loader. It can be loaded anywhere, natively without transpilation.
+
+Node.js:
+
+```js
+const arrayify = require('array-back')
+```
+
+Within Node.js with ECMAScript Module support enabled:
+
+```js
+import arrayify from 'array-back'
+```
+
+Within an modern browser ECMAScript Module:
+
+```js
+import arrayify from './node_modules/array-back/index.mjs'
+```
+
+Old browser (adds `window.arrayBack`):
+
+```html
+<script nomodule src="./node_modules/array-back/dist/index.js"></script>
+```
+
+* * *
+
+&copy; 2015-19 Lloyd Brookes \<75pound@gmail.com\>. Documented by [jsdoc-to-markdown](https://github.com/75lb/jsdoc-to-markdown).
diff --git a/node_modules/array-back/README.md b/node_modules/array-back/README.md
new file mode 100644
index 0000000..9860b1c
--- /dev/null
+++ b/node_modules/array-back/README.md
@@ -0,0 +1,81 @@
+[![view on npm](https://img.shields.io/npm/v/array-back.svg)](https://www.npmjs.org/package/array-back)
+[![npm module downloads](https://img.shields.io/npm/dt/array-back.svg)](https://www.npmjs.org/package/array-back)
+[![Build Status](https://travis-ci.org/75lb/array-back.svg?branch=master)](https://travis-ci.org/75lb/array-back)
+[![Coverage Status](https://coveralls.io/repos/github/75lb/array-back/badge.svg?branch=master)](https://coveralls.io/github/75lb/array-back?branch=master)
+[![Dependency Status](https://david-dm.org/75lb/array-back.svg)](https://david-dm.org/75lb/array-back)
+[![js-standard-style](https://img.shields.io/badge/code%20style-standard-brightgreen.svg)](https://github.com/feross/standard)
+
+<a name="module_array-back"></a>
+
+## array-back
+Takes any input and guarantees an array back.
+
+- Converts array-like objects (e.g. `arguments`, `Set`) to a real array.
+- Converts `undefined` to an empty array.
+- Converts any another other, singular value (including `null`, objects and iterables other than `Set`) into an array containing that value.
+- Ignores input which is already an array.
+
+**Example**
+```js
+> const arrayify = require('array-back')
+
+> arrayify(undefined)
+[]
+
+> arrayify(null)
+[ null ]
+
+> arrayify(0)
+[ 0 ]
+
+> arrayify([ 1, 2 ])
+[ 1, 2 ]
+
+> arrayify(new Set([ 1, 2 ]))
+[ 1, 2 ]
+
+> function f(){ return arrayify(arguments); }
+> f(1,2,3)
+[ 1, 2, 3 ]
+```
+<a name="exp_module_array-back--arrayify"></a>
+
+### arrayify(input) ⇒ <code>Array</code> ⏏
+**Kind**: Exported function
+
+| Param | Type | Description |
+| --- | --- | --- |
+| input | <code>\*</code> | The input value to convert to an array |
+
+
+### Load anywhere
+
+This library is compatible with Node.js, the Web and any style of module loader. It can be loaded anywhere, natively without transpilation.
+
+Node.js:
+
+```js
+const arrayify = require('array-back')
+```
+
+Within Node.js with ECMAScript Module support enabled:
+
+```js
+import arrayify from 'array-back'
+```
+
+Within an modern browser ECMAScript Module:
+
+```js
+import arrayify from './node_modules/array-back/index.mjs'
+```
+
+Old browser (adds `window.arrayBack`):
+
+```html
+<script nomodule src="./node_modules/array-back/dist/index.js"></script>
+```
+
+* * *
+
+&copy; 2015-19 Lloyd Brookes \<75pound@gmail.com\>. Documented by [jsdoc-to-markdown](https://github.com/75lb/jsdoc-to-markdown).
diff --git a/node_modules/array-back/dist/index.js b/node_modules/array-back/dist/index.js
new file mode 100644
index 0000000..0848d2d
--- /dev/null
+++ b/node_modules/array-back/dist/index.js
@@ -0,0 +1,70 @@
+(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
+ typeof define === 'function' && define.amd ? define(factory) :
+ (global = global || self, global.arrayBack = factory());
+}(this, function () { 'use strict';
+
+ /**
+ * Takes any input and guarantees an array back.
+ *
+ * - Converts array-like objects (e.g. `arguments`, `Set`) to a real array.
+ * - Converts `undefined` to an empty array.
+ * - Converts any another other, singular value (including `null`, objects and iterables other than `Set`) into an array containing that value.
+ * - Ignores input which is already an array.
+ *
+ * @module array-back
+ * @example
+ * > const arrayify = require('array-back')
+ *
+ * > arrayify(undefined)
+ * []
+ *
+ * > arrayify(null)
+ * [ null ]
+ *
+ * > arrayify(0)
+ * [ 0 ]
+ *
+ * > arrayify([ 1, 2 ])
+ * [ 1, 2 ]
+ *
+ * > arrayify(new Set([ 1, 2 ]))
+ * [ 1, 2 ]
+ *
+ * > function f(){ return arrayify(arguments); }
+ * > f(1,2,3)
+ * [ 1, 2, 3 ]
+ */
+
+ function isObject (input) {
+ return typeof input === 'object' && input !== null
+ }
+
+ function isArrayLike (input) {
+ return isObject(input) && typeof input.length === 'number'
+ }
+
+ /**
+ * @param {*} - The input value to convert to an array
+ * @returns {Array}
+ * @alias module:array-back
+ */
+ function arrayify (input) {
+ if (Array.isArray(input)) {
+ return input
+ }
+
+ if (input === undefined) {
+ return []
+ }
+
+ if (isArrayLike(input) || input instanceof Set) {
+ return Array.from(input)
+ }
+
+ return [ input ]
+ }
+
+ return arrayify;
+
+}));
diff --git a/node_modules/array-back/index.mjs b/node_modules/array-back/index.mjs
new file mode 100644
index 0000000..d937eba
--- /dev/null
+++ b/node_modules/array-back/index.mjs
@@ -0,0 +1,62 @@
+/**
+ * Takes any input and guarantees an array back.
+ *
+ * - Converts array-like objects (e.g. `arguments`, `Set`) to a real array.
+ * - Converts `undefined` to an empty array.
+ * - Converts any another other, singular value (including `null`, objects and iterables other than `Set`) into an array containing that value.
+ * - Ignores input which is already an array.
+ *
+ * @module array-back
+ * @example
+ * > const arrayify = require('array-back')
+ *
+ * > arrayify(undefined)
+ * []
+ *
+ * > arrayify(null)
+ * [ null ]
+ *
+ * > arrayify(0)
+ * [ 0 ]
+ *
+ * > arrayify([ 1, 2 ])
+ * [ 1, 2 ]
+ *
+ * > arrayify(new Set([ 1, 2 ]))
+ * [ 1, 2 ]
+ *
+ * > function f(){ return arrayify(arguments); }
+ * > f(1,2,3)
+ * [ 1, 2, 3 ]
+ */
+
+function isObject (input) {
+ return typeof input === 'object' && input !== null
+}
+
+function isArrayLike (input) {
+ return isObject(input) && typeof input.length === 'number'
+}
+
+/**
+ * @param {*} - The input value to convert to an array
+ * @returns {Array}
+ * @alias module:array-back
+ */
+function arrayify (input) {
+ if (Array.isArray(input)) {
+ return input
+ }
+
+ if (input === undefined) {
+ return []
+ }
+
+ if (isArrayLike(input) || input instanceof Set) {
+ return Array.from(input)
+ }
+
+ return [ input ]
+}
+
+export default arrayify
diff --git a/node_modules/array-back/package.json b/node_modules/array-back/package.json
new file mode 100644
index 0000000..787cac0
--- /dev/null
+++ b/node_modules/array-back/package.json
@@ -0,0 +1,46 @@
+{
+ "name": "array-back",
+ "author": "Lloyd Brookes <75pound@gmail.com>",
+ "version": "3.1.0",
+ "description": "Guarantees an array back",
+ "repository": "https://github.com/75lb/array-back.git",
+ "license": "MIT",
+ "main": "dist/index.js",
+ "keywords": [
+ "to",
+ "convert",
+ "return",
+ "array",
+ "arrayify"
+ ],
+ "engines": {
+ "node": ">=6"
+ },
+ "files": [
+ "index.mjs",
+ "dist/index.js"
+ ],
+ "scripts": {
+ "test": "npm run test:esm && npm run test:js",
+ "test:esm": "node --experimental-modules test.mjs",
+ "test:js": "npm run dist:test && node dist/test.js",
+ "docs": "jsdoc2md -t README.hbs index.mjs -c build/jsdoc.conf > README.md; echo",
+ "cover": "nyc test-runner test.js && nyc report --reporter=text-lcov | coveralls",
+ "dist": "rollup -c build/index.config.js",
+ "dist:test": "rollup -c build/test.config.js",
+ "lint": "standard **/*.mjs"
+ },
+ "dependencies": {},
+ "devDependencies": {
+ "coveralls": "^3.0.3",
+ "jsdoc-to-markdown": "^4.0.1",
+ "rollup": "^1.9.0",
+ "test-runner": "^0.5.1"
+ },
+ "standard": {
+ "ignore": [
+ "dist",
+ "build"
+ ]
+ }
+}
diff --git a/node_modules/asynckit/LICENSE b/node_modules/asynckit/LICENSE
new file mode 100644
index 0000000..c9eca5d
--- /dev/null
+++ b/node_modules/asynckit/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2016 Alex Indigo
+
+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/asynckit/README.md b/node_modules/asynckit/README.md
new file mode 100644
index 0000000..ddcc7e6
--- /dev/null
+++ b/node_modules/asynckit/README.md
@@ -0,0 +1,233 @@
+# asynckit [![NPM Module](https://img.shields.io/npm/v/asynckit.svg?style=flat)](https://www.npmjs.com/package/asynckit)
+
+Minimal async jobs utility library, with streams support.
+
+[![PhantomJS Build](https://img.shields.io/travis/alexindigo/asynckit/v0.4.0.svg?label=browser&style=flat)](https://travis-ci.org/alexindigo/asynckit)
+[![Linux Build](https://img.shields.io/travis/alexindigo/asynckit/v0.4.0.svg?label=linux:0.12-6.x&style=flat)](https://travis-ci.org/alexindigo/asynckit)
+[![Windows Build](https://img.shields.io/appveyor/ci/alexindigo/asynckit/v0.4.0.svg?label=windows:0.12-6.x&style=flat)](https://ci.appveyor.com/project/alexindigo/asynckit)
+
+[![Coverage Status](https://img.shields.io/coveralls/alexindigo/asynckit/v0.4.0.svg?label=code+coverage&style=flat)](https://coveralls.io/github/alexindigo/asynckit?branch=master)
+[![Dependency Status](https://img.shields.io/david/alexindigo/asynckit/v0.4.0.svg?style=flat)](https://david-dm.org/alexindigo/asynckit)
+[![bitHound Overall Score](https://www.bithound.io/github/alexindigo/asynckit/badges/score.svg)](https://www.bithound.io/github/alexindigo/asynckit)
+
+<!-- [![Readme](https://img.shields.io/badge/readme-tested-brightgreen.svg?style=flat)](https://www.npmjs.com/package/reamde) -->
+
+AsyncKit provides harness for `parallel` and `serial` iterators over list of items represented by arrays or objects.
+Optionally it accepts abort function (should be synchronously return by iterator for each item), and terminates left over jobs upon an error event. For specific iteration order built-in (`ascending` and `descending`) and custom sort helpers also supported, via `asynckit.serialOrdered` method.
+
+It ensures async operations to keep behavior more stable and prevent `Maximum call stack size exceeded` errors, from sync iterators.
+
+| compression | size |
+| :----------------- | -------: |
+| asynckit.js | 12.34 kB |
+| asynckit.min.js | 4.11 kB |
+| asynckit.min.js.gz | 1.47 kB |
+
+
+## Install
+
+```sh
+$ npm install --save asynckit
+```
+
+## Examples
+
+### Parallel Jobs
+
+Runs iterator over provided array in parallel. Stores output in the `result` array,
+on the matching positions. In unlikely event of an error from one of the jobs,
+will terminate rest of the active jobs (if abort function is provided)
+and return error along with salvaged data to the main callback function.
+
+#### Input Array
+
+```javascript
+var parallel = require('asynckit').parallel
+ , assert = require('assert')
+ ;
+
+var source = [ 1, 1, 4, 16, 64, 32, 8, 2 ]
+ , expectedResult = [ 2, 2, 8, 32, 128, 64, 16, 4 ]
+ , expectedTarget = [ 1, 1, 2, 4, 8, 16, 32, 64 ]
+ , target = []
+ ;
+
+parallel(source, asyncJob, function(err, result)
+{
+ assert.deepEqual(result, expectedResult);
+ assert.deepEqual(target, expectedTarget);
+});
+
+// async job accepts one element from the array
+// and a callback function
+function asyncJob(item, cb)
+{
+ // different delays (in ms) per item
+ var delay = item * 25;
+
+ // pretend different jobs take different time to finish
+ // and not in consequential order
+ var timeoutId = setTimeout(function() {
+ target.push(item);
+ cb(null, item * 2);
+ }, delay);
+
+ // allow to cancel "leftover" jobs upon error
+ // return function, invoking of which will abort this job
+ return clearTimeout.bind(null, timeoutId);
+}
+```
+
+More examples could be found in [test/test-parallel-array.js](test/test-parallel-array.js).
+
+#### Input Object
+
+Also it supports named jobs, listed via object.
+
+```javascript
+var parallel = require('asynckit/parallel')
+ , assert = require('assert')
+ ;
+
+var source = { first: 1, one: 1, four: 4, sixteen: 16, sixtyFour: 64, thirtyTwo: 32, eight: 8, two: 2 }
+ , expectedResult = { first: 2, one: 2, four: 8, sixteen: 32, sixtyFour: 128, thirtyTwo: 64, eight: 16, two: 4 }
+ , expectedTarget = [ 1, 1, 2, 4, 8, 16, 32, 64 ]
+ , expectedKeys = [ 'first', 'one', 'two', 'four', 'eight', 'sixteen', 'thirtyTwo', 'sixtyFour' ]
+ , target = []
+ , keys = []
+ ;
+
+parallel(source, asyncJob, function(err, result)
+{
+ assert.deepEqual(result, expectedResult);
+ assert.deepEqual(target, expectedTarget);
+ assert.deepEqual(keys, expectedKeys);
+});
+
+// supports full value, key, callback (shortcut) interface
+function asyncJob(item, key, cb)
+{
+ // different delays (in ms) per item
+ var delay = item * 25;
+
+ // pretend different jobs take different time to finish
+ // and not in consequential order
+ var timeoutId = setTimeout(function() {
+ keys.push(key);
+ target.push(item);
+ cb(null, item * 2);
+ }, delay);
+
+ // allow to cancel "leftover" jobs upon error
+ // return function, invoking of which will abort this job
+ return clearTimeout.bind(null, timeoutId);
+}
+```
+
+More examples could be found in [test/test-parallel-object.js](test/test-parallel-object.js).
+
+### Serial Jobs
+
+Runs iterator over provided array sequentially. Stores output in the `result` array,
+on the matching positions. In unlikely event of an error from one of the jobs,
+will not proceed to the rest of the items in the list
+and return error along with salvaged data to the main callback function.
+
+#### Input Array
+
+```javascript
+var serial = require('asynckit/serial')
+ , assert = require('assert')
+ ;
+
+var source = [ 1, 1, 4, 16, 64, 32, 8, 2 ]
+ , expectedResult = [ 2, 2, 8, 32, 128, 64, 16, 4 ]
+ , expectedTarget = [ 0, 1, 2, 3, 4, 5, 6, 7 ]
+ , target = []
+ ;
+
+serial(source, asyncJob, function(err, result)
+{
+ assert.deepEqual(result, expectedResult);
+ assert.deepEqual(target, expectedTarget);
+});
+
+// extended interface (item, key, callback)
+// also supported for arrays
+function asyncJob(item, key, cb)
+{
+ target.push(key);
+
+ // it will be automatically made async
+ // even it iterator "returns" in the same event loop
+ cb(null, item * 2);
+}
+```
+
+More examples could be found in [test/test-serial-array.js](test/test-serial-array.js).
+
+#### Input Object
+
+Also it supports named jobs, listed via object.
+
+```javascript
+var serial = require('asynckit').serial
+ , assert = require('assert')
+ ;
+
+var source = [ 1, 1, 4, 16, 64, 32, 8, 2 ]
+ , expectedResult = [ 2, 2, 8, 32, 128, 64, 16, 4 ]
+ , expectedTarget = [ 0, 1, 2, 3, 4, 5, 6, 7 ]
+ , target = []
+ ;
+
+var source = { first: 1, one: 1, four: 4, sixteen: 16, sixtyFour: 64, thirtyTwo: 32, eight: 8, two: 2 }
+ , expectedResult = { first: 2, one: 2, four: 8, sixteen: 32, sixtyFour: 128, thirtyTwo: 64, eight: 16, two: 4 }
+ , expectedTarget = [ 1, 1, 4, 16, 64, 32, 8, 2 ]
+ , target = []
+ ;
+
+
+serial(source, asyncJob, function(err, result)
+{
+ assert.deepEqual(result, expectedResult);
+ assert.deepEqual(target, expectedTarget);
+});
+
+// shortcut interface (item, callback)
+// works for object as well as for the arrays
+function asyncJob(item, cb)
+{
+ target.push(item);
+
+ // it will be automatically made async
+ // even it iterator "returns" in the same event loop
+ cb(null, item * 2);
+}
+```
+
+More examples could be found in [test/test-serial-object.js](test/test-serial-object.js).
+
+_Note: Since _object_ is an _unordered_ collection of properties,
+it may produce unexpected results with sequential iterations.
+Whenever order of the jobs' execution is important please use `serialOrdered` method._
+
+### Ordered Serial Iterations
+
+TBD
+
+For example [compare-property](compare-property) package.
+
+### Streaming interface
+
+TBD
+
+## Want to Know More?
+
+More examples can be found in [test folder](test/).
+
+Or open an [issue](https://github.com/alexindigo/asynckit/issues) with questions and/or suggestions.
+
+## License
+
+AsyncKit is licensed under the MIT license.
diff --git a/node_modules/asynckit/bench.js b/node_modules/asynckit/bench.js
new file mode 100644
index 0000000..c612f1a
--- /dev/null
+++ b/node_modules/asynckit/bench.js
@@ -0,0 +1,76 @@
+/* eslint no-console: "off" */
+
+var asynckit = require('./')
+ , async = require('async')
+ , assert = require('assert')
+ , expected = 0
+ ;
+
+var Benchmark = require('benchmark');
+var suite = new Benchmark.Suite;
+
+var source = [];
+for (var z = 1; z < 100; z++)
+{
+ source.push(z);
+ expected += z;
+}
+
+suite
+// add tests
+
+.add('async.map', function(deferred)
+{
+ var total = 0;
+
+ async.map(source,
+ function(i, cb)
+ {
+ setImmediate(function()
+ {
+ total += i;
+ cb(null, total);
+ });
+ },
+ function(err, result)
+ {
+ assert.ifError(err);
+ assert.equal(result[result.length - 1], expected);
+ deferred.resolve();
+ });
+}, {'defer': true})
+
+
+.add('asynckit.parallel', function(deferred)
+{
+ var total = 0;
+
+ asynckit.parallel(source,
+ function(i, cb)
+ {
+ setImmediate(function()
+ {
+ total += i;
+ cb(null, total);
+ });
+ },
+ function(err, result)
+ {
+ assert.ifError(err);
+ assert.equal(result[result.length - 1], expected);
+ deferred.resolve();
+ });
+}, {'defer': true})
+
+
+// add listeners
+.on('cycle', function(ev)
+{
+ console.log(String(ev.target));
+})
+.on('complete', function()
+{
+ console.log('Fastest is ' + this.filter('fastest').map('name'));
+})
+// run async
+.run({ 'async': true });
diff --git a/node_modules/asynckit/index.js b/node_modules/asynckit/index.js
new file mode 100644
index 0000000..455f945
--- /dev/null
+++ b/node_modules/asynckit/index.js
@@ -0,0 +1,6 @@
+module.exports =
+{
+ parallel : require('./parallel.js'),
+ serial : require('./serial.js'),
+ serialOrdered : require('./serialOrdered.js')
+};
diff --git a/node_modules/asynckit/lib/abort.js b/node_modules/asynckit/lib/abort.js
new file mode 100644
index 0000000..114367e
--- /dev/null
+++ b/node_modules/asynckit/lib/abort.js
@@ -0,0 +1,29 @@
+// API
+module.exports = abort;
+
+/**
+ * Aborts leftover active jobs
+ *
+ * @param {object} state - current state object
+ */
+function abort(state)
+{
+ Object.keys(state.jobs).forEach(clean.bind(state));
+
+ // reset leftover jobs
+ state.jobs = {};
+}
+
+/**
+ * Cleans up leftover job by invoking abort function for the provided job id
+ *
+ * @this state
+ * @param {string|number} key - job id to abort
+ */
+function clean(key)
+{
+ if (typeof this.jobs[key] == 'function')
+ {
+ this.jobs[key]();
+ }
+}
diff --git a/node_modules/asynckit/lib/async.js b/node_modules/asynckit/lib/async.js
new file mode 100644
index 0000000..7f1288a
--- /dev/null
+++ b/node_modules/asynckit/lib/async.js
@@ -0,0 +1,34 @@
+var defer = require('./defer.js');
+
+// API
+module.exports = async;
+
+/**
+ * Runs provided callback asynchronously
+ * even if callback itself is not
+ *
+ * @param {function} callback - callback to invoke
+ * @returns {function} - augmented callback
+ */
+function async(callback)
+{
+ var isAsync = false;
+
+ // check if async happened
+ defer(function() { isAsync = true; });
+
+ return function async_callback(err, result)
+ {
+ if (isAsync)
+ {
+ callback(err, result);
+ }
+ else
+ {
+ defer(function nextTick_callback()
+ {
+ callback(err, result);
+ });
+ }
+ };
+}
diff --git a/node_modules/asynckit/lib/defer.js b/node_modules/asynckit/lib/defer.js
new file mode 100644
index 0000000..b67110c
--- /dev/null
+++ b/node_modules/asynckit/lib/defer.js
@@ -0,0 +1,26 @@
+module.exports = defer;
+
+/**
+ * Runs provided function on next iteration of the event loop
+ *
+ * @param {function} fn - function to run
+ */
+function defer(fn)
+{
+ var nextTick = typeof setImmediate == 'function'
+ ? setImmediate
+ : (
+ typeof process == 'object' && typeof process.nextTick == 'function'
+ ? process.nextTick
+ : null
+ );
+
+ if (nextTick)
+ {
+ nextTick(fn);
+ }
+ else
+ {
+ setTimeout(fn, 0);
+ }
+}
diff --git a/node_modules/asynckit/lib/iterate.js b/node_modules/asynckit/lib/iterate.js
new file mode 100644
index 0000000..5d2839a
--- /dev/null
+++ b/node_modules/asynckit/lib/iterate.js
@@ -0,0 +1,75 @@
+var async = require('./async.js')
+ , abort = require('./abort.js')
+ ;
+
+// API
+module.exports = iterate;
+
+/**
+ * Iterates over each job object
+ *
+ * @param {array|object} list - array or object (named list) to iterate over
+ * @param {function} iterator - iterator to run
+ * @param {object} state - current job status
+ * @param {function} callback - invoked when all elements processed
+ */
+function iterate(list, iterator, state, callback)
+{
+ // store current index
+ var key = state['keyedList'] ? state['keyedList'][state.index] : state.index;
+
+ state.jobs[key] = runJob(iterator, key, list[key], function(error, output)
+ {
+ // don't repeat yourself
+ // skip secondary callbacks
+ if (!(key in state.jobs))
+ {
+ return;
+ }
+
+ // clean up jobs
+ delete state.jobs[key];
+
+ if (error)
+ {
+ // don't process rest of the results
+ // stop still active jobs
+ // and reset the list
+ abort(state);
+ }
+ else
+ {
+ state.results[key] = output;
+ }
+
+ // return salvaged results
+ callback(error, state.results);
+ });
+}
+
+/**
+ * Runs iterator over provided job element
+ *
+ * @param {function} iterator - iterator to invoke
+ * @param {string|number} key - key/index of the element in the list of jobs
+ * @param {mixed} item - job description
+ * @param {function} callback - invoked after iterator is done with the job
+ * @returns {function|mixed} - job abort function or something else
+ */
+function runJob(iterator, key, item, callback)
+{
+ var aborter;
+
+ // allow shortcut if iterator expects only two arguments
+ if (iterator.length == 2)
+ {
+ aborter = iterator(item, async(callback));
+ }
+ // otherwise go with full three arguments
+ else
+ {
+ aborter = iterator(item, key, async(callback));
+ }
+
+ return aborter;
+}
diff --git a/node_modules/asynckit/lib/readable_asynckit.js b/node_modules/asynckit/lib/readable_asynckit.js
new file mode 100644
index 0000000..78ad240
--- /dev/null
+++ b/node_modules/asynckit/lib/readable_asynckit.js
@@ -0,0 +1,91 @@
+var streamify = require('./streamify.js')
+ , defer = require('./defer.js')
+ ;
+
+// API
+module.exports = ReadableAsyncKit;
+
+/**
+ * Base constructor for all streams
+ * used to hold properties/methods
+ */
+function ReadableAsyncKit()
+{
+ ReadableAsyncKit.super_.apply(this, arguments);
+
+ // list of active jobs
+ this.jobs = {};
+
+ // add stream methods
+ this.destroy = destroy;
+ this._start = _start;
+ this._read = _read;
+}
+
+/**
+ * Destroys readable stream,
+ * by aborting outstanding jobs
+ *
+ * @returns {void}
+ */
+function destroy()
+{
+ if (this.destroyed)
+ {
+ return;
+ }
+
+ this.destroyed = true;
+
+ if (typeof this.terminator == 'function')
+ {
+ this.terminator();
+ }
+}
+
+/**
+ * Starts provided jobs in async manner
+ *
+ * @private
+ */
+function _start()
+{
+ // first argument – runner function
+ var runner = arguments[0]
+ // take away first argument
+ , args = Array.prototype.slice.call(arguments, 1)
+ // second argument - input data
+ , input = args[0]
+ // last argument - result callback
+ , endCb = streamify.callback.call(this, args[args.length - 1])
+ ;
+
+ args[args.length - 1] = endCb;
+ // third argument - iterator
+ args[1] = streamify.iterator.call(this, args[1]);
+
+ // allow time for proper setup
+ defer(function()
+ {
+ if (!this.destroyed)
+ {
+ this.terminator = runner.apply(null, args);
+ }
+ else
+ {
+ endCb(null, Array.isArray(input) ? [] : {});
+ }
+ }.bind(this));
+}
+
+
+/**
+ * Implement _read to comply with Readable streams
+ * Doesn't really make sense for flowing object mode
+ *
+ * @private
+ */
+function _read()
+{
+
+}
diff --git a/node_modules/asynckit/lib/readable_parallel.js b/node_modules/asynckit/lib/readable_parallel.js
new file mode 100644
index 0000000..5d2929f
--- /dev/null
+++ b/node_modules/asynckit/lib/readable_parallel.js
@@ -0,0 +1,25 @@
+var parallel = require('../parallel.js');
+
+// API
+module.exports = ReadableParallel;
+
+/**
+ * Streaming wrapper to `asynckit.parallel`
+ *
+ * @param {array|object} list - array or object (named list) to iterate over
+ * @param {function} iterator - iterator to run
+ * @param {function} callback - invoked when all elements processed
+ * @returns {stream.Readable#}
+ */
+function ReadableParallel(list, iterator, callback)
+{
+ if (!(this instanceof ReadableParallel))
+ {
+ return new ReadableParallel(list, iterator, callback);
+ }
+
+ // turn on object mode
+ ReadableParallel.super_.call(this, {objectMode: true});
+
+ this._start(parallel, list, iterator, callback);
+}
diff --git a/node_modules/asynckit/lib/readable_serial.js b/node_modules/asynckit/lib/readable_serial.js
new file mode 100644
index 0000000..7822698
--- /dev/null
+++ b/node_modules/asynckit/lib/readable_serial.js
@@ -0,0 +1,25 @@
+var serial = require('../serial.js');
+
+// API
+module.exports = ReadableSerial;
+
+/**
+ * Streaming wrapper to `asynckit.serial`
+ *
+ * @param {array|object} list - array or object (named list) to iterate over
+ * @param {function} iterator - iterator to run
+ * @param {function} callback - invoked when all elements processed
+ * @returns {stream.Readable#}
+ */
+function ReadableSerial(list, iterator, callback)
+{
+ if (!(this instanceof ReadableSerial))
+ {
+ return new ReadableSerial(list, iterator, callback);
+ }
+
+ // turn on object mode
+ ReadableSerial.super_.call(this, {objectMode: true});
+
+ this._start(serial, list, iterator, callback);
+}
diff --git a/node_modules/asynckit/lib/readable_serial_ordered.js b/node_modules/asynckit/lib/readable_serial_ordered.js
new file mode 100644
index 0000000..3de89c4
--- /dev/null
+++ b/node_modules/asynckit/lib/readable_serial_ordered.js
@@ -0,0 +1,29 @@
+var serialOrdered = require('../serialOrdered.js');
+
+// API
+module.exports = ReadableSerialOrdered;
+// expose sort helpers
+module.exports.ascending = serialOrdered.ascending;
+module.exports.descending = serialOrdered.descending;
+
+/**
+ * Streaming wrapper to `asynckit.serialOrdered`
+ *
+ * @param {array|object} list - array or object (named list) to iterate over
+ * @param {function} iterator - iterator to run
+ * @param {function} sortMethod - custom sort function
+ * @param {function} callback - invoked when all elements processed
+ * @returns {stream.Readable#}
+ */
+function ReadableSerialOrdered(list, iterator, sortMethod, callback)
+{
+ if (!(this instanceof ReadableSerialOrdered))
+ {
+ return new ReadableSerialOrdered(list, iterator, sortMethod, callback);
+ }
+
+ // turn on object mode
+ ReadableSerialOrdered.super_.call(this, {objectMode: true});
+
+ this._start(serialOrdered, list, iterator, sortMethod, callback);
+}
diff --git a/node_modules/asynckit/lib/state.js b/node_modules/asynckit/lib/state.js
new file mode 100644
index 0000000..cbea7ad
--- /dev/null
+++ b/node_modules/asynckit/lib/state.js
@@ -0,0 +1,37 @@
+// API
+module.exports = state;
+
+/**
+ * Creates initial state object
+ * for iteration over list
+ *
+ * @param {array|object} list - list to iterate over
+ * @param {function|null} sortMethod - function to use for keys sort,
+ * or `null` to keep them as is
+ * @returns {object} - initial state object
+ */
+function state(list, sortMethod)
+{
+ var isNamedList = !Array.isArray(list)
+ , initState =
+ {
+ index : 0,
+ keyedList: isNamedList || sortMethod ? Object.keys(list) : null,
+ jobs : {},
+ results : isNamedList ? {} : [],
+ size : isNamedList ? Object.keys(list).length : list.length
+ }
+ ;
+
+ if (sortMethod)
+ {
+ // sort array keys based on it's values
+ // sort object's keys just on own merit
+ initState.keyedList.sort(isNamedList ? sortMethod : function(a, b)
+ {
+ return sortMethod(list[a], list[b]);
+ });
+ }
+
+ return initState;
+}
diff --git a/node_modules/asynckit/lib/streamify.js b/node_modules/asynckit/lib/streamify.js
new file mode 100644
index 0000000..f56a1c9
--- /dev/null
+++ b/node_modules/asynckit/lib/streamify.js
@@ -0,0 +1,141 @@
+var async = require('./async.js');
+
+// API
+module.exports = {
+ iterator: wrapIterator,
+ callback: wrapCallback
+};
+
+/**
+ * Wraps iterators with long signature
+ *
+ * @this ReadableAsyncKit#
+ * @param {function} iterator - function to wrap
+ * @returns {function} - wrapped function
+ */
+function wrapIterator(iterator)
+{
+ var stream = this;
+
+ return function(item, key, cb)
+ {
+ var aborter
+ , wrappedCb = async(wrapIteratorCallback.call(stream, cb, key))
+ ;
+
+ stream.jobs[key] = wrappedCb;
+
+ // it's either shortcut (item, cb)
+ if (iterator.length == 2)
+ {
+ aborter = iterator(item, wrappedCb);
+ }
+ // or long format (item, key, cb)
+ else
+ {
+ aborter = iterator(item, key, wrappedCb);
+ }
+
+ return aborter;
+ };
+}
+
+/**
+ * Wraps provided callback function
+ * allowing to execute snitch function before
+ * real callback
+ *
+ * @this ReadableAsyncKit#
+ * @param {function} callback - function to wrap
+ * @returns {function} - wrapped function
+ */
+function wrapCallback(callback)
+{
+ var stream = this;
+
+ var wrapped = function(error, result)
+ {
+ return finisher.call(stream, error, result, callback);
+ };
+
+ return wrapped;
+}
+
+/**
+ * Wraps provided iterator callback function
+ * makes sure snitch only called once,
+ * but passes secondary calls to the original callback
+ *
+ * @this ReadableAsyncKit#
+ * @param {function} callback - callback to wrap
+ * @param {number|string} key - iteration key
+ * @returns {function} wrapped callback
+ */
+function wrapIteratorCallback(callback, key)
+{
+ var stream = this;
+
+ return function(error, output)
+ {
+ // don't repeat yourself
+ if (!(key in stream.jobs))
+ {
+ callback(error, output);
+ return;
+ }
+
+ // clean up jobs
+ delete stream.jobs[key];
+
+ return streamer.call(stream, error, {key: key, value: output}, callback);
+ };
+}
+
+/**
+ * Stream wrapper for iterator callback
+ *
+ * @this ReadableAsyncKit#
+ * @param {mixed} error - error response
+ * @param {mixed} output - iterator output
+ * @param {function} callback - callback that expects iterator results
+ */
+function streamer(error, output, callback)
+{
+ if (error && !this.error)
+ {
+ this.error = error;
+ this.pause();
+ this.emit('error', error);
+ // send back value only, as expected
+ callback(error, output && output.value);
+ return;
+ }
+
+ // stream stuff
+ this.push(output);
+
+ // back to original track
+ // send back value only, as expected
+ callback(error, output && output.value);
+}
+
+/**
+ * Stream wrapper for finishing callback
+ *
+ * @this ReadableAsyncKit#
+ * @param {mixed} error - error response
+ * @param {mixed} output - iterator output
+ * @param {function} callback - callback that expects final results
+ */
+function finisher(error, output, callback)
+{
+ // signal end of the stream
+ // only for successfully finished streams
+ if (!error)
+ {
+ this.push(null);
+ }
+
+ // back to original track
+ callback(error, output);
+}
diff --git a/node_modules/asynckit/lib/terminator.js b/node_modules/asynckit/lib/terminator.js
new file mode 100644
index 0000000..d6eb992
--- /dev/null
+++ b/node_modules/asynckit/lib/terminator.js
@@ -0,0 +1,29 @@
+var abort = require('./abort.js')
+ , async = require('./async.js')
+ ;
+
+// API
+module.exports = terminator;
+
+/**
+ * Terminates jobs in the attached state context
+ *
+ * @this AsyncKitState#
+ * @param {function} callback - final callback to invoke after termination
+ */
+function terminator(callback)
+{
+ if (!Object.keys(this.jobs).length)
+ {
+ return;
+ }
+
+ // fast forward iteration index
+ this.index = this.size;
+
+ // abort jobs
+ abort(this);
+
+ // send back results we have so far
+ async(callback)(null, this.results);
+}
diff --git a/node_modules/asynckit/package.json b/node_modules/asynckit/package.json
new file mode 100644
index 0000000..51147d6
--- /dev/null
+++ b/node_modules/asynckit/package.json
@@ -0,0 +1,63 @@
+{
+ "name": "asynckit",
+ "version": "0.4.0",
+ "description": "Minimal async jobs utility library, with streams support",
+ "main": "index.js",
+ "scripts": {
+ "clean": "rimraf coverage",
+ "lint": "eslint *.js lib/*.js test/*.js",
+ "test": "istanbul cover --reporter=json tape -- 'test/test-*.js' | tap-spec",
+ "win-test": "tape test/test-*.js",
+ "browser": "browserify -t browserify-istanbul test/lib/browserify_adjustment.js test/test-*.js | obake --coverage | tap-spec",
+ "report": "istanbul report",
+ "size": "browserify index.js | size-table asynckit",
+ "debug": "tape test/test-*.js"
+ },
+ "pre-commit": [
+ "clean",
+ "lint",
+ "test",
+ "browser",
+ "report",
+ "size"
+ ],
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/alexindigo/asynckit.git"
+ },
+ "keywords": [
+ "async",
+ "jobs",
+ "parallel",
+ "serial",
+ "iterator",
+ "array",
+ "object",
+ "stream",
+ "destroy",
+ "terminate",
+ "abort"
+ ],
+ "author": "Alex Indigo <iam@alexindigo.com>",
+ "license": "MIT",
+ "bugs": {
+ "url": "https://github.com/alexindigo/asynckit/issues"
+ },
+ "homepage": "https://github.com/alexindigo/asynckit#readme",
+ "devDependencies": {
+ "browserify": "^13.0.0",
+ "browserify-istanbul": "^2.0.0",
+ "coveralls": "^2.11.9",
+ "eslint": "^2.9.0",
+ "istanbul": "^0.4.3",
+ "obake": "^0.1.2",
+ "phantomjs-prebuilt": "^2.1.7",
+ "pre-commit": "^1.1.3",
+ "reamde": "^1.1.0",
+ "rimraf": "^2.5.2",
+ "size-table": "^0.2.0",
+ "tap-spec": "^4.1.1",
+ "tape": "^4.5.1"
+ },
+ "dependencies": {}
+}
diff --git a/node_modules/asynckit/parallel.js b/node_modules/asynckit/parallel.js
new file mode 100644
index 0000000..3c50344
--- /dev/null
+++ b/node_modules/asynckit/parallel.js
@@ -0,0 +1,43 @@
+var iterate = require('./lib/iterate.js')
+ , initState = require('./lib/state.js')
+ , terminator = require('./lib/terminator.js')
+ ;
+
+// Public API
+module.exports = parallel;
+
+/**
+ * Runs iterator over provided array elements in parallel
+ *
+ * @param {array|object} list - array or object (named list) to iterate over
+ * @param {function} iterator - iterator to run
+ * @param {function} callback - invoked when all elements processed
+ * @returns {function} - jobs terminator
+ */
+function parallel(list, iterator, callback)
+{
+ var state = initState(list);
+
+ while (state.index < (state['keyedList'] || list).length)
+ {
+ iterate(list, iterator, state, function(error, result)
+ {
+ if (error)
+ {
+ callback(error, result);
+ return;
+ }
+
+ // looks like it's the last one
+ if (Object.keys(state.jobs).length === 0)
+ {
+ callback(null, state.results);
+ return;
+ }
+ });
+
+ state.index++;
+ }
+
+ return terminator.bind(state, callback);
+}
diff --git a/node_modules/asynckit/serial.js b/node_modules/asynckit/serial.js
new file mode 100644
index 0000000..6cd949a
--- /dev/null
+++ b/node_modules/asynckit/serial.js
@@ -0,0 +1,17 @@
+var serialOrdered = require('./serialOrdered.js');
+
+// Public API
+module.exports = serial;
+
+/**
+ * Runs iterator over provided array elements in series
+ *
+ * @param {array|object} list - array or object (named list) to iterate over
+ * @param {function} iterator - iterator to run
+ * @param {function} callback - invoked when all elements processed
+ * @returns {function} - jobs terminator
+ */
+function serial(list, iterator, callback)
+{
+ return serialOrdered(list, iterator, null, callback);
+}
diff --git a/node_modules/asynckit/serialOrdered.js b/node_modules/asynckit/serialOrdered.js
new file mode 100644
index 0000000..607eafe
--- /dev/null
+++ b/node_modules/asynckit/serialOrdered.js
@@ -0,0 +1,75 @@
+var iterate = require('./lib/iterate.js')
+ , initState = require('./lib/state.js')
+ , terminator = require('./lib/terminator.js')
+ ;
+
+// Public API
+module.exports = serialOrdered;
+// sorting helpers
+module.exports.ascending = ascending;
+module.exports.descending = descending;
+
+/**
+ * Runs iterator over provided sorted array elements in series
+ *
+ * @param {array|object} list - array or object (named list) to iterate over
+ * @param {function} iterator - iterator to run
+ * @param {function} sortMethod - custom sort function
+ * @param {function} callback - invoked when all elements processed
+ * @returns {function} - jobs terminator
+ */
+function serialOrdered(list, iterator, sortMethod, callback)
+{
+ var state = initState(list, sortMethod);
+
+ iterate(list, iterator, state, function iteratorHandler(error, result)
+ {
+ if (error)
+ {
+ callback(error, result);
+ return;
+ }
+
+ state.index++;
+
+ // are we there yet?
+ if (state.index < (state['keyedList'] || list).length)
+ {
+ iterate(list, iterator, state, iteratorHandler);
+ return;
+ }
+
+ // done here
+ callback(null, state.results);
+ });
+
+ return terminator.bind(state, callback);
+}
+
+/*
+ * -- Sort methods
+ */
+
+/**
+ * sort helper to sort array elements in ascending order
+ *
+ * @param {mixed} a - an item to compare
+ * @param {mixed} b - an item to compare
+ * @returns {number} - comparison result
+ */
+function ascending(a, b)
+{
+ return a < b ? -1 : a > b ? 1 : 0;
+}
+
+/**
+ * sort helper to sort array elements in descending order
+ *
+ * @param {mixed} a - an item to compare
+ * @param {mixed} b - an item to compare
+ * @returns {number} - comparison result
+ */
+function descending(a, b)
+{
+ return -1 * ascending(a, b);
+}
diff --git a/node_modules/asynckit/stream.js b/node_modules/asynckit/stream.js
new file mode 100644
index 0000000..d43465f
--- /dev/null
+++ b/node_modules/asynckit/stream.js
@@ -0,0 +1,21 @@
+var inherits = require('util').inherits
+ , Readable = require('stream').Readable
+ , ReadableAsyncKit = require('./lib/readable_asynckit.js')
+ , ReadableParallel = require('./lib/readable_parallel.js')
+ , ReadableSerial = require('./lib/readable_serial.js')
+ , ReadableSerialOrdered = require('./lib/readable_serial_ordered.js')
+ ;
+
+// API
+module.exports =
+{
+ parallel : ReadableParallel,
+ serial : ReadableSerial,
+ serialOrdered : ReadableSerialOrdered,
+};
+
+inherits(ReadableAsyncKit, Readable);
+
+inherits(ReadableParallel, ReadableAsyncKit);
+inherits(ReadableSerial, ReadableAsyncKit);
+inherits(ReadableSerialOrdered, ReadableAsyncKit);
diff --git a/node_modules/axios/CHANGELOG.md b/node_modules/axios/CHANGELOG.md
new file mode 100644
index 0000000..7765b53
--- /dev/null
+++ b/node_modules/axios/CHANGELOG.md
@@ -0,0 +1,255 @@
+# Changelog
+
+## [1.0.0] - 2022-10-04
+
+### Added
+
+- Added stack trace to AxiosError [#4624](https://github.com/axios/axios/pull/4624)
+- Add AxiosError to AxiosStatic [#4654](https://github.com/axios/axios/pull/4654)
+- Replaced Rollup as our build runner [#4596](https://github.com/axios/axios/pull/4596)
+- Added generic TS types for the exposed toFormData helper [#4668](https://github.com/axios/axios/pull/4668)
+- Added listen callback function [#4096](https://github.com/axios/axios/pull/4096)
+- Added instructions for installing using PNPM [#4207](https://github.com/axios/axios/pull/4207)
+- Added generic AxiosAbortSignal TS interface to avoid importing AbortController polyfill [#4229](https://github.com/axios/axios/pull/4229)
+- Added axios-url-template in ECOSYSTEM.md [#4238](https://github.com/axios/axios/pull/4238)
+- Added a clear() function to the request and response interceptors object so a user can ensure that all interceptors have been removed from an axios instance [#4248](https://github.com/axios/axios/pull/4248)
+- Added react hook plugin [#4319](https://github.com/axios/axios/pull/4319)
+- Adding HTTP status code for transformResponse [#4580](https://github.com/axios/axios/pull/4580)
+- Added blob to the list of protocols supported by the browser [#4678](https://github.com/axios/axios/pull/4678)
+- Resolving proxy from env on redirect [#4436](https://github.com/axios/axios/pull/4436)
+- Added enhanced toFormData implementation with additional options [4704](https://github.com/axios/axios/pull/4704)
+- Adding Canceler parameters config and request [#4711](https://github.com/axios/axios/pull/4711)
+- Added automatic payload serialization to application/x-www-form-urlencoded [#4714](https://github.com/axios/axios/pull/4714)
+- Added the ability for webpack users to overwrite built-ins [#4715](https://github.com/axios/axios/pull/4715)
+- Added string[] to AxiosRequestHeaders type [#4322](https://github.com/axios/axios/pull/4322)
+- Added the ability for the url-encoded-form serializer to respect the formSerializer config [#4721](https://github.com/axios/axios/pull/4721)
+- Added isCancel type assert [#4293](https://github.com/axios/axios/pull/4293)
+- Added data URL support for node.js [#4725](https://github.com/axios/axios/pull/4725)
+- Adding types for progress event callbacks [#4675](https://github.com/axios/axios/pull/4675)
+- URL params serializer [#4734](https://github.com/axios/axios/pull/4734)
+- Added axios.formToJSON method [#4735](https://github.com/axios/axios/pull/4735)
+- Bower platform add data protocol [#4804](https://github.com/axios/axios/pull/4804)
+- Use WHATWG URL API instead of url.parse() [#4852](https://github.com/axios/axios/pull/4852)
+- Add ENUM containing Http Status Codes to typings [#4903](https://github.com/axios/axios/pull/4903)
+- Improve typing of timeout in index.d.ts [#4934](https://github.com/axios/axios/pull/4934)
+
+### Changed
+
+- Updated AxiosError.config to be optional in the type definition [#4665](https://github.com/axios/axios/pull/4665)
+- Updated README emphasizing the URLSearchParam built-in interface over other solutions [#4590](https://github.com/axios/axios/pull/4590)
+- Include request and config when creating a CanceledError instance [#4659](https://github.com/axios/axios/pull/4659)
+- Changed func-names eslint rule to as-needed [#4492](https://github.com/axios/axios/pull/4492)
+- Replacing deprecated substr() with slice() as substr() is deprecated [#4468](https://github.com/axios/axios/pull/4468)
+- Updating HTTP links in README.md to use HTTPS [#4387](https://github.com/axios/axios/pull/4387)
+- Updated to a better trim() polyfill [#4072](https://github.com/axios/axios/pull/4072)
+- Updated types to allow specifying partial default headers on instance create [#4185](https://github.com/axios/axios/pull/4185)
+- Expanded isAxiosError types [#4344](https://github.com/axios/axios/pull/4344)
+- Updated type definition for axios instance methods [#4224](https://github.com/axios/axios/pull/4224)
+- Updated eslint config [#4722](https://github.com/axios/axios/pull/4722)
+- Updated Docs [#4742](https://github.com/axios/axios/pull/4742)
+- Refactored Axios to use ES2017 [#4787](https://github.com/axios/axios/pull/4787)
+
+
+### Deprecated
+- There are multiple deprecations, refactors and fixes provided in this release. Please read through the full release notes to see how this may impact your project and use case.
+
+### Removed
+
+- Removed incorrect argument for NetworkError constructor [#4656](https://github.com/axios/axios/pull/4656)
+- Removed Webpack [#4596](https://github.com/axios/axios/pull/4596)
+- Removed function that transform arguments to array [#4544](https://github.com/axios/axios/pull/4544)
+
+### Fixed
+
+- Fixed grammar in README [#4649](https://github.com/axios/axios/pull/4649)
+- Fixed code error in README [#4599](https://github.com/axios/axios/pull/4599)
+- Optimized the code that checks cancellation [#4587](https://github.com/axios/axios/pull/4587)
+- Fix url pointing to defaults.js in README [#4532](https://github.com/axios/axios/pull/4532)
+- Use type alias instead of interface for AxiosPromise [#4505](https://github.com/axios/axios/pull/4505)
+- Fix some word spelling and lint style in code comments [#4500](https://github.com/axios/axios/pull/4500)
+- Edited readme with 3 updated browser icons of Chrome, FireFox and Safari [#4414](https://github.com/axios/axios/pull/4414)
+- Bump follow-redirects from 1.14.9 to 1.15.0 [#4673](https://github.com/axios/axios/pull/4673)
+- Fixing http tests to avoid hanging when assertions fail [#4435](https://github.com/axios/axios/pull/4435)
+- Fix TS definition for AxiosRequestTransformer [#4201](https://github.com/axios/axios/pull/4201)
+- Fix grammatical issues in README [#4232](https://github.com/axios/axios/pull/4232)
+- Fixing instance.defaults.headers type [#4557](https://github.com/axios/axios/pull/4557)
+- Fixed race condition on immediate requests cancellation [#4261](https://github.com/axios/axios/pull/4261)
+- Fixing Z_BUF_ERROR when no content [#4701](https://github.com/axios/axios/pull/4701)
+- Fixing proxy beforeRedirect regression [#4708](https://github.com/axios/axios/pull/4708)
+- Fixed AxiosError status code type [#4717](https://github.com/axios/axios/pull/4717)
+- Fixed AxiosError stack capturing [#4718](https://github.com/axios/axios/pull/4718)
+- Fixing AxiosRequestHeaders typings [#4334](https://github.com/axios/axios/pull/4334)
+- Fixed max body length defaults [#4731](https://github.com/axios/axios/pull/4731)
+- Fixed toFormData Blob issue on node>v17 [#4728](https://github.com/axios/axios/pull/4728)
+- Bump grunt from 1.5.2 to 1.5.3 [#4743](https://github.com/axios/axios/pull/4743)
+- Fixing content-type header repeated [#4745](https://github.com/axios/axios/pull/4745)
+- Fixed timeout error message for http [4738](https://github.com/axios/axios/pull/4738)
+- Request ignores false, 0 and empty string as body values [#4785](https://github.com/axios/axios/pull/4785)
+- Added back missing minified builds [#4805](https://github.com/axios/axios/pull/4805)
+- Fixed a type error [#4815](https://github.com/axios/axios/pull/4815)
+- Fixed a regression bug with unsubscribing from cancel token; [#4819](https://github.com/axios/axios/pull/4819)
+- Remove repeated compression algorithm [#4820](https://github.com/axios/axios/pull/4820)
+- The error of calling extend to pass parameters [#4857](https://github.com/axios/axios/pull/4857)
+- SerializerOptions.indexes allows boolean | null | undefined [#4862](https://github.com/axios/axios/pull/4862)
+- Require interceptors to return values [#4874](https://github.com/axios/axios/pull/4874)
+- Removed unused imports [#4949](https://github.com/axios/axios/pull/4949)
+- Allow null indexes on formSerializer and paramsSerializer [#4960](https://github.com/axios/axios/pull/4960)
+
+### Chores
+- Set permissions for GitHub actions [#4765](https://github.com/axios/axios/pull/4765)
+- Included githubactions in the dependabot config [#4770](https://github.com/axios/axios/pull/4770)
+- Included dependency review [#4771](https://github.com/axios/axios/pull/4771)
+- Update security.md [#4784](https://github.com/axios/axios/pull/4784)
+- Remove unnecessary spaces [#4854](https://github.com/axios/axios/pull/4854)
+- Simplify the import path of AxiosError [#4875](https://github.com/axios/axios/pull/4875)
+- Fix Gitpod dead link [#4941](https://github.com/axios/axios/pull/4941)
+- Enable syntax highlighting for a code block [#4970](https://github.com/axios/axios/pull/4970)
+- Using Logo Axios in Readme.md [#4993](https://github.com/axios/axios/pull/4993)
+- Fix markup for note in README [#4825](https://github.com/axios/axios/pull/4825)
+- Fix typo and formatting, add colons [#4853](https://github.com/axios/axios/pull/4853)
+- Fix typo in readme [#4942](https://github.com/axios/axios/pull/4942)
+
+### Security
+
+- Update SECURITY.md [#4687](https://github.com/axios/axios/pull/4687)
+
+### Contributors to this release
+
+- [Bertrand Marron](https://github.com/tusbar)
+- [Dmitriy Mozgovoy](https://github.com/DigitalBrainJS)
+- [Dan Mooney](https://github.com/danmooney)
+- [Michael Li](https://github.com/xiaoyu-tamu)
+- [aong](https://github.com/yxwzaxns)
+- [Des Preston](https://github.com/despreston)
+- [Ted Robertson](https://github.com/tredondo)
+- [zhoulixiang](https://github.com/zh-lx)
+- [Arthur Fiorette](https://github.com/arthurfiorette)
+- [Kumar Shanu](https://github.com/Kr-Shanu)
+- [JALAL](https://github.com/JLL32)
+- [Jingyi Lin](https://github.com/MageeLin)
+- [Philipp Loose](https://github.com/phloose)
+- [Alexander Shchukin](https://github.com/sashsvamir)
+- [Dave Cardwell](https://github.com/davecardwell)
+- [Cat Scarlet](https://github.com/catscarlet)
+- [Luca Pizzini](https://github.com/lpizzinidev)
+- [Kai](https://github.com/Schweinepriester)
+- [Maxime Bargiel](https://github.com/mbargiel)
+- [Brian Helba](https://github.com/brianhelba)
+- [reslear](https://github.com/reslear)
+- [Jamie Slome](https://github.com/JamieSlome)
+- [Landro3](https://github.com/Landro3)
+- [rafw87](https://github.com/rafw87)
+- [Afzal Sayed](https://github.com/afzalsayed96)
+- [Koki Oyatsu](https://github.com/kaishuu0123)
+- [Dave](https://github.com/wangcch)
+- [暴走老七](https://github.com/baozouai)
+- [Spencer](https://github.com/spalger)
+- [Adrian Wieprzkowicz](https://github.com/Argeento)
+- [Jamie Telin](https://github.com/lejahmie)
+- [毛呆](https://github.com/aweikalee)
+- [Kirill Shakirov](https://github.com/turisap)
+- [Rraji Abdelbari](https://github.com/estarossa0)
+- [Jelle Schutter](https://github.com/jelleschutter)
+- [Tom Ceuppens](https://github.com/KyorCode)
+- [Johann Cooper](https://github.com/JohannCooper)
+- [Dimitris Halatsis](https://github.com/mitsos1os)
+- [chenjigeng](https://github.com/chenjigeng)
+- [João Gabriel Quaresma](https://github.com/joaoGabriel55)
+- [Victor Augusto](https://github.com/VictorAugDB)
+- [neilnaveen](https://github.com/neilnaveen)
+- [Pavlos](https://github.com/psmoros)
+- [Kiryl Valkovich](https://github.com/visortelle)
+- [Naveen](https://github.com/naveensrinivasan)
+- [wenzheng](https://github.com/0x30)
+- [hcwhan](https://github.com/hcwhan)
+- [Bassel Rachid](https://github.com/basselworkforce)
+- [Grégoire Pineau](https://github.com/lyrixx)
+- [felipedamin](https://github.com/felipedamin)
+- [Karl Horky](https://github.com/karlhorky)
+- [Yue JIN](https://github.com/kingyue737)
+- [Usman Ali Siddiqui](https://github.com/usman250994)
+- [WD](https://github.com/techbirds)
+- [Günther Foidl](https://github.com/gfoidl)
+- [Stephen Jennings](https://github.com/jennings)
+- [C.T.Lin](https://github.com/chentsulin)
+- [mia-z](https://github.com/mia-z)
+- [Parth Banathia](https://github.com/Parth0105)
+- [parth0105pluang](https://github.com/parth0105pluang)
+- [Marco Weber](https://github.com/mrcwbr)
+- [Luca Pizzini](https://github.com/lpizzinidev)
+- [Willian Agostini](https://github.com/WillianAgostini)
+- [Huyen Nguyen](https://github.com/huyenltnguyen)
+
+## [1.1.0] - 2022-10-06
+
+### Fixed
+
+- Fixed missing exports in type definition index.d.ts [#5003](https://github.com/axios/axios/pull/5003)
+- Fixed query params composing [#5018](https://github.com/axios/axios/pull/5018)
+- Fixed GenericAbortSignal interface by making it more generic [#5021](https://github.com/axios/axios/pull/5021)
+- Fixed adding "clear" to AxiosInterceptorManager [#5010](https://github.com/axios/axios/pull/5010)
+- Fixed commonjs & umd exports [#5030](https://github.com/axios/axios/pull/5030)
+- Fixed inability to access response headers when using axios 1.x with Jest [#5036](https://github.com/axios/axios/pull/5036)
+
+### Contributors to this release
+
+- [Trim21](https://github.com/trim21)
+- [Dmitriy Mozgovoy](https://github.com/DigitalBrainJS)
+- [shingo.sasaki](https://github.com/s-sasaki-0529)
+- [Ivan Pepelko](https://github.com/ivanpepelko)
+- [Richard Kořínek](https://github.com/risa)
+
+## [1.1.1] - 2022-10-07
+
+### Fixed
+
+- Fixed broken exports for common js. This fix breaks a prior fix, I will fix both issues ASAP but the commonJS use is more impactful.
+
+### Contributors to this release
+
+- [Jason Saayman](https://github.com/jasonsaayman)
+
+## [1.1.2] - 2022-10-07
+
+### Fixed
+
+- Fixed broken exports for UMD builds.
+
+### Contributors to this release
+
+- [Jason Saayman](https://github.com/jasonsaayman)
+
+## [1.1.3] - 2022-10-15
+
+### Added
+Added custom params serializer support [#5113](https://github.com/axios/axios/pull/5113)
+
+### Fixed
+
+Fixed top-level export to keep them in-line with static properties [#5109](https://github.com/axios/axios/pull/5109)
+Stopped including null values to query string. [#5108](https://github.com/axios/axios/pull/5108)
+Restored proxy config backwards compatibility with 0.x [#5097](https://github.com/axios/axios/pull/5097)
+Added back AxiosHeaders in AxiosHeaderValue [#5103](https://github.com/axios/axios/pull/5103)
+Pin CDN install instructions to a specific version [#5060](https://github.com/axios/axios/pull/5060)
+Handling of array values fixed for AxiosHeaders [#5085](https://github.com/axios/axios/pull/5085)
+
+### Chores
+
+docs: match badge style, add link to them [#5046](https://github.com/axios/axios/pull/5046)
+chore: fixing comments typo [#5054](https://github.com/axios/axios/pull/5054)
+chore: update issue template [#5061](https://github.com/axios/axios/pull/5061)
+chore: added progress capturing section to the docs; [#5084](https://github.com/axios/axios/pull/5084)
+
+### Contributors to this release
+
+- [Jason Saayman](https://github.com/jasonsaayman)
+- [scarf](https://github.com/scarf005)
+- [Lenz Weber-Tronic](https://github.com/phryneas)
+- [Arvindh](https://github.com/itsarvindh)
+- [Félix Legrelle](https://github.com/FelixLgr)
+- [Patrick Petrovic](https://github.com/ppati000)
+- [Dmitriy Mozgovoy](https://github.com/DigitalBrainJS)
+- [littledian](https://github.com/littledian)
+- [ChronosMasterOfAllTime](https://github.com/ChronosMasterOfAllTime)
+- [Salman Shaikh](https://github.com/salmannotkhan)
+
diff --git a/node_modules/axios/LICENSE b/node_modules/axios/LICENSE
new file mode 100644
index 0000000..05006a5
--- /dev/null
+++ b/node_modules/axios/LICENSE
@@ -0,0 +1,7 @@
+# Copyright (c) 2014-present Matt Zabriskie & Collaborators
+
+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/axios/README.md b/node_modules/axios/README.md
new file mode 100644
index 0000000..b726041
--- /dev/null
+++ b/node_modules/axios/README.md
@@ -0,0 +1,1274 @@
+<h1 align="center">
+ <b>
+ <a href="https://axios-http.com"><img src="https://axios-http.com/assets/logo.svg" /></a><br>
+ </b>
+</h1>
+
+<p align="center">Promise based HTTP client for the browser and node.js</p>
+
+<p align="center">
+ <a href="https://axios-http.com/"><b>Website</b></a> •
+ <a href="https://axios-http.com/docs/intro"><b>Documentation</b></a>
+</p>
+
+<div align="center">
+
+[![npm version](https://img.shields.io/npm/v/axios.svg?style=flat-square)](https://www.npmjs.org/package/axios)
+[![CDNJS](https://img.shields.io/cdnjs/v/axios.svg?style=flat-square)](https://cdnjs.com/libraries/axios)
+[![Build status](https://img.shields.io/github/workflow/status/axios/axios/ci?label=CI&logo=github&style=flat-square)](https://github.com/axios/axios/actions/workflows/ci.yml)
+[![Gitpod Ready-to-Code](https://img.shields.io/badge/Gitpod-Ready--to--Code-blue?logo=gitpod&style=flat-square)](https://gitpod.io/#https://github.com/axios/axios)
+[![code coverage](https://img.shields.io/coveralls/mzabriskie/axios.svg?style=flat-square)](https://coveralls.io/r/mzabriskie/axios)
+[![install size](https://img.shields.io/badge/dynamic/json?url=https://packagephobia.com/v2/api.json?p=axios&query=$.install.pretty&label=install%20size&style=flat-square)](https://packagephobia.now.sh/result?p=axios)
+[![npm bundle size](https://img.shields.io/bundlephobia/minzip/axios?style=flat-square)](https://bundlephobia.com/package/axios@latest)
+[![npm downloads](https://img.shields.io/npm/dm/axios.svg?style=flat-square)](https://npm-stat.com/charts.html?package=axios)
+[![gitter chat](https://img.shields.io/gitter/room/mzabriskie/axios.svg?style=flat-square)](https://gitter.im/mzabriskie/axios)
+[![code helpers](https://www.codetriage.com/axios/axios/badges/users.svg)](https://www.codetriage.com/axios/axios)
+[![Known Vulnerabilities](https://snyk.io/test/npm/axios/badge.svg)](https://snyk.io/test/npm/axios)
+
+
+
+
+</div>
+
+## Table of Contents
+
+ - [Features](#features)
+ - [Browser Support](#browser-support)
+ - [Installing](#installing)
+ - [Example](#example)
+ - [Axios API](#axios-api)
+ - [Request method aliases](#request-method-aliases)
+ - [Concurrency 👎](#concurrency-deprecated)
+ - [Creating an instance](#creating-an-instance)
+ - [Instance methods](#instance-methods)
+ - [Request Config](#request-config)
+ - [Response Schema](#response-schema)
+ - [Config Defaults](#config-defaults)
+ - [Global axios defaults](#global-axios-defaults)
+ - [Custom instance defaults](#custom-instance-defaults)
+ - [Config order of precedence](#config-order-of-precedence)
+ - [Interceptors](#interceptors)
+ - [Multiple Interceptors](#multiple-interceptors)
+ - [Handling Errors](#handling-errors)
+ - [Cancellation](#cancellation)
+ - [AbortController](#abortcontroller)
+ - [CancelToken 👎](#canceltoken-deprecated)
+ - [Using application/x-www-form-urlencoded format](#using-applicationx-www-form-urlencoded-format)
+ - [URLSearchParams](#urlsearchparams)
+ - [Query string](#query-string-older-browsers)
+ - [🆕 Automatic serialization](#-automatic-serialization-to-urlsearchparams)
+ - [Using multipart/form-data format](#using-multipartform-data-format)
+ - [FormData](#formdata)
+ - [🆕 Automatic serialization](#-automatic-serialization-to-formdata)
+ - [Files Posting](#files-posting)
+ - [HTML Form Posting](#-html-form-posting-browser)
+ - [🆕 Progress capturing](#-progress-capturing)
+ - [🆕 Rate limiting](#-progress-capturing)
+ - [Semver](#semver)
+ - [Promises](#promises)
+ - [TypeScript](#typescript)
+ - [Resources](#resources)
+ - [Credits](#credits)
+ - [License](#license)
+
+## Features
+
+- Make [XMLHttpRequests](https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest) from the browser
+- Make [http](https://nodejs.org/api/http.html) requests from node.js
+- Supports the [Promise](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise) API
+- Intercept request and response
+- Transform request and response data
+- Cancel requests
+- Automatic transforms for JSON data
+- 🆕 Automatic data object serialization to `multipart/form-data` and `x-www-form-urlencoded` body encodings
+- Client side support for protecting against [XSRF](https://en.wikipedia.org/wiki/Cross-site_request_forgery)
+
+## Browser Support
+
+![Chrome](https://raw.githubusercontent.com/alrra/browser-logos/main/src/chrome/chrome_48x48.png) | ![Firefox](https://raw.githubusercontent.com/alrra/browser-logos/main/src/firefox/firefox_48x48.png) | ![Safari](https://raw.githubusercontent.com/alrra/browser-logos/main/src/safari/safari_48x48.png) | ![Opera](https://raw.githubusercontent.com/alrra/browser-logos/main/src/opera/opera_48x48.png) | ![Edge](https://raw.githubusercontent.com/alrra/browser-logos/main/src/edge/edge_48x48.png) | ![IE](https://raw.githubusercontent.com/alrra/browser-logos/master/src/archive/internet-explorer_9-11/internet-explorer_9-11_48x48.png) |
+--- | --- | --- | --- | --- | --- |
+Latest ✔ | Latest ✔ | Latest ✔ | Latest ✔ | Latest ✔ | 11 ✔ |
+
+[![Browser Matrix](https://saucelabs.com/open_sauce/build_matrix/axios.svg)](https://saucelabs.com/u/axios)
+
+## Installing
+
+Using npm:
+
+```bash
+$ npm install axios
+```
+
+Using bower:
+
+```bash
+$ bower install axios
+```
+
+Using yarn:
+
+```bash
+$ yarn add axios
+```
+
+Using pnpm:
+
+```bash
+$ pnpm add axios
+```
+
+Using jsDelivr CDN:
+
+```html
+<script src="https://cdn.jsdelivr.net/npm/axios@1.1.2/dist/axios.min.js"></script>
+```
+
+Using unpkg CDN:
+
+```html
+<script src="https://unpkg.com/axios@1.1.2/dist/axios.min.js"></script>
+```
+
+## Example
+
+### note: CommonJS usage
+In order to gain the TypeScript typings (for intellisense / autocomplete) while using CommonJS imports with `require()` use the following approach:
+
+```js
+const axios = require('axios').default;
+
+// axios.<method> will now provide autocomplete and parameter typings
+```
+
+Performing a `GET` request
+
+```js
+const axios = require('axios').default;
+
+// Make a request for a user with a given ID
+axios.get('/user?ID=12345')
+ .then(function (response) {
+ // handle success
+ console.log(response);
+ })
+ .catch(function (error) {
+ // handle error
+ console.log(error);
+ })
+ .finally(function () {
+ // always executed
+ });
+
+// Optionally the request above could also be done as
+axios.get('/user', {
+ params: {
+ ID: 12345
+ }
+ })
+ .then(function (response) {
+ console.log(response);
+ })
+ .catch(function (error) {
+ console.log(error);
+ })
+ .finally(function () {
+ // always executed
+ });
+
+// Want to use async/await? Add the `async` keyword to your outer function/method.
+async function getUser() {
+ try {
+ const response = await axios.get('/user?ID=12345');
+ console.log(response);
+ } catch (error) {
+ console.error(error);
+ }
+}
+```
+
+> **Note** `async/await` is part of ECMAScript 2017 and is not supported in Internet
+> Explorer and older browsers, so use with caution.
+
+Performing a `POST` request
+
+```js
+axios.post('/user', {
+ firstName: 'Fred',
+ lastName: 'Flintstone'
+ })
+ .then(function (response) {
+ console.log(response);
+ })
+ .catch(function (error) {
+ console.log(error);
+ });
+```
+
+Performing multiple concurrent requests
+
+```js
+function getUserAccount() {
+ return axios.get('/user/12345');
+}
+
+function getUserPermissions() {
+ return axios.get('/user/12345/permissions');
+}
+
+Promise.all([getUserAccount(), getUserPermissions()])
+ .then(function (results) {
+ const acct = results[0];
+ const perm = results[1];
+ });
+```
+
+## axios API
+
+Requests can be made by passing the relevant config to `axios`.
+
+##### axios(config)
+
+```js
+// Send a POST request
+axios({
+ method: 'post',
+ url: '/user/12345',
+ data: {
+ firstName: 'Fred',
+ lastName: 'Flintstone'
+ }
+});
+```
+
+```js
+// GET request for remote image in node.js
+axios({
+ method: 'get',
+ url: 'https://bit.ly/2mTM3nY',
+ responseType: 'stream'
+})
+ .then(function (response) {
+ response.data.pipe(fs.createWriteStream('ada_lovelace.jpg'))
+ });
+```
+
+##### axios(url[, config])
+
+```js
+// Send a GET request (default method)
+axios('/user/12345');
+```
+
+### Request method aliases
+
+For convenience, aliases have been provided for all common request methods.
+
+##### axios.request(config)
+##### axios.get(url[, config])
+##### axios.delete(url[, config])
+##### axios.head(url[, config])
+##### axios.options(url[, config])
+##### axios.post(url[, data[, config]])
+##### axios.put(url[, data[, config]])
+##### axios.patch(url[, data[, config]])
+
+###### NOTE
+When using the alias methods `url`, `method`, and `data` properties don't need to be specified in config.
+
+### Concurrency (Deprecated)
+Please use `Promise.all` to replace the below functions.
+
+Helper functions for dealing with concurrent requests.
+
+axios.all(iterable)
+axios.spread(callback)
+
+### Creating an instance
+
+You can create a new instance of axios with a custom config.
+
+##### axios.create([config])
+
+```js
+const instance = axios.create({
+ baseURL: 'https://some-domain.com/api/',
+ timeout: 1000,
+ headers: {'X-Custom-Header': 'foobar'}
+});
+```
+
+### Instance methods
+
+The available instance methods are listed below. The specified config will be merged with the instance config.
+
+##### axios#request(config)
+##### axios#get(url[, config])
+##### axios#delete(url[, config])
+##### axios#head(url[, config])
+##### axios#options(url[, config])
+##### axios#post(url[, data[, config]])
+##### axios#put(url[, data[, config]])
+##### axios#patch(url[, data[, config]])
+##### axios#getUri([config])
+
+## Request Config
+
+These are the available config options for making requests. Only the `url` is required. Requests will default to `GET` if `method` is not specified.
+
+```js
+{
+ // `url` is the server URL that will be used for the request
+ url: '/user',
+
+ // `method` is the request method to be used when making the request
+ method: 'get', // default
+
+ // `baseURL` will be prepended to `url` unless `url` is absolute.
+ // It can be convenient to set `baseURL` for an instance of axios to pass relative URLs
+ // to methods of that instance.
+ baseURL: 'https://some-domain.com/api/',
+
+ // `transformRequest` allows changes to the request data before it is sent to the server
+ // This is only applicable for request methods 'PUT', 'POST', 'PATCH' and 'DELETE'
+ // The last function in the array must return a string or an instance of Buffer, ArrayBuffer,
+ // FormData or Stream
+ // You may modify the headers object.
+ transformRequest: [function (data, headers) {
+ // Do whatever you want to transform the data
+
+ return data;
+ }],
+
+ // `transformResponse` allows changes to the response data to be made before
+ // it is passed to then/catch
+ transformResponse: [function (data) {
+ // Do whatever you want to transform the data
+
+ return data;
+ }],
+
+ // `headers` are custom headers to be sent
+ headers: {'X-Requested-With': 'XMLHttpRequest'},
+
+ // `params` are the URL parameters to be sent with the request
+ // Must be a plain object or a URLSearchParams object
+ params: {
+ ID: 12345
+ },
+
+ // `paramsSerializer` is an optional config in charge of serializing `params`
+ paramsSerializer: {
+ encode?: (param: string): string => { /* Do custom ops here and return transformed string */ }, // custom encoder function; sends Key/Values in an iterative fashion
+ serialize?: (params: Record<string, any>, options?: ParamsSerializerOptions ), // mimic pre 1.x behavior and send entire params object to a custom serializer func. Allows consumer to control how params are serialized.
+ indexes: false // array indexes format (null - no brackets, false (default) - empty brackets, true - brackets with indexes)
+ },
+
+ // `data` is the data to be sent as the request body
+ // Only applicable for request methods 'PUT', 'POST', 'DELETE , and 'PATCH'
+ // When no `transformRequest` is set, must be of one of the following types:
+ // - string, plain object, ArrayBuffer, ArrayBufferView, URLSearchParams
+ // - Browser only: FormData, File, Blob
+ // - Node only: Stream, Buffer, FormData (form-data package)
+ data: {
+ firstName: 'Fred'
+ },
+
+ // syntax alternative to send data into the body
+ // method post
+ // only the value is sent, not the key
+ data: 'Country=Brasil&City=Belo Horizonte',
+
+ // `timeout` specifies the number of milliseconds before the request times out.
+ // If the request takes longer than `timeout`, the request will be aborted.
+ timeout: 1000, // default is `0` (no timeout)
+
+ // `withCredentials` indicates whether or not cross-site Access-Control requests
+ // should be made using credentials
+ withCredentials: false, // default
+
+ // `adapter` allows custom handling of requests which makes testing easier.
+ // Return a promise and supply a valid response (see lib/adapters/README.md).
+ adapter: function (config) {
+ /* ... */
+ },
+
+ // `auth` indicates that HTTP Basic auth should be used, and supplies credentials.
+ // This will set an `Authorization` header, overwriting any existing
+ // `Authorization` custom headers you have set using `headers`.
+ // Please note that only HTTP Basic auth is configurable through this parameter.
+ // For Bearer tokens and such, use `Authorization` custom headers instead.
+ auth: {
+ username: 'janedoe',
+ password: 's00pers3cret'
+ },
+
+ // `responseType` indicates the type of data that the server will respond with
+ // options are: 'arraybuffer', 'document', 'json', 'text', 'stream'
+ // browser only: 'blob'
+ responseType: 'json', // default
+
+ // `responseEncoding` indicates encoding to use for decoding responses (Node.js only)
+ // Note: Ignored for `responseType` of 'stream' or client-side requests
+ responseEncoding: 'utf8', // default
+
+ // `xsrfCookieName` is the name of the cookie to use as a value for xsrf token
+ xsrfCookieName: 'XSRF-TOKEN', // default
+
+ // `xsrfHeaderName` is the name of the http header that carries the xsrf token value
+ xsrfHeaderName: 'X-XSRF-TOKEN', // default
+
+ // `onUploadProgress` allows handling of progress events for uploads
+ // browser & node.js
+ onUploadProgress: function ({loaded, total, progress, bytes, estimated, rate, upload = true}) {
+ // Do whatever you want with the Axios progress event
+ },
+
+ // `onDownloadProgress` allows handling of progress events for downloads
+ // browser & node.js
+ onDownloadProgress: function ({loaded, total, progress, bytes, estimated, rate, download = true}) {
+ // Do whatever you want with the Axios progress event
+ },
+
+ // `maxContentLength` defines the max size of the http response content in bytes allowed in node.js
+ maxContentLength: 2000,
+
+ // `maxBodyLength` (Node only option) defines the max size of the http request content in bytes allowed
+ maxBodyLength: 2000,
+
+ // `validateStatus` defines whether to resolve or reject the promise for a given
+ // HTTP response status code. If `validateStatus` returns `true` (or is set to `null`
+ // or `undefined`), the promise will be resolved; otherwise, the promise will be
+ // rejected.
+ validateStatus: function (status) {
+ return status >= 200 && status < 300; // default
+ },
+
+ // `maxRedirects` defines the maximum number of redirects to follow in node.js.
+ // If set to 0, no redirects will be followed.
+ maxRedirects: 21, // default
+
+ // `beforeRedirect` defines a function that will be called before redirect.
+ // Use this to adjust the request options upon redirecting,
+ // to inspect the latest response headers,
+ // or to cancel the request by throwing an error
+ // If maxRedirects is set to 0, `beforeRedirect` is not used.
+ beforeRedirect: (options, { headers }) => {
+ if (options.hostname === "example.com") {
+ options.auth = "user:password";
+ }
+ },
+
+ // `socketPath` defines a UNIX Socket to be used in node.js.
+ // e.g. '/var/run/docker.sock' to send requests to the docker daemon.
+ // Only either `socketPath` or `proxy` can be specified.
+ // If both are specified, `socketPath` is used.
+ socketPath: null, // default
+
+ // `httpAgent` and `httpsAgent` define a custom agent to be used when performing http
+ // and https requests, respectively, in node.js. This allows options to be added like
+ // `keepAlive` that are not enabled by default.
+ httpAgent: new http.Agent({ keepAlive: true }),
+ httpsAgent: new https.Agent({ keepAlive: true }),
+
+ // `proxy` defines the hostname, port, and protocol of the proxy server.
+ // You can also define your proxy using the conventional `http_proxy` and
+ // `https_proxy` environment variables. If you are using environment variables
+ // for your proxy configuration, you can also define a `no_proxy` environment
+ // variable as a comma-separated list of domains that should not be proxied.
+ // Use `false` to disable proxies, ignoring environment variables.
+ // `auth` indicates that HTTP Basic auth should be used to connect to the proxy, and
+ // supplies credentials.
+ // This will set an `Proxy-Authorization` header, overwriting any existing
+ // `Proxy-Authorization` custom headers you have set using `headers`.
+ // If the proxy server uses HTTPS, then you must set the protocol to `https`.
+ proxy: {
+ protocol: 'https',
+ host: '127.0.0.1',
+ // hostname: '127.0.0.1' // Takes precedence over 'host' if both are defined
+ port: 9000,
+ auth: {
+ username: 'mikeymike',
+ password: 'rapunz3l'
+ }
+ },
+
+ // `cancelToken` specifies a cancel token that can be used to cancel the request
+ // (see Cancellation section below for details)
+ cancelToken: new CancelToken(function (cancel) {
+ }),
+
+ // an alternative way to cancel Axios requests using AbortController
+ signal: new AbortController().signal,
+
+ // `decompress` indicates whether or not the response body should be decompressed
+ // automatically. If set to `true` will also remove the 'content-encoding' header
+ // from the responses objects of all decompressed responses
+ // - Node only (XHR cannot turn off decompression)
+ decompress: true // default
+
+ // `insecureHTTPParser` boolean.
+ // Indicates where to use an insecure HTTP parser that accepts invalid HTTP headers.
+ // This may allow interoperability with non-conformant HTTP implementations.
+ // Using the insecure parser should be avoided.
+ // see options https://nodejs.org/dist/latest-v12.x/docs/api/http.html#http_http_request_url_options_callback
+ // see also https://nodejs.org/en/blog/vulnerability/february-2020-security-releases/#strict-http-header-parsing-none
+ insecureHTTPParser: undefined // default
+
+ // transitional options for backward compatibility that may be removed in the newer versions
+ transitional: {
+ // silent JSON parsing mode
+ // `true` - ignore JSON parsing errors and set response.data to null if parsing failed (old behaviour)
+ // `false` - throw SyntaxError if JSON parsing failed (Note: responseType must be set to 'json')
+ silentJSONParsing: true, // default value for the current Axios version
+
+ // try to parse the response string as JSON even if `responseType` is not 'json'
+ forcedJSONParsing: true,
+
+ // throw ETIMEDOUT error instead of generic ECONNABORTED on request timeouts
+ clarifyTimeoutError: false,
+ },
+
+ env: {
+ // The FormData class to be used to automatically serialize the payload into a FormData object
+ FormData: window?.FormData || global?.FormData
+ },
+
+ formSerializer: {
+ visitor: (value, key, path, helpers) => {}; // custom visitor function to serialize form values
+ dots: boolean; // use dots instead of brackets format
+ metaTokens: boolean; // keep special endings like {} in parameter key
+ indexes: boolean; // array indexes format null - no brackets, false - empty brackets, true - brackets with indexes
+ },
+
+ // http adapter only (node.js)
+ maxRate: [
+ 100 * 1024, // 100KB/s upload limit,
+ 100 * 1024 // 100KB/s download limit
+ ]
+}
+```
+
+## Response Schema
+
+The response for a request contains the following information.
+
+```js
+{
+ // `data` is the response that was provided by the server
+ data: {},
+
+ // `status` is the HTTP status code from the server response
+ status: 200,
+
+ // `statusText` is the HTTP status message from the server response
+ statusText: 'OK',
+
+ // `headers` the HTTP headers that the server responded with
+ // All header names are lowercase and can be accessed using the bracket notation.
+ // Example: `response.headers['content-type']`
+ headers: {},
+
+ // `config` is the config that was provided to `axios` for the request
+ config: {},
+
+ // `request` is the request that generated this response
+ // It is the last ClientRequest instance in node.js (in redirects)
+ // and an XMLHttpRequest instance in the browser
+ request: {}
+}
+```
+
+When using `then`, you will receive the response as follows:
+
+```js
+axios.get('/user/12345')
+ .then(function (response) {
+ console.log(response.data);
+ console.log(response.status);
+ console.log(response.statusText);
+ console.log(response.headers);
+ console.log(response.config);
+ });
+```
+
+When using `catch`, or passing a [rejection callback](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/then) as second parameter of `then`, the response will be available through the `error` object as explained in the [Handling Errors](#handling-errors) section.
+
+## Config Defaults
+
+You can specify config defaults that will be applied to every request.
+
+### Global axios defaults
+
+```js
+axios.defaults.baseURL = 'https://api.example.com';
+
+// Important: If axios is used with multiple domains, the AUTH_TOKEN will be sent to all of them.
+// See below for an example using Custom instance defaults instead.
+axios.defaults.headers.common['Authorization'] = AUTH_TOKEN;
+
+axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';
+```
+
+### Custom instance defaults
+
+```js
+// Set config defaults when creating the instance
+const instance = axios.create({
+ baseURL: 'https://api.example.com'
+});
+
+// Alter defaults after instance has been created
+instance.defaults.headers.common['Authorization'] = AUTH_TOKEN;
+```
+
+### Config order of precedence
+
+Config will be merged with an order of precedence. The order is library defaults found in [lib/defaults.js](https://github.com/axios/axios/blob/master/lib/defaults/index.js#L28), then `defaults` property of the instance, and finally `config` argument for the request. The latter will take precedence over the former. Here's an example.
+
+```js
+// Create an instance using the config defaults provided by the library
+// At this point the timeout config value is `0` as is the default for the library
+const instance = axios.create();
+
+// Override timeout default for the library
+// Now all requests using this instance will wait 2.5 seconds before timing out
+instance.defaults.timeout = 2500;
+
+// Override timeout for this request as it's known to take a long time
+instance.get('/longRequest', {
+ timeout: 5000
+});
+```
+
+## Interceptors
+
+You can intercept requests or responses before they are handled by `then` or `catch`.
+
+```js
+// Add a request interceptor
+axios.interceptors.request.use(function (config) {
+ // Do something before request is sent
+ return config;
+ }, function (error) {
+ // Do something with request error
+ return Promise.reject(error);
+ });
+
+// Add a response interceptor
+axios.interceptors.response.use(function (response) {
+ // Any status code that lie within the range of 2xx cause this function to trigger
+ // Do something with response data
+ return response;
+ }, function (error) {
+ // Any status codes that falls outside the range of 2xx cause this function to trigger
+ // Do something with response error
+ return Promise.reject(error);
+ });
+```
+
+If you need to remove an interceptor later you can.
+
+```js
+const myInterceptor = axios.interceptors.request.use(function () {/*...*/});
+axios.interceptors.request.eject(myInterceptor);
+```
+
+You can also clear all interceptors for requests or responses.
+```js
+const instance = axios.create();
+instance.interceptors.request.use(function () {/*...*/});
+instance.interceptors.request.clear(); // Removes interceptors from requests
+instance.interceptors.response.use(function () {/*...*/});
+instance.interceptors.response.clear(); // Removes interceptors from responses
+```
+
+You can add interceptors to a custom instance of axios.
+
+```js
+const instance = axios.create();
+instance.interceptors.request.use(function () {/*...*/});
+```
+
+When you add request interceptors, they are presumed to be asynchronous by default. This can cause a delay
+in the execution of your axios request when the main thread is blocked (a promise is created under the hood for
+the interceptor and your request gets put on the bottom of the call stack). If your request interceptors are synchronous you can add a flag
+to the options object that will tell axios to run the code synchronously and avoid any delays in request execution.
+
+```js
+axios.interceptors.request.use(function (config) {
+ config.headers.test = 'I am only a header!';
+ return config;
+}, null, { synchronous: true });
+```
+
+If you want to execute a particular interceptor based on a runtime check,
+you can add a `runWhen` function to the options object. The interceptor will not be executed **if and only if** the return
+of `runWhen` is `false`. The function will be called with the config
+object (don't forget that you can bind your own arguments to it as well.) This can be handy when you have an
+asynchronous request interceptor that only needs to run at certain times.
+
+```js
+function onGetCall(config) {
+ return config.method === 'get';
+}
+axios.interceptors.request.use(function (config) {
+ config.headers.test = 'special get headers';
+ return config;
+}, null, { runWhen: onGetCall });
+```
+
+### Multiple Interceptors
+
+Given you add multiple response interceptors
+and when the response was fulfilled
+- then each interceptor is executed
+- then they are executed in the order they were added
+- then only the last interceptor's result is returned
+- then every interceptor receives the result of its predecessor
+- and when the fulfillment-interceptor throws
+ - then the following fulfillment-interceptor is not called
+ - then the following rejection-interceptor is called
+ - once caught, another following fulfill-interceptor is called again (just like in a promise chain).
+
+Read [the interceptor tests](./test/specs/interceptors.spec.js) for seeing all this in code.
+
+## Handling Errors
+
+```js
+axios.get('/user/12345')
+ .catch(function (error) {
+ if (error.response) {
+ // The request was made and the server responded with a status code
+ // that falls out of the range of 2xx
+ console.log(error.response.data);
+ console.log(error.response.status);
+ console.log(error.response.headers);
+ } else if (error.request) {
+ // The request was made but no response was received
+ // `error.request` is an instance of XMLHttpRequest in the browser and an instance of
+ // http.ClientRequest in node.js
+ console.log(error.request);
+ } else {
+ // Something happened in setting up the request that triggered an Error
+ console.log('Error', error.message);
+ }
+ console.log(error.config);
+ });
+```
+
+Using the `validateStatus` config option, you can define HTTP code(s) that should throw an error.
+
+```js
+axios.get('/user/12345', {
+ validateStatus: function (status) {
+ return status < 500; // Resolve only if the status code is less than 500
+ }
+})
+```
+
+Using `toJSON` you get an object with more information about the HTTP error.
+
+```js
+axios.get('/user/12345')
+ .catch(function (error) {
+ console.log(error.toJSON());
+ });
+```
+
+## Cancellation
+
+### AbortController
+
+Starting from `v0.22.0` Axios supports AbortController to cancel requests in fetch API way:
+
+```js
+const controller = new AbortController();
+
+axios.get('/foo/bar', {
+ signal: controller.signal
+}).then(function(response) {
+ //...
+});
+// cancel the request
+controller.abort()
+```
+
+### CancelToken `👎deprecated`
+
+You can also cancel a request using a *CancelToken*.
+
+> The axios cancel token API is based on the withdrawn [cancelable promises proposal](https://github.com/tc39/proposal-cancelable-promises).
+
+> This API is deprecated since v0.22.0 and shouldn't be used in new projects
+
+You can create a cancel token using the `CancelToken.source` factory as shown below:
+
+```js
+const CancelToken = axios.CancelToken;
+const source = CancelToken.source();
+
+axios.get('/user/12345', {
+ cancelToken: source.token
+}).catch(function (thrown) {
+ if (axios.isCancel(thrown)) {
+ console.log('Request canceled', thrown.message);
+ } else {
+ // handle error
+ }
+});
+
+axios.post('/user/12345', {
+ name: 'new name'
+}, {
+ cancelToken: source.token
+})
+
+// cancel the request (the message parameter is optional)
+source.cancel('Operation canceled by the user.');
+```
+
+You can also create a cancel token by passing an executor function to the `CancelToken` constructor:
+
+```js
+const CancelToken = axios.CancelToken;
+let cancel;
+
+axios.get('/user/12345', {
+ cancelToken: new CancelToken(function executor(c) {
+ // An executor function receives a cancel function as a parameter
+ cancel = c;
+ })
+});
+
+// cancel the request
+cancel();
+```
+
+> **Note:** you can cancel several requests with the same cancel token/abort controller.
+> If a cancellation token is already cancelled at the moment of starting an Axios request, then the request is cancelled immediately, without any attempts to make a real request.
+
+> During the transition period, you can use both cancellation APIs, even for the same request:
+
+## Using `application/x-www-form-urlencoded` format
+
+### URLSearchParams
+
+By default, axios serializes JavaScript objects to `JSON`. To send data in the [`application/x-www-form-urlencoded` format](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/POST) instead, you can use the [`URLSearchParams`](https://developer.mozilla.org/en-US/docs/Web/API/URLSearchParams) API, which is [supported](http://www.caniuse.com/#feat=urlsearchparams) in the vast majority of browsers, [and Node](https://nodejs.org/api/url.html#url_class_urlsearchparams) starting with v10 (released in 2018).
+
+```js
+const params = new URLSearchParams({ foo: 'bar' });
+params.append('extraparam', 'value');
+axios.post('/foo', params);
+```
+
+### Query string (Older browsers)
+
+For compatibility with very old browsers, there is a [polyfill](https://github.com/WebReflection/url-search-params) available (make sure to polyfill the global environment).
+
+Alternatively, you can encode data using the [`qs`](https://github.com/ljharb/qs) library:
+
+```js
+const qs = require('qs');
+axios.post('/foo', qs.stringify({ 'bar': 123 }));
+```
+
+Or in another way (ES6),
+
+```js
+import qs from 'qs';
+const data = { 'bar': 123 };
+const options = {
+ method: 'POST',
+ headers: { 'content-type': 'application/x-www-form-urlencoded' },
+ data: qs.stringify(data),
+ url,
+};
+axios(options);
+```
+
+### Older Node.js versions
+
+For older Node.js engines, you can use the [`querystring`](https://nodejs.org/api/querystring.html) module as follows:
+
+```js
+const querystring = require('querystring');
+axios.post('https://something.com/', querystring.stringify({ foo: 'bar' }));
+```
+
+You can also use the [`qs`](https://github.com/ljharb/qs) library.
+
+> **Note**
+> The `qs` library is preferable if you need to stringify nested objects, as the `querystring` method has [known issues](https://github.com/nodejs/node-v0.x-archive/issues/1665) with that use case.
+
+### 🆕 Automatic serialization to URLSearchParams
+
+Axios will automatically serialize the data object to urlencoded format if the content-type header is set to "application/x-www-form-urlencoded".
+
+```js
+const data = {
+ x: 1,
+ arr: [1, 2, 3],
+ arr2: [1, [2], 3],
+ users: [{name: 'Peter', surname: 'Griffin'}, {name: 'Thomas', surname: 'Anderson'}],
+};
+
+await axios.postForm('https://postman-echo.com/post', data,
+ {headers: {'content-type': 'application/x-www-form-urlencoded'}}
+);
+```
+
+The server will handle it as
+
+```js
+ {
+ x: '1',
+ 'arr[]': [ '1', '2', '3' ],
+ 'arr2[0]': '1',
+ 'arr2[1][0]': '2',
+ 'arr2[2]': '3',
+ 'arr3[]': [ '1', '2', '3' ],
+ 'users[0][name]': 'Peter',
+ 'users[0][surname]': 'griffin',
+ 'users[1][name]': 'Thomas',
+ 'users[1][surname]': 'Anderson'
+ }
+````
+
+If your backend body-parser (like `body-parser` of `express.js`) supports nested objects decoding, you will get the same object on the server-side automatically
+
+```js
+ var app = express();
+
+ app.use(bodyParser.urlencoded({ extended: true })); // support encoded bodies
+
+ app.post('/', function (req, res, next) {
+ // echo body as JSON
+ res.send(JSON.stringify(req.body));
+ });
+
+ server = app.listen(3000);
+```
+
+## Using `multipart/form-data` format
+
+### FormData
+
+To send the data as a `multipart/formdata` you need to pass a formData instance as a payload.
+Setting the `Content-Type` header is not required as Axios guesses it based on the payload type.
+
+```js
+const formData = new FormData();
+formData.append('foo', 'bar');
+
+axios.post('https://httpbin.org/post', formData);
+```
+
+In node.js, you can use the [`form-data`](https://github.com/form-data/form-data) library as follows:
+
+```js
+const FormData = require('form-data');
+
+const form = new FormData();
+form.append('my_field', 'my value');
+form.append('my_buffer', new Buffer(10));
+form.append('my_file', fs.createReadStream('/foo/bar.jpg'));
+
+axios.post('https://example.com', form)
+```
+
+### 🆕 Automatic serialization to FormData
+
+Starting from `v0.27.0`, Axios supports automatic object serialization to a FormData object if the request `Content-Type`
+header is set to `multipart/form-data`.
+
+The following request will submit the data in a FormData format (Browser & Node.js):
+
+```js
+import axios from 'axios';
+
+axios.post('https://httpbin.org/post', {x: 1}, {
+ headers: {
+ 'Content-Type': 'multipart/form-data'
+ }
+}).then(({data}) => console.log(data));
+```
+
+In the `node.js` build, the ([`form-data`](https://github.com/form-data/form-data)) polyfill is used by default.
+
+You can overload the FormData class by setting the `env.FormData` config variable,
+but you probably won't need it in most cases:
+
+```js
+const axios = require('axios');
+var FormData = require('form-data');
+
+axios.post('https://httpbin.org/post', {x: 1, buf: new Buffer(10)}, {
+ headers: {
+ 'Content-Type': 'multipart/form-data'
+ }
+}).then(({data}) => console.log(data));
+```
+
+Axios FormData serializer supports some special endings to perform the following operations:
+
+- `{}` - serialize the value with JSON.stringify
+- `[]` - unwrap the array-like object as separate fields with the same key
+
+> **Note**
+> unwrap/expand operation will be used by default on arrays and FileList objects
+
+FormData serializer supports additional options via `config.formSerializer: object` property to handle rare cases:
+
+- `visitor: Function` - user-defined visitor function that will be called recursively to serialize the data object
+to a `FormData` object by following custom rules.
+
+- `dots: boolean = false` - use dot notation instead of brackets to serialize arrays and objects;
+
+- `metaTokens: boolean = true` - add the special ending (e.g `user{}: '{"name": "John"}'`) in the FormData key.
+The back-end body-parser could potentially use this meta-information to automatically parse the value as JSON.
+
+- `indexes: null|false|true = false` - controls how indexes will be added to unwrapped keys of `flat` array-like objects
+
+ - `null` - don't add brackets (`arr: 1`, `arr: 2`, `arr: 3`)
+ - `false`(default) - add empty brackets (`arr[]: 1`, `arr[]: 2`, `arr[]: 3`)
+ - `true` - add brackets with indexes (`arr[0]: 1`, `arr[1]: 2`, `arr[2]: 3`)
+
+Let's say we have an object like this one:
+
+```js
+const obj = {
+ x: 1,
+ arr: [1, 2, 3],
+ arr2: [1, [2], 3],
+ users: [{name: 'Peter', surname: 'Griffin'}, {name: 'Thomas', surname: 'Anderson'}],
+ 'obj2{}': [{x:1}]
+};
+```
+
+The following steps will be executed by the Axios serializer internally:
+
+```js
+const formData = new FormData();
+formData.append('x', '1');
+formData.append('arr[]', '1');
+formData.append('arr[]', '2');
+formData.append('arr[]', '3');
+formData.append('arr2[0]', '1');
+formData.append('arr2[1][0]', '2');
+formData.append('arr2[2]', '3');
+formData.append('users[0][name]', 'Peter');
+formData.append('users[0][surname]', 'Griffin');
+formData.append('users[1][name]', 'Thomas');
+formData.append('users[1][surname]', 'Anderson');
+formData.append('obj2{}', '[{"x":1}]');
+```
+
+Axios supports the following shortcut methods: `postForm`, `putForm`, `patchForm`
+which are just the corresponding http methods with the `Content-Type` header preset to `multipart/form-data`.
+
+## Files Posting
+
+You can easily submit a single file:
+
+```js
+await axios.postForm('https://httpbin.org/post', {
+ 'myVar' : 'foo',
+ 'file': document.querySelector('#fileInput').files[0]
+});
+```
+
+or multiple files as `multipart/form-data`:
+
+```js
+await axios.postForm('https://httpbin.org/post', {
+ 'files[]': document.querySelector('#fileInput').files
+});
+```
+
+`FileList` object can be passed directly:
+
+```js
+await axios.postForm('https://httpbin.org/post', document.querySelector('#fileInput').files)
+```
+
+All files will be sent with the same field names: `files[]`.
+
+## 🆕 HTML Form Posting (browser)
+
+Pass HTML Form element as a payload to submit it as `multipart/form-data` content.
+
+```js
+await axios.postForm('https://httpbin.org/post', document.querySelector('#htmlForm'));
+```
+
+`FormData` and `HTMLForm` objects can also be posted as `JSON` by explicitly setting the `Content-Type` header to `application/json`:
+
+```js
+await axios.post('https://httpbin.org/post', document.querySelector('#htmlForm'), {
+ headers: {
+ 'Content-Type': 'application/json'
+ }
+})
+```
+
+For example, the Form
+
+```html
+<form id="form">
+ <input type="text" name="foo" value="1">
+ <input type="text" name="deep.prop" value="2">
+ <input type="text" name="deep prop spaced" value="3">
+ <input type="text" name="baz" value="4">
+ <input type="text" name="baz" value="5">
+
+ <select name="user.age">
+ <option value="value1">Value 1</option>
+ <option value="value2" selected>Value 2</option>
+ <option value="value3">Value 3</option>
+ </select>
+
+ <input type="submit" value="Save">
+</form>
+```
+
+will be submitted as the following JSON object:
+
+```js
+{
+ "foo": "1",
+ "deep": {
+ "prop": {
+ "spaced": "3"
+ }
+ },
+ "baz": [
+ "4",
+ "5"
+ ],
+ "user": {
+ "age": "value2"
+ }
+}
+````
+
+Sending `Blobs`/`Files` as JSON (`base64`) is not currently supported.
+
+## 🆕 Progress capturing
+
+Axios supports both browser and node environments to capture request upload/download progress.
+
+```js
+await axios.post(url, data, {
+ onUploadProgress: function (axiosProgressEvent) {
+ /*{
+ loaded: number;
+ total?: number;
+ progress?: number; // in range [0..1]
+ bytes: number; // how many bytes have been transferred since the last trigger (delta)
+ estimated?: number; // estimated time in seconds
+ rate?: number; // upload speed in bytes
+ upload: true; // upload sign
+ }*/
+ },
+
+ onDownloadProgress: function (axiosProgressEvent) {
+ /*{
+ loaded: number;
+ total?: number;
+ progress?: number;
+ bytes: number;
+ estimated?: number;
+ rate?: number; // download speed in bytes
+ download: true; // download sign
+ }*/
+ }
+});
+```
+
+You can also track stream upload/download progress in node.js:
+
+```js
+const {data} = await axios.post(SERVER_URL, readableStream, {
+ onUploadProgress: ({progress}) => {
+ console.log((progress * 100).toFixed(2));
+ },
+
+ headers: {
+ 'Content-Length': contentLength
+ },
+
+ maxRedirects: 0 // avoid buffering the entire stream
+});
+````
+
+> **Note:**
+> Capturing FormData upload progress is currently not currently supported in node.js environments.
+
+> **⚠️ Warning**
+> It is recommended to disable redirects by setting maxRedirects: 0 to upload the stream in the **node.js** environment,
+> as follow-redirects package will buffer the entire stream in RAM without following the "backpressure" algorithm.
+
+
+## 🆕 Rate limiting
+
+Download and upload rate limits can only be set for the http adapter (node.js):
+
+```js
+const {data} = await axios.post(LOCAL_SERVER_URL, myBuffer, {
+ onUploadProgress: ({progress, rate}) => {
+ console.log(`Upload [${(progress*100).toFixed(2)}%]: ${(rate / 1024).toFixed(2)}KB/s`)
+ },
+
+ maxRate: [100 * 1024], // 100KB/s limit
+});
+```
+
+## Semver
+
+Until axios reaches a `1.0` release, breaking changes will be released with a new minor version. For example `0.5.1`, and `0.5.4` will have the same API, but `0.6.0` will have breaking changes.
+
+## Promises
+
+axios depends on a native ES6 Promise implementation to be [supported](https://caniuse.com/promises).
+If your environment doesn't support ES6 Promises, you can [polyfill](https://github.com/jakearchibald/es6-promise).
+
+## TypeScript
+
+axios includes [TypeScript](https://typescriptlang.org) definitions and a type guard for axios errors.
+
+```typescript
+let user: User = null;
+try {
+ const { data } = await axios.get('/user?ID=12345');
+ user = data.userDetails;
+} catch (error) {
+ if (axios.isAxiosError(error)) {
+ handleAxiosError(error);
+ } else {
+ handleUnexpectedError(error);
+ }
+}
+```
+
+## Online one-click setup
+
+You can use Gitpod, an online IDE(which is free for Open Source) for contributing or running the examples online.
+
+[![Open in Gitpod](https://gitpod.io/button/open-in-gitpod.svg)](https://gitpod.io/#https://github.com/axios/axios/blob/main/examples/server.js)
+
+
+## Resources
+
+* [Changelog](https://github.com/axios/axios/blob/master/CHANGELOG.md)
+* [Upgrade Guide](https://github.com/axios/axios/blob/master/UPGRADE_GUIDE.md)
+* [Ecosystem](https://github.com/axios/axios/blob/master/ECOSYSTEM.md)
+* [Contributing Guide](https://github.com/axios/axios/blob/master/CONTRIBUTING.md)
+* [Code of Conduct](https://github.com/axios/axios/blob/master/CODE_OF_CONDUCT.md)
+
+## Credits
+
+axios is heavily inspired by the [$http service](https://docs.angularjs.org/api/ng/service/$http) provided in [AngularJS](https://angularjs.org/). Ultimately axios is an effort to provide a standalone `$http`-like service for use outside of AngularJS.
+
+## License
+
+[MIT](LICENSE)
diff --git a/node_modules/axios/SECURITY.md b/node_modules/axios/SECURITY.md
new file mode 100644
index 0000000..a5a2b7d
--- /dev/null
+++ b/node_modules/axios/SECURITY.md
@@ -0,0 +1,6 @@
+# Reporting a Vulnerability
+
+If you discover a security vulnerability in axios please disclose it via [our huntr page](https://huntr.dev/repos/axios/axios/). Bounty eligibility, CVE assignment, response times and past reports are all there.
+
+
+Thank you for improving the security of axios.
diff --git a/node_modules/axios/UPGRADE_GUIDE.md b/node_modules/axios/UPGRADE_GUIDE.md
new file mode 100644
index 0000000..e0febe5
--- /dev/null
+++ b/node_modules/axios/UPGRADE_GUIDE.md
@@ -0,0 +1,3 @@
+# Upgrade Guide
+
+## 0.x.x -> 1.1.0
diff --git a/node_modules/axios/bin/ssl_hotfix.js b/node_modules/axios/bin/ssl_hotfix.js
new file mode 100644
index 0000000..6147bf0
--- /dev/null
+++ b/node_modules/axios/bin/ssl_hotfix.js
@@ -0,0 +1,22 @@
+import {spawn} from 'child_process';
+
+const args = process.argv.slice(2);
+
+console.log(`Running ${args.join(' ')} on ${process.version}\n`);
+
+const match = /v(\d+)/.exec(process.version);
+
+const isHotfixNeeded = match && match[1] > 16;
+
+isHotfixNeeded && console.warn('Setting --openssl-legacy-provider as ssl hotfix');
+
+const test = spawn('cross-env',
+ isHotfixNeeded ? ['NODE_OPTIONS=--openssl-legacy-provider', ...args] : args, {
+ shell: true,
+ stdio: 'inherit'
+ }
+);
+
+test.on('exit', function (code) {
+ process.exit(code)
+})
diff --git a/node_modules/axios/dist/axios.js b/node_modules/axios/dist/axios.js
new file mode 100644
index 0000000..5c85690
--- /dev/null
+++ b/node_modules/axios/dist/axios.js
@@ -0,0 +1,2658 @@
+// Axios v1.1.3 Copyright (c) 2022 Matt Zabriskie and contributors
+(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
+ typeof define === 'function' && define.amd ? define(factory) :
+ (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.axios = factory());
+})(this, (function () { 'use strict';
+
+ function _typeof(obj) {
+ "@babel/helpers - typeof";
+
+ return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) {
+ return typeof obj;
+ } : function (obj) {
+ return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj;
+ }, _typeof(obj);
+ }
+ function _classCallCheck(instance, Constructor) {
+ if (!(instance instanceof Constructor)) {
+ throw new TypeError("Cannot call a class as a function");
+ }
+ }
+ function _defineProperties(target, props) {
+ for (var i = 0; i < props.length; i++) {
+ var descriptor = props[i];
+ descriptor.enumerable = descriptor.enumerable || false;
+ descriptor.configurable = true;
+ if ("value" in descriptor) descriptor.writable = true;
+ Object.defineProperty(target, descriptor.key, descriptor);
+ }
+ }
+ function _createClass(Constructor, protoProps, staticProps) {
+ if (protoProps) _defineProperties(Constructor.prototype, protoProps);
+ if (staticProps) _defineProperties(Constructor, staticProps);
+ Object.defineProperty(Constructor, "prototype", {
+ writable: false
+ });
+ return Constructor;
+ }
+
+ function bind(fn, thisArg) {
+ return function wrap() {
+ return fn.apply(thisArg, arguments);
+ };
+ }
+
+ // utils is a library of generic helper functions non-specific to axios
+
+ var toString = Object.prototype.toString;
+ var getPrototypeOf = Object.getPrototypeOf;
+ var kindOf = function (cache) {
+ return function (thing) {
+ var str = toString.call(thing);
+ return cache[str] || (cache[str] = str.slice(8, -1).toLowerCase());
+ };
+ }(Object.create(null));
+ var kindOfTest = function kindOfTest(type) {
+ type = type.toLowerCase();
+ return function (thing) {
+ return kindOf(thing) === type;
+ };
+ };
+ var typeOfTest = function typeOfTest(type) {
+ return function (thing) {
+ return _typeof(thing) === type;
+ };
+ };
+
+ /**
+ * Determine if a value is an Array
+ *
+ * @param {Object} val The value to test
+ *
+ * @returns {boolean} True if value is an Array, otherwise false
+ */
+ var isArray = Array.isArray;
+
+ /**
+ * Determine if a value is undefined
+ *
+ * @param {*} val The value to test
+ *
+ * @returns {boolean} True if the value is undefined, otherwise false
+ */
+ var isUndefined = typeOfTest('undefined');
+
+ /**
+ * Determine if a value is a Buffer
+ *
+ * @param {*} val The value to test
+ *
+ * @returns {boolean} True if value is a Buffer, otherwise false
+ */
+ function isBuffer(val) {
+ return val !== null && !isUndefined(val) && val.constructor !== null && !isUndefined(val.constructor) && isFunction(val.constructor.isBuffer) && val.constructor.isBuffer(val);
+ }
+
+ /**
+ * Determine if a value is an ArrayBuffer
+ *
+ * @param {*} val The value to test
+ *
+ * @returns {boolean} True if value is an ArrayBuffer, otherwise false
+ */
+ var isArrayBuffer = kindOfTest('ArrayBuffer');
+
+ /**
+ * Determine if a value is a view on an ArrayBuffer
+ *
+ * @param {*} val The value to test
+ *
+ * @returns {boolean} True if value is a view on an ArrayBuffer, otherwise false
+ */
+ function isArrayBufferView(val) {
+ var result;
+ if (typeof ArrayBuffer !== 'undefined' && ArrayBuffer.isView) {
+ result = ArrayBuffer.isView(val);
+ } else {
+ result = val && val.buffer && isArrayBuffer(val.buffer);
+ }
+ return result;
+ }
+
+ /**
+ * Determine if a value is a String
+ *
+ * @param {*} val The value to test
+ *
+ * @returns {boolean} True if value is a String, otherwise false
+ */
+ var isString = typeOfTest('string');
+
+ /**
+ * Determine if a value is a Function
+ *
+ * @param {*} val The value to test
+ * @returns {boolean} True if value is a Function, otherwise false
+ */
+ var isFunction = typeOfTest('function');
+
+ /**
+ * Determine if a value is a Number
+ *
+ * @param {*} val The value to test
+ *
+ * @returns {boolean} True if value is a Number, otherwise false
+ */
+ var isNumber = typeOfTest('number');
+
+ /**
+ * Determine if a value is an Object
+ *
+ * @param {*} thing The value to test
+ *
+ * @returns {boolean} True if value is an Object, otherwise false
+ */
+ var isObject = function isObject(thing) {
+ return thing !== null && _typeof(thing) === 'object';
+ };
+
+ /**
+ * Determine if a value is a Boolean
+ *
+ * @param {*} thing The value to test
+ * @returns {boolean} True if value is a Boolean, otherwise false
+ */
+ var isBoolean = function isBoolean(thing) {
+ return thing === true || thing === false;
+ };
+
+ /**
+ * Determine if a value is a plain Object
+ *
+ * @param {*} val The value to test
+ *
+ * @returns {boolean} True if value is a plain Object, otherwise false
+ */
+ var isPlainObject = function isPlainObject(val) {
+ if (kindOf(val) !== 'object') {
+ return false;
+ }
+ var prototype = getPrototypeOf(val);
+ return (prototype === null || prototype === Object.prototype || Object.getPrototypeOf(prototype) === null) && !(Symbol.toStringTag in val) && !(Symbol.iterator in val);
+ };
+
+ /**
+ * Determine if a value is a Date
+ *
+ * @param {*} val The value to test
+ *
+ * @returns {boolean} True if value is a Date, otherwise false
+ */
+ var isDate = kindOfTest('Date');
+
+ /**
+ * Determine if a value is a File
+ *
+ * @param {*} val The value to test
+ *
+ * @returns {boolean} True if value is a File, otherwise false
+ */
+ var isFile = kindOfTest('File');
+
+ /**
+ * Determine if a value is a Blob
+ *
+ * @param {*} val The value to test
+ *
+ * @returns {boolean} True if value is a Blob, otherwise false
+ */
+ var isBlob = kindOfTest('Blob');
+
+ /**
+ * Determine if a value is a FileList
+ *
+ * @param {*} val The value to test
+ *
+ * @returns {boolean} True if value is a File, otherwise false
+ */
+ var isFileList = kindOfTest('FileList');
+
+ /**
+ * Determine if a value is a Stream
+ *
+ * @param {*} val The value to test
+ *
+ * @returns {boolean} True if value is a Stream, otherwise false
+ */
+ var isStream = function isStream(val) {
+ return isObject(val) && isFunction(val.pipe);
+ };
+
+ /**
+ * Determine if a value is a FormData
+ *
+ * @param {*} thing The value to test
+ *
+ * @returns {boolean} True if value is an FormData, otherwise false
+ */
+ var isFormData = function isFormData(thing) {
+ var pattern = '[object FormData]';
+ return thing && (typeof FormData === 'function' && thing instanceof FormData || toString.call(thing) === pattern || isFunction(thing.toString) && thing.toString() === pattern);
+ };
+
+ /**
+ * Determine if a value is a URLSearchParams object
+ *
+ * @param {*} val The value to test
+ *
+ * @returns {boolean} True if value is a URLSearchParams object, otherwise false
+ */
+ var isURLSearchParams = kindOfTest('URLSearchParams');
+
+ /**
+ * Trim excess whitespace off the beginning and end of a string
+ *
+ * @param {String} str The String to trim
+ *
+ * @returns {String} The String freed of excess whitespace
+ */
+ var trim = function trim(str) {
+ return str.trim ? str.trim() : str.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, '');
+ };
+
+ /**
+ * Iterate over an Array or an Object invoking a function for each item.
+ *
+ * If `obj` is an Array callback will be called passing
+ * the value, index, and complete array for each item.
+ *
+ * If 'obj' is an Object callback will be called passing
+ * the value, key, and complete object for each property.
+ *
+ * @param {Object|Array} obj The object to iterate
+ * @param {Function} fn The callback to invoke for each item
+ *
+ * @param {Boolean} [allOwnKeys = false]
+ * @returns {void}
+ */
+ function forEach(obj, fn) {
+ var _ref = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {},
+ _ref$allOwnKeys = _ref.allOwnKeys,
+ allOwnKeys = _ref$allOwnKeys === void 0 ? false : _ref$allOwnKeys;
+ // Don't bother if no value provided
+ if (obj === null || typeof obj === 'undefined') {
+ return;
+ }
+ var i;
+ var l;
+
+ // Force an array if not already something iterable
+ if (_typeof(obj) !== 'object') {
+ /*eslint no-param-reassign:0*/
+ obj = [obj];
+ }
+ if (isArray(obj)) {
+ // Iterate over array values
+ for (i = 0, l = obj.length; i < l; i++) {
+ fn.call(null, obj[i], i, obj);
+ }
+ } else {
+ // Iterate over object keys
+ var keys = allOwnKeys ? Object.getOwnPropertyNames(obj) : Object.keys(obj);
+ var len = keys.length;
+ var key;
+ for (i = 0; i < len; i++) {
+ key = keys[i];
+ fn.call(null, obj[key], key, obj);
+ }
+ }
+ }
+
+ /**
+ * Accepts varargs expecting each argument to be an object, then
+ * immutably merges the properties of each object and returns result.
+ *
+ * When multiple objects contain the same key the later object in
+ * the arguments list will take precedence.
+ *
+ * Example:
+ *
+ * ```js
+ * var result = merge({foo: 123}, {foo: 456});
+ * console.log(result.foo); // outputs 456
+ * ```
+ *
+ * @param {Object} obj1 Object to merge
+ *
+ * @returns {Object} Result of all merge properties
+ */
+ function /* obj1, obj2, obj3, ... */
+ merge() {
+ var result = {};
+ var assignValue = function assignValue(val, key) {
+ if (isPlainObject(result[key]) && isPlainObject(val)) {
+ result[key] = merge(result[key], val);
+ } else if (isPlainObject(val)) {
+ result[key] = merge({}, val);
+ } else if (isArray(val)) {
+ result[key] = val.slice();
+ } else {
+ result[key] = val;
+ }
+ };
+ for (var i = 0, l = arguments.length; i < l; i++) {
+ arguments[i] && forEach(arguments[i], assignValue);
+ }
+ return result;
+ }
+
+ /**
+ * Extends object a by mutably adding to it the properties of object b.
+ *
+ * @param {Object} a The object to be extended
+ * @param {Object} b The object to copy properties from
+ * @param {Object} thisArg The object to bind function to
+ *
+ * @param {Boolean} [allOwnKeys]
+ * @returns {Object} The resulting value of object a
+ */
+ var extend = function extend(a, b, thisArg) {
+ var _ref2 = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {},
+ allOwnKeys = _ref2.allOwnKeys;
+ forEach(b, function (val, key) {
+ if (thisArg && isFunction(val)) {
+ a[key] = bind(val, thisArg);
+ } else {
+ a[key] = val;
+ }
+ }, {
+ allOwnKeys: allOwnKeys
+ });
+ return a;
+ };
+
+ /**
+ * Remove byte order marker. This catches EF BB BF (the UTF-8 BOM)
+ *
+ * @param {string} content with BOM
+ *
+ * @returns {string} content value without BOM
+ */
+ var stripBOM = function stripBOM(content) {
+ if (content.charCodeAt(0) === 0xFEFF) {
+ content = content.slice(1);
+ }
+ return content;
+ };
+
+ /**
+ * Inherit the prototype methods from one constructor into another
+ * @param {function} constructor
+ * @param {function} superConstructor
+ * @param {object} [props]
+ * @param {object} [descriptors]
+ *
+ * @returns {void}
+ */
+ var inherits = function inherits(constructor, superConstructor, props, descriptors) {
+ constructor.prototype = Object.create(superConstructor.prototype, descriptors);
+ constructor.prototype.constructor = constructor;
+ Object.defineProperty(constructor, 'super', {
+ value: superConstructor.prototype
+ });
+ props && Object.assign(constructor.prototype, props);
+ };
+
+ /**
+ * Resolve object with deep prototype chain to a flat object
+ * @param {Object} sourceObj source object
+ * @param {Object} [destObj]
+ * @param {Function|Boolean} [filter]
+ * @param {Function} [propFilter]
+ *
+ * @returns {Object}
+ */
+ var toFlatObject = function toFlatObject(sourceObj, destObj, filter, propFilter) {
+ var props;
+ var i;
+ var prop;
+ var merged = {};
+ destObj = destObj || {};
+ // eslint-disable-next-line no-eq-null,eqeqeq
+ if (sourceObj == null) return destObj;
+ do {
+ props = Object.getOwnPropertyNames(sourceObj);
+ i = props.length;
+ while (i-- > 0) {
+ prop = props[i];
+ if ((!propFilter || propFilter(prop, sourceObj, destObj)) && !merged[prop]) {
+ destObj[prop] = sourceObj[prop];
+ merged[prop] = true;
+ }
+ }
+ sourceObj = filter !== false && getPrototypeOf(sourceObj);
+ } while (sourceObj && (!filter || filter(sourceObj, destObj)) && sourceObj !== Object.prototype);
+ return destObj;
+ };
+
+ /**
+ * Determines whether a string ends with the characters of a specified string
+ *
+ * @param {String} str
+ * @param {String} searchString
+ * @param {Number} [position= 0]
+ *
+ * @returns {boolean}
+ */
+ var endsWith = function endsWith(str, searchString, position) {
+ str = String(str);
+ if (position === undefined || position > str.length) {
+ position = str.length;
+ }
+ position -= searchString.length;
+ var lastIndex = str.indexOf(searchString, position);
+ return lastIndex !== -1 && lastIndex === position;
+ };
+
+ /**
+ * Returns new array from array like object or null if failed
+ *
+ * @param {*} [thing]
+ *
+ * @returns {?Array}
+ */
+ var toArray = function toArray(thing) {
+ if (!thing) return null;
+ if (isArray(thing)) return thing;
+ var i = thing.length;
+ if (!isNumber(i)) return null;
+ var arr = new Array(i);
+ while (i-- > 0) {
+ arr[i] = thing[i];
+ }
+ return arr;
+ };
+
+ /**
+ * Checking if the Uint8Array exists and if it does, it returns a function that checks if the
+ * thing passed in is an instance of Uint8Array
+ *
+ * @param {TypedArray}
+ *
+ * @returns {Array}
+ */
+ // eslint-disable-next-line func-names
+ var isTypedArray = function (TypedArray) {
+ // eslint-disable-next-line func-names
+ return function (thing) {
+ return TypedArray && thing instanceof TypedArray;
+ };
+ }(typeof Uint8Array !== 'undefined' && getPrototypeOf(Uint8Array));
+
+ /**
+ * For each entry in the object, call the function with the key and value.
+ *
+ * @param {Object<any, any>} obj - The object to iterate over.
+ * @param {Function} fn - The function to call for each entry.
+ *
+ * @returns {void}
+ */
+ var forEachEntry = function forEachEntry(obj, fn) {
+ var generator = obj && obj[Symbol.iterator];
+ var iterator = generator.call(obj);
+ var result;
+ while ((result = iterator.next()) && !result.done) {
+ var pair = result.value;
+ fn.call(obj, pair[0], pair[1]);
+ }
+ };
+
+ /**
+ * It takes a regular expression and a string, and returns an array of all the matches
+ *
+ * @param {string} regExp - The regular expression to match against.
+ * @param {string} str - The string to search.
+ *
+ * @returns {Array<boolean>}
+ */
+ var matchAll = function matchAll(regExp, str) {
+ var matches;
+ var arr = [];
+ while ((matches = regExp.exec(str)) !== null) {
+ arr.push(matches);
+ }
+ return arr;
+ };
+
+ /* Checking if the kindOfTest function returns true when passed an HTMLFormElement. */
+ var isHTMLForm = kindOfTest('HTMLFormElement');
+ var toCamelCase = function toCamelCase(str) {
+ return str.toLowerCase().replace(/[_-\s]([a-z\d])(\w*)/g, function replacer(m, p1, p2) {
+ return p1.toUpperCase() + p2;
+ });
+ };
+
+ /* Creating a function that will check if an object has a property. */
+ var hasOwnProperty = function (_ref3) {
+ var hasOwnProperty = _ref3.hasOwnProperty;
+ return function (obj, prop) {
+ return hasOwnProperty.call(obj, prop);
+ };
+ }(Object.prototype);
+
+ /**
+ * Determine if a value is a RegExp object
+ *
+ * @param {*} val The value to test
+ *
+ * @returns {boolean} True if value is a RegExp object, otherwise false
+ */
+ var isRegExp = kindOfTest('RegExp');
+ var reduceDescriptors = function reduceDescriptors(obj, reducer) {
+ var descriptors = Object.getOwnPropertyDescriptors(obj);
+ var reducedDescriptors = {};
+ forEach(descriptors, function (descriptor, name) {
+ if (reducer(descriptor, name, obj) !== false) {
+ reducedDescriptors[name] = descriptor;
+ }
+ });
+ Object.defineProperties(obj, reducedDescriptors);
+ };
+
+ /**
+ * Makes all methods read-only
+ * @param {Object} obj
+ */
+
+ var freezeMethods = function freezeMethods(obj) {
+ reduceDescriptors(obj, function (descriptor, name) {
+ var value = obj[name];
+ if (!isFunction(value)) return;
+ descriptor.enumerable = false;
+ if ('writable' in descriptor) {
+ descriptor.writable = false;
+ return;
+ }
+ if (!descriptor.set) {
+ descriptor.set = function () {
+ throw Error('Can not read-only method \'' + name + '\'');
+ };
+ }
+ });
+ };
+ var toObjectSet = function toObjectSet(arrayOrString, delimiter) {
+ var obj = {};
+ var define = function define(arr) {
+ arr.forEach(function (value) {
+ obj[value] = true;
+ });
+ };
+ isArray(arrayOrString) ? define(arrayOrString) : define(String(arrayOrString).split(delimiter));
+ return obj;
+ };
+ var noop = function noop() {};
+ var toFiniteNumber = function toFiniteNumber(value, defaultValue) {
+ value = +value;
+ return Number.isFinite(value) ? value : defaultValue;
+ };
+ var utils = {
+ isArray: isArray,
+ isArrayBuffer: isArrayBuffer,
+ isBuffer: isBuffer,
+ isFormData: isFormData,
+ isArrayBufferView: isArrayBufferView,
+ isString: isString,
+ isNumber: isNumber,
+ isBoolean: isBoolean,
+ isObject: isObject,
+ isPlainObject: isPlainObject,
+ isUndefined: isUndefined,
+ isDate: isDate,
+ isFile: isFile,
+ isBlob: isBlob,
+ isRegExp: isRegExp,
+ isFunction: isFunction,
+ isStream: isStream,
+ isURLSearchParams: isURLSearchParams,
+ isTypedArray: isTypedArray,
+ isFileList: isFileList,
+ forEach: forEach,
+ merge: merge,
+ extend: extend,
+ trim: trim,
+ stripBOM: stripBOM,
+ inherits: inherits,
+ toFlatObject: toFlatObject,
+ kindOf: kindOf,
+ kindOfTest: kindOfTest,
+ endsWith: endsWith,
+ toArray: toArray,
+ forEachEntry: forEachEntry,
+ matchAll: matchAll,
+ isHTMLForm: isHTMLForm,
+ hasOwnProperty: hasOwnProperty,
+ hasOwnProp: hasOwnProperty,
+ // an alias to avoid ESLint no-prototype-builtins detection
+ reduceDescriptors: reduceDescriptors,
+ freezeMethods: freezeMethods,
+ toObjectSet: toObjectSet,
+ toCamelCase: toCamelCase,
+ noop: noop,
+ toFiniteNumber: toFiniteNumber
+ };
+
+ /**
+ * Create an Error with the specified message, config, error code, request and response.
+ *
+ * @param {string} message The error message.
+ * @param {string} [code] The error code (for example, 'ECONNABORTED').
+ * @param {Object} [config] The config.
+ * @param {Object} [request] The request.
+ * @param {Object} [response] The response.
+ *
+ * @returns {Error} The created error.
+ */
+ function AxiosError(message, code, config, request, response) {
+ Error.call(this);
+ if (Error.captureStackTrace) {
+ Error.captureStackTrace(this, this.constructor);
+ } else {
+ this.stack = new Error().stack;
+ }
+ this.message = message;
+ this.name = 'AxiosError';
+ code && (this.code = code);
+ config && (this.config = config);
+ request && (this.request = request);
+ response && (this.response = response);
+ }
+ utils.inherits(AxiosError, Error, {
+ toJSON: function toJSON() {
+ return {
+ // Standard
+ message: this.message,
+ name: this.name,
+ // Microsoft
+ description: this.description,
+ number: this.number,
+ // Mozilla
+ fileName: this.fileName,
+ lineNumber: this.lineNumber,
+ columnNumber: this.columnNumber,
+ stack: this.stack,
+ // Axios
+ config: this.config,
+ code: this.code,
+ status: this.response && this.response.status ? this.response.status : null
+ };
+ }
+ });
+ var prototype$1 = AxiosError.prototype;
+ var descriptors = {};
+ ['ERR_BAD_OPTION_VALUE', 'ERR_BAD_OPTION', 'ECONNABORTED', 'ETIMEDOUT', 'ERR_NETWORK', 'ERR_FR_TOO_MANY_REDIRECTS', 'ERR_DEPRECATED', 'ERR_BAD_RESPONSE', 'ERR_BAD_REQUEST', 'ERR_CANCELED', 'ERR_NOT_SUPPORT', 'ERR_INVALID_URL'
+ // eslint-disable-next-line func-names
+ ].forEach(function (code) {
+ descriptors[code] = {
+ value: code
+ };
+ });
+ Object.defineProperties(AxiosError, descriptors);
+ Object.defineProperty(prototype$1, 'isAxiosError', {
+ value: true
+ });
+
+ // eslint-disable-next-line func-names
+ AxiosError.from = function (error, code, config, request, response, customProps) {
+ var axiosError = Object.create(prototype$1);
+ utils.toFlatObject(error, axiosError, function filter(obj) {
+ return obj !== Error.prototype;
+ }, function (prop) {
+ return prop !== 'isAxiosError';
+ });
+ AxiosError.call(axiosError, error.message, code, config, request, response);
+ axiosError.cause = error;
+ axiosError.name = error.name;
+ customProps && Object.assign(axiosError, customProps);
+ return axiosError;
+ };
+
+ /* eslint-env browser */
+ var browser = (typeof self === "undefined" ? "undefined" : _typeof(self)) == 'object' ? self.FormData : window.FormData;
+
+ /**
+ * Determines if the given thing is a array or js object.
+ *
+ * @param {string} thing - The object or array to be visited.
+ *
+ * @returns {boolean}
+ */
+ function isVisitable(thing) {
+ return utils.isPlainObject(thing) || utils.isArray(thing);
+ }
+
+ /**
+ * It removes the brackets from the end of a string
+ *
+ * @param {string} key - The key of the parameter.
+ *
+ * @returns {string} the key without the brackets.
+ */
+ function removeBrackets(key) {
+ return utils.endsWith(key, '[]') ? key.slice(0, -2) : key;
+ }
+
+ /**
+ * It takes a path, a key, and a boolean, and returns a string
+ *
+ * @param {string} path - The path to the current key.
+ * @param {string} key - The key of the current object being iterated over.
+ * @param {string} dots - If true, the key will be rendered with dots instead of brackets.
+ *
+ * @returns {string} The path to the current key.
+ */
+ function renderKey(path, key, dots) {
+ if (!path) return key;
+ return path.concat(key).map(function each(token, i) {
+ // eslint-disable-next-line no-param-reassign
+ token = removeBrackets(token);
+ return !dots && i ? '[' + token + ']' : token;
+ }).join(dots ? '.' : '');
+ }
+
+ /**
+ * If the array is an array and none of its elements are visitable, then it's a flat array.
+ *
+ * @param {Array<any>} arr - The array to check
+ *
+ * @returns {boolean}
+ */
+ function isFlatArray(arr) {
+ return utils.isArray(arr) && !arr.some(isVisitable);
+ }
+ var predicates = utils.toFlatObject(utils, {}, null, function filter(prop) {
+ return /^is[A-Z]/.test(prop);
+ });
+
+ /**
+ * If the thing is a FormData object, return true, otherwise return false.
+ *
+ * @param {unknown} thing - The thing to check.
+ *
+ * @returns {boolean}
+ */
+ function isSpecCompliant(thing) {
+ return thing && utils.isFunction(thing.append) && thing[Symbol.toStringTag] === 'FormData' && thing[Symbol.iterator];
+ }
+
+ /**
+ * Convert a data object to FormData
+ *
+ * @param {Object} obj
+ * @param {?Object} [formData]
+ * @param {?Object} [options]
+ * @param {Function} [options.visitor]
+ * @param {Boolean} [options.metaTokens = true]
+ * @param {Boolean} [options.dots = false]
+ * @param {?Boolean} [options.indexes = false]
+ *
+ * @returns {Object}
+ **/
+
+ /**
+ * It converts an object into a FormData object
+ *
+ * @param {Object<any, any>} obj - The object to convert to form data.
+ * @param {string} formData - The FormData object to append to.
+ * @param {Object<string, any>} options
+ *
+ * @returns
+ */
+ function toFormData(obj, formData, options) {
+ if (!utils.isObject(obj)) {
+ throw new TypeError('target must be an object');
+ }
+
+ // eslint-disable-next-line no-param-reassign
+ formData = formData || new (browser || FormData)();
+
+ // eslint-disable-next-line no-param-reassign
+ options = utils.toFlatObject(options, {
+ metaTokens: true,
+ dots: false,
+ indexes: false
+ }, false, function defined(option, source) {
+ // eslint-disable-next-line no-eq-null,eqeqeq
+ return !utils.isUndefined(source[option]);
+ });
+ var metaTokens = options.metaTokens;
+ // eslint-disable-next-line no-use-before-define
+ var visitor = options.visitor || defaultVisitor;
+ var dots = options.dots;
+ var indexes = options.indexes;
+ var _Blob = options.Blob || typeof Blob !== 'undefined' && Blob;
+ var useBlob = _Blob && isSpecCompliant(formData);
+ if (!utils.isFunction(visitor)) {
+ throw new TypeError('visitor must be a function');
+ }
+ function convertValue(value) {
+ if (value === null) return '';
+ if (utils.isDate(value)) {
+ return value.toISOString();
+ }
+ if (!useBlob && utils.isBlob(value)) {
+ throw new AxiosError('Blob is not supported. Use a Buffer instead.');
+ }
+ if (utils.isArrayBuffer(value) || utils.isTypedArray(value)) {
+ return useBlob && typeof Blob === 'function' ? new Blob([value]) : Buffer.from(value);
+ }
+ return value;
+ }
+
+ /**
+ * Default visitor.
+ *
+ * @param {*} value
+ * @param {String|Number} key
+ * @param {Array<String|Number>} path
+ * @this {FormData}
+ *
+ * @returns {boolean} return true to visit the each prop of the value recursively
+ */
+ function defaultVisitor(value, key, path) {
+ var arr = value;
+ if (value && !path && _typeof(value) === 'object') {
+ if (utils.endsWith(key, '{}')) {
+ // eslint-disable-next-line no-param-reassign
+ key = metaTokens ? key : key.slice(0, -2);
+ // eslint-disable-next-line no-param-reassign
+ value = JSON.stringify(value);
+ } else if (utils.isArray(value) && isFlatArray(value) || utils.isFileList(value) || utils.endsWith(key, '[]') && (arr = utils.toArray(value))) {
+ // eslint-disable-next-line no-param-reassign
+ key = removeBrackets(key);
+ arr.forEach(function each(el, index) {
+ !(utils.isUndefined(el) || el === null) && formData.append(
+ // eslint-disable-next-line no-nested-ternary
+ indexes === true ? renderKey([key], index, dots) : indexes === null ? key : key + '[]', convertValue(el));
+ });
+ return false;
+ }
+ }
+ if (isVisitable(value)) {
+ return true;
+ }
+ formData.append(renderKey(path, key, dots), convertValue(value));
+ return false;
+ }
+ var stack = [];
+ var exposedHelpers = Object.assign(predicates, {
+ defaultVisitor: defaultVisitor,
+ convertValue: convertValue,
+ isVisitable: isVisitable
+ });
+ function build(value, path) {
+ if (utils.isUndefined(value)) return;
+ if (stack.indexOf(value) !== -1) {
+ throw Error('Circular reference detected in ' + path.join('.'));
+ }
+ stack.push(value);
+ utils.forEach(value, function each(el, key) {
+ var result = !(utils.isUndefined(el) || el === null) && visitor.call(formData, el, utils.isString(key) ? key.trim() : key, path, exposedHelpers);
+ if (result === true) {
+ build(el, path ? path.concat(key) : [key]);
+ }
+ });
+ stack.pop();
+ }
+ if (!utils.isObject(obj)) {
+ throw new TypeError('data must be an object');
+ }
+ build(obj);
+ return formData;
+ }
+
+ /**
+ * It encodes a string by replacing all characters that are not in the unreserved set with
+ * their percent-encoded equivalents
+ *
+ * @param {string} str - The string to encode.
+ *
+ * @returns {string} The encoded string.
+ */
+ function encode$1(str) {
+ var charMap = {
+ '!': '%21',
+ "'": '%27',
+ '(': '%28',
+ ')': '%29',
+ '~': '%7E',
+ '%20': '+',
+ '%00': '\x00'
+ };
+ return encodeURIComponent(str).replace(/[!'()~]|%20|%00/g, function replacer(match) {
+ return charMap[match];
+ });
+ }
+
+ /**
+ * It takes a params object and converts it to a FormData object
+ *
+ * @param {Object<string, any>} params - The parameters to be converted to a FormData object.
+ * @param {Object<string, any>} options - The options object passed to the Axios constructor.
+ *
+ * @returns {void}
+ */
+ function AxiosURLSearchParams(params, options) {
+ this._pairs = [];
+ params && toFormData(params, this, options);
+ }
+ var prototype = AxiosURLSearchParams.prototype;
+ prototype.append = function append(name, value) {
+ this._pairs.push([name, value]);
+ };
+ prototype.toString = function toString(encoder) {
+ var _encode = encoder ? function (value) {
+ return encoder.call(this, value, encode$1);
+ } : encode$1;
+ return this._pairs.map(function each(pair) {
+ return _encode(pair[0]) + '=' + _encode(pair[1]);
+ }, '').join('&');
+ };
+
+ /**
+ * It replaces all instances of the characters `:`, `$`, `,`, `+`, `[`, and `]` with their
+ * URI encoded counterparts
+ *
+ * @param {string} val The value to be encoded.
+ *
+ * @returns {string} The encoded value.
+ */
+ function encode(val) {
+ return encodeURIComponent(val).replace(/%3A/gi, ':').replace(/%24/g, '$').replace(/%2C/gi, ',').replace(/%20/g, '+').replace(/%5B/gi, '[').replace(/%5D/gi, ']');
+ }
+
+ /**
+ * Build a URL by appending params to the end
+ *
+ * @param {string} url The base of the url (e.g., http://www.google.com)
+ * @param {object} [params] The params to be appended
+ * @param {?object} options
+ *
+ * @returns {string} The formatted url
+ */
+ function buildURL(url, params, options) {
+ /*eslint no-param-reassign:0*/
+ if (!params) {
+ return url;
+ }
+ var _encode = options && options.encode || encode;
+ var serializeFn = options && options.serialize;
+ var serializedParams;
+ if (serializeFn) {
+ serializedParams = serializeFn(params, options);
+ } else {
+ serializedParams = utils.isURLSearchParams(params) ? params.toString() : new AxiosURLSearchParams(params, options).toString(_encode);
+ }
+ if (serializedParams) {
+ var hashmarkIndex = url.indexOf("#");
+ if (hashmarkIndex !== -1) {
+ url = url.slice(0, hashmarkIndex);
+ }
+ url += (url.indexOf('?') === -1 ? '?' : '&') + serializedParams;
+ }
+ return url;
+ }
+
+ var InterceptorManager = /*#__PURE__*/function () {
+ function InterceptorManager() {
+ _classCallCheck(this, InterceptorManager);
+ this.handlers = [];
+ }
+
+ /**
+ * Add a new interceptor to the stack
+ *
+ * @param {Function} fulfilled The function to handle `then` for a `Promise`
+ * @param {Function} rejected The function to handle `reject` for a `Promise`
+ *
+ * @return {Number} An ID used to remove interceptor later
+ */
+ _createClass(InterceptorManager, [{
+ key: "use",
+ value: function use(fulfilled, rejected, options) {
+ this.handlers.push({
+ fulfilled: fulfilled,
+ rejected: rejected,
+ synchronous: options ? options.synchronous : false,
+ runWhen: options ? options.runWhen : null
+ });
+ return this.handlers.length - 1;
+ }
+
+ /**
+ * Remove an interceptor from the stack
+ *
+ * @param {Number} id The ID that was returned by `use`
+ *
+ * @returns {Boolean} `true` if the interceptor was removed, `false` otherwise
+ */
+ }, {
+ key: "eject",
+ value: function eject(id) {
+ if (this.handlers[id]) {
+ this.handlers[id] = null;
+ }
+ }
+
+ /**
+ * Clear all interceptors from the stack
+ *
+ * @returns {void}
+ */
+ }, {
+ key: "clear",
+ value: function clear() {
+ if (this.handlers) {
+ this.handlers = [];
+ }
+ }
+
+ /**
+ * Iterate over all the registered interceptors
+ *
+ * This method is particularly useful for skipping over any
+ * interceptors that may have become `null` calling `eject`.
+ *
+ * @param {Function} fn The function to call for each interceptor
+ *
+ * @returns {void}
+ */
+ }, {
+ key: "forEach",
+ value: function forEach(fn) {
+ utils.forEach(this.handlers, function forEachHandler(h) {
+ if (h !== null) {
+ fn(h);
+ }
+ });
+ }
+ }]);
+ return InterceptorManager;
+ }();
+
+ var transitionalDefaults = {
+ silentJSONParsing: true,
+ forcedJSONParsing: true,
+ clarifyTimeoutError: false
+ };
+
+ var URLSearchParams$1 = typeof URLSearchParams !== 'undefined' ? URLSearchParams : AxiosURLSearchParams;
+
+ var FormData$1 = FormData;
+
+ /**
+ * Determine if we're running in a standard browser environment
+ *
+ * This allows axios to run in a web worker, and react-native.
+ * Both environments support XMLHttpRequest, but not fully standard globals.
+ *
+ * web workers:
+ * typeof window -> undefined
+ * typeof document -> undefined
+ *
+ * react-native:
+ * navigator.product -> 'ReactNative'
+ * nativescript
+ * navigator.product -> 'NativeScript' or 'NS'
+ *
+ * @returns {boolean}
+ */
+ var isStandardBrowserEnv = function () {
+ var product;
+ if (typeof navigator !== 'undefined' && ((product = navigator.product) === 'ReactNative' || product === 'NativeScript' || product === 'NS')) {
+ return false;
+ }
+ return typeof window !== 'undefined' && typeof document !== 'undefined';
+ }();
+ var platform = {
+ isBrowser: true,
+ classes: {
+ URLSearchParams: URLSearchParams$1,
+ FormData: FormData$1,
+ Blob: Blob
+ },
+ isStandardBrowserEnv: isStandardBrowserEnv,
+ protocols: ['http', 'https', 'file', 'blob', 'url', 'data']
+ };
+
+ function toURLEncodedForm(data, options) {
+ return toFormData(data, new platform.classes.URLSearchParams(), Object.assign({
+ visitor: function visitor(value, key, path, helpers) {
+ if (platform.isNode && utils.isBuffer(value)) {
+ this.append(key, value.toString('base64'));
+ return false;
+ }
+ return helpers.defaultVisitor.apply(this, arguments);
+ }
+ }, options));
+ }
+
+ /**
+ * It takes a string like `foo[x][y][z]` and returns an array like `['foo', 'x', 'y', 'z']
+ *
+ * @param {string} name - The name of the property to get.
+ *
+ * @returns An array of strings.
+ */
+ function parsePropPath(name) {
+ // foo[x][y][z]
+ // foo.x.y.z
+ // foo-x-y-z
+ // foo x y z
+ return utils.matchAll(/\w+|\[(\w*)]/g, name).map(function (match) {
+ return match[0] === '[]' ? '' : match[1] || match[0];
+ });
+ }
+
+ /**
+ * Convert an array to an object.
+ *
+ * @param {Array<any>} arr - The array to convert to an object.
+ *
+ * @returns An object with the same keys and values as the array.
+ */
+ function arrayToObject(arr) {
+ var obj = {};
+ var keys = Object.keys(arr);
+ var i;
+ var len = keys.length;
+ var key;
+ for (i = 0; i < len; i++) {
+ key = keys[i];
+ obj[key] = arr[key];
+ }
+ return obj;
+ }
+
+ /**
+ * It takes a FormData object and returns a JavaScript object
+ *
+ * @param {string} formData The FormData object to convert to JSON.
+ *
+ * @returns {Object<string, any> | null} The converted object.
+ */
+ function formDataToJSON(formData) {
+ function buildPath(path, value, target, index) {
+ var name = path[index++];
+ var isNumericKey = Number.isFinite(+name);
+ var isLast = index >= path.length;
+ name = !name && utils.isArray(target) ? target.length : name;
+ if (isLast) {
+ if (utils.hasOwnProp(target, name)) {
+ target[name] = [target[name], value];
+ } else {
+ target[name] = value;
+ }
+ return !isNumericKey;
+ }
+ if (!target[name] || !utils.isObject(target[name])) {
+ target[name] = [];
+ }
+ var result = buildPath(path, value, target[name], index);
+ if (result && utils.isArray(target[name])) {
+ target[name] = arrayToObject(target[name]);
+ }
+ return !isNumericKey;
+ }
+ if (utils.isFormData(formData) && utils.isFunction(formData.entries)) {
+ var obj = {};
+ utils.forEachEntry(formData, function (name, value) {
+ buildPath(parsePropPath(name), value, obj, 0);
+ });
+ return obj;
+ }
+ return null;
+ }
+
+ /**
+ * Resolve or reject a Promise based on response status.
+ *
+ * @param {Function} resolve A function that resolves the promise.
+ * @param {Function} reject A function that rejects the promise.
+ * @param {object} response The response.
+ *
+ * @returns {object} The response.
+ */
+ function settle(resolve, reject, response) {
+ var validateStatus = response.config.validateStatus;
+ if (!response.status || !validateStatus || validateStatus(response.status)) {
+ resolve(response);
+ } else {
+ reject(new AxiosError('Request failed with status code ' + response.status, [AxiosError.ERR_BAD_REQUEST, AxiosError.ERR_BAD_RESPONSE][Math.floor(response.status / 100) - 4], response.config, response.request, response));
+ }
+ }
+
+ var cookies = platform.isStandardBrowserEnv ?
+ // Standard browser envs support document.cookie
+ function standardBrowserEnv() {
+ return {
+ write: function write(name, value, expires, path, domain, secure) {
+ var cookie = [];
+ cookie.push(name + '=' + encodeURIComponent(value));
+ if (utils.isNumber(expires)) {
+ cookie.push('expires=' + new Date(expires).toGMTString());
+ }
+ if (utils.isString(path)) {
+ cookie.push('path=' + path);
+ }
+ if (utils.isString(domain)) {
+ cookie.push('domain=' + domain);
+ }
+ if (secure === true) {
+ cookie.push('secure');
+ }
+ document.cookie = cookie.join('; ');
+ },
+ read: function read(name) {
+ var match = document.cookie.match(new RegExp('(^|;\\s*)(' + name + ')=([^;]*)'));
+ return match ? decodeURIComponent(match[3]) : null;
+ },
+ remove: function remove(name) {
+ this.write(name, '', Date.now() - 86400000);
+ }
+ };
+ }() :
+ // Non standard browser env (web workers, react-native) lack needed support.
+ function nonStandardBrowserEnv() {
+ return {
+ write: function write() {},
+ read: function read() {
+ return null;
+ },
+ remove: function remove() {}
+ };
+ }();
+
+ /**
+ * Determines whether the specified URL is absolute
+ *
+ * @param {string} url The URL to test
+ *
+ * @returns {boolean} True if the specified URL is absolute, otherwise false
+ */
+ function isAbsoluteURL(url) {
+ // A URL is considered absolute if it begins with "<scheme>://" or "//" (protocol-relative URL).
+ // RFC 3986 defines scheme name as a sequence of characters beginning with a letter and followed
+ // by any combination of letters, digits, plus, period, or hyphen.
+ return /^([a-z][a-z\d+\-.]*:)?\/\//i.test(url);
+ }
+
+ /**
+ * Creates a new URL by combining the specified URLs
+ *
+ * @param {string} baseURL The base URL
+ * @param {string} relativeURL The relative URL
+ *
+ * @returns {string} The combined URL
+ */
+ function combineURLs(baseURL, relativeURL) {
+ return relativeURL ? baseURL.replace(/\/+$/, '') + '/' + relativeURL.replace(/^\/+/, '') : baseURL;
+ }
+
+ /**
+ * Creates a new URL by combining the baseURL with the requestedURL,
+ * only when the requestedURL is not already an absolute URL.
+ * If the requestURL is absolute, this function returns the requestedURL untouched.
+ *
+ * @param {string} baseURL The base URL
+ * @param {string} requestedURL Absolute or relative URL to combine
+ *
+ * @returns {string} The combined full path
+ */
+ function buildFullPath(baseURL, requestedURL) {
+ if (baseURL && !isAbsoluteURL(requestedURL)) {
+ return combineURLs(baseURL, requestedURL);
+ }
+ return requestedURL;
+ }
+
+ var isURLSameOrigin = platform.isStandardBrowserEnv ?
+ // Standard browser envs have full support of the APIs needed to test
+ // whether the request URL is of the same origin as current location.
+ function standardBrowserEnv() {
+ var msie = /(msie|trident)/i.test(navigator.userAgent);
+ var urlParsingNode = document.createElement('a');
+ var originURL;
+
+ /**
+ * Parse a URL to discover it's components
+ *
+ * @param {String} url The URL to be parsed
+ * @returns {Object}
+ */
+ function resolveURL(url) {
+ var href = url;
+ if (msie) {
+ // IE needs attribute set twice to normalize properties
+ urlParsingNode.setAttribute('href', href);
+ href = urlParsingNode.href;
+ }
+ urlParsingNode.setAttribute('href', href);
+
+ // urlParsingNode provides the UrlUtils interface - http://url.spec.whatwg.org/#urlutils
+ return {
+ href: urlParsingNode.href,
+ protocol: urlParsingNode.protocol ? urlParsingNode.protocol.replace(/:$/, '') : '',
+ host: urlParsingNode.host,
+ search: urlParsingNode.search ? urlParsingNode.search.replace(/^\?/, '') : '',
+ hash: urlParsingNode.hash ? urlParsingNode.hash.replace(/^#/, '') : '',
+ hostname: urlParsingNode.hostname,
+ port: urlParsingNode.port,
+ pathname: urlParsingNode.pathname.charAt(0) === '/' ? urlParsingNode.pathname : '/' + urlParsingNode.pathname
+ };
+ }
+ originURL = resolveURL(window.location.href);
+
+ /**
+ * Determine if a URL shares the same origin as the current location
+ *
+ * @param {String} requestURL The URL to test
+ * @returns {boolean} True if URL shares the same origin, otherwise false
+ */
+ return function isURLSameOrigin(requestURL) {
+ var parsed = utils.isString(requestURL) ? resolveURL(requestURL) : requestURL;
+ return parsed.protocol === originURL.protocol && parsed.host === originURL.host;
+ };
+ }() :
+ // Non standard browser envs (web workers, react-native) lack needed support.
+ function nonStandardBrowserEnv() {
+ return function isURLSameOrigin() {
+ return true;
+ };
+ }();
+
+ /**
+ * A `CanceledError` is an object that is thrown when an operation is canceled.
+ *
+ * @param {string=} message The message.
+ * @param {Object=} config The config.
+ * @param {Object=} request The request.
+ *
+ * @returns {CanceledError} The created error.
+ */
+ function CanceledError(message, config, request) {
+ // eslint-disable-next-line no-eq-null,eqeqeq
+ AxiosError.call(this, message == null ? 'canceled' : message, AxiosError.ERR_CANCELED, config, request);
+ this.name = 'CanceledError';
+ }
+ utils.inherits(CanceledError, AxiosError, {
+ __CANCEL__: true
+ });
+
+ function parseProtocol(url) {
+ var match = /^([-+\w]{1,25})(:?\/\/|:)/.exec(url);
+ return match && match[1] || '';
+ }
+
+ // RawAxiosHeaders whose duplicates are ignored by node
+ // c.f. https://nodejs.org/api/http.html#http_message_headers
+ var ignoreDuplicateOf = utils.toObjectSet(['age', 'authorization', 'content-length', 'content-type', 'etag', 'expires', 'from', 'host', 'if-modified-since', 'if-unmodified-since', 'last-modified', 'location', 'max-forwards', 'proxy-authorization', 'referer', 'retry-after', 'user-agent']);
+
+ /**
+ * Parse headers into an object
+ *
+ * ```
+ * Date: Wed, 27 Aug 2014 08:58:49 GMT
+ * Content-Type: application/json
+ * Connection: keep-alive
+ * Transfer-Encoding: chunked
+ * ```
+ *
+ * @param {String} rawHeaders Headers needing to be parsed
+ *
+ * @returns {Object} Headers parsed into an object
+ */
+ var parseHeaders = (function (rawHeaders) {
+ var parsed = {};
+ var key;
+ var val;
+ var i;
+ rawHeaders && rawHeaders.split('\n').forEach(function parser(line) {
+ i = line.indexOf(':');
+ key = line.substring(0, i).trim().toLowerCase();
+ val = line.substring(i + 1).trim();
+ if (!key || parsed[key] && ignoreDuplicateOf[key]) {
+ return;
+ }
+ if (key === 'set-cookie') {
+ if (parsed[key]) {
+ parsed[key].push(val);
+ } else {
+ parsed[key] = [val];
+ }
+ } else {
+ parsed[key] = parsed[key] ? parsed[key] + ', ' + val : val;
+ }
+ });
+ return parsed;
+ });
+
+ var $internals = Symbol('internals');
+ var $defaults = Symbol('defaults');
+ function normalizeHeader(header) {
+ return header && String(header).trim().toLowerCase();
+ }
+ function normalizeValue(value) {
+ if (value === false || value == null) {
+ return value;
+ }
+ return utils.isArray(value) ? value.map(normalizeValue) : String(value);
+ }
+ function parseTokens(str) {
+ var tokens = Object.create(null);
+ var tokensRE = /([^\s,;=]+)\s*(?:=\s*([^,;]+))?/g;
+ var match;
+ while (match = tokensRE.exec(str)) {
+ tokens[match[1]] = match[2];
+ }
+ return tokens;
+ }
+ function matchHeaderValue(context, value, header, filter) {
+ if (utils.isFunction(filter)) {
+ return filter.call(this, value, header);
+ }
+ if (!utils.isString(value)) return;
+ if (utils.isString(filter)) {
+ return value.indexOf(filter) !== -1;
+ }
+ if (utils.isRegExp(filter)) {
+ return filter.test(value);
+ }
+ }
+ function formatHeader(header) {
+ return header.trim().toLowerCase().replace(/([a-z\d])(\w*)/g, function (w, _char, str) {
+ return _char.toUpperCase() + str;
+ });
+ }
+ function buildAccessors(obj, header) {
+ var accessorName = utils.toCamelCase(' ' + header);
+ ['get', 'set', 'has'].forEach(function (methodName) {
+ Object.defineProperty(obj, methodName + accessorName, {
+ value: function value(arg1, arg2, arg3) {
+ return this[methodName].call(this, header, arg1, arg2, arg3);
+ },
+ configurable: true
+ });
+ });
+ }
+ function findKey(obj, key) {
+ key = key.toLowerCase();
+ var keys = Object.keys(obj);
+ var i = keys.length;
+ var _key;
+ while (i-- > 0) {
+ _key = keys[i];
+ if (key === _key.toLowerCase()) {
+ return _key;
+ }
+ }
+ return null;
+ }
+ function AxiosHeaders(headers, defaults) {
+ headers && this.set(headers);
+ this[$defaults] = defaults || null;
+ }
+ Object.assign(AxiosHeaders.prototype, {
+ set: function set(header, valueOrRewrite, rewrite) {
+ var self = this;
+ function setHeader(_value, _header, _rewrite) {
+ var lHeader = normalizeHeader(_header);
+ if (!lHeader) {
+ throw new Error('header name must be a non-empty string');
+ }
+ var key = findKey(self, lHeader);
+ if (key && _rewrite !== true && (self[key] === false || _rewrite === false)) {
+ return;
+ }
+ self[key || _header] = normalizeValue(_value);
+ }
+ if (utils.isPlainObject(header)) {
+ utils.forEach(header, function (_value, _header) {
+ setHeader(_value, _header, valueOrRewrite);
+ });
+ } else {
+ setHeader(valueOrRewrite, header, rewrite);
+ }
+ return this;
+ },
+ get: function get(header, parser) {
+ header = normalizeHeader(header);
+ if (!header) return undefined;
+ var key = findKey(this, header);
+ if (key) {
+ var value = this[key];
+ if (!parser) {
+ return value;
+ }
+ if (parser === true) {
+ return parseTokens(value);
+ }
+ if (utils.isFunction(parser)) {
+ return parser.call(this, value, key);
+ }
+ if (utils.isRegExp(parser)) {
+ return parser.exec(value);
+ }
+ throw new TypeError('parser must be boolean|regexp|function');
+ }
+ },
+ has: function has(header, matcher) {
+ header = normalizeHeader(header);
+ if (header) {
+ var key = findKey(this, header);
+ return !!(key && (!matcher || matchHeaderValue(this, this[key], key, matcher)));
+ }
+ return false;
+ },
+ "delete": function _delete(header, matcher) {
+ var self = this;
+ var deleted = false;
+ function deleteHeader(_header) {
+ _header = normalizeHeader(_header);
+ if (_header) {
+ var key = findKey(self, _header);
+ if (key && (!matcher || matchHeaderValue(self, self[key], key, matcher))) {
+ delete self[key];
+ deleted = true;
+ }
+ }
+ }
+ if (utils.isArray(header)) {
+ header.forEach(deleteHeader);
+ } else {
+ deleteHeader(header);
+ }
+ return deleted;
+ },
+ clear: function clear() {
+ return Object.keys(this).forEach(this["delete"].bind(this));
+ },
+ normalize: function normalize(format) {
+ var self = this;
+ var headers = {};
+ utils.forEach(this, function (value, header) {
+ var key = findKey(headers, header);
+ if (key) {
+ self[key] = normalizeValue(value);
+ delete self[header];
+ return;
+ }
+ var normalized = format ? formatHeader(header) : String(header).trim();
+ if (normalized !== header) {
+ delete self[header];
+ }
+ self[normalized] = normalizeValue(value);
+ headers[normalized] = true;
+ });
+ return this;
+ },
+ toJSON: function toJSON(asStrings) {
+ var obj = Object.create(null);
+ utils.forEach(Object.assign({}, this[$defaults] || null, this), function (value, header) {
+ if (value == null || value === false) return;
+ obj[header] = asStrings && utils.isArray(value) ? value.join(', ') : value;
+ });
+ return obj;
+ }
+ });
+ Object.assign(AxiosHeaders, {
+ from: function from(thing) {
+ if (utils.isString(thing)) {
+ return new this(parseHeaders(thing));
+ }
+ return thing instanceof this ? thing : new this(thing);
+ },
+ accessor: function accessor(header) {
+ var internals = this[$internals] = this[$internals] = {
+ accessors: {}
+ };
+ var accessors = internals.accessors;
+ var prototype = this.prototype;
+ function defineAccessor(_header) {
+ var lHeader = normalizeHeader(_header);
+ if (!accessors[lHeader]) {
+ buildAccessors(prototype, _header);
+ accessors[lHeader] = true;
+ }
+ }
+ utils.isArray(header) ? header.forEach(defineAccessor) : defineAccessor(header);
+ return this;
+ }
+ });
+ AxiosHeaders.accessor(['Content-Type', 'Content-Length', 'Accept', 'Accept-Encoding', 'User-Agent']);
+ utils.freezeMethods(AxiosHeaders.prototype);
+ utils.freezeMethods(AxiosHeaders);
+
+ /**
+ * Calculate data maxRate
+ * @param {Number} [samplesCount= 10]
+ * @param {Number} [min= 1000]
+ * @returns {Function}
+ */
+ function speedometer(samplesCount, min) {
+ samplesCount = samplesCount || 10;
+ var bytes = new Array(samplesCount);
+ var timestamps = new Array(samplesCount);
+ var head = 0;
+ var tail = 0;
+ var firstSampleTS;
+ min = min !== undefined ? min : 1000;
+ return function push(chunkLength) {
+ var now = Date.now();
+ var startedAt = timestamps[tail];
+ if (!firstSampleTS) {
+ firstSampleTS = now;
+ }
+ bytes[head] = chunkLength;
+ timestamps[head] = now;
+ var i = tail;
+ var bytesCount = 0;
+ while (i !== head) {
+ bytesCount += bytes[i++];
+ i = i % samplesCount;
+ }
+ head = (head + 1) % samplesCount;
+ if (head === tail) {
+ tail = (tail + 1) % samplesCount;
+ }
+ if (now - firstSampleTS < min) {
+ return;
+ }
+ var passed = startedAt && now - startedAt;
+ return passed ? Math.round(bytesCount * 1000 / passed) : undefined;
+ };
+ }
+
+ function progressEventReducer(listener, isDownloadStream) {
+ var bytesNotified = 0;
+ var _speedometer = speedometer(50, 250);
+ return function (e) {
+ var loaded = e.loaded;
+ var total = e.lengthComputable ? e.total : undefined;
+ var progressBytes = loaded - bytesNotified;
+ var rate = _speedometer(progressBytes);
+ var inRange = loaded <= total;
+ bytesNotified = loaded;
+ var data = {
+ loaded: loaded,
+ total: total,
+ progress: total ? loaded / total : undefined,
+ bytes: progressBytes,
+ rate: rate ? rate : undefined,
+ estimated: rate && total && inRange ? (total - loaded) / rate : undefined
+ };
+ data[isDownloadStream ? 'download' : 'upload'] = true;
+ listener(data);
+ };
+ }
+ function xhrAdapter(config) {
+ return new Promise(function dispatchXhrRequest(resolve, reject) {
+ var requestData = config.data;
+ var requestHeaders = AxiosHeaders.from(config.headers).normalize();
+ var responseType = config.responseType;
+ var onCanceled;
+ function done() {
+ if (config.cancelToken) {
+ config.cancelToken.unsubscribe(onCanceled);
+ }
+ if (config.signal) {
+ config.signal.removeEventListener('abort', onCanceled);
+ }
+ }
+ if (utils.isFormData(requestData) && platform.isStandardBrowserEnv) {
+ requestHeaders.setContentType(false); // Let the browser set it
+ }
+
+ var request = new XMLHttpRequest();
+
+ // HTTP basic authentication
+ if (config.auth) {
+ var username = config.auth.username || '';
+ var password = config.auth.password ? unescape(encodeURIComponent(config.auth.password)) : '';
+ requestHeaders.set('Authorization', 'Basic ' + btoa(username + ':' + password));
+ }
+ var fullPath = buildFullPath(config.baseURL, config.url);
+ request.open(config.method.toUpperCase(), buildURL(fullPath, config.params, config.paramsSerializer), true);
+
+ // Set the request timeout in MS
+ request.timeout = config.timeout;
+ function onloadend() {
+ if (!request) {
+ return;
+ }
+ // Prepare the response
+ var responseHeaders = AxiosHeaders.from('getAllResponseHeaders' in request && request.getAllResponseHeaders());
+ var responseData = !responseType || responseType === 'text' || responseType === 'json' ? request.responseText : request.response;
+ var response = {
+ data: responseData,
+ status: request.status,
+ statusText: request.statusText,
+ headers: responseHeaders,
+ config: config,
+ request: request
+ };
+ settle(function _resolve(value) {
+ resolve(value);
+ done();
+ }, function _reject(err) {
+ reject(err);
+ done();
+ }, response);
+
+ // Clean up request
+ request = null;
+ }
+ if ('onloadend' in request) {
+ // Use onloadend if available
+ request.onloadend = onloadend;
+ } else {
+ // Listen for ready state to emulate onloadend
+ request.onreadystatechange = function handleLoad() {
+ if (!request || request.readyState !== 4) {
+ return;
+ }
+
+ // The request errored out and we didn't get a response, this will be
+ // handled by onerror instead
+ // With one exception: request that using file: protocol, most browsers
+ // will return status as 0 even though it's a successful request
+ if (request.status === 0 && !(request.responseURL && request.responseURL.indexOf('file:') === 0)) {
+ return;
+ }
+ // readystate handler is calling before onerror or ontimeout handlers,
+ // so we should call onloadend on the next 'tick'
+ setTimeout(onloadend);
+ };
+ }
+
+ // Handle browser request cancellation (as opposed to a manual cancellation)
+ request.onabort = function handleAbort() {
+ if (!request) {
+ return;
+ }
+ reject(new AxiosError('Request aborted', AxiosError.ECONNABORTED, config, request));
+
+ // Clean up request
+ request = null;
+ };
+
+ // Handle low level network errors
+ request.onerror = function handleError() {
+ // Real errors are hidden from us by the browser
+ // onerror should only fire if it's a network error
+ reject(new AxiosError('Network Error', AxiosError.ERR_NETWORK, config, request));
+
+ // Clean up request
+ request = null;
+ };
+
+ // Handle timeout
+ request.ontimeout = function handleTimeout() {
+ var timeoutErrorMessage = config.timeout ? 'timeout of ' + config.timeout + 'ms exceeded' : 'timeout exceeded';
+ var transitional = config.transitional || transitionalDefaults;
+ if (config.timeoutErrorMessage) {
+ timeoutErrorMessage = config.timeoutErrorMessage;
+ }
+ reject(new AxiosError(timeoutErrorMessage, transitional.clarifyTimeoutError ? AxiosError.ETIMEDOUT : AxiosError.ECONNABORTED, config, request));
+
+ // Clean up request
+ request = null;
+ };
+
+ // Add xsrf header
+ // This is only done if running in a standard browser environment.
+ // Specifically not if we're in a web worker, or react-native.
+ if (platform.isStandardBrowserEnv) {
+ // Add xsrf header
+ var xsrfValue = (config.withCredentials || isURLSameOrigin(fullPath)) && config.xsrfCookieName && cookies.read(config.xsrfCookieName);
+ if (xsrfValue) {
+ requestHeaders.set(config.xsrfHeaderName, xsrfValue);
+ }
+ }
+
+ // Remove Content-Type if data is undefined
+ requestData === undefined && requestHeaders.setContentType(null);
+
+ // Add headers to the request
+ if ('setRequestHeader' in request) {
+ utils.forEach(requestHeaders.toJSON(), function setRequestHeader(val, key) {
+ request.setRequestHeader(key, val);
+ });
+ }
+
+ // Add withCredentials to request if needed
+ if (!utils.isUndefined(config.withCredentials)) {
+ request.withCredentials = !!config.withCredentials;
+ }
+
+ // Add responseType to request if needed
+ if (responseType && responseType !== 'json') {
+ request.responseType = config.responseType;
+ }
+
+ // Handle progress if needed
+ if (typeof config.onDownloadProgress === 'function') {
+ request.addEventListener('progress', progressEventReducer(config.onDownloadProgress, true));
+ }
+
+ // Not all browsers support upload events
+ if (typeof config.onUploadProgress === 'function' && request.upload) {
+ request.upload.addEventListener('progress', progressEventReducer(config.onUploadProgress));
+ }
+ if (config.cancelToken || config.signal) {
+ // Handle cancellation
+ // eslint-disable-next-line func-names
+ onCanceled = function onCanceled(cancel) {
+ if (!request) {
+ return;
+ }
+ reject(!cancel || cancel.type ? new CanceledError(null, config, request) : cancel);
+ request.abort();
+ request = null;
+ };
+ config.cancelToken && config.cancelToken.subscribe(onCanceled);
+ if (config.signal) {
+ config.signal.aborted ? onCanceled() : config.signal.addEventListener('abort', onCanceled);
+ }
+ }
+ var protocol = parseProtocol(fullPath);
+ if (protocol && platform.protocols.indexOf(protocol) === -1) {
+ reject(new AxiosError('Unsupported protocol ' + protocol + ':', AxiosError.ERR_BAD_REQUEST, config));
+ return;
+ }
+
+ // Send the request
+ request.send(requestData || null);
+ });
+ }
+
+ var adapters = {
+ http: xhrAdapter,
+ xhr: xhrAdapter
+ };
+ var adapters$1 = {
+ getAdapter: function getAdapter(nameOrAdapter) {
+ if (utils.isString(nameOrAdapter)) {
+ var adapter = adapters[nameOrAdapter];
+ if (!nameOrAdapter) {
+ throw Error(utils.hasOwnProp(nameOrAdapter) ? "Adapter '".concat(nameOrAdapter, "' is not available in the build") : "Can not resolve adapter '".concat(nameOrAdapter, "'"));
+ }
+ return adapter;
+ }
+ if (!utils.isFunction(nameOrAdapter)) {
+ throw new TypeError('adapter is not a function');
+ }
+ return nameOrAdapter;
+ },
+ adapters: adapters
+ };
+
+ var DEFAULT_CONTENT_TYPE = {
+ 'Content-Type': 'application/x-www-form-urlencoded'
+ };
+
+ /**
+ * If the browser has an XMLHttpRequest object, use the XHR adapter, otherwise use the HTTP
+ * adapter
+ *
+ * @returns {Function}
+ */
+ function getDefaultAdapter() {
+ var adapter;
+ if (typeof XMLHttpRequest !== 'undefined') {
+ // For browsers use XHR adapter
+ adapter = adapters$1.getAdapter('xhr');
+ } else if (typeof process !== 'undefined' && utils.kindOf(process) === 'process') {
+ // For node use HTTP adapter
+ adapter = adapters$1.getAdapter('http');
+ }
+ return adapter;
+ }
+
+ /**
+ * It takes a string, tries to parse it, and if it fails, it returns the stringified version
+ * of the input
+ *
+ * @param {any} rawValue - The value to be stringified.
+ * @param {Function} parser - A function that parses a string into a JavaScript object.
+ * @param {Function} encoder - A function that takes a value and returns a string.
+ *
+ * @returns {string} A stringified version of the rawValue.
+ */
+ function stringifySafely(rawValue, parser, encoder) {
+ if (utils.isString(rawValue)) {
+ try {
+ (parser || JSON.parse)(rawValue);
+ return utils.trim(rawValue);
+ } catch (e) {
+ if (e.name !== 'SyntaxError') {
+ throw e;
+ }
+ }
+ }
+ return (encoder || JSON.stringify)(rawValue);
+ }
+ var defaults = {
+ transitional: transitionalDefaults,
+ adapter: getDefaultAdapter(),
+ transformRequest: [function transformRequest(data, headers) {
+ var contentType = headers.getContentType() || '';
+ var hasJSONContentType = contentType.indexOf('application/json') > -1;
+ var isObjectPayload = utils.isObject(data);
+ if (isObjectPayload && utils.isHTMLForm(data)) {
+ data = new FormData(data);
+ }
+ var isFormData = utils.isFormData(data);
+ if (isFormData) {
+ if (!hasJSONContentType) {
+ return data;
+ }
+ return hasJSONContentType ? JSON.stringify(formDataToJSON(data)) : data;
+ }
+ if (utils.isArrayBuffer(data) || utils.isBuffer(data) || utils.isStream(data) || utils.isFile(data) || utils.isBlob(data)) {
+ return data;
+ }
+ if (utils.isArrayBufferView(data)) {
+ return data.buffer;
+ }
+ if (utils.isURLSearchParams(data)) {
+ headers.setContentType('application/x-www-form-urlencoded;charset=utf-8', false);
+ return data.toString();
+ }
+ var isFileList;
+ if (isObjectPayload) {
+ if (contentType.indexOf('application/x-www-form-urlencoded') > -1) {
+ return toURLEncodedForm(data, this.formSerializer).toString();
+ }
+ if ((isFileList = utils.isFileList(data)) || contentType.indexOf('multipart/form-data') > -1) {
+ var _FormData = this.env && this.env.FormData;
+ return toFormData(isFileList ? {
+ 'files[]': data
+ } : data, _FormData && new _FormData(), this.formSerializer);
+ }
+ }
+ if (isObjectPayload || hasJSONContentType) {
+ headers.setContentType('application/json', false);
+ return stringifySafely(data);
+ }
+ return data;
+ }],
+ transformResponse: [function transformResponse(data) {
+ var transitional = this.transitional || defaults.transitional;
+ var forcedJSONParsing = transitional && transitional.forcedJSONParsing;
+ var JSONRequested = this.responseType === 'json';
+ if (data && utils.isString(data) && (forcedJSONParsing && !this.responseType || JSONRequested)) {
+ var silentJSONParsing = transitional && transitional.silentJSONParsing;
+ var strictJSONParsing = !silentJSONParsing && JSONRequested;
+ try {
+ return JSON.parse(data);
+ } catch (e) {
+ if (strictJSONParsing) {
+ if (e.name === 'SyntaxError') {
+ throw AxiosError.from(e, AxiosError.ERR_BAD_RESPONSE, this, null, this.response);
+ }
+ throw e;
+ }
+ }
+ }
+ return data;
+ }],
+ /**
+ * A timeout in milliseconds to abort a request. If set to 0 (default) a
+ * timeout is not created.
+ */
+ timeout: 0,
+ xsrfCookieName: 'XSRF-TOKEN',
+ xsrfHeaderName: 'X-XSRF-TOKEN',
+ maxContentLength: -1,
+ maxBodyLength: -1,
+ env: {
+ FormData: platform.classes.FormData,
+ Blob: platform.classes.Blob
+ },
+ validateStatus: function validateStatus(status) {
+ return status >= 200 && status < 300;
+ },
+ headers: {
+ common: {
+ 'Accept': 'application/json, text/plain, */*'
+ }
+ }
+ };
+ utils.forEach(['delete', 'get', 'head'], function forEachMethodNoData(method) {
+ defaults.headers[method] = {};
+ });
+ utils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {
+ defaults.headers[method] = utils.merge(DEFAULT_CONTENT_TYPE);
+ });
+
+ /**
+ * Transform the data for a request or a response
+ *
+ * @param {Array|Function} fns A single function or Array of functions
+ * @param {?Object} response The response object
+ *
+ * @returns {*} The resulting transformed data
+ */
+ function transformData(fns, response) {
+ var config = this || defaults;
+ var context = response || config;
+ var headers = AxiosHeaders.from(context.headers);
+ var data = context.data;
+ utils.forEach(fns, function transform(fn) {
+ data = fn.call(config, data, headers.normalize(), response ? response.status : undefined);
+ });
+ headers.normalize();
+ return data;
+ }
+
+ function isCancel(value) {
+ return !!(value && value.__CANCEL__);
+ }
+
+ /**
+ * Throws a `CanceledError` if cancellation has been requested.
+ *
+ * @param {Object} config The config that is to be used for the request
+ *
+ * @returns {void}
+ */
+ function throwIfCancellationRequested(config) {
+ if (config.cancelToken) {
+ config.cancelToken.throwIfRequested();
+ }
+ if (config.signal && config.signal.aborted) {
+ throw new CanceledError();
+ }
+ }
+
+ /**
+ * Dispatch a request to the server using the configured adapter.
+ *
+ * @param {object} config The config that is to be used for the request
+ *
+ * @returns {Promise} The Promise to be fulfilled
+ */
+ function dispatchRequest(config) {
+ throwIfCancellationRequested(config);
+ config.headers = AxiosHeaders.from(config.headers);
+
+ // Transform request data
+ config.data = transformData.call(config, config.transformRequest);
+ var adapter = config.adapter || defaults.adapter;
+ return adapter(config).then(function onAdapterResolution(response) {
+ throwIfCancellationRequested(config);
+
+ // Transform response data
+ response.data = transformData.call(config, config.transformResponse, response);
+ response.headers = AxiosHeaders.from(response.headers);
+ return response;
+ }, function onAdapterRejection(reason) {
+ if (!isCancel(reason)) {
+ throwIfCancellationRequested(config);
+
+ // Transform response data
+ if (reason && reason.response) {
+ reason.response.data = transformData.call(config, config.transformResponse, reason.response);
+ reason.response.headers = AxiosHeaders.from(reason.response.headers);
+ }
+ }
+ return Promise.reject(reason);
+ });
+ }
+
+ /**
+ * Config-specific merge-function which creates a new config-object
+ * by merging two configuration objects together.
+ *
+ * @param {Object} config1
+ * @param {Object} config2
+ *
+ * @returns {Object} New object resulting from merging config2 to config1
+ */
+ function mergeConfig(config1, config2) {
+ // eslint-disable-next-line no-param-reassign
+ config2 = config2 || {};
+ var config = {};
+ function getMergedValue(target, source) {
+ if (utils.isPlainObject(target) && utils.isPlainObject(source)) {
+ return utils.merge(target, source);
+ } else if (utils.isPlainObject(source)) {
+ return utils.merge({}, source);
+ } else if (utils.isArray(source)) {
+ return source.slice();
+ }
+ return source;
+ }
+
+ // eslint-disable-next-line consistent-return
+ function mergeDeepProperties(prop) {
+ if (!utils.isUndefined(config2[prop])) {
+ return getMergedValue(config1[prop], config2[prop]);
+ } else if (!utils.isUndefined(config1[prop])) {
+ return getMergedValue(undefined, config1[prop]);
+ }
+ }
+
+ // eslint-disable-next-line consistent-return
+ function valueFromConfig2(prop) {
+ if (!utils.isUndefined(config2[prop])) {
+ return getMergedValue(undefined, config2[prop]);
+ }
+ }
+
+ // eslint-disable-next-line consistent-return
+ function defaultToConfig2(prop) {
+ if (!utils.isUndefined(config2[prop])) {
+ return getMergedValue(undefined, config2[prop]);
+ } else if (!utils.isUndefined(config1[prop])) {
+ return getMergedValue(undefined, config1[prop]);
+ }
+ }
+
+ // eslint-disable-next-line consistent-return
+ function mergeDirectKeys(prop) {
+ if (prop in config2) {
+ return getMergedValue(config1[prop], config2[prop]);
+ } else if (prop in config1) {
+ return getMergedValue(undefined, config1[prop]);
+ }
+ }
+ var mergeMap = {
+ 'url': valueFromConfig2,
+ 'method': valueFromConfig2,
+ 'data': valueFromConfig2,
+ 'baseURL': defaultToConfig2,
+ 'transformRequest': defaultToConfig2,
+ 'transformResponse': defaultToConfig2,
+ 'paramsSerializer': defaultToConfig2,
+ 'timeout': defaultToConfig2,
+ 'timeoutMessage': defaultToConfig2,
+ 'withCredentials': defaultToConfig2,
+ 'adapter': defaultToConfig2,
+ 'responseType': defaultToConfig2,
+ 'xsrfCookieName': defaultToConfig2,
+ 'xsrfHeaderName': defaultToConfig2,
+ 'onUploadProgress': defaultToConfig2,
+ 'onDownloadProgress': defaultToConfig2,
+ 'decompress': defaultToConfig2,
+ 'maxContentLength': defaultToConfig2,
+ 'maxBodyLength': defaultToConfig2,
+ 'beforeRedirect': defaultToConfig2,
+ 'transport': defaultToConfig2,
+ 'httpAgent': defaultToConfig2,
+ 'httpsAgent': defaultToConfig2,
+ 'cancelToken': defaultToConfig2,
+ 'socketPath': defaultToConfig2,
+ 'responseEncoding': defaultToConfig2,
+ 'validateStatus': mergeDirectKeys
+ };
+ utils.forEach(Object.keys(config1).concat(Object.keys(config2)), function computeConfigValue(prop) {
+ var merge = mergeMap[prop] || mergeDeepProperties;
+ var configValue = merge(prop);
+ utils.isUndefined(configValue) && merge !== mergeDirectKeys || (config[prop] = configValue);
+ });
+ return config;
+ }
+
+ var VERSION = "1.1.3";
+
+ var validators$1 = {};
+
+ // eslint-disable-next-line func-names
+ ['object', 'boolean', 'number', 'function', 'string', 'symbol'].forEach(function (type, i) {
+ validators$1[type] = function validator(thing) {
+ return _typeof(thing) === type || 'a' + (i < 1 ? 'n ' : ' ') + type;
+ };
+ });
+ var deprecatedWarnings = {};
+
+ /**
+ * Transitional option validator
+ *
+ * @param {function|boolean?} validator - set to false if the transitional option has been removed
+ * @param {string?} version - deprecated version / removed since version
+ * @param {string?} message - some message with additional info
+ *
+ * @returns {function}
+ */
+ validators$1.transitional = function transitional(validator, version, message) {
+ function formatMessage(opt, desc) {
+ return '[Axios v' + VERSION + '] Transitional option \'' + opt + '\'' + desc + (message ? '. ' + message : '');
+ }
+
+ // eslint-disable-next-line func-names
+ return function (value, opt, opts) {
+ if (validator === false) {
+ throw new AxiosError(formatMessage(opt, ' has been removed' + (version ? ' in ' + version : '')), AxiosError.ERR_DEPRECATED);
+ }
+ if (version && !deprecatedWarnings[opt]) {
+ deprecatedWarnings[opt] = true;
+ // eslint-disable-next-line no-console
+ console.warn(formatMessage(opt, ' has been deprecated since v' + version + ' and will be removed in the near future'));
+ }
+ return validator ? validator(value, opt, opts) : true;
+ };
+ };
+
+ /**
+ * Assert object's properties type
+ *
+ * @param {object} options
+ * @param {object} schema
+ * @param {boolean?} allowUnknown
+ *
+ * @returns {object}
+ */
+
+ function assertOptions(options, schema, allowUnknown) {
+ if (_typeof(options) !== 'object') {
+ throw new AxiosError('options must be an object', AxiosError.ERR_BAD_OPTION_VALUE);
+ }
+ var keys = Object.keys(options);
+ var i = keys.length;
+ while (i-- > 0) {
+ var opt = keys[i];
+ var validator = schema[opt];
+ if (validator) {
+ var value = options[opt];
+ var result = value === undefined || validator(value, opt, options);
+ if (result !== true) {
+ throw new AxiosError('option ' + opt + ' must be ' + result, AxiosError.ERR_BAD_OPTION_VALUE);
+ }
+ continue;
+ }
+ if (allowUnknown !== true) {
+ throw new AxiosError('Unknown option ' + opt, AxiosError.ERR_BAD_OPTION);
+ }
+ }
+ }
+ var validator = {
+ assertOptions: assertOptions,
+ validators: validators$1
+ };
+
+ var validators = validator.validators;
+
+ /**
+ * Create a new instance of Axios
+ *
+ * @param {Object} instanceConfig The default config for the instance
+ *
+ * @return {Axios} A new instance of Axios
+ */
+ var Axios = /*#__PURE__*/function () {
+ function Axios(instanceConfig) {
+ _classCallCheck(this, Axios);
+ this.defaults = instanceConfig;
+ this.interceptors = {
+ request: new InterceptorManager(),
+ response: new InterceptorManager()
+ };
+ }
+
+ /**
+ * Dispatch a request
+ *
+ * @param {String|Object} configOrUrl The config specific for this request (merged with this.defaults)
+ * @param {?Object} config
+ *
+ * @returns {Promise} The Promise to be fulfilled
+ */
+ _createClass(Axios, [{
+ key: "request",
+ value: function request(configOrUrl, config) {
+ /*eslint no-param-reassign:0*/
+ // Allow for axios('example/url'[, config]) a la fetch API
+ if (typeof configOrUrl === 'string') {
+ config = config || {};
+ config.url = configOrUrl;
+ } else {
+ config = configOrUrl || {};
+ }
+ config = mergeConfig(this.defaults, config);
+ var _config = config,
+ transitional = _config.transitional,
+ paramsSerializer = _config.paramsSerializer;
+ if (transitional !== undefined) {
+ validator.assertOptions(transitional, {
+ silentJSONParsing: validators.transitional(validators["boolean"]),
+ forcedJSONParsing: validators.transitional(validators["boolean"]),
+ clarifyTimeoutError: validators.transitional(validators["boolean"])
+ }, false);
+ }
+ if (paramsSerializer !== undefined) {
+ validator.assertOptions(paramsSerializer, {
+ encode: validators["function"],
+ serialize: validators["function"]
+ }, true);
+ }
+
+ // Set config.method
+ config.method = (config.method || this.defaults.method || 'get').toLowerCase();
+
+ // Flatten headers
+ var defaultHeaders = config.headers && utils.merge(config.headers.common, config.headers[config.method]);
+ defaultHeaders && utils.forEach(['delete', 'get', 'head', 'post', 'put', 'patch', 'common'], function cleanHeaderConfig(method) {
+ delete config.headers[method];
+ });
+ config.headers = new AxiosHeaders(config.headers, defaultHeaders);
+
+ // filter out skipped interceptors
+ var requestInterceptorChain = [];
+ var synchronousRequestInterceptors = true;
+ this.interceptors.request.forEach(function unshiftRequestInterceptors(interceptor) {
+ if (typeof interceptor.runWhen === 'function' && interceptor.runWhen(config) === false) {
+ return;
+ }
+ synchronousRequestInterceptors = synchronousRequestInterceptors && interceptor.synchronous;
+ requestInterceptorChain.unshift(interceptor.fulfilled, interceptor.rejected);
+ });
+ var responseInterceptorChain = [];
+ this.interceptors.response.forEach(function pushResponseInterceptors(interceptor) {
+ responseInterceptorChain.push(interceptor.fulfilled, interceptor.rejected);
+ });
+ var promise;
+ var i = 0;
+ var len;
+ if (!synchronousRequestInterceptors) {
+ var chain = [dispatchRequest.bind(this), undefined];
+ chain.unshift.apply(chain, requestInterceptorChain);
+ chain.push.apply(chain, responseInterceptorChain);
+ len = chain.length;
+ promise = Promise.resolve(config);
+ while (i < len) {
+ promise = promise.then(chain[i++], chain[i++]);
+ }
+ return promise;
+ }
+ len = requestInterceptorChain.length;
+ var newConfig = config;
+ i = 0;
+ while (i < len) {
+ var onFulfilled = requestInterceptorChain[i++];
+ var onRejected = requestInterceptorChain[i++];
+ try {
+ newConfig = onFulfilled(newConfig);
+ } catch (error) {
+ onRejected.call(this, error);
+ break;
+ }
+ }
+ try {
+ promise = dispatchRequest.call(this, newConfig);
+ } catch (error) {
+ return Promise.reject(error);
+ }
+ i = 0;
+ len = responseInterceptorChain.length;
+ while (i < len) {
+ promise = promise.then(responseInterceptorChain[i++], responseInterceptorChain[i++]);
+ }
+ return promise;
+ }
+ }, {
+ key: "getUri",
+ value: function getUri(config) {
+ config = mergeConfig(this.defaults, config);
+ var fullPath = buildFullPath(config.baseURL, config.url);
+ return buildURL(fullPath, config.params, config.paramsSerializer);
+ }
+ }]);
+ return Axios;
+ }(); // Provide aliases for supported request methods
+ utils.forEach(['delete', 'get', 'head', 'options'], function forEachMethodNoData(method) {
+ /*eslint func-names:0*/
+ Axios.prototype[method] = function (url, config) {
+ return this.request(mergeConfig(config || {}, {
+ method: method,
+ url: url,
+ data: (config || {}).data
+ }));
+ };
+ });
+ utils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {
+ /*eslint func-names:0*/
+
+ function generateHTTPMethod(isForm) {
+ return function httpMethod(url, data, config) {
+ return this.request(mergeConfig(config || {}, {
+ method: method,
+ headers: isForm ? {
+ 'Content-Type': 'multipart/form-data'
+ } : {},
+ url: url,
+ data: data
+ }));
+ };
+ }
+ Axios.prototype[method] = generateHTTPMethod();
+ Axios.prototype[method + 'Form'] = generateHTTPMethod(true);
+ });
+
+ /**
+ * A `CancelToken` is an object that can be used to request cancellation of an operation.
+ *
+ * @param {Function} executor The executor function.
+ *
+ * @returns {CancelToken}
+ */
+ var CancelToken = /*#__PURE__*/function () {
+ function CancelToken(executor) {
+ _classCallCheck(this, CancelToken);
+ if (typeof executor !== 'function') {
+ throw new TypeError('executor must be a function.');
+ }
+ var resolvePromise;
+ this.promise = new Promise(function promiseExecutor(resolve) {
+ resolvePromise = resolve;
+ });
+ var token = this;
+
+ // eslint-disable-next-line func-names
+ this.promise.then(function (cancel) {
+ if (!token._listeners) return;
+ var i = token._listeners.length;
+ while (i-- > 0) {
+ token._listeners[i](cancel);
+ }
+ token._listeners = null;
+ });
+
+ // eslint-disable-next-line func-names
+ this.promise.then = function (onfulfilled) {
+ var _resolve;
+ // eslint-disable-next-line func-names
+ var promise = new Promise(function (resolve) {
+ token.subscribe(resolve);
+ _resolve = resolve;
+ }).then(onfulfilled);
+ promise.cancel = function reject() {
+ token.unsubscribe(_resolve);
+ };
+ return promise;
+ };
+ executor(function cancel(message, config, request) {
+ if (token.reason) {
+ // Cancellation has already been requested
+ return;
+ }
+ token.reason = new CanceledError(message, config, request);
+ resolvePromise(token.reason);
+ });
+ }
+
+ /**
+ * Throws a `CanceledError` if cancellation has been requested.
+ */
+ _createClass(CancelToken, [{
+ key: "throwIfRequested",
+ value: function throwIfRequested() {
+ if (this.reason) {
+ throw this.reason;
+ }
+ }
+
+ /**
+ * Subscribe to the cancel signal
+ */
+ }, {
+ key: "subscribe",
+ value: function subscribe(listener) {
+ if (this.reason) {
+ listener(this.reason);
+ return;
+ }
+ if (this._listeners) {
+ this._listeners.push(listener);
+ } else {
+ this._listeners = [listener];
+ }
+ }
+
+ /**
+ * Unsubscribe from the cancel signal
+ */
+ }, {
+ key: "unsubscribe",
+ value: function unsubscribe(listener) {
+ if (!this._listeners) {
+ return;
+ }
+ var index = this._listeners.indexOf(listener);
+ if (index !== -1) {
+ this._listeners.splice(index, 1);
+ }
+ }
+
+ /**
+ * Returns an object that contains a new `CancelToken` and a function that, when called,
+ * cancels the `CancelToken`.
+ */
+ }], [{
+ key: "source",
+ value: function source() {
+ var cancel;
+ var token = new CancelToken(function executor(c) {
+ cancel = c;
+ });
+ return {
+ token: token,
+ cancel: cancel
+ };
+ }
+ }]);
+ return CancelToken;
+ }();
+
+ /**
+ * Syntactic sugar for invoking a function and expanding an array for arguments.
+ *
+ * Common use case would be to use `Function.prototype.apply`.
+ *
+ * ```js
+ * function f(x, y, z) {}
+ * var args = [1, 2, 3];
+ * f.apply(null, args);
+ * ```
+ *
+ * With `spread` this example can be re-written.
+ *
+ * ```js
+ * spread(function(x, y, z) {})([1, 2, 3]);
+ * ```
+ *
+ * @param {Function} callback
+ *
+ * @returns {Function}
+ */
+ function spread(callback) {
+ return function wrap(arr) {
+ return callback.apply(null, arr);
+ };
+ }
+
+ /**
+ * Determines whether the payload is an error thrown by Axios
+ *
+ * @param {*} payload The value to test
+ *
+ * @returns {boolean} True if the payload is an error thrown by Axios, otherwise false
+ */
+ function isAxiosError(payload) {
+ return utils.isObject(payload) && payload.isAxiosError === true;
+ }
+
+ /**
+ * Create an instance of Axios
+ *
+ * @param {Object} defaultConfig The default config for the instance
+ *
+ * @returns {Axios} A new instance of Axios
+ */
+ function createInstance(defaultConfig) {
+ var context = new Axios(defaultConfig);
+ var instance = bind(Axios.prototype.request, context);
+
+ // Copy axios.prototype to instance
+ utils.extend(instance, Axios.prototype, context, {
+ allOwnKeys: true
+ });
+
+ // Copy context to instance
+ utils.extend(instance, context, null, {
+ allOwnKeys: true
+ });
+
+ // Factory for creating new instances
+ instance.create = function create(instanceConfig) {
+ return createInstance(mergeConfig(defaultConfig, instanceConfig));
+ };
+ return instance;
+ }
+
+ // Create the default instance to be exported
+ var axios = createInstance(defaults);
+
+ // Expose Axios class to allow class inheritance
+ axios.Axios = Axios;
+
+ // Expose Cancel & CancelToken
+ axios.CanceledError = CanceledError;
+ axios.CancelToken = CancelToken;
+ axios.isCancel = isCancel;
+ axios.VERSION = VERSION;
+ axios.toFormData = toFormData;
+
+ // Expose AxiosError class
+ axios.AxiosError = AxiosError;
+
+ // alias for CanceledError for backward compatibility
+ axios.Cancel = axios.CanceledError;
+
+ // Expose all/spread
+ axios.all = function all(promises) {
+ return Promise.all(promises);
+ };
+ axios.spread = spread;
+
+ // Expose isAxiosError
+ axios.isAxiosError = isAxiosError;
+ axios.formToJSON = function (thing) {
+ return formDataToJSON(utils.isHTMLForm(thing) ? new FormData(thing) : thing);
+ };
+
+ return axios;
+
+}));
+//# sourceMappingURL=axios.js.map
diff --git a/node_modules/axios/dist/axios.js.map b/node_modules/axios/dist/axios.js.map
new file mode 100644
index 0000000..8ea8925
--- /dev/null
+++ b/node_modules/axios/dist/axios.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"axios.js","sources":["../lib/helpers/bind.js","../lib/utils.js","../lib/core/AxiosError.js","../node_modules/form-data/lib/browser.js","../lib/helpers/toFormData.js","../lib/helpers/AxiosURLSearchParams.js","../lib/helpers/buildURL.js","../lib/core/InterceptorManager.js","../lib/defaults/transitional.js","../lib/platform/browser/classes/URLSearchParams.js","../lib/platform/browser/classes/FormData.js","../lib/platform/browser/index.js","../lib/helpers/toURLEncodedForm.js","../lib/helpers/formDataToJSON.js","../lib/core/settle.js","../lib/helpers/cookies.js","../lib/helpers/isAbsoluteURL.js","../lib/helpers/combineURLs.js","../lib/core/buildFullPath.js","../lib/helpers/isURLSameOrigin.js","../lib/cancel/CanceledError.js","../lib/helpers/parseProtocol.js","../lib/helpers/parseHeaders.js","../lib/core/AxiosHeaders.js","../lib/helpers/speedometer.js","../lib/adapters/xhr.js","../lib/adapters/index.js","../lib/defaults/index.js","../lib/core/transformData.js","../lib/cancel/isCancel.js","../lib/core/dispatchRequest.js","../lib/core/mergeConfig.js","../lib/env/data.js","../lib/helpers/validator.js","../lib/core/Axios.js","../lib/cancel/CancelToken.js","../lib/helpers/spread.js","../lib/helpers/isAxiosError.js","../lib/axios.js"],"sourcesContent":["'use strict';\n\nexport default function bind(fn, thisArg) {\n return function wrap() {\n return fn.apply(thisArg, arguments);\n };\n}\n","'use strict';\n\nimport bind from './helpers/bind.js';\n\n// utils is a library of generic helper functions non-specific to axios\n\nconst {toString} = Object.prototype;\nconst {getPrototypeOf} = Object;\n\nconst kindOf = (cache => thing => {\n const str = toString.call(thing);\n return cache[str] || (cache[str] = str.slice(8, -1).toLowerCase());\n})(Object.create(null));\n\nconst kindOfTest = (type) => {\n type = type.toLowerCase();\n return (thing) => kindOf(thing) === type\n}\n\nconst typeOfTest = type => thing => typeof thing === type;\n\n/**\n * Determine if a value is an Array\n *\n * @param {Object} val The value to test\n *\n * @returns {boolean} True if value is an Array, otherwise false\n */\nconst {isArray} = Array;\n\n/**\n * Determine if a value is undefined\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if the value is undefined, otherwise false\n */\nconst isUndefined = typeOfTest('undefined');\n\n/**\n * Determine if a value is a Buffer\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Buffer, otherwise false\n */\nfunction isBuffer(val) {\n return val !== null && !isUndefined(val) && val.constructor !== null && !isUndefined(val.constructor)\n && isFunction(val.constructor.isBuffer) && val.constructor.isBuffer(val);\n}\n\n/**\n * Determine if a value is an ArrayBuffer\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is an ArrayBuffer, otherwise false\n */\nconst isArrayBuffer = kindOfTest('ArrayBuffer');\n\n\n/**\n * Determine if a value is a view on an ArrayBuffer\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a view on an ArrayBuffer, otherwise false\n */\nfunction isArrayBufferView(val) {\n let result;\n if ((typeof ArrayBuffer !== 'undefined') && (ArrayBuffer.isView)) {\n result = ArrayBuffer.isView(val);\n } else {\n result = (val) && (val.buffer) && (isArrayBuffer(val.buffer));\n }\n return result;\n}\n\n/**\n * Determine if a value is a String\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a String, otherwise false\n */\nconst isString = typeOfTest('string');\n\n/**\n * Determine if a value is a Function\n *\n * @param {*} val The value to test\n * @returns {boolean} True if value is a Function, otherwise false\n */\nconst isFunction = typeOfTest('function');\n\n/**\n * Determine if a value is a Number\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Number, otherwise false\n */\nconst isNumber = typeOfTest('number');\n\n/**\n * Determine if a value is an Object\n *\n * @param {*} thing The value to test\n *\n * @returns {boolean} True if value is an Object, otherwise false\n */\nconst isObject = (thing) => thing !== null && typeof thing === 'object';\n\n/**\n * Determine if a value is a Boolean\n *\n * @param {*} thing The value to test\n * @returns {boolean} True if value is a Boolean, otherwise false\n */\nconst isBoolean = thing => thing === true || thing === false;\n\n/**\n * Determine if a value is a plain Object\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a plain Object, otherwise false\n */\nconst isPlainObject = (val) => {\n if (kindOf(val) !== 'object') {\n return false;\n }\n\n const prototype = getPrototypeOf(val);\n return (prototype === null || prototype === Object.prototype || Object.getPrototypeOf(prototype) === null) && !(Symbol.toStringTag in val) && !(Symbol.iterator in val);\n}\n\n/**\n * Determine if a value is a Date\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Date, otherwise false\n */\nconst isDate = kindOfTest('Date');\n\n/**\n * Determine if a value is a File\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a File, otherwise false\n */\nconst isFile = kindOfTest('File');\n\n/**\n * Determine if a value is a Blob\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Blob, otherwise false\n */\nconst isBlob = kindOfTest('Blob');\n\n/**\n * Determine if a value is a FileList\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a File, otherwise false\n */\nconst isFileList = kindOfTest('FileList');\n\n/**\n * Determine if a value is a Stream\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Stream, otherwise false\n */\nconst isStream = (val) => isObject(val) && isFunction(val.pipe);\n\n/**\n * Determine if a value is a FormData\n *\n * @param {*} thing The value to test\n *\n * @returns {boolean} True if value is an FormData, otherwise false\n */\nconst isFormData = (thing) => {\n const pattern = '[object FormData]';\n return thing && (\n (typeof FormData === 'function' && thing instanceof FormData) ||\n toString.call(thing) === pattern ||\n (isFunction(thing.toString) && thing.toString() === pattern)\n );\n}\n\n/**\n * Determine if a value is a URLSearchParams object\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a URLSearchParams object, otherwise false\n */\nconst isURLSearchParams = kindOfTest('URLSearchParams');\n\n/**\n * Trim excess whitespace off the beginning and end of a string\n *\n * @param {String} str The String to trim\n *\n * @returns {String} The String freed of excess whitespace\n */\nconst trim = (str) => str.trim ?\n str.trim() : str.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n\n/**\n * Iterate over an Array or an Object invoking a function for each item.\n *\n * If `obj` is an Array callback will be called passing\n * the value, index, and complete array for each item.\n *\n * If 'obj' is an Object callback will be called passing\n * the value, key, and complete object for each property.\n *\n * @param {Object|Array} obj The object to iterate\n * @param {Function} fn The callback to invoke for each item\n *\n * @param {Boolean} [allOwnKeys = false]\n * @returns {void}\n */\nfunction forEach(obj, fn, {allOwnKeys = false} = {}) {\n // Don't bother if no value provided\n if (obj === null || typeof obj === 'undefined') {\n return;\n }\n\n let i;\n let l;\n\n // Force an array if not already something iterable\n if (typeof obj !== 'object') {\n /*eslint no-param-reassign:0*/\n obj = [obj];\n }\n\n if (isArray(obj)) {\n // Iterate over array values\n for (i = 0, l = obj.length; i < l; i++) {\n fn.call(null, obj[i], i, obj);\n }\n } else {\n // Iterate over object keys\n const keys = allOwnKeys ? Object.getOwnPropertyNames(obj) : Object.keys(obj);\n const len = keys.length;\n let key;\n\n for (i = 0; i < len; i++) {\n key = keys[i];\n fn.call(null, obj[key], key, obj);\n }\n }\n}\n\n/**\n * Accepts varargs expecting each argument to be an object, then\n * immutably merges the properties of each object and returns result.\n *\n * When multiple objects contain the same key the later object in\n * the arguments list will take precedence.\n *\n * Example:\n *\n * ```js\n * var result = merge({foo: 123}, {foo: 456});\n * console.log(result.foo); // outputs 456\n * ```\n *\n * @param {Object} obj1 Object to merge\n *\n * @returns {Object} Result of all merge properties\n */\nfunction merge(/* obj1, obj2, obj3, ... */) {\n const result = {};\n const assignValue = (val, key) => {\n if (isPlainObject(result[key]) && isPlainObject(val)) {\n result[key] = merge(result[key], val);\n } else if (isPlainObject(val)) {\n result[key] = merge({}, val);\n } else if (isArray(val)) {\n result[key] = val.slice();\n } else {\n result[key] = val;\n }\n }\n\n for (let i = 0, l = arguments.length; i < l; i++) {\n arguments[i] && forEach(arguments[i], assignValue);\n }\n return result;\n}\n\n/**\n * Extends object a by mutably adding to it the properties of object b.\n *\n * @param {Object} a The object to be extended\n * @param {Object} b The object to copy properties from\n * @param {Object} thisArg The object to bind function to\n *\n * @param {Boolean} [allOwnKeys]\n * @returns {Object} The resulting value of object a\n */\nconst extend = (a, b, thisArg, {allOwnKeys}= {}) => {\n forEach(b, (val, key) => {\n if (thisArg && isFunction(val)) {\n a[key] = bind(val, thisArg);\n } else {\n a[key] = val;\n }\n }, {allOwnKeys});\n return a;\n}\n\n/**\n * Remove byte order marker. This catches EF BB BF (the UTF-8 BOM)\n *\n * @param {string} content with BOM\n *\n * @returns {string} content value without BOM\n */\nconst stripBOM = (content) => {\n if (content.charCodeAt(0) === 0xFEFF) {\n content = content.slice(1);\n }\n return content;\n}\n\n/**\n * Inherit the prototype methods from one constructor into another\n * @param {function} constructor\n * @param {function} superConstructor\n * @param {object} [props]\n * @param {object} [descriptors]\n *\n * @returns {void}\n */\nconst inherits = (constructor, superConstructor, props, descriptors) => {\n constructor.prototype = Object.create(superConstructor.prototype, descriptors);\n constructor.prototype.constructor = constructor;\n Object.defineProperty(constructor, 'super', {\n value: superConstructor.prototype\n });\n props && Object.assign(constructor.prototype, props);\n}\n\n/**\n * Resolve object with deep prototype chain to a flat object\n * @param {Object} sourceObj source object\n * @param {Object} [destObj]\n * @param {Function|Boolean} [filter]\n * @param {Function} [propFilter]\n *\n * @returns {Object}\n */\nconst toFlatObject = (sourceObj, destObj, filter, propFilter) => {\n let props;\n let i;\n let prop;\n const merged = {};\n\n destObj = destObj || {};\n // eslint-disable-next-line no-eq-null,eqeqeq\n if (sourceObj == null) return destObj;\n\n do {\n props = Object.getOwnPropertyNames(sourceObj);\n i = props.length;\n while (i-- > 0) {\n prop = props[i];\n if ((!propFilter || propFilter(prop, sourceObj, destObj)) && !merged[prop]) {\n destObj[prop] = sourceObj[prop];\n merged[prop] = true;\n }\n }\n sourceObj = filter !== false && getPrototypeOf(sourceObj);\n } while (sourceObj && (!filter || filter(sourceObj, destObj)) && sourceObj !== Object.prototype);\n\n return destObj;\n}\n\n/**\n * Determines whether a string ends with the characters of a specified string\n *\n * @param {String} str\n * @param {String} searchString\n * @param {Number} [position= 0]\n *\n * @returns {boolean}\n */\nconst endsWith = (str, searchString, position) => {\n str = String(str);\n if (position === undefined || position > str.length) {\n position = str.length;\n }\n position -= searchString.length;\n const lastIndex = str.indexOf(searchString, position);\n return lastIndex !== -1 && lastIndex === position;\n}\n\n\n/**\n * Returns new array from array like object or null if failed\n *\n * @param {*} [thing]\n *\n * @returns {?Array}\n */\nconst toArray = (thing) => {\n if (!thing) return null;\n if (isArray(thing)) return thing;\n let i = thing.length;\n if (!isNumber(i)) return null;\n const arr = new Array(i);\n while (i-- > 0) {\n arr[i] = thing[i];\n }\n return arr;\n}\n\n/**\n * Checking if the Uint8Array exists and if it does, it returns a function that checks if the\n * thing passed in is an instance of Uint8Array\n *\n * @param {TypedArray}\n *\n * @returns {Array}\n */\n// eslint-disable-next-line func-names\nconst isTypedArray = (TypedArray => {\n // eslint-disable-next-line func-names\n return thing => {\n return TypedArray && thing instanceof TypedArray;\n };\n})(typeof Uint8Array !== 'undefined' && getPrototypeOf(Uint8Array));\n\n/**\n * For each entry in the object, call the function with the key and value.\n *\n * @param {Object<any, any>} obj - The object to iterate over.\n * @param {Function} fn - The function to call for each entry.\n *\n * @returns {void}\n */\nconst forEachEntry = (obj, fn) => {\n const generator = obj && obj[Symbol.iterator];\n\n const iterator = generator.call(obj);\n\n let result;\n\n while ((result = iterator.next()) && !result.done) {\n const pair = result.value;\n fn.call(obj, pair[0], pair[1]);\n }\n}\n\n/**\n * It takes a regular expression and a string, and returns an array of all the matches\n *\n * @param {string} regExp - The regular expression to match against.\n * @param {string} str - The string to search.\n *\n * @returns {Array<boolean>}\n */\nconst matchAll = (regExp, str) => {\n let matches;\n const arr = [];\n\n while ((matches = regExp.exec(str)) !== null) {\n arr.push(matches);\n }\n\n return arr;\n}\n\n/* Checking if the kindOfTest function returns true when passed an HTMLFormElement. */\nconst isHTMLForm = kindOfTest('HTMLFormElement');\n\nconst toCamelCase = str => {\n return str.toLowerCase().replace(/[_-\\s]([a-z\\d])(\\w*)/g,\n function replacer(m, p1, p2) {\n return p1.toUpperCase() + p2;\n }\n );\n};\n\n/* Creating a function that will check if an object has a property. */\nconst hasOwnProperty = (({hasOwnProperty}) => (obj, prop) => hasOwnProperty.call(obj, prop))(Object.prototype);\n\n/**\n * Determine if a value is a RegExp object\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a RegExp object, otherwise false\n */\nconst isRegExp = kindOfTest('RegExp');\n\nconst reduceDescriptors = (obj, reducer) => {\n const descriptors = Object.getOwnPropertyDescriptors(obj);\n const reducedDescriptors = {};\n\n forEach(descriptors, (descriptor, name) => {\n if (reducer(descriptor, name, obj) !== false) {\n reducedDescriptors[name] = descriptor;\n }\n });\n\n Object.defineProperties(obj, reducedDescriptors);\n}\n\n/**\n * Makes all methods read-only\n * @param {Object} obj\n */\n\nconst freezeMethods = (obj) => {\n reduceDescriptors(obj, (descriptor, name) => {\n const value = obj[name];\n\n if (!isFunction(value)) return;\n\n descriptor.enumerable = false;\n\n if ('writable' in descriptor) {\n descriptor.writable = false;\n return;\n }\n\n if (!descriptor.set) {\n descriptor.set = () => {\n throw Error('Can not read-only method \\'' + name + '\\'');\n };\n }\n });\n}\n\nconst toObjectSet = (arrayOrString, delimiter) => {\n const obj = {};\n\n const define = (arr) => {\n arr.forEach(value => {\n obj[value] = true;\n });\n }\n\n isArray(arrayOrString) ? define(arrayOrString) : define(String(arrayOrString).split(delimiter));\n\n return obj;\n}\n\nconst noop = () => {}\n\nconst toFiniteNumber = (value, defaultValue) => {\n value = +value;\n return Number.isFinite(value) ? value : defaultValue;\n}\n\nexport default {\n isArray,\n isArrayBuffer,\n isBuffer,\n isFormData,\n isArrayBufferView,\n isString,\n isNumber,\n isBoolean,\n isObject,\n isPlainObject,\n isUndefined,\n isDate,\n isFile,\n isBlob,\n isRegExp,\n isFunction,\n isStream,\n isURLSearchParams,\n isTypedArray,\n isFileList,\n forEach,\n merge,\n extend,\n trim,\n stripBOM,\n inherits,\n toFlatObject,\n kindOf,\n kindOfTest,\n endsWith,\n toArray,\n forEachEntry,\n matchAll,\n isHTMLForm,\n hasOwnProperty,\n hasOwnProp: hasOwnProperty, // an alias to avoid ESLint no-prototype-builtins detection\n reduceDescriptors,\n freezeMethods,\n toObjectSet,\n toCamelCase,\n noop,\n toFiniteNumber\n};\n","'use strict';\n\nimport utils from '../utils.js';\n\n/**\n * Create an Error with the specified message, config, error code, request and response.\n *\n * @param {string} message The error message.\n * @param {string} [code] The error code (for example, 'ECONNABORTED').\n * @param {Object} [config] The config.\n * @param {Object} [request] The request.\n * @param {Object} [response] The response.\n *\n * @returns {Error} The created error.\n */\nfunction AxiosError(message, code, config, request, response) {\n Error.call(this);\n\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, this.constructor);\n } else {\n this.stack = (new Error()).stack;\n }\n\n this.message = message;\n this.name = 'AxiosError';\n code && (this.code = code);\n config && (this.config = config);\n request && (this.request = request);\n response && (this.response = response);\n}\n\nutils.inherits(AxiosError, Error, {\n toJSON: function toJSON() {\n return {\n // Standard\n message: this.message,\n name: this.name,\n // Microsoft\n description: this.description,\n number: this.number,\n // Mozilla\n fileName: this.fileName,\n lineNumber: this.lineNumber,\n columnNumber: this.columnNumber,\n stack: this.stack,\n // Axios\n config: this.config,\n code: this.code,\n status: this.response && this.response.status ? this.response.status : null\n };\n }\n});\n\nconst prototype = AxiosError.prototype;\nconst descriptors = {};\n\n[\n 'ERR_BAD_OPTION_VALUE',\n 'ERR_BAD_OPTION',\n 'ECONNABORTED',\n 'ETIMEDOUT',\n 'ERR_NETWORK',\n 'ERR_FR_TOO_MANY_REDIRECTS',\n 'ERR_DEPRECATED',\n 'ERR_BAD_RESPONSE',\n 'ERR_BAD_REQUEST',\n 'ERR_CANCELED',\n 'ERR_NOT_SUPPORT',\n 'ERR_INVALID_URL'\n// eslint-disable-next-line func-names\n].forEach(code => {\n descriptors[code] = {value: code};\n});\n\nObject.defineProperties(AxiosError, descriptors);\nObject.defineProperty(prototype, 'isAxiosError', {value: true});\n\n// eslint-disable-next-line func-names\nAxiosError.from = (error, code, config, request, response, customProps) => {\n const axiosError = Object.create(prototype);\n\n utils.toFlatObject(error, axiosError, function filter(obj) {\n return obj !== Error.prototype;\n }, prop => {\n return prop !== 'isAxiosError';\n });\n\n AxiosError.call(axiosError, error.message, code, config, request, response);\n\n axiosError.cause = error;\n\n axiosError.name = error.name;\n\n customProps && Object.assign(axiosError, customProps);\n\n return axiosError;\n};\n\nexport default AxiosError;\n","/* eslint-env browser */\nmodule.exports = typeof self == 'object' ? self.FormData : window.FormData;\n","'use strict';\n\nimport utils from '../utils.js';\nimport AxiosError from '../core/AxiosError.js';\nimport envFormData from '../env/classes/FormData.js';\n\n/**\n * Determines if the given thing is a array or js object.\n *\n * @param {string} thing - The object or array to be visited.\n *\n * @returns {boolean}\n */\nfunction isVisitable(thing) {\n return utils.isPlainObject(thing) || utils.isArray(thing);\n}\n\n/**\n * It removes the brackets from the end of a string\n *\n * @param {string} key - The key of the parameter.\n *\n * @returns {string} the key without the brackets.\n */\nfunction removeBrackets(key) {\n return utils.endsWith(key, '[]') ? key.slice(0, -2) : key;\n}\n\n/**\n * It takes a path, a key, and a boolean, and returns a string\n *\n * @param {string} path - The path to the current key.\n * @param {string} key - The key of the current object being iterated over.\n * @param {string} dots - If true, the key will be rendered with dots instead of brackets.\n *\n * @returns {string} The path to the current key.\n */\nfunction renderKey(path, key, dots) {\n if (!path) return key;\n return path.concat(key).map(function each(token, i) {\n // eslint-disable-next-line no-param-reassign\n token = removeBrackets(token);\n return !dots && i ? '[' + token + ']' : token;\n }).join(dots ? '.' : '');\n}\n\n/**\n * If the array is an array and none of its elements are visitable, then it's a flat array.\n *\n * @param {Array<any>} arr - The array to check\n *\n * @returns {boolean}\n */\nfunction isFlatArray(arr) {\n return utils.isArray(arr) && !arr.some(isVisitable);\n}\n\nconst predicates = utils.toFlatObject(utils, {}, null, function filter(prop) {\n return /^is[A-Z]/.test(prop);\n});\n\n/**\n * If the thing is a FormData object, return true, otherwise return false.\n *\n * @param {unknown} thing - The thing to check.\n *\n * @returns {boolean}\n */\nfunction isSpecCompliant(thing) {\n return thing && utils.isFunction(thing.append) && thing[Symbol.toStringTag] === 'FormData' && thing[Symbol.iterator];\n}\n\n/**\n * Convert a data object to FormData\n *\n * @param {Object} obj\n * @param {?Object} [formData]\n * @param {?Object} [options]\n * @param {Function} [options.visitor]\n * @param {Boolean} [options.metaTokens = true]\n * @param {Boolean} [options.dots = false]\n * @param {?Boolean} [options.indexes = false]\n *\n * @returns {Object}\n **/\n\n/**\n * It converts an object into a FormData object\n *\n * @param {Object<any, any>} obj - The object to convert to form data.\n * @param {string} formData - The FormData object to append to.\n * @param {Object<string, any>} options\n *\n * @returns\n */\nfunction toFormData(obj, formData, options) {\n if (!utils.isObject(obj)) {\n throw new TypeError('target must be an object');\n }\n\n // eslint-disable-next-line no-param-reassign\n formData = formData || new (envFormData || FormData)();\n\n // eslint-disable-next-line no-param-reassign\n options = utils.toFlatObject(options, {\n metaTokens: true,\n dots: false,\n indexes: false\n }, false, function defined(option, source) {\n // eslint-disable-next-line no-eq-null,eqeqeq\n return !utils.isUndefined(source[option]);\n });\n\n const metaTokens = options.metaTokens;\n // eslint-disable-next-line no-use-before-define\n const visitor = options.visitor || defaultVisitor;\n const dots = options.dots;\n const indexes = options.indexes;\n const _Blob = options.Blob || typeof Blob !== 'undefined' && Blob;\n const useBlob = _Blob && isSpecCompliant(formData);\n\n if (!utils.isFunction(visitor)) {\n throw new TypeError('visitor must be a function');\n }\n\n function convertValue(value) {\n if (value === null) return '';\n\n if (utils.isDate(value)) {\n return value.toISOString();\n }\n\n if (!useBlob && utils.isBlob(value)) {\n throw new AxiosError('Blob is not supported. Use a Buffer instead.');\n }\n\n if (utils.isArrayBuffer(value) || utils.isTypedArray(value)) {\n return useBlob && typeof Blob === 'function' ? new Blob([value]) : Buffer.from(value);\n }\n\n return value;\n }\n\n /**\n * Default visitor.\n *\n * @param {*} value\n * @param {String|Number} key\n * @param {Array<String|Number>} path\n * @this {FormData}\n *\n * @returns {boolean} return true to visit the each prop of the value recursively\n */\n function defaultVisitor(value, key, path) {\n let arr = value;\n\n if (value && !path && typeof value === 'object') {\n if (utils.endsWith(key, '{}')) {\n // eslint-disable-next-line no-param-reassign\n key = metaTokens ? key : key.slice(0, -2);\n // eslint-disable-next-line no-param-reassign\n value = JSON.stringify(value);\n } else if (\n (utils.isArray(value) && isFlatArray(value)) ||\n (utils.isFileList(value) || utils.endsWith(key, '[]') && (arr = utils.toArray(value))\n )) {\n // eslint-disable-next-line no-param-reassign\n key = removeBrackets(key);\n\n arr.forEach(function each(el, index) {\n !(utils.isUndefined(el) || el === null) && formData.append(\n // eslint-disable-next-line no-nested-ternary\n indexes === true ? renderKey([key], index, dots) : (indexes === null ? key : key + '[]'),\n convertValue(el)\n );\n });\n return false;\n }\n }\n\n if (isVisitable(value)) {\n return true;\n }\n\n formData.append(renderKey(path, key, dots), convertValue(value));\n\n return false;\n }\n\n const stack = [];\n\n const exposedHelpers = Object.assign(predicates, {\n defaultVisitor,\n convertValue,\n isVisitable\n });\n\n function build(value, path) {\n if (utils.isUndefined(value)) return;\n\n if (stack.indexOf(value) !== -1) {\n throw Error('Circular reference detected in ' + path.join('.'));\n }\n\n stack.push(value);\n\n utils.forEach(value, function each(el, key) {\n const result = !(utils.isUndefined(el) || el === null) && visitor.call(\n formData, el, utils.isString(key) ? key.trim() : key, path, exposedHelpers\n );\n\n if (result === true) {\n build(el, path ? path.concat(key) : [key]);\n }\n });\n\n stack.pop();\n }\n\n if (!utils.isObject(obj)) {\n throw new TypeError('data must be an object');\n }\n\n build(obj);\n\n return formData;\n}\n\nexport default toFormData;\n","'use strict';\n\nimport toFormData from './toFormData.js';\n\n/**\n * It encodes a string by replacing all characters that are not in the unreserved set with\n * their percent-encoded equivalents\n *\n * @param {string} str - The string to encode.\n *\n * @returns {string} The encoded string.\n */\nfunction encode(str) {\n const charMap = {\n '!': '%21',\n \"'\": '%27',\n '(': '%28',\n ')': '%29',\n '~': '%7E',\n '%20': '+',\n '%00': '\\x00'\n };\n return encodeURIComponent(str).replace(/[!'()~]|%20|%00/g, function replacer(match) {\n return charMap[match];\n });\n}\n\n/**\n * It takes a params object and converts it to a FormData object\n *\n * @param {Object<string, any>} params - The parameters to be converted to a FormData object.\n * @param {Object<string, any>} options - The options object passed to the Axios constructor.\n *\n * @returns {void}\n */\nfunction AxiosURLSearchParams(params, options) {\n this._pairs = [];\n\n params && toFormData(params, this, options);\n}\n\nconst prototype = AxiosURLSearchParams.prototype;\n\nprototype.append = function append(name, value) {\n this._pairs.push([name, value]);\n};\n\nprototype.toString = function toString(encoder) {\n const _encode = encoder ? function(value) {\n return encoder.call(this, value, encode);\n } : encode;\n\n return this._pairs.map(function each(pair) {\n return _encode(pair[0]) + '=' + _encode(pair[1]);\n }, '').join('&');\n};\n\nexport default AxiosURLSearchParams;\n","'use strict';\n\nimport utils from '../utils.js';\nimport AxiosURLSearchParams from '../helpers/AxiosURLSearchParams.js';\n\n/**\n * It replaces all instances of the characters `:`, `$`, `,`, `+`, `[`, and `]` with their\n * URI encoded counterparts\n *\n * @param {string} val The value to be encoded.\n *\n * @returns {string} The encoded value.\n */\nfunction encode(val) {\n return encodeURIComponent(val).\n replace(/%3A/gi, ':').\n replace(/%24/g, '$').\n replace(/%2C/gi, ',').\n replace(/%20/g, '+').\n replace(/%5B/gi, '[').\n replace(/%5D/gi, ']');\n}\n\n/**\n * Build a URL by appending params to the end\n *\n * @param {string} url The base of the url (e.g., http://www.google.com)\n * @param {object} [params] The params to be appended\n * @param {?object} options\n *\n * @returns {string} The formatted url\n */\nexport default function buildURL(url, params, options) {\n /*eslint no-param-reassign:0*/\n if (!params) {\n return url;\n }\n \n const _encode = options && options.encode || encode;\n\n const serializeFn = options && options.serialize;\n\n let serializedParams;\n\n if (serializeFn) {\n serializedParams = serializeFn(params, options);\n } else {\n serializedParams = utils.isURLSearchParams(params) ?\n params.toString() :\n new AxiosURLSearchParams(params, options).toString(_encode);\n }\n\n if (serializedParams) {\n const hashmarkIndex = url.indexOf(\"#\");\n\n if (hashmarkIndex !== -1) {\n url = url.slice(0, hashmarkIndex);\n }\n url += (url.indexOf('?') === -1 ? '?' : '&') + serializedParams;\n }\n\n return url;\n}\n","'use strict';\n\nimport utils from './../utils.js';\n\nclass InterceptorManager {\n constructor() {\n this.handlers = [];\n }\n\n /**\n * Add a new interceptor to the stack\n *\n * @param {Function} fulfilled The function to handle `then` for a `Promise`\n * @param {Function} rejected The function to handle `reject` for a `Promise`\n *\n * @return {Number} An ID used to remove interceptor later\n */\n use(fulfilled, rejected, options) {\n this.handlers.push({\n fulfilled,\n rejected,\n synchronous: options ? options.synchronous : false,\n runWhen: options ? options.runWhen : null\n });\n return this.handlers.length - 1;\n }\n\n /**\n * Remove an interceptor from the stack\n *\n * @param {Number} id The ID that was returned by `use`\n *\n * @returns {Boolean} `true` if the interceptor was removed, `false` otherwise\n */\n eject(id) {\n if (this.handlers[id]) {\n this.handlers[id] = null;\n }\n }\n\n /**\n * Clear all interceptors from the stack\n *\n * @returns {void}\n */\n clear() {\n if (this.handlers) {\n this.handlers = [];\n }\n }\n\n /**\n * Iterate over all the registered interceptors\n *\n * This method is particularly useful for skipping over any\n * interceptors that may have become `null` calling `eject`.\n *\n * @param {Function} fn The function to call for each interceptor\n *\n * @returns {void}\n */\n forEach(fn) {\n utils.forEach(this.handlers, function forEachHandler(h) {\n if (h !== null) {\n fn(h);\n }\n });\n }\n}\n\nexport default InterceptorManager;\n","'use strict';\n\nexport default {\n silentJSONParsing: true,\n forcedJSONParsing: true,\n clarifyTimeoutError: false\n};\n","'use strict';\n\nimport AxiosURLSearchParams from '../../../helpers/AxiosURLSearchParams.js';\nexport default typeof URLSearchParams !== 'undefined' ? URLSearchParams : AxiosURLSearchParams;\n","'use strict';\n\nexport default FormData;\n","import URLSearchParams from './classes/URLSearchParams.js'\nimport FormData from './classes/FormData.js'\n\n/**\n * Determine if we're running in a standard browser environment\n *\n * This allows axios to run in a web worker, and react-native.\n * Both environments support XMLHttpRequest, but not fully standard globals.\n *\n * web workers:\n * typeof window -> undefined\n * typeof document -> undefined\n *\n * react-native:\n * navigator.product -> 'ReactNative'\n * nativescript\n * navigator.product -> 'NativeScript' or 'NS'\n *\n * @returns {boolean}\n */\nconst isStandardBrowserEnv = (() => {\n let product;\n if (typeof navigator !== 'undefined' && (\n (product = navigator.product) === 'ReactNative' ||\n product === 'NativeScript' ||\n product === 'NS')\n ) {\n return false;\n }\n\n return typeof window !== 'undefined' && typeof document !== 'undefined';\n})();\n\nexport default {\n isBrowser: true,\n classes: {\n URLSearchParams,\n FormData,\n Blob\n },\n isStandardBrowserEnv,\n protocols: ['http', 'https', 'file', 'blob', 'url', 'data']\n};\n","'use strict';\n\nimport utils from '../utils.js';\nimport toFormData from './toFormData.js';\nimport platform from '../platform/index.js';\n\nexport default function toURLEncodedForm(data, options) {\n return toFormData(data, new platform.classes.URLSearchParams(), Object.assign({\n visitor: function(value, key, path, helpers) {\n if (platform.isNode && utils.isBuffer(value)) {\n this.append(key, value.toString('base64'));\n return false;\n }\n\n return helpers.defaultVisitor.apply(this, arguments);\n }\n }, options));\n}\n","'use strict';\n\nimport utils from '../utils.js';\n\n/**\n * It takes a string like `foo[x][y][z]` and returns an array like `['foo', 'x', 'y', 'z']\n *\n * @param {string} name - The name of the property to get.\n *\n * @returns An array of strings.\n */\nfunction parsePropPath(name) {\n // foo[x][y][z]\n // foo.x.y.z\n // foo-x-y-z\n // foo x y z\n return utils.matchAll(/\\w+|\\[(\\w*)]/g, name).map(match => {\n return match[0] === '[]' ? '' : match[1] || match[0];\n });\n}\n\n/**\n * Convert an array to an object.\n *\n * @param {Array<any>} arr - The array to convert to an object.\n *\n * @returns An object with the same keys and values as the array.\n */\nfunction arrayToObject(arr) {\n const obj = {};\n const keys = Object.keys(arr);\n let i;\n const len = keys.length;\n let key;\n for (i = 0; i < len; i++) {\n key = keys[i];\n obj[key] = arr[key];\n }\n return obj;\n}\n\n/**\n * It takes a FormData object and returns a JavaScript object\n *\n * @param {string} formData The FormData object to convert to JSON.\n *\n * @returns {Object<string, any> | null} The converted object.\n */\nfunction formDataToJSON(formData) {\n function buildPath(path, value, target, index) {\n let name = path[index++];\n const isNumericKey = Number.isFinite(+name);\n const isLast = index >= path.length;\n name = !name && utils.isArray(target) ? target.length : name;\n\n if (isLast) {\n if (utils.hasOwnProp(target, name)) {\n target[name] = [target[name], value];\n } else {\n target[name] = value;\n }\n\n return !isNumericKey;\n }\n\n if (!target[name] || !utils.isObject(target[name])) {\n target[name] = [];\n }\n\n const result = buildPath(path, value, target[name], index);\n\n if (result && utils.isArray(target[name])) {\n target[name] = arrayToObject(target[name]);\n }\n\n return !isNumericKey;\n }\n\n if (utils.isFormData(formData) && utils.isFunction(formData.entries)) {\n const obj = {};\n\n utils.forEachEntry(formData, (name, value) => {\n buildPath(parsePropPath(name), value, obj, 0);\n });\n\n return obj;\n }\n\n return null;\n}\n\nexport default formDataToJSON;\n","'use strict';\n\nimport AxiosError from './AxiosError.js';\n\n/**\n * Resolve or reject a Promise based on response status.\n *\n * @param {Function} resolve A function that resolves the promise.\n * @param {Function} reject A function that rejects the promise.\n * @param {object} response The response.\n *\n * @returns {object} The response.\n */\nexport default function settle(resolve, reject, response) {\n const validateStatus = response.config.validateStatus;\n if (!response.status || !validateStatus || validateStatus(response.status)) {\n resolve(response);\n } else {\n reject(new AxiosError(\n 'Request failed with status code ' + response.status,\n [AxiosError.ERR_BAD_REQUEST, AxiosError.ERR_BAD_RESPONSE][Math.floor(response.status / 100) - 4],\n response.config,\n response.request,\n response\n ));\n }\n}\n","'use strict';\n\nimport utils from './../utils.js';\nimport platform from '../platform/index.js';\n\nexport default platform.isStandardBrowserEnv ?\n\n// Standard browser envs support document.cookie\n (function standardBrowserEnv() {\n return {\n write: function write(name, value, expires, path, domain, secure) {\n const cookie = [];\n cookie.push(name + '=' + encodeURIComponent(value));\n\n if (utils.isNumber(expires)) {\n cookie.push('expires=' + new Date(expires).toGMTString());\n }\n\n if (utils.isString(path)) {\n cookie.push('path=' + path);\n }\n\n if (utils.isString(domain)) {\n cookie.push('domain=' + domain);\n }\n\n if (secure === true) {\n cookie.push('secure');\n }\n\n document.cookie = cookie.join('; ');\n },\n\n read: function read(name) {\n const match = document.cookie.match(new RegExp('(^|;\\\\s*)(' + name + ')=([^;]*)'));\n return (match ? decodeURIComponent(match[3]) : null);\n },\n\n remove: function remove(name) {\n this.write(name, '', Date.now() - 86400000);\n }\n };\n })() :\n\n// Non standard browser env (web workers, react-native) lack needed support.\n (function nonStandardBrowserEnv() {\n return {\n write: function write() {},\n read: function read() { return null; },\n remove: function remove() {}\n };\n })();\n","'use strict';\n\n/**\n * Determines whether the specified URL is absolute\n *\n * @param {string} url The URL to test\n *\n * @returns {boolean} True if the specified URL is absolute, otherwise false\n */\nexport default function isAbsoluteURL(url) {\n // A URL is considered absolute if it begins with \"<scheme>://\" or \"//\" (protocol-relative URL).\n // RFC 3986 defines scheme name as a sequence of characters beginning with a letter and followed\n // by any combination of letters, digits, plus, period, or hyphen.\n return /^([a-z][a-z\\d+\\-.]*:)?\\/\\//i.test(url);\n}\n","'use strict';\n\n/**\n * Creates a new URL by combining the specified URLs\n *\n * @param {string} baseURL The base URL\n * @param {string} relativeURL The relative URL\n *\n * @returns {string} The combined URL\n */\nexport default function combineURLs(baseURL, relativeURL) {\n return relativeURL\n ? baseURL.replace(/\\/+$/, '') + '/' + relativeURL.replace(/^\\/+/, '')\n : baseURL;\n}\n","'use strict';\n\nimport isAbsoluteURL from '../helpers/isAbsoluteURL.js';\nimport combineURLs from '../helpers/combineURLs.js';\n\n/**\n * Creates a new URL by combining the baseURL with the requestedURL,\n * only when the requestedURL is not already an absolute URL.\n * If the requestURL is absolute, this function returns the requestedURL untouched.\n *\n * @param {string} baseURL The base URL\n * @param {string} requestedURL Absolute or relative URL to combine\n *\n * @returns {string} The combined full path\n */\nexport default function buildFullPath(baseURL, requestedURL) {\n if (baseURL && !isAbsoluteURL(requestedURL)) {\n return combineURLs(baseURL, requestedURL);\n }\n return requestedURL;\n}\n","'use strict';\n\nimport utils from './../utils.js';\nimport platform from '../platform/index.js';\n\nexport default platform.isStandardBrowserEnv ?\n\n// Standard browser envs have full support of the APIs needed to test\n// whether the request URL is of the same origin as current location.\n (function standardBrowserEnv() {\n const msie = /(msie|trident)/i.test(navigator.userAgent);\n const urlParsingNode = document.createElement('a');\n let originURL;\n\n /**\n * Parse a URL to discover it's components\n *\n * @param {String} url The URL to be parsed\n * @returns {Object}\n */\n function resolveURL(url) {\n let href = url;\n\n if (msie) {\n // IE needs attribute set twice to normalize properties\n urlParsingNode.setAttribute('href', href);\n href = urlParsingNode.href;\n }\n\n urlParsingNode.setAttribute('href', href);\n\n // urlParsingNode provides the UrlUtils interface - http://url.spec.whatwg.org/#urlutils\n return {\n href: urlParsingNode.href,\n protocol: urlParsingNode.protocol ? urlParsingNode.protocol.replace(/:$/, '') : '',\n host: urlParsingNode.host,\n search: urlParsingNode.search ? urlParsingNode.search.replace(/^\\?/, '') : '',\n hash: urlParsingNode.hash ? urlParsingNode.hash.replace(/^#/, '') : '',\n hostname: urlParsingNode.hostname,\n port: urlParsingNode.port,\n pathname: (urlParsingNode.pathname.charAt(0) === '/') ?\n urlParsingNode.pathname :\n '/' + urlParsingNode.pathname\n };\n }\n\n originURL = resolveURL(window.location.href);\n\n /**\n * Determine if a URL shares the same origin as the current location\n *\n * @param {String} requestURL The URL to test\n * @returns {boolean} True if URL shares the same origin, otherwise false\n */\n return function isURLSameOrigin(requestURL) {\n const parsed = (utils.isString(requestURL)) ? resolveURL(requestURL) : requestURL;\n return (parsed.protocol === originURL.protocol &&\n parsed.host === originURL.host);\n };\n })() :\n\n // Non standard browser envs (web workers, react-native) lack needed support.\n (function nonStandardBrowserEnv() {\n return function isURLSameOrigin() {\n return true;\n };\n })();\n","'use strict';\n\nimport AxiosError from '../core/AxiosError.js';\nimport utils from '../utils.js';\n\n/**\n * A `CanceledError` is an object that is thrown when an operation is canceled.\n *\n * @param {string=} message The message.\n * @param {Object=} config The config.\n * @param {Object=} request The request.\n *\n * @returns {CanceledError} The created error.\n */\nfunction CanceledError(message, config, request) {\n // eslint-disable-next-line no-eq-null,eqeqeq\n AxiosError.call(this, message == null ? 'canceled' : message, AxiosError.ERR_CANCELED, config, request);\n this.name = 'CanceledError';\n}\n\nutils.inherits(CanceledError, AxiosError, {\n __CANCEL__: true\n});\n\nexport default CanceledError;\n","'use strict';\n\nexport default function parseProtocol(url) {\n const match = /^([-+\\w]{1,25})(:?\\/\\/|:)/.exec(url);\n return match && match[1] || '';\n}\n","'use strict';\n\nimport utils from './../utils.js';\n\n// RawAxiosHeaders whose duplicates are ignored by node\n// c.f. https://nodejs.org/api/http.html#http_message_headers\nconst ignoreDuplicateOf = utils.toObjectSet([\n 'age', 'authorization', 'content-length', 'content-type', 'etag',\n 'expires', 'from', 'host', 'if-modified-since', 'if-unmodified-since',\n 'last-modified', 'location', 'max-forwards', 'proxy-authorization',\n 'referer', 'retry-after', 'user-agent'\n]);\n\n/**\n * Parse headers into an object\n *\n * ```\n * Date: Wed, 27 Aug 2014 08:58:49 GMT\n * Content-Type: application/json\n * Connection: keep-alive\n * Transfer-Encoding: chunked\n * ```\n *\n * @param {String} rawHeaders Headers needing to be parsed\n *\n * @returns {Object} Headers parsed into an object\n */\nexport default rawHeaders => {\n const parsed = {};\n let key;\n let val;\n let i;\n\n rawHeaders && rawHeaders.split('\\n').forEach(function parser(line) {\n i = line.indexOf(':');\n key = line.substring(0, i).trim().toLowerCase();\n val = line.substring(i + 1).trim();\n\n if (!key || (parsed[key] && ignoreDuplicateOf[key])) {\n return;\n }\n\n if (key === 'set-cookie') {\n if (parsed[key]) {\n parsed[key].push(val);\n } else {\n parsed[key] = [val];\n }\n } else {\n parsed[key] = parsed[key] ? parsed[key] + ', ' + val : val;\n }\n });\n\n return parsed;\n};\n","'use strict';\n\nimport utils from '../utils.js';\nimport parseHeaders from '../helpers/parseHeaders.js';\n\nconst $internals = Symbol('internals');\nconst $defaults = Symbol('defaults');\n\nfunction normalizeHeader(header) {\n return header && String(header).trim().toLowerCase();\n}\n\nfunction normalizeValue(value) {\n if (value === false || value == null) {\n return value;\n }\n\n return utils.isArray(value) ? value.map(normalizeValue) : String(value);\n}\n\nfunction parseTokens(str) {\n const tokens = Object.create(null);\n const tokensRE = /([^\\s,;=]+)\\s*(?:=\\s*([^,;]+))?/g;\n let match;\n\n while ((match = tokensRE.exec(str))) {\n tokens[match[1]] = match[2];\n }\n\n return tokens;\n}\n\nfunction matchHeaderValue(context, value, header, filter) {\n if (utils.isFunction(filter)) {\n return filter.call(this, value, header);\n }\n\n if (!utils.isString(value)) return;\n\n if (utils.isString(filter)) {\n return value.indexOf(filter) !== -1;\n }\n\n if (utils.isRegExp(filter)) {\n return filter.test(value);\n }\n}\n\nfunction formatHeader(header) {\n return header.trim()\n .toLowerCase().replace(/([a-z\\d])(\\w*)/g, (w, char, str) => {\n return char.toUpperCase() + str;\n });\n}\n\nfunction buildAccessors(obj, header) {\n const accessorName = utils.toCamelCase(' ' + header);\n\n ['get', 'set', 'has'].forEach(methodName => {\n Object.defineProperty(obj, methodName + accessorName, {\n value: function(arg1, arg2, arg3) {\n return this[methodName].call(this, header, arg1, arg2, arg3);\n },\n configurable: true\n });\n });\n}\n\nfunction findKey(obj, key) {\n key = key.toLowerCase();\n const keys = Object.keys(obj);\n let i = keys.length;\n let _key;\n while (i-- > 0) {\n _key = keys[i];\n if (key === _key.toLowerCase()) {\n return _key;\n }\n }\n return null;\n}\n\nfunction AxiosHeaders(headers, defaults) {\n headers && this.set(headers);\n this[$defaults] = defaults || null;\n}\n\nObject.assign(AxiosHeaders.prototype, {\n set: function(header, valueOrRewrite, rewrite) {\n const self = this;\n\n function setHeader(_value, _header, _rewrite) {\n const lHeader = normalizeHeader(_header);\n\n if (!lHeader) {\n throw new Error('header name must be a non-empty string');\n }\n\n const key = findKey(self, lHeader);\n\n if (key && _rewrite !== true && (self[key] === false || _rewrite === false)) {\n return;\n }\n\n self[key || _header] = normalizeValue(_value);\n }\n\n if (utils.isPlainObject(header)) {\n utils.forEach(header, (_value, _header) => {\n setHeader(_value, _header, valueOrRewrite);\n });\n } else {\n setHeader(valueOrRewrite, header, rewrite);\n }\n\n return this;\n },\n\n get: function(header, parser) {\n header = normalizeHeader(header);\n\n if (!header) return undefined;\n\n const key = findKey(this, header);\n\n if (key) {\n const value = this[key];\n\n if (!parser) {\n return value;\n }\n\n if (parser === true) {\n return parseTokens(value);\n }\n\n if (utils.isFunction(parser)) {\n return parser.call(this, value, key);\n }\n\n if (utils.isRegExp(parser)) {\n return parser.exec(value);\n }\n\n throw new TypeError('parser must be boolean|regexp|function');\n }\n },\n\n has: function(header, matcher) {\n header = normalizeHeader(header);\n\n if (header) {\n const key = findKey(this, header);\n\n return !!(key && (!matcher || matchHeaderValue(this, this[key], key, matcher)));\n }\n\n return false;\n },\n\n delete: function(header, matcher) {\n const self = this;\n let deleted = false;\n\n function deleteHeader(_header) {\n _header = normalizeHeader(_header);\n\n if (_header) {\n const key = findKey(self, _header);\n\n if (key && (!matcher || matchHeaderValue(self, self[key], key, matcher))) {\n delete self[key];\n\n deleted = true;\n }\n }\n }\n\n if (utils.isArray(header)) {\n header.forEach(deleteHeader);\n } else {\n deleteHeader(header);\n }\n\n return deleted;\n },\n\n clear: function() {\n return Object.keys(this).forEach(this.delete.bind(this));\n },\n\n normalize: function(format) {\n const self = this;\n const headers = {};\n\n utils.forEach(this, (value, header) => {\n const key = findKey(headers, header);\n\n if (key) {\n self[key] = normalizeValue(value);\n delete self[header];\n return;\n }\n\n const normalized = format ? formatHeader(header) : String(header).trim();\n\n if (normalized !== header) {\n delete self[header];\n }\n\n self[normalized] = normalizeValue(value);\n\n headers[normalized] = true;\n });\n\n return this;\n },\n\n toJSON: function(asStrings) {\n const obj = Object.create(null);\n\n utils.forEach(Object.assign({}, this[$defaults] || null, this),\n (value, header) => {\n if (value == null || value === false) return;\n obj[header] = asStrings && utils.isArray(value) ? value.join(', ') : value;\n });\n\n return obj;\n }\n});\n\nObject.assign(AxiosHeaders, {\n from: function(thing) {\n if (utils.isString(thing)) {\n return new this(parseHeaders(thing));\n }\n return thing instanceof this ? thing : new this(thing);\n },\n\n accessor: function(header) {\n const internals = this[$internals] = (this[$internals] = {\n accessors: {}\n });\n\n const accessors = internals.accessors;\n const prototype = this.prototype;\n\n function defineAccessor(_header) {\n const lHeader = normalizeHeader(_header);\n\n if (!accessors[lHeader]) {\n buildAccessors(prototype, _header);\n accessors[lHeader] = true;\n }\n }\n\n utils.isArray(header) ? header.forEach(defineAccessor) : defineAccessor(header);\n\n return this;\n }\n});\n\nAxiosHeaders.accessor(['Content-Type', 'Content-Length', 'Accept', 'Accept-Encoding', 'User-Agent']);\n\nutils.freezeMethods(AxiosHeaders.prototype);\nutils.freezeMethods(AxiosHeaders);\n\nexport default AxiosHeaders;\n","'use strict';\n\n/**\n * Calculate data maxRate\n * @param {Number} [samplesCount= 10]\n * @param {Number} [min= 1000]\n * @returns {Function}\n */\nfunction speedometer(samplesCount, min) {\n samplesCount = samplesCount || 10;\n const bytes = new Array(samplesCount);\n const timestamps = new Array(samplesCount);\n let head = 0;\n let tail = 0;\n let firstSampleTS;\n\n min = min !== undefined ? min : 1000;\n\n return function push(chunkLength) {\n const now = Date.now();\n\n const startedAt = timestamps[tail];\n\n if (!firstSampleTS) {\n firstSampleTS = now;\n }\n\n bytes[head] = chunkLength;\n timestamps[head] = now;\n\n let i = tail;\n let bytesCount = 0;\n\n while (i !== head) {\n bytesCount += bytes[i++];\n i = i % samplesCount;\n }\n\n head = (head + 1) % samplesCount;\n\n if (head === tail) {\n tail = (tail + 1) % samplesCount;\n }\n\n if (now - firstSampleTS < min) {\n return;\n }\n\n const passed = startedAt && now - startedAt;\n\n return passed ? Math.round(bytesCount * 1000 / passed) : undefined;\n };\n}\n\nexport default speedometer;\n","'use strict';\n\nimport utils from './../utils.js';\nimport settle from './../core/settle.js';\nimport cookies from './../helpers/cookies.js';\nimport buildURL from './../helpers/buildURL.js';\nimport buildFullPath from '../core/buildFullPath.js';\nimport isURLSameOrigin from './../helpers/isURLSameOrigin.js';\nimport transitionalDefaults from '../defaults/transitional.js';\nimport AxiosError from '../core/AxiosError.js';\nimport CanceledError from '../cancel/CanceledError.js';\nimport parseProtocol from '../helpers/parseProtocol.js';\nimport platform from '../platform/index.js';\nimport AxiosHeaders from '../core/AxiosHeaders.js';\nimport speedometer from '../helpers/speedometer.js';\n\nfunction progressEventReducer(listener, isDownloadStream) {\n let bytesNotified = 0;\n const _speedometer = speedometer(50, 250);\n\n return e => {\n const loaded = e.loaded;\n const total = e.lengthComputable ? e.total : undefined;\n const progressBytes = loaded - bytesNotified;\n const rate = _speedometer(progressBytes);\n const inRange = loaded <= total;\n\n bytesNotified = loaded;\n\n const data = {\n loaded,\n total,\n progress: total ? (loaded / total) : undefined,\n bytes: progressBytes,\n rate: rate ? rate : undefined,\n estimated: rate && total && inRange ? (total - loaded) / rate : undefined\n };\n\n data[isDownloadStream ? 'download' : 'upload'] = true;\n\n listener(data);\n };\n}\n\nexport default function xhrAdapter(config) {\n return new Promise(function dispatchXhrRequest(resolve, reject) {\n let requestData = config.data;\n const requestHeaders = AxiosHeaders.from(config.headers).normalize();\n const responseType = config.responseType;\n let onCanceled;\n function done() {\n if (config.cancelToken) {\n config.cancelToken.unsubscribe(onCanceled);\n }\n\n if (config.signal) {\n config.signal.removeEventListener('abort', onCanceled);\n }\n }\n\n if (utils.isFormData(requestData) && platform.isStandardBrowserEnv) {\n requestHeaders.setContentType(false); // Let the browser set it\n }\n\n let request = new XMLHttpRequest();\n\n // HTTP basic authentication\n if (config.auth) {\n const username = config.auth.username || '';\n const password = config.auth.password ? unescape(encodeURIComponent(config.auth.password)) : '';\n requestHeaders.set('Authorization', 'Basic ' + btoa(username + ':' + password));\n }\n\n const fullPath = buildFullPath(config.baseURL, config.url);\n\n request.open(config.method.toUpperCase(), buildURL(fullPath, config.params, config.paramsSerializer), true);\n\n // Set the request timeout in MS\n request.timeout = config.timeout;\n\n function onloadend() {\n if (!request) {\n return;\n }\n // Prepare the response\n const responseHeaders = AxiosHeaders.from(\n 'getAllResponseHeaders' in request && request.getAllResponseHeaders()\n );\n const responseData = !responseType || responseType === 'text' || responseType === 'json' ?\n request.responseText : request.response;\n const response = {\n data: responseData,\n status: request.status,\n statusText: request.statusText,\n headers: responseHeaders,\n config,\n request\n };\n\n settle(function _resolve(value) {\n resolve(value);\n done();\n }, function _reject(err) {\n reject(err);\n done();\n }, response);\n\n // Clean up request\n request = null;\n }\n\n if ('onloadend' in request) {\n // Use onloadend if available\n request.onloadend = onloadend;\n } else {\n // Listen for ready state to emulate onloadend\n request.onreadystatechange = function handleLoad() {\n if (!request || request.readyState !== 4) {\n return;\n }\n\n // The request errored out and we didn't get a response, this will be\n // handled by onerror instead\n // With one exception: request that using file: protocol, most browsers\n // will return status as 0 even though it's a successful request\n if (request.status === 0 && !(request.responseURL && request.responseURL.indexOf('file:') === 0)) {\n return;\n }\n // readystate handler is calling before onerror or ontimeout handlers,\n // so we should call onloadend on the next 'tick'\n setTimeout(onloadend);\n };\n }\n\n // Handle browser request cancellation (as opposed to a manual cancellation)\n request.onabort = function handleAbort() {\n if (!request) {\n return;\n }\n\n reject(new AxiosError('Request aborted', AxiosError.ECONNABORTED, config, request));\n\n // Clean up request\n request = null;\n };\n\n // Handle low level network errors\n request.onerror = function handleError() {\n // Real errors are hidden from us by the browser\n // onerror should only fire if it's a network error\n reject(new AxiosError('Network Error', AxiosError.ERR_NETWORK, config, request));\n\n // Clean up request\n request = null;\n };\n\n // Handle timeout\n request.ontimeout = function handleTimeout() {\n let timeoutErrorMessage = config.timeout ? 'timeout of ' + config.timeout + 'ms exceeded' : 'timeout exceeded';\n const transitional = config.transitional || transitionalDefaults;\n if (config.timeoutErrorMessage) {\n timeoutErrorMessage = config.timeoutErrorMessage;\n }\n reject(new AxiosError(\n timeoutErrorMessage,\n transitional.clarifyTimeoutError ? AxiosError.ETIMEDOUT : AxiosError.ECONNABORTED,\n config,\n request));\n\n // Clean up request\n request = null;\n };\n\n // Add xsrf header\n // This is only done if running in a standard browser environment.\n // Specifically not if we're in a web worker, or react-native.\n if (platform.isStandardBrowserEnv) {\n // Add xsrf header\n const xsrfValue = (config.withCredentials || isURLSameOrigin(fullPath))\n && config.xsrfCookieName && cookies.read(config.xsrfCookieName);\n\n if (xsrfValue) {\n requestHeaders.set(config.xsrfHeaderName, xsrfValue);\n }\n }\n\n // Remove Content-Type if data is undefined\n requestData === undefined && requestHeaders.setContentType(null);\n\n // Add headers to the request\n if ('setRequestHeader' in request) {\n utils.forEach(requestHeaders.toJSON(), function setRequestHeader(val, key) {\n request.setRequestHeader(key, val);\n });\n }\n\n // Add withCredentials to request if needed\n if (!utils.isUndefined(config.withCredentials)) {\n request.withCredentials = !!config.withCredentials;\n }\n\n // Add responseType to request if needed\n if (responseType && responseType !== 'json') {\n request.responseType = config.responseType;\n }\n\n // Handle progress if needed\n if (typeof config.onDownloadProgress === 'function') {\n request.addEventListener('progress', progressEventReducer(config.onDownloadProgress, true));\n }\n\n // Not all browsers support upload events\n if (typeof config.onUploadProgress === 'function' && request.upload) {\n request.upload.addEventListener('progress', progressEventReducer(config.onUploadProgress));\n }\n\n if (config.cancelToken || config.signal) {\n // Handle cancellation\n // eslint-disable-next-line func-names\n onCanceled = cancel => {\n if (!request) {\n return;\n }\n reject(!cancel || cancel.type ? new CanceledError(null, config, request) : cancel);\n request.abort();\n request = null;\n };\n\n config.cancelToken && config.cancelToken.subscribe(onCanceled);\n if (config.signal) {\n config.signal.aborted ? onCanceled() : config.signal.addEventListener('abort', onCanceled);\n }\n }\n\n const protocol = parseProtocol(fullPath);\n\n if (protocol && platform.protocols.indexOf(protocol) === -1) {\n reject(new AxiosError('Unsupported protocol ' + protocol + ':', AxiosError.ERR_BAD_REQUEST, config));\n return;\n }\n\n\n // Send the request\n request.send(requestData || null);\n });\n}\n","import utils from '../utils.js';\nimport httpAdapter from './http.js';\nimport xhrAdapter from './xhr.js';\n\nconst adapters = {\n http: httpAdapter,\n xhr: xhrAdapter\n}\n\nexport default {\n getAdapter: (nameOrAdapter) => {\n if(utils.isString(nameOrAdapter)){\n const adapter = adapters[nameOrAdapter];\n\n if (!nameOrAdapter) {\n throw Error(\n utils.hasOwnProp(nameOrAdapter) ?\n `Adapter '${nameOrAdapter}' is not available in the build` :\n `Can not resolve adapter '${nameOrAdapter}'`\n );\n }\n\n return adapter\n }\n\n if (!utils.isFunction(nameOrAdapter)) {\n throw new TypeError('adapter is not a function');\n }\n\n return nameOrAdapter;\n },\n adapters\n}\n","'use strict';\n\nimport utils from '../utils.js';\nimport AxiosError from '../core/AxiosError.js';\nimport transitionalDefaults from './transitional.js';\nimport toFormData from '../helpers/toFormData.js';\nimport toURLEncodedForm from '../helpers/toURLEncodedForm.js';\nimport platform from '../platform/index.js';\nimport formDataToJSON from '../helpers/formDataToJSON.js';\nimport adapters from '../adapters/index.js';\n\nconst DEFAULT_CONTENT_TYPE = {\n 'Content-Type': 'application/x-www-form-urlencoded'\n};\n\n/**\n * If the browser has an XMLHttpRequest object, use the XHR adapter, otherwise use the HTTP\n * adapter\n *\n * @returns {Function}\n */\nfunction getDefaultAdapter() {\n let adapter;\n if (typeof XMLHttpRequest !== 'undefined') {\n // For browsers use XHR adapter\n adapter = adapters.getAdapter('xhr');\n } else if (typeof process !== 'undefined' && utils.kindOf(process) === 'process') {\n // For node use HTTP adapter\n adapter = adapters.getAdapter('http');\n }\n return adapter;\n}\n\n/**\n * It takes a string, tries to parse it, and if it fails, it returns the stringified version\n * of the input\n *\n * @param {any} rawValue - The value to be stringified.\n * @param {Function} parser - A function that parses a string into a JavaScript object.\n * @param {Function} encoder - A function that takes a value and returns a string.\n *\n * @returns {string} A stringified version of the rawValue.\n */\nfunction stringifySafely(rawValue, parser, encoder) {\n if (utils.isString(rawValue)) {\n try {\n (parser || JSON.parse)(rawValue);\n return utils.trim(rawValue);\n } catch (e) {\n if (e.name !== 'SyntaxError') {\n throw e;\n }\n }\n }\n\n return (encoder || JSON.stringify)(rawValue);\n}\n\nconst defaults = {\n\n transitional: transitionalDefaults,\n\n adapter: getDefaultAdapter(),\n\n transformRequest: [function transformRequest(data, headers) {\n const contentType = headers.getContentType() || '';\n const hasJSONContentType = contentType.indexOf('application/json') > -1;\n const isObjectPayload = utils.isObject(data);\n\n if (isObjectPayload && utils.isHTMLForm(data)) {\n data = new FormData(data);\n }\n\n const isFormData = utils.isFormData(data);\n\n if (isFormData) {\n if (!hasJSONContentType) {\n return data;\n }\n return hasJSONContentType ? JSON.stringify(formDataToJSON(data)) : data;\n }\n\n if (utils.isArrayBuffer(data) ||\n utils.isBuffer(data) ||\n utils.isStream(data) ||\n utils.isFile(data) ||\n utils.isBlob(data)\n ) {\n return data;\n }\n if (utils.isArrayBufferView(data)) {\n return data.buffer;\n }\n if (utils.isURLSearchParams(data)) {\n headers.setContentType('application/x-www-form-urlencoded;charset=utf-8', false);\n return data.toString();\n }\n\n let isFileList;\n\n if (isObjectPayload) {\n if (contentType.indexOf('application/x-www-form-urlencoded') > -1) {\n return toURLEncodedForm(data, this.formSerializer).toString();\n }\n\n if ((isFileList = utils.isFileList(data)) || contentType.indexOf('multipart/form-data') > -1) {\n const _FormData = this.env && this.env.FormData;\n\n return toFormData(\n isFileList ? {'files[]': data} : data,\n _FormData && new _FormData(),\n this.formSerializer\n );\n }\n }\n\n if (isObjectPayload || hasJSONContentType ) {\n headers.setContentType('application/json', false);\n return stringifySafely(data);\n }\n\n return data;\n }],\n\n transformResponse: [function transformResponse(data) {\n const transitional = this.transitional || defaults.transitional;\n const forcedJSONParsing = transitional && transitional.forcedJSONParsing;\n const JSONRequested = this.responseType === 'json';\n\n if (data && utils.isString(data) && ((forcedJSONParsing && !this.responseType) || JSONRequested)) {\n const silentJSONParsing = transitional && transitional.silentJSONParsing;\n const strictJSONParsing = !silentJSONParsing && JSONRequested;\n\n try {\n return JSON.parse(data);\n } catch (e) {\n if (strictJSONParsing) {\n if (e.name === 'SyntaxError') {\n throw AxiosError.from(e, AxiosError.ERR_BAD_RESPONSE, this, null, this.response);\n }\n throw e;\n }\n }\n }\n\n return data;\n }],\n\n /**\n * A timeout in milliseconds to abort a request. If set to 0 (default) a\n * timeout is not created.\n */\n timeout: 0,\n\n xsrfCookieName: 'XSRF-TOKEN',\n xsrfHeaderName: 'X-XSRF-TOKEN',\n\n maxContentLength: -1,\n maxBodyLength: -1,\n\n env: {\n FormData: platform.classes.FormData,\n Blob: platform.classes.Blob\n },\n\n validateStatus: function validateStatus(status) {\n return status >= 200 && status < 300;\n },\n\n headers: {\n common: {\n 'Accept': 'application/json, text/plain, */*'\n }\n }\n};\n\nutils.forEach(['delete', 'get', 'head'], function forEachMethodNoData(method) {\n defaults.headers[method] = {};\n});\n\nutils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {\n defaults.headers[method] = utils.merge(DEFAULT_CONTENT_TYPE);\n});\n\nexport default defaults;\n","'use strict';\n\nimport utils from './../utils.js';\nimport defaults from '../defaults/index.js';\nimport AxiosHeaders from '../core/AxiosHeaders.js';\n\n/**\n * Transform the data for a request or a response\n *\n * @param {Array|Function} fns A single function or Array of functions\n * @param {?Object} response The response object\n *\n * @returns {*} The resulting transformed data\n */\nexport default function transformData(fns, response) {\n const config = this || defaults;\n const context = response || config;\n const headers = AxiosHeaders.from(context.headers);\n let data = context.data;\n\n utils.forEach(fns, function transform(fn) {\n data = fn.call(config, data, headers.normalize(), response ? response.status : undefined);\n });\n\n headers.normalize();\n\n return data;\n}\n","'use strict';\n\nexport default function isCancel(value) {\n return !!(value && value.__CANCEL__);\n}\n","'use strict';\n\nimport transformData from './transformData.js';\nimport isCancel from '../cancel/isCancel.js';\nimport defaults from '../defaults/index.js';\nimport CanceledError from '../cancel/CanceledError.js';\nimport AxiosHeaders from '../core/AxiosHeaders.js';\n\n/**\n * Throws a `CanceledError` if cancellation has been requested.\n *\n * @param {Object} config The config that is to be used for the request\n *\n * @returns {void}\n */\nfunction throwIfCancellationRequested(config) {\n if (config.cancelToken) {\n config.cancelToken.throwIfRequested();\n }\n\n if (config.signal && config.signal.aborted) {\n throw new CanceledError();\n }\n}\n\n/**\n * Dispatch a request to the server using the configured adapter.\n *\n * @param {object} config The config that is to be used for the request\n *\n * @returns {Promise} The Promise to be fulfilled\n */\nexport default function dispatchRequest(config) {\n throwIfCancellationRequested(config);\n\n config.headers = AxiosHeaders.from(config.headers);\n\n // Transform request data\n config.data = transformData.call(\n config,\n config.transformRequest\n );\n\n const adapter = config.adapter || defaults.adapter;\n\n return adapter(config).then(function onAdapterResolution(response) {\n throwIfCancellationRequested(config);\n\n // Transform response data\n response.data = transformData.call(\n config,\n config.transformResponse,\n response\n );\n\n response.headers = AxiosHeaders.from(response.headers);\n\n return response;\n }, function onAdapterRejection(reason) {\n if (!isCancel(reason)) {\n throwIfCancellationRequested(config);\n\n // Transform response data\n if (reason && reason.response) {\n reason.response.data = transformData.call(\n config,\n config.transformResponse,\n reason.response\n );\n reason.response.headers = AxiosHeaders.from(reason.response.headers);\n }\n }\n\n return Promise.reject(reason);\n });\n}\n","'use strict';\n\nimport utils from '../utils.js';\n\n/**\n * Config-specific merge-function which creates a new config-object\n * by merging two configuration objects together.\n *\n * @param {Object} config1\n * @param {Object} config2\n *\n * @returns {Object} New object resulting from merging config2 to config1\n */\nexport default function mergeConfig(config1, config2) {\n // eslint-disable-next-line no-param-reassign\n config2 = config2 || {};\n const config = {};\n\n function getMergedValue(target, source) {\n if (utils.isPlainObject(target) && utils.isPlainObject(source)) {\n return utils.merge(target, source);\n } else if (utils.isPlainObject(source)) {\n return utils.merge({}, source);\n } else if (utils.isArray(source)) {\n return source.slice();\n }\n return source;\n }\n\n // eslint-disable-next-line consistent-return\n function mergeDeepProperties(prop) {\n if (!utils.isUndefined(config2[prop])) {\n return getMergedValue(config1[prop], config2[prop]);\n } else if (!utils.isUndefined(config1[prop])) {\n return getMergedValue(undefined, config1[prop]);\n }\n }\n\n // eslint-disable-next-line consistent-return\n function valueFromConfig2(prop) {\n if (!utils.isUndefined(config2[prop])) {\n return getMergedValue(undefined, config2[prop]);\n }\n }\n\n // eslint-disable-next-line consistent-return\n function defaultToConfig2(prop) {\n if (!utils.isUndefined(config2[prop])) {\n return getMergedValue(undefined, config2[prop]);\n } else if (!utils.isUndefined(config1[prop])) {\n return getMergedValue(undefined, config1[prop]);\n }\n }\n\n // eslint-disable-next-line consistent-return\n function mergeDirectKeys(prop) {\n if (prop in config2) {\n return getMergedValue(config1[prop], config2[prop]);\n } else if (prop in config1) {\n return getMergedValue(undefined, config1[prop]);\n }\n }\n\n const mergeMap = {\n 'url': valueFromConfig2,\n 'method': valueFromConfig2,\n 'data': valueFromConfig2,\n 'baseURL': defaultToConfig2,\n 'transformRequest': defaultToConfig2,\n 'transformResponse': defaultToConfig2,\n 'paramsSerializer': defaultToConfig2,\n 'timeout': defaultToConfig2,\n 'timeoutMessage': defaultToConfig2,\n 'withCredentials': defaultToConfig2,\n 'adapter': defaultToConfig2,\n 'responseType': defaultToConfig2,\n 'xsrfCookieName': defaultToConfig2,\n 'xsrfHeaderName': defaultToConfig2,\n 'onUploadProgress': defaultToConfig2,\n 'onDownloadProgress': defaultToConfig2,\n 'decompress': defaultToConfig2,\n 'maxContentLength': defaultToConfig2,\n 'maxBodyLength': defaultToConfig2,\n 'beforeRedirect': defaultToConfig2,\n 'transport': defaultToConfig2,\n 'httpAgent': defaultToConfig2,\n 'httpsAgent': defaultToConfig2,\n 'cancelToken': defaultToConfig2,\n 'socketPath': defaultToConfig2,\n 'responseEncoding': defaultToConfig2,\n 'validateStatus': mergeDirectKeys\n };\n\n utils.forEach(Object.keys(config1).concat(Object.keys(config2)), function computeConfigValue(prop) {\n const merge = mergeMap[prop] || mergeDeepProperties;\n const configValue = merge(prop);\n (utils.isUndefined(configValue) && merge !== mergeDirectKeys) || (config[prop] = configValue);\n });\n\n return config;\n}\n","export const VERSION = \"1.1.3\";","'use strict';\n\nimport {VERSION} from '../env/data.js';\nimport AxiosError from '../core/AxiosError.js';\n\nconst validators = {};\n\n// eslint-disable-next-line func-names\n['object', 'boolean', 'number', 'function', 'string', 'symbol'].forEach((type, i) => {\n validators[type] = function validator(thing) {\n return typeof thing === type || 'a' + (i < 1 ? 'n ' : ' ') + type;\n };\n});\n\nconst deprecatedWarnings = {};\n\n/**\n * Transitional option validator\n *\n * @param {function|boolean?} validator - set to false if the transitional option has been removed\n * @param {string?} version - deprecated version / removed since version\n * @param {string?} message - some message with additional info\n *\n * @returns {function}\n */\nvalidators.transitional = function transitional(validator, version, message) {\n function formatMessage(opt, desc) {\n return '[Axios v' + VERSION + '] Transitional option \\'' + opt + '\\'' + desc + (message ? '. ' + message : '');\n }\n\n // eslint-disable-next-line func-names\n return (value, opt, opts) => {\n if (validator === false) {\n throw new AxiosError(\n formatMessage(opt, ' has been removed' + (version ? ' in ' + version : '')),\n AxiosError.ERR_DEPRECATED\n );\n }\n\n if (version && !deprecatedWarnings[opt]) {\n deprecatedWarnings[opt] = true;\n // eslint-disable-next-line no-console\n console.warn(\n formatMessage(\n opt,\n ' has been deprecated since v' + version + ' and will be removed in the near future'\n )\n );\n }\n\n return validator ? validator(value, opt, opts) : true;\n };\n};\n\n/**\n * Assert object's properties type\n *\n * @param {object} options\n * @param {object} schema\n * @param {boolean?} allowUnknown\n *\n * @returns {object}\n */\n\nfunction assertOptions(options, schema, allowUnknown) {\n if (typeof options !== 'object') {\n throw new AxiosError('options must be an object', AxiosError.ERR_BAD_OPTION_VALUE);\n }\n const keys = Object.keys(options);\n let i = keys.length;\n while (i-- > 0) {\n const opt = keys[i];\n const validator = schema[opt];\n if (validator) {\n const value = options[opt];\n const result = value === undefined || validator(value, opt, options);\n if (result !== true) {\n throw new AxiosError('option ' + opt + ' must be ' + result, AxiosError.ERR_BAD_OPTION_VALUE);\n }\n continue;\n }\n if (allowUnknown !== true) {\n throw new AxiosError('Unknown option ' + opt, AxiosError.ERR_BAD_OPTION);\n }\n }\n}\n\nexport default {\n assertOptions,\n validators\n};\n","'use strict';\n\nimport utils from './../utils.js';\nimport buildURL from '../helpers/buildURL.js';\nimport InterceptorManager from './InterceptorManager.js';\nimport dispatchRequest from './dispatchRequest.js';\nimport mergeConfig from './mergeConfig.js';\nimport buildFullPath from './buildFullPath.js';\nimport validator from '../helpers/validator.js';\nimport AxiosHeaders from './AxiosHeaders.js';\n\nconst validators = validator.validators;\n\n/**\n * Create a new instance of Axios\n *\n * @param {Object} instanceConfig The default config for the instance\n *\n * @return {Axios} A new instance of Axios\n */\nclass Axios {\n constructor(instanceConfig) {\n this.defaults = instanceConfig;\n this.interceptors = {\n request: new InterceptorManager(),\n response: new InterceptorManager()\n };\n }\n\n /**\n * Dispatch a request\n *\n * @param {String|Object} configOrUrl The config specific for this request (merged with this.defaults)\n * @param {?Object} config\n *\n * @returns {Promise} The Promise to be fulfilled\n */\n request(configOrUrl, config) {\n /*eslint no-param-reassign:0*/\n // Allow for axios('example/url'[, config]) a la fetch API\n if (typeof configOrUrl === 'string') {\n config = config || {};\n config.url = configOrUrl;\n } else {\n config = configOrUrl || {};\n }\n\n config = mergeConfig(this.defaults, config);\n\n const {transitional, paramsSerializer} = config;\n\n if (transitional !== undefined) {\n validator.assertOptions(transitional, {\n silentJSONParsing: validators.transitional(validators.boolean),\n forcedJSONParsing: validators.transitional(validators.boolean),\n clarifyTimeoutError: validators.transitional(validators.boolean)\n }, false);\n }\n\n if (paramsSerializer !== undefined) {\n validator.assertOptions(paramsSerializer, {\n encode: validators.function,\n serialize: validators.function\n }, true);\n }\n\n // Set config.method\n config.method = (config.method || this.defaults.method || 'get').toLowerCase();\n\n // Flatten headers\n const defaultHeaders = config.headers && utils.merge(\n config.headers.common,\n config.headers[config.method]\n );\n\n defaultHeaders && utils.forEach(\n ['delete', 'get', 'head', 'post', 'put', 'patch', 'common'],\n function cleanHeaderConfig(method) {\n delete config.headers[method];\n }\n );\n\n config.headers = new AxiosHeaders(config.headers, defaultHeaders);\n\n // filter out skipped interceptors\n const requestInterceptorChain = [];\n let synchronousRequestInterceptors = true;\n this.interceptors.request.forEach(function unshiftRequestInterceptors(interceptor) {\n if (typeof interceptor.runWhen === 'function' && interceptor.runWhen(config) === false) {\n return;\n }\n\n synchronousRequestInterceptors = synchronousRequestInterceptors && interceptor.synchronous;\n\n requestInterceptorChain.unshift(interceptor.fulfilled, interceptor.rejected);\n });\n\n const responseInterceptorChain = [];\n this.interceptors.response.forEach(function pushResponseInterceptors(interceptor) {\n responseInterceptorChain.push(interceptor.fulfilled, interceptor.rejected);\n });\n\n let promise;\n let i = 0;\n let len;\n\n if (!synchronousRequestInterceptors) {\n const chain = [dispatchRequest.bind(this), undefined];\n chain.unshift.apply(chain, requestInterceptorChain);\n chain.push.apply(chain, responseInterceptorChain);\n len = chain.length;\n\n promise = Promise.resolve(config);\n\n while (i < len) {\n promise = promise.then(chain[i++], chain[i++]);\n }\n\n return promise;\n }\n\n len = requestInterceptorChain.length;\n\n let newConfig = config;\n\n i = 0;\n\n while (i < len) {\n const onFulfilled = requestInterceptorChain[i++];\n const onRejected = requestInterceptorChain[i++];\n try {\n newConfig = onFulfilled(newConfig);\n } catch (error) {\n onRejected.call(this, error);\n break;\n }\n }\n\n try {\n promise = dispatchRequest.call(this, newConfig);\n } catch (error) {\n return Promise.reject(error);\n }\n\n i = 0;\n len = responseInterceptorChain.length;\n\n while (i < len) {\n promise = promise.then(responseInterceptorChain[i++], responseInterceptorChain[i++]);\n }\n\n return promise;\n }\n\n getUri(config) {\n config = mergeConfig(this.defaults, config);\n const fullPath = buildFullPath(config.baseURL, config.url);\n return buildURL(fullPath, config.params, config.paramsSerializer);\n }\n}\n\n// Provide aliases for supported request methods\nutils.forEach(['delete', 'get', 'head', 'options'], function forEachMethodNoData(method) {\n /*eslint func-names:0*/\n Axios.prototype[method] = function(url, config) {\n return this.request(mergeConfig(config || {}, {\n method,\n url,\n data: (config || {}).data\n }));\n };\n});\n\nutils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {\n /*eslint func-names:0*/\n\n function generateHTTPMethod(isForm) {\n return function httpMethod(url, data, config) {\n return this.request(mergeConfig(config || {}, {\n method,\n headers: isForm ? {\n 'Content-Type': 'multipart/form-data'\n } : {},\n url,\n data\n }));\n };\n }\n\n Axios.prototype[method] = generateHTTPMethod();\n\n Axios.prototype[method + 'Form'] = generateHTTPMethod(true);\n});\n\nexport default Axios;\n","'use strict';\n\nimport CanceledError from './CanceledError.js';\n\n/**\n * A `CancelToken` is an object that can be used to request cancellation of an operation.\n *\n * @param {Function} executor The executor function.\n *\n * @returns {CancelToken}\n */\nclass CancelToken {\n constructor(executor) {\n if (typeof executor !== 'function') {\n throw new TypeError('executor must be a function.');\n }\n\n let resolvePromise;\n\n this.promise = new Promise(function promiseExecutor(resolve) {\n resolvePromise = resolve;\n });\n\n const token = this;\n\n // eslint-disable-next-line func-names\n this.promise.then(cancel => {\n if (!token._listeners) return;\n\n let i = token._listeners.length;\n\n while (i-- > 0) {\n token._listeners[i](cancel);\n }\n token._listeners = null;\n });\n\n // eslint-disable-next-line func-names\n this.promise.then = onfulfilled => {\n let _resolve;\n // eslint-disable-next-line func-names\n const promise = new Promise(resolve => {\n token.subscribe(resolve);\n _resolve = resolve;\n }).then(onfulfilled);\n\n promise.cancel = function reject() {\n token.unsubscribe(_resolve);\n };\n\n return promise;\n };\n\n executor(function cancel(message, config, request) {\n if (token.reason) {\n // Cancellation has already been requested\n return;\n }\n\n token.reason = new CanceledError(message, config, request);\n resolvePromise(token.reason);\n });\n }\n\n /**\n * Throws a `CanceledError` if cancellation has been requested.\n */\n throwIfRequested() {\n if (this.reason) {\n throw this.reason;\n }\n }\n\n /**\n * Subscribe to the cancel signal\n */\n\n subscribe(listener) {\n if (this.reason) {\n listener(this.reason);\n return;\n }\n\n if (this._listeners) {\n this._listeners.push(listener);\n } else {\n this._listeners = [listener];\n }\n }\n\n /**\n * Unsubscribe from the cancel signal\n */\n\n unsubscribe(listener) {\n if (!this._listeners) {\n return;\n }\n const index = this._listeners.indexOf(listener);\n if (index !== -1) {\n this._listeners.splice(index, 1);\n }\n }\n\n /**\n * Returns an object that contains a new `CancelToken` and a function that, when called,\n * cancels the `CancelToken`.\n */\n static source() {\n let cancel;\n const token = new CancelToken(function executor(c) {\n cancel = c;\n });\n return {\n token,\n cancel\n };\n }\n}\n\nexport default CancelToken;\n","'use strict';\n\n/**\n * Syntactic sugar for invoking a function and expanding an array for arguments.\n *\n * Common use case would be to use `Function.prototype.apply`.\n *\n * ```js\n * function f(x, y, z) {}\n * var args = [1, 2, 3];\n * f.apply(null, args);\n * ```\n *\n * With `spread` this example can be re-written.\n *\n * ```js\n * spread(function(x, y, z) {})([1, 2, 3]);\n * ```\n *\n * @param {Function} callback\n *\n * @returns {Function}\n */\nexport default function spread(callback) {\n return function wrap(arr) {\n return callback.apply(null, arr);\n };\n}\n","'use strict';\n\nimport utils from './../utils.js';\n\n/**\n * Determines whether the payload is an error thrown by Axios\n *\n * @param {*} payload The value to test\n *\n * @returns {boolean} True if the payload is an error thrown by Axios, otherwise false\n */\nexport default function isAxiosError(payload) {\n return utils.isObject(payload) && (payload.isAxiosError === true);\n}\n","'use strict';\n\nimport utils from './utils.js';\nimport bind from './helpers/bind.js';\nimport Axios from './core/Axios.js';\nimport mergeConfig from './core/mergeConfig.js';\nimport defaults from './defaults/index.js';\nimport formDataToJSON from './helpers/formDataToJSON.js';\nimport CanceledError from './cancel/CanceledError.js';\nimport CancelToken from './cancel/CancelToken.js';\nimport isCancel from './cancel/isCancel.js';\nimport {VERSION} from './env/data.js';\nimport toFormData from './helpers/toFormData.js';\nimport AxiosError from './core/AxiosError.js';\nimport spread from './helpers/spread.js';\nimport isAxiosError from './helpers/isAxiosError.js';\n\n/**\n * Create an instance of Axios\n *\n * @param {Object} defaultConfig The default config for the instance\n *\n * @returns {Axios} A new instance of Axios\n */\nfunction createInstance(defaultConfig) {\n const context = new Axios(defaultConfig);\n const instance = bind(Axios.prototype.request, context);\n\n // Copy axios.prototype to instance\n utils.extend(instance, Axios.prototype, context, {allOwnKeys: true});\n\n // Copy context to instance\n utils.extend(instance, context, null, {allOwnKeys: true});\n\n // Factory for creating new instances\n instance.create = function create(instanceConfig) {\n return createInstance(mergeConfig(defaultConfig, instanceConfig));\n };\n\n return instance;\n}\n\n// Create the default instance to be exported\nconst axios = createInstance(defaults);\n\n// Expose Axios class to allow class inheritance\naxios.Axios = Axios;\n\n// Expose Cancel & CancelToken\naxios.CanceledError = CanceledError;\naxios.CancelToken = CancelToken;\naxios.isCancel = isCancel;\naxios.VERSION = VERSION;\naxios.toFormData = toFormData;\n\n// Expose AxiosError class\naxios.AxiosError = AxiosError;\n\n// alias for CanceledError for backward compatibility\naxios.Cancel = axios.CanceledError;\n\n// Expose all/spread\naxios.all = function all(promises) {\n return Promise.all(promises);\n};\n\naxios.spread = spread;\n\n// Expose isAxiosError\naxios.isAxiosError = isAxiosError;\n\naxios.formToJSON = thing => {\n return formDataToJSON(utils.isHTMLForm(thing) ? new FormData(thing) : thing);\n};\n\nexport default axios\n"],"names":["bind","fn","thisArg","wrap","apply","arguments","toString","Object","prototype","getPrototypeOf","kindOf","cache","thing","str","call","slice","toLowerCase","create","kindOfTest","type","typeOfTest","isArray","Array","isUndefined","isBuffer","val","constructor","isFunction","isArrayBuffer","isArrayBufferView","result","ArrayBuffer","isView","buffer","isString","isNumber","isObject","isBoolean","isPlainObject","Symbol","toStringTag","iterator","isDate","isFile","isBlob","isFileList","isStream","pipe","isFormData","pattern","FormData","isURLSearchParams","trim","replace","forEach","obj","allOwnKeys","i","l","length","keys","getOwnPropertyNames","len","key","merge","assignValue","extend","a","b","stripBOM","content","charCodeAt","inherits","superConstructor","props","descriptors","defineProperty","value","assign","toFlatObject","sourceObj","destObj","filter","propFilter","prop","merged","endsWith","searchString","position","String","undefined","lastIndex","indexOf","toArray","arr","isTypedArray","TypedArray","Uint8Array","forEachEntry","generator","next","done","pair","matchAll","regExp","matches","exec","push","isHTMLForm","toCamelCase","replacer","m","p1","p2","toUpperCase","hasOwnProperty","isRegExp","reduceDescriptors","reducer","getOwnPropertyDescriptors","reducedDescriptors","descriptor","name","defineProperties","freezeMethods","enumerable","writable","set","Error","toObjectSet","arrayOrString","delimiter","define","split","noop","toFiniteNumber","defaultValue","Number","isFinite","hasOwnProp","AxiosError","message","code","config","request","response","captureStackTrace","stack","utils","toJSON","description","number","fileName","lineNumber","columnNumber","status","from","error","customProps","axiosError","cause","browser","self","window","isVisitable","removeBrackets","renderKey","path","dots","concat","map","each","token","join","isFlatArray","some","predicates","test","isSpecCompliant","append","toFormData","formData","options","TypeError","envFormData","metaTokens","indexes","defined","option","source","visitor","defaultVisitor","_Blob","Blob","useBlob","convertValue","toISOString","Buffer","JSON","stringify","el","index","exposedHelpers","build","pop","encode","charMap","encodeURIComponent","match","AxiosURLSearchParams","params","_pairs","encoder","_encode","buildURL","url","serializeFn","serialize","serializedParams","hashmarkIndex","InterceptorManager","handlers","fulfilled","rejected","synchronous","runWhen","id","forEachHandler","h","silentJSONParsing","forcedJSONParsing","clarifyTimeoutError","URLSearchParams","isStandardBrowserEnv","product","navigator","document","isBrowser","classes","protocols","toURLEncodedForm","data","platform","helpers","isNode","parsePropPath","arrayToObject","formDataToJSON","buildPath","target","isNumericKey","isLast","entries","settle","resolve","reject","validateStatus","ERR_BAD_REQUEST","ERR_BAD_RESPONSE","Math","floor","standardBrowserEnv","write","expires","domain","secure","cookie","Date","toGMTString","read","RegExp","decodeURIComponent","remove","now","nonStandardBrowserEnv","isAbsoluteURL","combineURLs","baseURL","relativeURL","buildFullPath","requestedURL","msie","userAgent","urlParsingNode","createElement","originURL","resolveURL","href","setAttribute","protocol","host","search","hash","hostname","port","pathname","charAt","location","isURLSameOrigin","requestURL","parsed","CanceledError","ERR_CANCELED","__CANCEL__","parseProtocol","ignoreDuplicateOf","rawHeaders","parser","line","substring","$internals","$defaults","normalizeHeader","header","normalizeValue","parseTokens","tokens","tokensRE","matchHeaderValue","context","formatHeader","w","char","buildAccessors","accessorName","methodName","arg1","arg2","arg3","configurable","findKey","_key","AxiosHeaders","headers","defaults","valueOrRewrite","rewrite","setHeader","_value","_header","_rewrite","lHeader","get","has","matcher","deleted","deleteHeader","clear","normalize","format","normalized","asStrings","parseHeaders","accessor","internals","accessors","defineAccessor","speedometer","samplesCount","min","bytes","timestamps","head","tail","firstSampleTS","chunkLength","startedAt","bytesCount","passed","round","progressEventReducer","listener","isDownloadStream","bytesNotified","_speedometer","e","loaded","total","lengthComputable","progressBytes","rate","inRange","progress","estimated","xhrAdapter","Promise","dispatchXhrRequest","requestData","requestHeaders","responseType","onCanceled","cancelToken","unsubscribe","signal","removeEventListener","setContentType","XMLHttpRequest","auth","username","password","unescape","btoa","fullPath","open","method","paramsSerializer","timeout","onloadend","responseHeaders","getAllResponseHeaders","responseData","responseText","statusText","_resolve","_reject","err","onreadystatechange","handleLoad","readyState","responseURL","setTimeout","onabort","handleAbort","ECONNABORTED","onerror","handleError","ERR_NETWORK","ontimeout","handleTimeout","timeoutErrorMessage","transitional","transitionalDefaults","ETIMEDOUT","xsrfValue","withCredentials","xsrfCookieName","cookies","xsrfHeaderName","setRequestHeader","onDownloadProgress","addEventListener","onUploadProgress","upload","cancel","abort","subscribe","aborted","send","adapters","http","httpAdapter","xhr","getAdapter","nameOrAdapter","adapter","DEFAULT_CONTENT_TYPE","getDefaultAdapter","process","stringifySafely","rawValue","parse","transformRequest","contentType","getContentType","hasJSONContentType","isObjectPayload","formSerializer","_FormData","env","transformResponse","JSONRequested","strictJSONParsing","maxContentLength","maxBodyLength","common","forEachMethodNoData","forEachMethodWithData","transformData","fns","transform","isCancel","throwIfCancellationRequested","throwIfRequested","dispatchRequest","then","onAdapterResolution","onAdapterRejection","reason","mergeConfig","config1","config2","getMergedValue","mergeDeepProperties","valueFromConfig2","defaultToConfig2","mergeDirectKeys","mergeMap","computeConfigValue","configValue","VERSION","validators","validator","deprecatedWarnings","version","formatMessage","opt","desc","opts","ERR_DEPRECATED","console","warn","assertOptions","schema","allowUnknown","ERR_BAD_OPTION_VALUE","ERR_BAD_OPTION","Axios","instanceConfig","interceptors","configOrUrl","defaultHeaders","cleanHeaderConfig","requestInterceptorChain","synchronousRequestInterceptors","unshiftRequestInterceptors","interceptor","unshift","responseInterceptorChain","pushResponseInterceptors","promise","chain","newConfig","onFulfilled","onRejected","generateHTTPMethod","isForm","httpMethod","CancelToken","executor","resolvePromise","promiseExecutor","_listeners","onfulfilled","splice","c","spread","callback","isAxiosError","payload","createInstance","defaultConfig","instance","axios","Cancel","all","promises","formToJSON"],"mappings":"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"} \ No newline at end of file
diff --git a/node_modules/axios/dist/axios.min.js b/node_modules/axios/dist/axios.min.js
new file mode 100644
index 0000000..75e993b
--- /dev/null
+++ b/node_modules/axios/dist/axios.min.js
@@ -0,0 +1,2 @@
+!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).axios=t()}(this,(function(){"use strict";function e(t){return e="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},e(t)}function t(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function n(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}function r(e,t,r){return t&&n(e.prototype,t),r&&n(e,r),Object.defineProperty(e,"prototype",{writable:!1}),e}function o(e,t){return function(){return e.apply(t,arguments)}}var i,s=Object.prototype.toString,a=Object.getPrototypeOf,u=(i=Object.create(null),function(e){var t=s.call(e);return i[t]||(i[t]=t.slice(8,-1).toLowerCase())}),c=function(e){return e=e.toLowerCase(),function(t){return u(t)===e}},f=function(t){return function(n){return e(n)===t}},l=Array.isArray,d=f("undefined");var h=c("ArrayBuffer");var p=f("string"),m=f("function"),v=f("number"),y=function(t){return null!==t&&"object"===e(t)},b=function(e){if("object"!==u(e))return!1;var t=a(e);return!(null!==t&&t!==Object.prototype&&null!==Object.getPrototypeOf(t)||Symbol.toStringTag in e||Symbol.iterator in e)},g=c("Date"),E=c("File"),w=c("Blob"),O=c("FileList"),S=c("URLSearchParams");function R(t,n){var r,o,i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},s=i.allOwnKeys,a=void 0!==s&&s;if(null!=t)if("object"!==e(t)&&(t=[t]),l(t))for(r=0,o=t.length;r<o;r++)n.call(null,t[r],r,t);else{var u,c=a?Object.getOwnPropertyNames(t):Object.keys(t),f=c.length;for(r=0;r<f;r++)u=c[r],n.call(null,t[u],u,t)}}var A,j=(A="undefined"!=typeof Uint8Array&&a(Uint8Array),function(e){return A&&e instanceof A}),T=c("HTMLFormElement"),x=function(e){var t=Object.prototype.hasOwnProperty;return function(e,n){return t.call(e,n)}}(),C=c("RegExp"),N=function(e,t){var n=Object.getOwnPropertyDescriptors(e),r={};R(n,(function(n,o){!1!==t(n,o,e)&&(r[o]=n)})),Object.defineProperties(e,r)},P={isArray:l,isArrayBuffer:h,isBuffer:function(e){return null!==e&&!d(e)&&null!==e.constructor&&!d(e.constructor)&&m(e.constructor.isBuffer)&&e.constructor.isBuffer(e)},isFormData:function(e){var t="[object FormData]";return e&&("function"==typeof FormData&&e instanceof FormData||s.call(e)===t||m(e.toString)&&e.toString()===t)},isArrayBufferView:function(e){return"undefined"!=typeof ArrayBuffer&&ArrayBuffer.isView?ArrayBuffer.isView(e):e&&e.buffer&&h(e.buffer)},isString:p,isNumber:v,isBoolean:function(e){return!0===e||!1===e},isObject:y,isPlainObject:b,isUndefined:d,isDate:g,isFile:E,isBlob:w,isRegExp:C,isFunction:m,isStream:function(e){return y(e)&&m(e.pipe)},isURLSearchParams:S,isTypedArray:j,isFileList:O,forEach:R,merge:function e(){for(var t={},n=function(n,r){b(t[r])&&b(n)?t[r]=e(t[r],n):b(n)?t[r]=e({},n):l(n)?t[r]=n.slice():t[r]=n},r=0,o=arguments.length;r<o;r++)arguments[r]&&R(arguments[r],n);return t},extend:function(e,t,n){var r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{},i=r.allOwnKeys;return R(t,(function(t,r){n&&m(t)?e[r]=o(t,n):e[r]=t}),{allOwnKeys:i}),e},trim:function(e){return e.trim?e.trim():e.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"")},stripBOM:function(e){return 65279===e.charCodeAt(0)&&(e=e.slice(1)),e},inherits:function(e,t,n,r){e.prototype=Object.create(t.prototype,r),e.prototype.constructor=e,Object.defineProperty(e,"super",{value:t.prototype}),n&&Object.assign(e.prototype,n)},toFlatObject:function(e,t,n,r){var o,i,s,u={};if(t=t||{},null==e)return t;do{for(i=(o=Object.getOwnPropertyNames(e)).length;i-- >0;)s=o[i],r&&!r(s,e,t)||u[s]||(t[s]=e[s],u[s]=!0);e=!1!==n&&a(e)}while(e&&(!n||n(e,t))&&e!==Object.prototype);return t},kindOf:u,kindOfTest:c,endsWith:function(e,t,n){e=String(e),(void 0===n||n>e.length)&&(n=e.length),n-=t.length;var r=e.indexOf(t,n);return-1!==r&&r===n},toArray:function(e){if(!e)return null;if(l(e))return e;var t=e.length;if(!v(t))return null;for(var n=new Array(t);t-- >0;)n[t]=e[t];return n},forEachEntry:function(e,t){for(var n,r=(e&&e[Symbol.iterator]).call(e);(n=r.next())&&!n.done;){var o=n.value;t.call(e,o[0],o[1])}},matchAll:function(e,t){for(var n,r=[];null!==(n=e.exec(t));)r.push(n);return r},isHTMLForm:T,hasOwnProperty:x,hasOwnProp:x,reduceDescriptors:N,freezeMethods:function(e){N(e,(function(t,n){var r=e[n];m(r)&&(t.enumerable=!1,"writable"in t?t.writable=!1:t.set||(t.set=function(){throw Error("Can not read-only method '"+n+"'")}))}))},toObjectSet:function(e,t){var n={},r=function(e){e.forEach((function(e){n[e]=!0}))};return l(e)?r(e):r(String(e).split(t)),n},toCamelCase:function(e){return e.toLowerCase().replace(/[_-\s]([a-z\d])(\w*)/g,(function(e,t,n){return t.toUpperCase()+n}))},noop:function(){},toFiniteNumber:function(e,t){return e=+e,Number.isFinite(e)?e:t}};function _(e,t,n,r,o){Error.call(this),Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=(new Error).stack,this.message=e,this.name="AxiosError",t&&(this.code=t),n&&(this.config=n),r&&(this.request=r),o&&(this.response=o)}P.inherits(_,Error,{toJSON:function(){return{message:this.message,name:this.name,description:this.description,number:this.number,fileName:this.fileName,lineNumber:this.lineNumber,columnNumber:this.columnNumber,stack:this.stack,config:this.config,code:this.code,status:this.response&&this.response.status?this.response.status:null}}});var B=_.prototype,D={};["ERR_BAD_OPTION_VALUE","ERR_BAD_OPTION","ECONNABORTED","ETIMEDOUT","ERR_NETWORK","ERR_FR_TOO_MANY_REDIRECTS","ERR_DEPRECATED","ERR_BAD_RESPONSE","ERR_BAD_REQUEST","ERR_CANCELED","ERR_NOT_SUPPORT","ERR_INVALID_URL"].forEach((function(e){D[e]={value:e}})),Object.defineProperties(_,D),Object.defineProperty(B,"isAxiosError",{value:!0}),_.from=function(e,t,n,r,o,i){var s=Object.create(B);return P.toFlatObject(e,s,(function(e){return e!==Error.prototype}),(function(e){return"isAxiosError"!==e})),_.call(s,e.message,t,n,r,o),s.cause=e,s.name=e.name,i&&Object.assign(s,i),s};var F="object"==("undefined"==typeof self?"undefined":e(self))?self.FormData:window.FormData;function U(e){return P.isPlainObject(e)||P.isArray(e)}function k(e){return P.endsWith(e,"[]")?e.slice(0,-2):e}function L(e,t,n){return e?e.concat(t).map((function(e,t){return e=k(e),!n&&t?"["+e+"]":e})).join(n?".":""):t}var z=P.toFlatObject(P,{},null,(function(e){return/^is[A-Z]/.test(e)}));function q(t,n,r){if(!P.isObject(t))throw new TypeError("target must be an object");n=n||new(F||FormData);var o,i=(r=P.toFlatObject(r,{metaTokens:!0,dots:!1,indexes:!1},!1,(function(e,t){return!P.isUndefined(t[e])}))).metaTokens,s=r.visitor||l,a=r.dots,u=r.indexes,c=(r.Blob||"undefined"!=typeof Blob&&Blob)&&((o=n)&&P.isFunction(o.append)&&"FormData"===o[Symbol.toStringTag]&&o[Symbol.iterator]);if(!P.isFunction(s))throw new TypeError("visitor must be a function");function f(e){if(null===e)return"";if(P.isDate(e))return e.toISOString();if(!c&&P.isBlob(e))throw new _("Blob is not supported. Use a Buffer instead.");return P.isArrayBuffer(e)||P.isTypedArray(e)?c&&"function"==typeof Blob?new Blob([e]):Buffer.from(e):e}function l(t,r,o){var s=t;if(t&&!o&&"object"===e(t))if(P.endsWith(r,"{}"))r=i?r:r.slice(0,-2),t=JSON.stringify(t);else if(P.isArray(t)&&function(e){return P.isArray(e)&&!e.some(U)}(t)||P.isFileList(t)||P.endsWith(r,"[]")&&(s=P.toArray(t)))return r=k(r),s.forEach((function(e,t){!P.isUndefined(e)&&null!==e&&n.append(!0===u?L([r],t,a):null===u?r:r+"[]",f(e))})),!1;return!!U(t)||(n.append(L(o,r,a),f(t)),!1)}var d=[],h=Object.assign(z,{defaultVisitor:l,convertValue:f,isVisitable:U});if(!P.isObject(t))throw new TypeError("data must be an object");return function e(t,r){if(!P.isUndefined(t)){if(-1!==d.indexOf(t))throw Error("Circular reference detected in "+r.join("."));d.push(t),P.forEach(t,(function(t,o){!0===(!(P.isUndefined(t)||null===t)&&s.call(n,t,P.isString(o)?o.trim():o,r,h))&&e(t,r?r.concat(o):[o])})),d.pop()}}(t),n}function I(e){var t={"!":"%21","'":"%27","(":"%28",")":"%29","~":"%7E","%20":"+","%00":"\0"};return encodeURIComponent(e).replace(/[!'()~]|%20|%00/g,(function(e){return t[e]}))}function M(e,t){this._pairs=[],e&&q(e,this,t)}var J=M.prototype;function H(e){return encodeURIComponent(e).replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,"+").replace(/%5B/gi,"[").replace(/%5D/gi,"]")}function V(e,t,n){if(!t)return e;var r,o=n&&n.encode||H,i=n&&n.serialize;if(r=i?i(t,n):P.isURLSearchParams(t)?t.toString():new M(t,n).toString(o)){var s=e.indexOf("#");-1!==s&&(e=e.slice(0,s)),e+=(-1===e.indexOf("?")?"?":"&")+r}return e}J.append=function(e,t){this._pairs.push([e,t])},J.toString=function(e){var t=e?function(t){return e.call(this,t,I)}:I;return this._pairs.map((function(e){return t(e[0])+"="+t(e[1])}),"").join("&")};var W,K=function(){function e(){t(this,e),this.handlers=[]}return r(e,[{key:"use",value:function(e,t,n){return this.handlers.push({fulfilled:e,rejected:t,synchronous:!!n&&n.synchronous,runWhen:n?n.runWhen:null}),this.handlers.length-1}},{key:"eject",value:function(e){this.handlers[e]&&(this.handlers[e]=null)}},{key:"clear",value:function(){this.handlers&&(this.handlers=[])}},{key:"forEach",value:function(e){P.forEach(this.handlers,(function(t){null!==t&&e(t)}))}}]),e}(),X={silentJSONParsing:!0,forcedJSONParsing:!0,clarifyTimeoutError:!1},$="undefined"!=typeof URLSearchParams?URLSearchParams:M,Q=FormData,G=("undefined"==typeof navigator||"ReactNative"!==(W=navigator.product)&&"NativeScript"!==W&&"NS"!==W)&&"undefined"!=typeof window&&"undefined"!=typeof document,Y={isBrowser:!0,classes:{URLSearchParams:$,FormData:Q,Blob:Blob},isStandardBrowserEnv:G,protocols:["http","https","file","blob","url","data"]};function Z(e){function t(e,n,r,o){var i=e[o++],s=Number.isFinite(+i),a=o>=e.length;return i=!i&&P.isArray(r)?r.length:i,a?(P.hasOwnProp(r,i)?r[i]=[r[i],n]:r[i]=n,!s):(r[i]&&P.isObject(r[i])||(r[i]=[]),t(e,n,r[i],o)&&P.isArray(r[i])&&(r[i]=function(e){var t,n,r={},o=Object.keys(e),i=o.length;for(t=0;t<i;t++)r[n=o[t]]=e[n];return r}(r[i])),!s)}if(P.isFormData(e)&&P.isFunction(e.entries)){var n={};return P.forEachEntry(e,(function(e,r){t(function(e){return P.matchAll(/\w+|\[(\w*)]/g,e).map((function(e){return"[]"===e[0]?"":e[1]||e[0]}))}(e),r,n,0)})),n}return null}var ee=Y.isStandardBrowserEnv?{write:function(e,t,n,r,o,i){var s=[];s.push(e+"="+encodeURIComponent(t)),P.isNumber(n)&&s.push("expires="+new Date(n).toGMTString()),P.isString(r)&&s.push("path="+r),P.isString(o)&&s.push("domain="+o),!0===i&&s.push("secure"),document.cookie=s.join("; ")},read:function(e){var t=document.cookie.match(new RegExp("(^|;\\s*)("+e+")=([^;]*)"));return t?decodeURIComponent(t[3]):null},remove:function(e){this.write(e,"",Date.now()-864e5)}}:{write:function(){},read:function(){return null},remove:function(){}};function te(e,t){return e&&!/^([a-z][a-z\d+\-.]*:)?\/\//i.test(t)?function(e,t){return t?e.replace(/\/+$/,"")+"/"+t.replace(/^\/+/,""):e}(e,t):t}var ne=Y.isStandardBrowserEnv?function(){var e,t=/(msie|trident)/i.test(navigator.userAgent),n=document.createElement("a");function r(e){var r=e;return t&&(n.setAttribute("href",r),r=n.href),n.setAttribute("href",r),{href:n.href,protocol:n.protocol?n.protocol.replace(/:$/,""):"",host:n.host,search:n.search?n.search.replace(/^\?/,""):"",hash:n.hash?n.hash.replace(/^#/,""):"",hostname:n.hostname,port:n.port,pathname:"/"===n.pathname.charAt(0)?n.pathname:"/"+n.pathname}}return e=r(window.location.href),function(t){var n=P.isString(t)?r(t):t;return n.protocol===e.protocol&&n.host===e.host}}():function(){return!0};function re(e,t,n){_.call(this,null==e?"canceled":e,_.ERR_CANCELED,t,n),this.name="CanceledError"}P.inherits(re,_,{__CANCEL__:!0});var oe=P.toObjectSet(["age","authorization","content-length","content-type","etag","expires","from","host","if-modified-since","if-unmodified-since","last-modified","location","max-forwards","proxy-authorization","referer","retry-after","user-agent"]),ie=Symbol("internals"),se=Symbol("defaults");function ae(e){return e&&String(e).trim().toLowerCase()}function ue(e){return!1===e||null==e?e:P.isArray(e)?e.map(ue):String(e)}function ce(e,t,n,r){return P.isFunction(r)?r.call(this,t,n):P.isString(t)?P.isString(r)?-1!==t.indexOf(r):P.isRegExp(r)?r.test(t):void 0:void 0}function fe(e,t){t=t.toLowerCase();for(var n,r=Object.keys(e),o=r.length;o-- >0;)if(t===(n=r[o]).toLowerCase())return n;return null}function le(e,t){e&&this.set(e),this[se]=t||null}function de(e,t){var n=0,r=function(e,t){e=e||10;var n,r=new Array(e),o=new Array(e),i=0,s=0;return t=void 0!==t?t:1e3,function(a){var u=Date.now(),c=o[s];n||(n=u),r[i]=a,o[i]=u;for(var f=s,l=0;f!==i;)l+=r[f++],f%=e;if((i=(i+1)%e)===s&&(s=(s+1)%e),!(u-n<t)){var d=c&&u-c;return d?Math.round(1e3*l/d):void 0}}}(50,250);return function(o){var i=o.loaded,s=o.lengthComputable?o.total:void 0,a=i-n,u=r(a);n=i;var c={loaded:i,total:s,progress:s?i/s:void 0,bytes:a,rate:u||void 0,estimated:u&&s&&i<=s?(s-i)/u:void 0};c[t?"download":"upload"]=!0,e(c)}}function he(e){return new Promise((function(t,n){var r,o=e.data,i=le.from(e.headers).normalize(),s=e.responseType;function a(){e.cancelToken&&e.cancelToken.unsubscribe(r),e.signal&&e.signal.removeEventListener("abort",r)}P.isFormData(o)&&Y.isStandardBrowserEnv&&i.setContentType(!1);var u=new XMLHttpRequest;if(e.auth){var c=e.auth.username||"",f=e.auth.password?unescape(encodeURIComponent(e.auth.password)):"";i.set("Authorization","Basic "+btoa(c+":"+f))}var l=te(e.baseURL,e.url);function d(){if(u){var r=le.from("getAllResponseHeaders"in u&&u.getAllResponseHeaders());!function(e,t,n){var r=n.config.validateStatus;n.status&&r&&!r(n.status)?t(new _("Request failed with status code "+n.status,[_.ERR_BAD_REQUEST,_.ERR_BAD_RESPONSE][Math.floor(n.status/100)-4],n.config,n.request,n)):e(n)}((function(e){t(e),a()}),(function(e){n(e),a()}),{data:s&&"text"!==s&&"json"!==s?u.response:u.responseText,status:u.status,statusText:u.statusText,headers:r,config:e,request:u}),u=null}}if(u.open(e.method.toUpperCase(),V(l,e.params,e.paramsSerializer),!0),u.timeout=e.timeout,"onloadend"in u?u.onloadend=d:u.onreadystatechange=function(){u&&4===u.readyState&&(0!==u.status||u.responseURL&&0===u.responseURL.indexOf("file:"))&&setTimeout(d)},u.onabort=function(){u&&(n(new _("Request aborted",_.ECONNABORTED,e,u)),u=null)},u.onerror=function(){n(new _("Network Error",_.ERR_NETWORK,e,u)),u=null},u.ontimeout=function(){var t=e.timeout?"timeout of "+e.timeout+"ms exceeded":"timeout exceeded",r=e.transitional||X;e.timeoutErrorMessage&&(t=e.timeoutErrorMessage),n(new _(t,r.clarifyTimeoutError?_.ETIMEDOUT:_.ECONNABORTED,e,u)),u=null},Y.isStandardBrowserEnv){var h=(e.withCredentials||ne(l))&&e.xsrfCookieName&&ee.read(e.xsrfCookieName);h&&i.set(e.xsrfHeaderName,h)}void 0===o&&i.setContentType(null),"setRequestHeader"in u&&P.forEach(i.toJSON(),(function(e,t){u.setRequestHeader(t,e)})),P.isUndefined(e.withCredentials)||(u.withCredentials=!!e.withCredentials),s&&"json"!==s&&(u.responseType=e.responseType),"function"==typeof e.onDownloadProgress&&u.addEventListener("progress",de(e.onDownloadProgress,!0)),"function"==typeof e.onUploadProgress&&u.upload&&u.upload.addEventListener("progress",de(e.onUploadProgress)),(e.cancelToken||e.signal)&&(r=function(t){u&&(n(!t||t.type?new re(null,e,u):t),u.abort(),u=null)},e.cancelToken&&e.cancelToken.subscribe(r),e.signal&&(e.signal.aborted?r():e.signal.addEventListener("abort",r)));var p,m=(p=/^([-+\w]{1,25})(:?\/\/|:)/.exec(l))&&p[1]||"";m&&-1===Y.protocols.indexOf(m)?n(new _("Unsupported protocol "+m+":",_.ERR_BAD_REQUEST,e)):u.send(o||null)}))}Object.assign(le.prototype,{set:function(e,t,n){var r=this;function o(e,t,n){var o=ae(t);if(!o)throw new Error("header name must be a non-empty string");var i=fe(r,o);(!i||!0===n||!1!==r[i]&&!1!==n)&&(r[i||t]=ue(e))}return P.isPlainObject(e)?P.forEach(e,(function(e,n){o(e,n,t)})):o(t,e,n),this},get:function(e,t){if(e=ae(e)){var n=fe(this,e);if(n){var r=this[n];if(!t)return r;if(!0===t)return function(e){for(var t,n=Object.create(null),r=/([^\s,;=]+)\s*(?:=\s*([^,;]+))?/g;t=r.exec(e);)n[t[1]]=t[2];return n}(r);if(P.isFunction(t))return t.call(this,r,n);if(P.isRegExp(t))return t.exec(r);throw new TypeError("parser must be boolean|regexp|function")}}},has:function(e,t){if(e=ae(e)){var n=fe(this,e);return!(!n||t&&!ce(0,this[n],n,t))}return!1},delete:function(e,t){var n=this,r=!1;function o(e){if(e=ae(e)){var o=fe(n,e);!o||t&&!ce(0,n[o],o,t)||(delete n[o],r=!0)}}return P.isArray(e)?e.forEach(o):o(e),r},clear:function(){return Object.keys(this).forEach(this.delete.bind(this))},normalize:function(e){var t=this,n={};return P.forEach(this,(function(r,o){var i=fe(n,o);if(i)return t[i]=ue(r),void delete t[o];var s=e?function(e){return e.trim().toLowerCase().replace(/([a-z\d])(\w*)/g,(function(e,t,n){return t.toUpperCase()+n}))}(o):String(o).trim();s!==o&&delete t[o],t[s]=ue(r),n[s]=!0})),this},toJSON:function(e){var t=Object.create(null);return P.forEach(Object.assign({},this[se]||null,this),(function(n,r){null!=n&&!1!==n&&(t[r]=e&&P.isArray(n)?n.join(", "):n)})),t}}),Object.assign(le,{from:function(e){return P.isString(e)?new this((i={},(t=e)&&t.split("\n").forEach((function(e){o=e.indexOf(":"),n=e.substring(0,o).trim().toLowerCase(),r=e.substring(o+1).trim(),!n||i[n]&&oe[n]||("set-cookie"===n?i[n]?i[n].push(r):i[n]=[r]:i[n]=i[n]?i[n]+", "+r:r)})),i)):e instanceof this?e:new this(e);var t,n,r,o,i},accessor:function(e){var t=(this[ie]=this[ie]={accessors:{}}).accessors,n=this.prototype;function r(e){var r=ae(e);t[r]||(!function(e,t){var n=P.toCamelCase(" "+t);["get","set","has"].forEach((function(r){Object.defineProperty(e,r+n,{value:function(e,n,o){return this[r].call(this,t,e,n,o)},configurable:!0})}))}(n,e),t[r]=!0)}return P.isArray(e)?e.forEach(r):r(e),this}}),le.accessor(["Content-Type","Content-Length","Accept","Accept-Encoding","User-Agent"]),P.freezeMethods(le.prototype),P.freezeMethods(le);var pe={http:he,xhr:he},me=function(e){if(P.isString(e)){var t=pe[e];if(!e)throw Error(P.hasOwnProp(e)?"Adapter '".concat(e,"' is not available in the build"):"Can not resolve adapter '".concat(e,"'"));return t}if(!P.isFunction(e))throw new TypeError("adapter is not a function");return e},ve={"Content-Type":"application/x-www-form-urlencoded"};var ye,be={transitional:X,adapter:("undefined"!=typeof XMLHttpRequest?ye=me("xhr"):"undefined"!=typeof process&&"process"===P.kindOf(process)&&(ye=me("http")),ye),transformRequest:[function(e,t){var n,r=t.getContentType()||"",o=r.indexOf("application/json")>-1,i=P.isObject(e);if(i&&P.isHTMLForm(e)&&(e=new FormData(e)),P.isFormData(e))return o&&o?JSON.stringify(Z(e)):e;if(P.isArrayBuffer(e)||P.isBuffer(e)||P.isStream(e)||P.isFile(e)||P.isBlob(e))return e;if(P.isArrayBufferView(e))return e.buffer;if(P.isURLSearchParams(e))return t.setContentType("application/x-www-form-urlencoded;charset=utf-8",!1),e.toString();if(i){if(r.indexOf("application/x-www-form-urlencoded")>-1)return function(e,t){return q(e,new Y.classes.URLSearchParams,Object.assign({visitor:function(e,t,n,r){return Y.isNode&&P.isBuffer(e)?(this.append(t,e.toString("base64")),!1):r.defaultVisitor.apply(this,arguments)}},t))}(e,this.formSerializer).toString();if((n=P.isFileList(e))||r.indexOf("multipart/form-data")>-1){var s=this.env&&this.env.FormData;return q(n?{"files[]":e}:e,s&&new s,this.formSerializer)}}return i||o?(t.setContentType("application/json",!1),function(e,t,n){if(P.isString(e))try{return(t||JSON.parse)(e),P.trim(e)}catch(e){if("SyntaxError"!==e.name)throw e}return(n||JSON.stringify)(e)}(e)):e}],transformResponse:[function(e){var t=this.transitional||be.transitional,n=t&&t.forcedJSONParsing,r="json"===this.responseType;if(e&&P.isString(e)&&(n&&!this.responseType||r)){var o=!(t&&t.silentJSONParsing)&&r;try{return JSON.parse(e)}catch(e){if(o){if("SyntaxError"===e.name)throw _.from(e,_.ERR_BAD_RESPONSE,this,null,this.response);throw e}}}return e}],timeout:0,xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",maxContentLength:-1,maxBodyLength:-1,env:{FormData:Y.classes.FormData,Blob:Y.classes.Blob},validateStatus:function(e){return e>=200&&e<300},headers:{common:{Accept:"application/json, text/plain, */*"}}};function ge(e,t){var n=this||be,r=t||n,o=le.from(r.headers),i=r.data;return P.forEach(e,(function(e){i=e.call(n,i,o.normalize(),t?t.status:void 0)})),o.normalize(),i}function Ee(e){return!(!e||!e.__CANCEL__)}function we(e){if(e.cancelToken&&e.cancelToken.throwIfRequested(),e.signal&&e.signal.aborted)throw new re}function Oe(e){return we(e),e.headers=le.from(e.headers),e.data=ge.call(e,e.transformRequest),(e.adapter||be.adapter)(e).then((function(t){return we(e),t.data=ge.call(e,e.transformResponse,t),t.headers=le.from(t.headers),t}),(function(t){return Ee(t)||(we(e),t&&t.response&&(t.response.data=ge.call(e,e.transformResponse,t.response),t.response.headers=le.from(t.response.headers))),Promise.reject(t)}))}function Se(e,t){t=t||{};var n={};function r(e,t){return P.isPlainObject(e)&&P.isPlainObject(t)?P.merge(e,t):P.isPlainObject(t)?P.merge({},t):P.isArray(t)?t.slice():t}function o(n){return P.isUndefined(t[n])?P.isUndefined(e[n])?void 0:r(void 0,e[n]):r(e[n],t[n])}function i(e){if(!P.isUndefined(t[e]))return r(void 0,t[e])}function s(n){return P.isUndefined(t[n])?P.isUndefined(e[n])?void 0:r(void 0,e[n]):r(void 0,t[n])}function a(n){return n in t?r(e[n],t[n]):n in e?r(void 0,e[n]):void 0}var u={url:i,method:i,data:i,baseURL:s,transformRequest:s,transformResponse:s,paramsSerializer:s,timeout:s,timeoutMessage:s,withCredentials:s,adapter:s,responseType:s,xsrfCookieName:s,xsrfHeaderName:s,onUploadProgress:s,onDownloadProgress:s,decompress:s,maxContentLength:s,maxBodyLength:s,beforeRedirect:s,transport:s,httpAgent:s,httpsAgent:s,cancelToken:s,socketPath:s,responseEncoding:s,validateStatus:a};return P.forEach(Object.keys(e).concat(Object.keys(t)),(function(e){var t=u[e]||o,r=t(e);P.isUndefined(r)&&t!==a||(n[e]=r)})),n}P.forEach(["delete","get","head"],(function(e){be.headers[e]={}})),P.forEach(["post","put","patch"],(function(e){be.headers[e]=P.merge(ve)}));var Re="1.1.3",Ae={};["object","boolean","number","function","string","symbol"].forEach((function(t,n){Ae[t]=function(r){return e(r)===t||"a"+(n<1?"n ":" ")+t}}));var je={};Ae.transitional=function(e,t,n){function r(e,t){return"[Axios v1.1.3] Transitional option '"+e+"'"+t+(n?". "+n:"")}return function(n,o,i){if(!1===e)throw new _(r(o," has been removed"+(t?" in "+t:"")),_.ERR_DEPRECATED);return t&&!je[o]&&(je[o]=!0,console.warn(r(o," has been deprecated since v"+t+" and will be removed in the near future"))),!e||e(n,o,i)}};var Te={assertOptions:function(t,n,r){if("object"!==e(t))throw new _("options must be an object",_.ERR_BAD_OPTION_VALUE);for(var o=Object.keys(t),i=o.length;i-- >0;){var s=o[i],a=n[s];if(a){var u=t[s],c=void 0===u||a(u,s,t);if(!0!==c)throw new _("option "+s+" must be "+c,_.ERR_BAD_OPTION_VALUE)}else if(!0!==r)throw new _("Unknown option "+s,_.ERR_BAD_OPTION)}},validators:Ae},xe=Te.validators,Ce=function(){function e(n){t(this,e),this.defaults=n,this.interceptors={request:new K,response:new K}}return r(e,[{key:"request",value:function(e,t){"string"==typeof e?(t=t||{}).url=e:t=e||{};var n=t=Se(this.defaults,t),r=n.transitional,o=n.paramsSerializer;void 0!==r&&Te.assertOptions(r,{silentJSONParsing:xe.transitional(xe.boolean),forcedJSONParsing:xe.transitional(xe.boolean),clarifyTimeoutError:xe.transitional(xe.boolean)},!1),void 0!==o&&Te.assertOptions(o,{encode:xe.function,serialize:xe.function},!0),t.method=(t.method||this.defaults.method||"get").toLowerCase();var i=t.headers&&P.merge(t.headers.common,t.headers[t.method]);i&&P.forEach(["delete","get","head","post","put","patch","common"],(function(e){delete t.headers[e]})),t.headers=new le(t.headers,i);var s=[],a=!0;this.interceptors.request.forEach((function(e){"function"==typeof e.runWhen&&!1===e.runWhen(t)||(a=a&&e.synchronous,s.unshift(e.fulfilled,e.rejected))}));var u,c=[];this.interceptors.response.forEach((function(e){c.push(e.fulfilled,e.rejected)}));var f,l=0;if(!a){var d=[Oe.bind(this),void 0];for(d.unshift.apply(d,s),d.push.apply(d,c),f=d.length,u=Promise.resolve(t);l<f;)u=u.then(d[l++],d[l++]);return u}f=s.length;var h=t;for(l=0;l<f;){var p=s[l++],m=s[l++];try{h=p(h)}catch(e){m.call(this,e);break}}try{u=Oe.call(this,h)}catch(e){return Promise.reject(e)}for(l=0,f=c.length;l<f;)u=u.then(c[l++],c[l++]);return u}},{key:"getUri",value:function(e){return V(te((e=Se(this.defaults,e)).baseURL,e.url),e.params,e.paramsSerializer)}}]),e}();P.forEach(["delete","get","head","options"],(function(e){Ce.prototype[e]=function(t,n){return this.request(Se(n||{},{method:e,url:t,data:(n||{}).data}))}})),P.forEach(["post","put","patch"],(function(e){function t(t){return function(n,r,o){return this.request(Se(o||{},{method:e,headers:t?{"Content-Type":"multipart/form-data"}:{},url:n,data:r}))}}Ce.prototype[e]=t(),Ce.prototype[e+"Form"]=t(!0)}));var Ne=function(){function e(n){if(t(this,e),"function"!=typeof n)throw new TypeError("executor must be a function.");var r;this.promise=new Promise((function(e){r=e}));var o=this;this.promise.then((function(e){if(o._listeners){for(var t=o._listeners.length;t-- >0;)o._listeners[t](e);o._listeners=null}})),this.promise.then=function(e){var t,n=new Promise((function(e){o.subscribe(e),t=e})).then(e);return n.cancel=function(){o.unsubscribe(t)},n},n((function(e,t,n){o.reason||(o.reason=new re(e,t,n),r(o.reason))}))}return r(e,[{key:"throwIfRequested",value:function(){if(this.reason)throw this.reason}},{key:"subscribe",value:function(e){this.reason?e(this.reason):this._listeners?this._listeners.push(e):this._listeners=[e]}},{key:"unsubscribe",value:function(e){if(this._listeners){var t=this._listeners.indexOf(e);-1!==t&&this._listeners.splice(t,1)}}}],[{key:"source",value:function(){var t;return{token:new e((function(e){t=e})),cancel:t}}}]),e}();var Pe=function e(t){var n=new Ce(t),r=o(Ce.prototype.request,n);return P.extend(r,Ce.prototype,n,{allOwnKeys:!0}),P.extend(r,n,null,{allOwnKeys:!0}),r.create=function(n){return e(Se(t,n))},r}(be);return Pe.Axios=Ce,Pe.CanceledError=re,Pe.CancelToken=Ne,Pe.isCancel=Ee,Pe.VERSION=Re,Pe.toFormData=q,Pe.AxiosError=_,Pe.Cancel=Pe.CanceledError,Pe.all=function(e){return Promise.all(e)},Pe.spread=function(e){return function(t){return e.apply(null,t)}},Pe.isAxiosError=function(e){return P.isObject(e)&&!0===e.isAxiosError},Pe.formToJSON=function(e){return Z(P.isHTMLForm(e)?new FormData(e):e)},Pe}));
+//# sourceMappingURL=axios.min.js.map
diff --git a/node_modules/axios/dist/axios.min.js.map b/node_modules/axios/dist/axios.min.js.map
new file mode 100644
index 0000000..463582d
--- /dev/null
+++ b/node_modules/axios/dist/axios.min.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"axios.min.js","sources":["../lib/helpers/bind.js","../lib/utils.js","../lib/core/AxiosError.js","../node_modules/form-data/lib/browser.js","../lib/helpers/toFormData.js","../lib/helpers/AxiosURLSearchParams.js","../lib/helpers/buildURL.js","../lib/core/InterceptorManager.js","../lib/platform/browser/index.js","../lib/defaults/transitional.js","../lib/platform/browser/classes/URLSearchParams.js","../lib/platform/browser/classes/FormData.js","../lib/helpers/formDataToJSON.js","../lib/helpers/cookies.js","../lib/core/buildFullPath.js","../lib/helpers/isAbsoluteURL.js","../lib/helpers/combineURLs.js","../lib/helpers/isURLSameOrigin.js","../lib/cancel/CanceledError.js","../lib/helpers/parseHeaders.js","../lib/core/AxiosHeaders.js","../lib/adapters/xhr.js","../lib/helpers/speedometer.js","../lib/core/settle.js","../lib/helpers/parseProtocol.js","../lib/adapters/index.js","../lib/defaults/index.js","../lib/helpers/toURLEncodedForm.js","../lib/core/transformData.js","../lib/cancel/isCancel.js","../lib/core/dispatchRequest.js","../lib/core/mergeConfig.js","../lib/env/data.js","../lib/helpers/validator.js","../lib/core/Axios.js","../lib/cancel/CancelToken.js","../lib/axios.js","../lib/helpers/spread.js","../lib/helpers/isAxiosError.js"],"sourcesContent":["'use strict';\n\nexport default function bind(fn, thisArg) {\n return function wrap() {\n return fn.apply(thisArg, arguments);\n };\n}\n","'use strict';\n\nimport bind from './helpers/bind.js';\n\n// utils is a library of generic helper functions non-specific to axios\n\nconst {toString} = Object.prototype;\nconst {getPrototypeOf} = Object;\n\nconst kindOf = (cache => thing => {\n const str = toString.call(thing);\n return cache[str] || (cache[str] = str.slice(8, -1).toLowerCase());\n})(Object.create(null));\n\nconst kindOfTest = (type) => {\n type = type.toLowerCase();\n return (thing) => kindOf(thing) === type\n}\n\nconst typeOfTest = type => thing => typeof thing === type;\n\n/**\n * Determine if a value is an Array\n *\n * @param {Object} val The value to test\n *\n * @returns {boolean} True if value is an Array, otherwise false\n */\nconst {isArray} = Array;\n\n/**\n * Determine if a value is undefined\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if the value is undefined, otherwise false\n */\nconst isUndefined = typeOfTest('undefined');\n\n/**\n * Determine if a value is a Buffer\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Buffer, otherwise false\n */\nfunction isBuffer(val) {\n return val !== null && !isUndefined(val) && val.constructor !== null && !isUndefined(val.constructor)\n && isFunction(val.constructor.isBuffer) && val.constructor.isBuffer(val);\n}\n\n/**\n * Determine if a value is an ArrayBuffer\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is an ArrayBuffer, otherwise false\n */\nconst isArrayBuffer = kindOfTest('ArrayBuffer');\n\n\n/**\n * Determine if a value is a view on an ArrayBuffer\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a view on an ArrayBuffer, otherwise false\n */\nfunction isArrayBufferView(val) {\n let result;\n if ((typeof ArrayBuffer !== 'undefined') && (ArrayBuffer.isView)) {\n result = ArrayBuffer.isView(val);\n } else {\n result = (val) && (val.buffer) && (isArrayBuffer(val.buffer));\n }\n return result;\n}\n\n/**\n * Determine if a value is a String\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a String, otherwise false\n */\nconst isString = typeOfTest('string');\n\n/**\n * Determine if a value is a Function\n *\n * @param {*} val The value to test\n * @returns {boolean} True if value is a Function, otherwise false\n */\nconst isFunction = typeOfTest('function');\n\n/**\n * Determine if a value is a Number\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Number, otherwise false\n */\nconst isNumber = typeOfTest('number');\n\n/**\n * Determine if a value is an Object\n *\n * @param {*} thing The value to test\n *\n * @returns {boolean} True if value is an Object, otherwise false\n */\nconst isObject = (thing) => thing !== null && typeof thing === 'object';\n\n/**\n * Determine if a value is a Boolean\n *\n * @param {*} thing The value to test\n * @returns {boolean} True if value is a Boolean, otherwise false\n */\nconst isBoolean = thing => thing === true || thing === false;\n\n/**\n * Determine if a value is a plain Object\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a plain Object, otherwise false\n */\nconst isPlainObject = (val) => {\n if (kindOf(val) !== 'object') {\n return false;\n }\n\n const prototype = getPrototypeOf(val);\n return (prototype === null || prototype === Object.prototype || Object.getPrototypeOf(prototype) === null) && !(Symbol.toStringTag in val) && !(Symbol.iterator in val);\n}\n\n/**\n * Determine if a value is a Date\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Date, otherwise false\n */\nconst isDate = kindOfTest('Date');\n\n/**\n * Determine if a value is a File\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a File, otherwise false\n */\nconst isFile = kindOfTest('File');\n\n/**\n * Determine if a value is a Blob\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Blob, otherwise false\n */\nconst isBlob = kindOfTest('Blob');\n\n/**\n * Determine if a value is a FileList\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a File, otherwise false\n */\nconst isFileList = kindOfTest('FileList');\n\n/**\n * Determine if a value is a Stream\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Stream, otherwise false\n */\nconst isStream = (val) => isObject(val) && isFunction(val.pipe);\n\n/**\n * Determine if a value is a FormData\n *\n * @param {*} thing The value to test\n *\n * @returns {boolean} True if value is an FormData, otherwise false\n */\nconst isFormData = (thing) => {\n const pattern = '[object FormData]';\n return thing && (\n (typeof FormData === 'function' && thing instanceof FormData) ||\n toString.call(thing) === pattern ||\n (isFunction(thing.toString) && thing.toString() === pattern)\n );\n}\n\n/**\n * Determine if a value is a URLSearchParams object\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a URLSearchParams object, otherwise false\n */\nconst isURLSearchParams = kindOfTest('URLSearchParams');\n\n/**\n * Trim excess whitespace off the beginning and end of a string\n *\n * @param {String} str The String to trim\n *\n * @returns {String} The String freed of excess whitespace\n */\nconst trim = (str) => str.trim ?\n str.trim() : str.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n\n/**\n * Iterate over an Array or an Object invoking a function for each item.\n *\n * If `obj` is an Array callback will be called passing\n * the value, index, and complete array for each item.\n *\n * If 'obj' is an Object callback will be called passing\n * the value, key, and complete object for each property.\n *\n * @param {Object|Array} obj The object to iterate\n * @param {Function} fn The callback to invoke for each item\n *\n * @param {Boolean} [allOwnKeys = false]\n * @returns {void}\n */\nfunction forEach(obj, fn, {allOwnKeys = false} = {}) {\n // Don't bother if no value provided\n if (obj === null || typeof obj === 'undefined') {\n return;\n }\n\n let i;\n let l;\n\n // Force an array if not already something iterable\n if (typeof obj !== 'object') {\n /*eslint no-param-reassign:0*/\n obj = [obj];\n }\n\n if (isArray(obj)) {\n // Iterate over array values\n for (i = 0, l = obj.length; i < l; i++) {\n fn.call(null, obj[i], i, obj);\n }\n } else {\n // Iterate over object keys\n const keys = allOwnKeys ? Object.getOwnPropertyNames(obj) : Object.keys(obj);\n const len = keys.length;\n let key;\n\n for (i = 0; i < len; i++) {\n key = keys[i];\n fn.call(null, obj[key], key, obj);\n }\n }\n}\n\n/**\n * Accepts varargs expecting each argument to be an object, then\n * immutably merges the properties of each object and returns result.\n *\n * When multiple objects contain the same key the later object in\n * the arguments list will take precedence.\n *\n * Example:\n *\n * ```js\n * var result = merge({foo: 123}, {foo: 456});\n * console.log(result.foo); // outputs 456\n * ```\n *\n * @param {Object} obj1 Object to merge\n *\n * @returns {Object} Result of all merge properties\n */\nfunction merge(/* obj1, obj2, obj3, ... */) {\n const result = {};\n const assignValue = (val, key) => {\n if (isPlainObject(result[key]) && isPlainObject(val)) {\n result[key] = merge(result[key], val);\n } else if (isPlainObject(val)) {\n result[key] = merge({}, val);\n } else if (isArray(val)) {\n result[key] = val.slice();\n } else {\n result[key] = val;\n }\n }\n\n for (let i = 0, l = arguments.length; i < l; i++) {\n arguments[i] && forEach(arguments[i], assignValue);\n }\n return result;\n}\n\n/**\n * Extends object a by mutably adding to it the properties of object b.\n *\n * @param {Object} a The object to be extended\n * @param {Object} b The object to copy properties from\n * @param {Object} thisArg The object to bind function to\n *\n * @param {Boolean} [allOwnKeys]\n * @returns {Object} The resulting value of object a\n */\nconst extend = (a, b, thisArg, {allOwnKeys}= {}) => {\n forEach(b, (val, key) => {\n if (thisArg && isFunction(val)) {\n a[key] = bind(val, thisArg);\n } else {\n a[key] = val;\n }\n }, {allOwnKeys});\n return a;\n}\n\n/**\n * Remove byte order marker. This catches EF BB BF (the UTF-8 BOM)\n *\n * @param {string} content with BOM\n *\n * @returns {string} content value without BOM\n */\nconst stripBOM = (content) => {\n if (content.charCodeAt(0) === 0xFEFF) {\n content = content.slice(1);\n }\n return content;\n}\n\n/**\n * Inherit the prototype methods from one constructor into another\n * @param {function} constructor\n * @param {function} superConstructor\n * @param {object} [props]\n * @param {object} [descriptors]\n *\n * @returns {void}\n */\nconst inherits = (constructor, superConstructor, props, descriptors) => {\n constructor.prototype = Object.create(superConstructor.prototype, descriptors);\n constructor.prototype.constructor = constructor;\n Object.defineProperty(constructor, 'super', {\n value: superConstructor.prototype\n });\n props && Object.assign(constructor.prototype, props);\n}\n\n/**\n * Resolve object with deep prototype chain to a flat object\n * @param {Object} sourceObj source object\n * @param {Object} [destObj]\n * @param {Function|Boolean} [filter]\n * @param {Function} [propFilter]\n *\n * @returns {Object}\n */\nconst toFlatObject = (sourceObj, destObj, filter, propFilter) => {\n let props;\n let i;\n let prop;\n const merged = {};\n\n destObj = destObj || {};\n // eslint-disable-next-line no-eq-null,eqeqeq\n if (sourceObj == null) return destObj;\n\n do {\n props = Object.getOwnPropertyNames(sourceObj);\n i = props.length;\n while (i-- > 0) {\n prop = props[i];\n if ((!propFilter || propFilter(prop, sourceObj, destObj)) && !merged[prop]) {\n destObj[prop] = sourceObj[prop];\n merged[prop] = true;\n }\n }\n sourceObj = filter !== false && getPrototypeOf(sourceObj);\n } while (sourceObj && (!filter || filter(sourceObj, destObj)) && sourceObj !== Object.prototype);\n\n return destObj;\n}\n\n/**\n * Determines whether a string ends with the characters of a specified string\n *\n * @param {String} str\n * @param {String} searchString\n * @param {Number} [position= 0]\n *\n * @returns {boolean}\n */\nconst endsWith = (str, searchString, position) => {\n str = String(str);\n if (position === undefined || position > str.length) {\n position = str.length;\n }\n position -= searchString.length;\n const lastIndex = str.indexOf(searchString, position);\n return lastIndex !== -1 && lastIndex === position;\n}\n\n\n/**\n * Returns new array from array like object or null if failed\n *\n * @param {*} [thing]\n *\n * @returns {?Array}\n */\nconst toArray = (thing) => {\n if (!thing) return null;\n if (isArray(thing)) return thing;\n let i = thing.length;\n if (!isNumber(i)) return null;\n const arr = new Array(i);\n while (i-- > 0) {\n arr[i] = thing[i];\n }\n return arr;\n}\n\n/**\n * Checking if the Uint8Array exists and if it does, it returns a function that checks if the\n * thing passed in is an instance of Uint8Array\n *\n * @param {TypedArray}\n *\n * @returns {Array}\n */\n// eslint-disable-next-line func-names\nconst isTypedArray = (TypedArray => {\n // eslint-disable-next-line func-names\n return thing => {\n return TypedArray && thing instanceof TypedArray;\n };\n})(typeof Uint8Array !== 'undefined' && getPrototypeOf(Uint8Array));\n\n/**\n * For each entry in the object, call the function with the key and value.\n *\n * @param {Object<any, any>} obj - The object to iterate over.\n * @param {Function} fn - The function to call for each entry.\n *\n * @returns {void}\n */\nconst forEachEntry = (obj, fn) => {\n const generator = obj && obj[Symbol.iterator];\n\n const iterator = generator.call(obj);\n\n let result;\n\n while ((result = iterator.next()) && !result.done) {\n const pair = result.value;\n fn.call(obj, pair[0], pair[1]);\n }\n}\n\n/**\n * It takes a regular expression and a string, and returns an array of all the matches\n *\n * @param {string} regExp - The regular expression to match against.\n * @param {string} str - The string to search.\n *\n * @returns {Array<boolean>}\n */\nconst matchAll = (regExp, str) => {\n let matches;\n const arr = [];\n\n while ((matches = regExp.exec(str)) !== null) {\n arr.push(matches);\n }\n\n return arr;\n}\n\n/* Checking if the kindOfTest function returns true when passed an HTMLFormElement. */\nconst isHTMLForm = kindOfTest('HTMLFormElement');\n\nconst toCamelCase = str => {\n return str.toLowerCase().replace(/[_-\\s]([a-z\\d])(\\w*)/g,\n function replacer(m, p1, p2) {\n return p1.toUpperCase() + p2;\n }\n );\n};\n\n/* Creating a function that will check if an object has a property. */\nconst hasOwnProperty = (({hasOwnProperty}) => (obj, prop) => hasOwnProperty.call(obj, prop))(Object.prototype);\n\n/**\n * Determine if a value is a RegExp object\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a RegExp object, otherwise false\n */\nconst isRegExp = kindOfTest('RegExp');\n\nconst reduceDescriptors = (obj, reducer) => {\n const descriptors = Object.getOwnPropertyDescriptors(obj);\n const reducedDescriptors = {};\n\n forEach(descriptors, (descriptor, name) => {\n if (reducer(descriptor, name, obj) !== false) {\n reducedDescriptors[name] = descriptor;\n }\n });\n\n Object.defineProperties(obj, reducedDescriptors);\n}\n\n/**\n * Makes all methods read-only\n * @param {Object} obj\n */\n\nconst freezeMethods = (obj) => {\n reduceDescriptors(obj, (descriptor, name) => {\n const value = obj[name];\n\n if (!isFunction(value)) return;\n\n descriptor.enumerable = false;\n\n if ('writable' in descriptor) {\n descriptor.writable = false;\n return;\n }\n\n if (!descriptor.set) {\n descriptor.set = () => {\n throw Error('Can not read-only method \\'' + name + '\\'');\n };\n }\n });\n}\n\nconst toObjectSet = (arrayOrString, delimiter) => {\n const obj = {};\n\n const define = (arr) => {\n arr.forEach(value => {\n obj[value] = true;\n });\n }\n\n isArray(arrayOrString) ? define(arrayOrString) : define(String(arrayOrString).split(delimiter));\n\n return obj;\n}\n\nconst noop = () => {}\n\nconst toFiniteNumber = (value, defaultValue) => {\n value = +value;\n return Number.isFinite(value) ? value : defaultValue;\n}\n\nexport default {\n isArray,\n isArrayBuffer,\n isBuffer,\n isFormData,\n isArrayBufferView,\n isString,\n isNumber,\n isBoolean,\n isObject,\n isPlainObject,\n isUndefined,\n isDate,\n isFile,\n isBlob,\n isRegExp,\n isFunction,\n isStream,\n isURLSearchParams,\n isTypedArray,\n isFileList,\n forEach,\n merge,\n extend,\n trim,\n stripBOM,\n inherits,\n toFlatObject,\n kindOf,\n kindOfTest,\n endsWith,\n toArray,\n forEachEntry,\n matchAll,\n isHTMLForm,\n hasOwnProperty,\n hasOwnProp: hasOwnProperty, // an alias to avoid ESLint no-prototype-builtins detection\n reduceDescriptors,\n freezeMethods,\n toObjectSet,\n toCamelCase,\n noop,\n toFiniteNumber\n};\n","'use strict';\n\nimport utils from '../utils.js';\n\n/**\n * Create an Error with the specified message, config, error code, request and response.\n *\n * @param {string} message The error message.\n * @param {string} [code] The error code (for example, 'ECONNABORTED').\n * @param {Object} [config] The config.\n * @param {Object} [request] The request.\n * @param {Object} [response] The response.\n *\n * @returns {Error} The created error.\n */\nfunction AxiosError(message, code, config, request, response) {\n Error.call(this);\n\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, this.constructor);\n } else {\n this.stack = (new Error()).stack;\n }\n\n this.message = message;\n this.name = 'AxiosError';\n code && (this.code = code);\n config && (this.config = config);\n request && (this.request = request);\n response && (this.response = response);\n}\n\nutils.inherits(AxiosError, Error, {\n toJSON: function toJSON() {\n return {\n // Standard\n message: this.message,\n name: this.name,\n // Microsoft\n description: this.description,\n number: this.number,\n // Mozilla\n fileName: this.fileName,\n lineNumber: this.lineNumber,\n columnNumber: this.columnNumber,\n stack: this.stack,\n // Axios\n config: this.config,\n code: this.code,\n status: this.response && this.response.status ? this.response.status : null\n };\n }\n});\n\nconst prototype = AxiosError.prototype;\nconst descriptors = {};\n\n[\n 'ERR_BAD_OPTION_VALUE',\n 'ERR_BAD_OPTION',\n 'ECONNABORTED',\n 'ETIMEDOUT',\n 'ERR_NETWORK',\n 'ERR_FR_TOO_MANY_REDIRECTS',\n 'ERR_DEPRECATED',\n 'ERR_BAD_RESPONSE',\n 'ERR_BAD_REQUEST',\n 'ERR_CANCELED',\n 'ERR_NOT_SUPPORT',\n 'ERR_INVALID_URL'\n// eslint-disable-next-line func-names\n].forEach(code => {\n descriptors[code] = {value: code};\n});\n\nObject.defineProperties(AxiosError, descriptors);\nObject.defineProperty(prototype, 'isAxiosError', {value: true});\n\n// eslint-disable-next-line func-names\nAxiosError.from = (error, code, config, request, response, customProps) => {\n const axiosError = Object.create(prototype);\n\n utils.toFlatObject(error, axiosError, function filter(obj) {\n return obj !== Error.prototype;\n }, prop => {\n return prop !== 'isAxiosError';\n });\n\n AxiosError.call(axiosError, error.message, code, config, request, response);\n\n axiosError.cause = error;\n\n axiosError.name = error.name;\n\n customProps && Object.assign(axiosError, customProps);\n\n return axiosError;\n};\n\nexport default AxiosError;\n","/* eslint-env browser */\nmodule.exports = typeof self == 'object' ? self.FormData : window.FormData;\n","'use strict';\n\nimport utils from '../utils.js';\nimport AxiosError from '../core/AxiosError.js';\nimport envFormData from '../env/classes/FormData.js';\n\n/**\n * Determines if the given thing is a array or js object.\n *\n * @param {string} thing - The object or array to be visited.\n *\n * @returns {boolean}\n */\nfunction isVisitable(thing) {\n return utils.isPlainObject(thing) || utils.isArray(thing);\n}\n\n/**\n * It removes the brackets from the end of a string\n *\n * @param {string} key - The key of the parameter.\n *\n * @returns {string} the key without the brackets.\n */\nfunction removeBrackets(key) {\n return utils.endsWith(key, '[]') ? key.slice(0, -2) : key;\n}\n\n/**\n * It takes a path, a key, and a boolean, and returns a string\n *\n * @param {string} path - The path to the current key.\n * @param {string} key - The key of the current object being iterated over.\n * @param {string} dots - If true, the key will be rendered with dots instead of brackets.\n *\n * @returns {string} The path to the current key.\n */\nfunction renderKey(path, key, dots) {\n if (!path) return key;\n return path.concat(key).map(function each(token, i) {\n // eslint-disable-next-line no-param-reassign\n token = removeBrackets(token);\n return !dots && i ? '[' + token + ']' : token;\n }).join(dots ? '.' : '');\n}\n\n/**\n * If the array is an array and none of its elements are visitable, then it's a flat array.\n *\n * @param {Array<any>} arr - The array to check\n *\n * @returns {boolean}\n */\nfunction isFlatArray(arr) {\n return utils.isArray(arr) && !arr.some(isVisitable);\n}\n\nconst predicates = utils.toFlatObject(utils, {}, null, function filter(prop) {\n return /^is[A-Z]/.test(prop);\n});\n\n/**\n * If the thing is a FormData object, return true, otherwise return false.\n *\n * @param {unknown} thing - The thing to check.\n *\n * @returns {boolean}\n */\nfunction isSpecCompliant(thing) {\n return thing && utils.isFunction(thing.append) && thing[Symbol.toStringTag] === 'FormData' && thing[Symbol.iterator];\n}\n\n/**\n * Convert a data object to FormData\n *\n * @param {Object} obj\n * @param {?Object} [formData]\n * @param {?Object} [options]\n * @param {Function} [options.visitor]\n * @param {Boolean} [options.metaTokens = true]\n * @param {Boolean} [options.dots = false]\n * @param {?Boolean} [options.indexes = false]\n *\n * @returns {Object}\n **/\n\n/**\n * It converts an object into a FormData object\n *\n * @param {Object<any, any>} obj - The object to convert to form data.\n * @param {string} formData - The FormData object to append to.\n * @param {Object<string, any>} options\n *\n * @returns\n */\nfunction toFormData(obj, formData, options) {\n if (!utils.isObject(obj)) {\n throw new TypeError('target must be an object');\n }\n\n // eslint-disable-next-line no-param-reassign\n formData = formData || new (envFormData || FormData)();\n\n // eslint-disable-next-line no-param-reassign\n options = utils.toFlatObject(options, {\n metaTokens: true,\n dots: false,\n indexes: false\n }, false, function defined(option, source) {\n // eslint-disable-next-line no-eq-null,eqeqeq\n return !utils.isUndefined(source[option]);\n });\n\n const metaTokens = options.metaTokens;\n // eslint-disable-next-line no-use-before-define\n const visitor = options.visitor || defaultVisitor;\n const dots = options.dots;\n const indexes = options.indexes;\n const _Blob = options.Blob || typeof Blob !== 'undefined' && Blob;\n const useBlob = _Blob && isSpecCompliant(formData);\n\n if (!utils.isFunction(visitor)) {\n throw new TypeError('visitor must be a function');\n }\n\n function convertValue(value) {\n if (value === null) return '';\n\n if (utils.isDate(value)) {\n return value.toISOString();\n }\n\n if (!useBlob && utils.isBlob(value)) {\n throw new AxiosError('Blob is not supported. Use a Buffer instead.');\n }\n\n if (utils.isArrayBuffer(value) || utils.isTypedArray(value)) {\n return useBlob && typeof Blob === 'function' ? new Blob([value]) : Buffer.from(value);\n }\n\n return value;\n }\n\n /**\n * Default visitor.\n *\n * @param {*} value\n * @param {String|Number} key\n * @param {Array<String|Number>} path\n * @this {FormData}\n *\n * @returns {boolean} return true to visit the each prop of the value recursively\n */\n function defaultVisitor(value, key, path) {\n let arr = value;\n\n if (value && !path && typeof value === 'object') {\n if (utils.endsWith(key, '{}')) {\n // eslint-disable-next-line no-param-reassign\n key = metaTokens ? key : key.slice(0, -2);\n // eslint-disable-next-line no-param-reassign\n value = JSON.stringify(value);\n } else if (\n (utils.isArray(value) && isFlatArray(value)) ||\n (utils.isFileList(value) || utils.endsWith(key, '[]') && (arr = utils.toArray(value))\n )) {\n // eslint-disable-next-line no-param-reassign\n key = removeBrackets(key);\n\n arr.forEach(function each(el, index) {\n !(utils.isUndefined(el) || el === null) && formData.append(\n // eslint-disable-next-line no-nested-ternary\n indexes === true ? renderKey([key], index, dots) : (indexes === null ? key : key + '[]'),\n convertValue(el)\n );\n });\n return false;\n }\n }\n\n if (isVisitable(value)) {\n return true;\n }\n\n formData.append(renderKey(path, key, dots), convertValue(value));\n\n return false;\n }\n\n const stack = [];\n\n const exposedHelpers = Object.assign(predicates, {\n defaultVisitor,\n convertValue,\n isVisitable\n });\n\n function build(value, path) {\n if (utils.isUndefined(value)) return;\n\n if (stack.indexOf(value) !== -1) {\n throw Error('Circular reference detected in ' + path.join('.'));\n }\n\n stack.push(value);\n\n utils.forEach(value, function each(el, key) {\n const result = !(utils.isUndefined(el) || el === null) && visitor.call(\n formData, el, utils.isString(key) ? key.trim() : key, path, exposedHelpers\n );\n\n if (result === true) {\n build(el, path ? path.concat(key) : [key]);\n }\n });\n\n stack.pop();\n }\n\n if (!utils.isObject(obj)) {\n throw new TypeError('data must be an object');\n }\n\n build(obj);\n\n return formData;\n}\n\nexport default toFormData;\n","'use strict';\n\nimport toFormData from './toFormData.js';\n\n/**\n * It encodes a string by replacing all characters that are not in the unreserved set with\n * their percent-encoded equivalents\n *\n * @param {string} str - The string to encode.\n *\n * @returns {string} The encoded string.\n */\nfunction encode(str) {\n const charMap = {\n '!': '%21',\n \"'\": '%27',\n '(': '%28',\n ')': '%29',\n '~': '%7E',\n '%20': '+',\n '%00': '\\x00'\n };\n return encodeURIComponent(str).replace(/[!'()~]|%20|%00/g, function replacer(match) {\n return charMap[match];\n });\n}\n\n/**\n * It takes a params object and converts it to a FormData object\n *\n * @param {Object<string, any>} params - The parameters to be converted to a FormData object.\n * @param {Object<string, any>} options - The options object passed to the Axios constructor.\n *\n * @returns {void}\n */\nfunction AxiosURLSearchParams(params, options) {\n this._pairs = [];\n\n params && toFormData(params, this, options);\n}\n\nconst prototype = AxiosURLSearchParams.prototype;\n\nprototype.append = function append(name, value) {\n this._pairs.push([name, value]);\n};\n\nprototype.toString = function toString(encoder) {\n const _encode = encoder ? function(value) {\n return encoder.call(this, value, encode);\n } : encode;\n\n return this._pairs.map(function each(pair) {\n return _encode(pair[0]) + '=' + _encode(pair[1]);\n }, '').join('&');\n};\n\nexport default AxiosURLSearchParams;\n","'use strict';\n\nimport utils from '../utils.js';\nimport AxiosURLSearchParams from '../helpers/AxiosURLSearchParams.js';\n\n/**\n * It replaces all instances of the characters `:`, `$`, `,`, `+`, `[`, and `]` with their\n * URI encoded counterparts\n *\n * @param {string} val The value to be encoded.\n *\n * @returns {string} The encoded value.\n */\nfunction encode(val) {\n return encodeURIComponent(val).\n replace(/%3A/gi, ':').\n replace(/%24/g, '$').\n replace(/%2C/gi, ',').\n replace(/%20/g, '+').\n replace(/%5B/gi, '[').\n replace(/%5D/gi, ']');\n}\n\n/**\n * Build a URL by appending params to the end\n *\n * @param {string} url The base of the url (e.g., http://www.google.com)\n * @param {object} [params] The params to be appended\n * @param {?object} options\n *\n * @returns {string} The formatted url\n */\nexport default function buildURL(url, params, options) {\n /*eslint no-param-reassign:0*/\n if (!params) {\n return url;\n }\n \n const _encode = options && options.encode || encode;\n\n const serializeFn = options && options.serialize;\n\n let serializedParams;\n\n if (serializeFn) {\n serializedParams = serializeFn(params, options);\n } else {\n serializedParams = utils.isURLSearchParams(params) ?\n params.toString() :\n new AxiosURLSearchParams(params, options).toString(_encode);\n }\n\n if (serializedParams) {\n const hashmarkIndex = url.indexOf(\"#\");\n\n if (hashmarkIndex !== -1) {\n url = url.slice(0, hashmarkIndex);\n }\n url += (url.indexOf('?') === -1 ? '?' : '&') + serializedParams;\n }\n\n return url;\n}\n","'use strict';\n\nimport utils from './../utils.js';\n\nclass InterceptorManager {\n constructor() {\n this.handlers = [];\n }\n\n /**\n * Add a new interceptor to the stack\n *\n * @param {Function} fulfilled The function to handle `then` for a `Promise`\n * @param {Function} rejected The function to handle `reject` for a `Promise`\n *\n * @return {Number} An ID used to remove interceptor later\n */\n use(fulfilled, rejected, options) {\n this.handlers.push({\n fulfilled,\n rejected,\n synchronous: options ? options.synchronous : false,\n runWhen: options ? options.runWhen : null\n });\n return this.handlers.length - 1;\n }\n\n /**\n * Remove an interceptor from the stack\n *\n * @param {Number} id The ID that was returned by `use`\n *\n * @returns {Boolean} `true` if the interceptor was removed, `false` otherwise\n */\n eject(id) {\n if (this.handlers[id]) {\n this.handlers[id] = null;\n }\n }\n\n /**\n * Clear all interceptors from the stack\n *\n * @returns {void}\n */\n clear() {\n if (this.handlers) {\n this.handlers = [];\n }\n }\n\n /**\n * Iterate over all the registered interceptors\n *\n * This method is particularly useful for skipping over any\n * interceptors that may have become `null` calling `eject`.\n *\n * @param {Function} fn The function to call for each interceptor\n *\n * @returns {void}\n */\n forEach(fn) {\n utils.forEach(this.handlers, function forEachHandler(h) {\n if (h !== null) {\n fn(h);\n }\n });\n }\n}\n\nexport default InterceptorManager;\n","import URLSearchParams from './classes/URLSearchParams.js'\nimport FormData from './classes/FormData.js'\n\n/**\n * Determine if we're running in a standard browser environment\n *\n * This allows axios to run in a web worker, and react-native.\n * Both environments support XMLHttpRequest, but not fully standard globals.\n *\n * web workers:\n * typeof window -> undefined\n * typeof document -> undefined\n *\n * react-native:\n * navigator.product -> 'ReactNative'\n * nativescript\n * navigator.product -> 'NativeScript' or 'NS'\n *\n * @returns {boolean}\n */\nconst isStandardBrowserEnv = (() => {\n let product;\n if (typeof navigator !== 'undefined' && (\n (product = navigator.product) === 'ReactNative' ||\n product === 'NativeScript' ||\n product === 'NS')\n ) {\n return false;\n }\n\n return typeof window !== 'undefined' && typeof document !== 'undefined';\n})();\n\nexport default {\n isBrowser: true,\n classes: {\n URLSearchParams,\n FormData,\n Blob\n },\n isStandardBrowserEnv,\n protocols: ['http', 'https', 'file', 'blob', 'url', 'data']\n};\n","'use strict';\n\nexport default {\n silentJSONParsing: true,\n forcedJSONParsing: true,\n clarifyTimeoutError: false\n};\n","'use strict';\n\nimport AxiosURLSearchParams from '../../../helpers/AxiosURLSearchParams.js';\nexport default typeof URLSearchParams !== 'undefined' ? URLSearchParams : AxiosURLSearchParams;\n","'use strict';\n\nexport default FormData;\n","'use strict';\n\nimport utils from '../utils.js';\n\n/**\n * It takes a string like `foo[x][y][z]` and returns an array like `['foo', 'x', 'y', 'z']\n *\n * @param {string} name - The name of the property to get.\n *\n * @returns An array of strings.\n */\nfunction parsePropPath(name) {\n // foo[x][y][z]\n // foo.x.y.z\n // foo-x-y-z\n // foo x y z\n return utils.matchAll(/\\w+|\\[(\\w*)]/g, name).map(match => {\n return match[0] === '[]' ? '' : match[1] || match[0];\n });\n}\n\n/**\n * Convert an array to an object.\n *\n * @param {Array<any>} arr - The array to convert to an object.\n *\n * @returns An object with the same keys and values as the array.\n */\nfunction arrayToObject(arr) {\n const obj = {};\n const keys = Object.keys(arr);\n let i;\n const len = keys.length;\n let key;\n for (i = 0; i < len; i++) {\n key = keys[i];\n obj[key] = arr[key];\n }\n return obj;\n}\n\n/**\n * It takes a FormData object and returns a JavaScript object\n *\n * @param {string} formData The FormData object to convert to JSON.\n *\n * @returns {Object<string, any> | null} The converted object.\n */\nfunction formDataToJSON(formData) {\n function buildPath(path, value, target, index) {\n let name = path[index++];\n const isNumericKey = Number.isFinite(+name);\n const isLast = index >= path.length;\n name = !name && utils.isArray(target) ? target.length : name;\n\n if (isLast) {\n if (utils.hasOwnProp(target, name)) {\n target[name] = [target[name], value];\n } else {\n target[name] = value;\n }\n\n return !isNumericKey;\n }\n\n if (!target[name] || !utils.isObject(target[name])) {\n target[name] = [];\n }\n\n const result = buildPath(path, value, target[name], index);\n\n if (result && utils.isArray(target[name])) {\n target[name] = arrayToObject(target[name]);\n }\n\n return !isNumericKey;\n }\n\n if (utils.isFormData(formData) && utils.isFunction(formData.entries)) {\n const obj = {};\n\n utils.forEachEntry(formData, (name, value) => {\n buildPath(parsePropPath(name), value, obj, 0);\n });\n\n return obj;\n }\n\n return null;\n}\n\nexport default formDataToJSON;\n","'use strict';\n\nimport utils from './../utils.js';\nimport platform from '../platform/index.js';\n\nexport default platform.isStandardBrowserEnv ?\n\n// Standard browser envs support document.cookie\n (function standardBrowserEnv() {\n return {\n write: function write(name, value, expires, path, domain, secure) {\n const cookie = [];\n cookie.push(name + '=' + encodeURIComponent(value));\n\n if (utils.isNumber(expires)) {\n cookie.push('expires=' + new Date(expires).toGMTString());\n }\n\n if (utils.isString(path)) {\n cookie.push('path=' + path);\n }\n\n if (utils.isString(domain)) {\n cookie.push('domain=' + domain);\n }\n\n if (secure === true) {\n cookie.push('secure');\n }\n\n document.cookie = cookie.join('; ');\n },\n\n read: function read(name) {\n const match = document.cookie.match(new RegExp('(^|;\\\\s*)(' + name + ')=([^;]*)'));\n return (match ? decodeURIComponent(match[3]) : null);\n },\n\n remove: function remove(name) {\n this.write(name, '', Date.now() - 86400000);\n }\n };\n })() :\n\n// Non standard browser env (web workers, react-native) lack needed support.\n (function nonStandardBrowserEnv() {\n return {\n write: function write() {},\n read: function read() { return null; },\n remove: function remove() {}\n };\n })();\n","'use strict';\n\nimport isAbsoluteURL from '../helpers/isAbsoluteURL.js';\nimport combineURLs from '../helpers/combineURLs.js';\n\n/**\n * Creates a new URL by combining the baseURL with the requestedURL,\n * only when the requestedURL is not already an absolute URL.\n * If the requestURL is absolute, this function returns the requestedURL untouched.\n *\n * @param {string} baseURL The base URL\n * @param {string} requestedURL Absolute or relative URL to combine\n *\n * @returns {string} The combined full path\n */\nexport default function buildFullPath(baseURL, requestedURL) {\n if (baseURL && !isAbsoluteURL(requestedURL)) {\n return combineURLs(baseURL, requestedURL);\n }\n return requestedURL;\n}\n","'use strict';\n\n/**\n * Determines whether the specified URL is absolute\n *\n * @param {string} url The URL to test\n *\n * @returns {boolean} True if the specified URL is absolute, otherwise false\n */\nexport default function isAbsoluteURL(url) {\n // A URL is considered absolute if it begins with \"<scheme>://\" or \"//\" (protocol-relative URL).\n // RFC 3986 defines scheme name as a sequence of characters beginning with a letter and followed\n // by any combination of letters, digits, plus, period, or hyphen.\n return /^([a-z][a-z\\d+\\-.]*:)?\\/\\//i.test(url);\n}\n","'use strict';\n\n/**\n * Creates a new URL by combining the specified URLs\n *\n * @param {string} baseURL The base URL\n * @param {string} relativeURL The relative URL\n *\n * @returns {string} The combined URL\n */\nexport default function combineURLs(baseURL, relativeURL) {\n return relativeURL\n ? baseURL.replace(/\\/+$/, '') + '/' + relativeURL.replace(/^\\/+/, '')\n : baseURL;\n}\n","'use strict';\n\nimport utils from './../utils.js';\nimport platform from '../platform/index.js';\n\nexport default platform.isStandardBrowserEnv ?\n\n// Standard browser envs have full support of the APIs needed to test\n// whether the request URL is of the same origin as current location.\n (function standardBrowserEnv() {\n const msie = /(msie|trident)/i.test(navigator.userAgent);\n const urlParsingNode = document.createElement('a');\n let originURL;\n\n /**\n * Parse a URL to discover it's components\n *\n * @param {String} url The URL to be parsed\n * @returns {Object}\n */\n function resolveURL(url) {\n let href = url;\n\n if (msie) {\n // IE needs attribute set twice to normalize properties\n urlParsingNode.setAttribute('href', href);\n href = urlParsingNode.href;\n }\n\n urlParsingNode.setAttribute('href', href);\n\n // urlParsingNode provides the UrlUtils interface - http://url.spec.whatwg.org/#urlutils\n return {\n href: urlParsingNode.href,\n protocol: urlParsingNode.protocol ? urlParsingNode.protocol.replace(/:$/, '') : '',\n host: urlParsingNode.host,\n search: urlParsingNode.search ? urlParsingNode.search.replace(/^\\?/, '') : '',\n hash: urlParsingNode.hash ? urlParsingNode.hash.replace(/^#/, '') : '',\n hostname: urlParsingNode.hostname,\n port: urlParsingNode.port,\n pathname: (urlParsingNode.pathname.charAt(0) === '/') ?\n urlParsingNode.pathname :\n '/' + urlParsingNode.pathname\n };\n }\n\n originURL = resolveURL(window.location.href);\n\n /**\n * Determine if a URL shares the same origin as the current location\n *\n * @param {String} requestURL The URL to test\n * @returns {boolean} True if URL shares the same origin, otherwise false\n */\n return function isURLSameOrigin(requestURL) {\n const parsed = (utils.isString(requestURL)) ? resolveURL(requestURL) : requestURL;\n return (parsed.protocol === originURL.protocol &&\n parsed.host === originURL.host);\n };\n })() :\n\n // Non standard browser envs (web workers, react-native) lack needed support.\n (function nonStandardBrowserEnv() {\n return function isURLSameOrigin() {\n return true;\n };\n })();\n","'use strict';\n\nimport AxiosError from '../core/AxiosError.js';\nimport utils from '../utils.js';\n\n/**\n * A `CanceledError` is an object that is thrown when an operation is canceled.\n *\n * @param {string=} message The message.\n * @param {Object=} config The config.\n * @param {Object=} request The request.\n *\n * @returns {CanceledError} The created error.\n */\nfunction CanceledError(message, config, request) {\n // eslint-disable-next-line no-eq-null,eqeqeq\n AxiosError.call(this, message == null ? 'canceled' : message, AxiosError.ERR_CANCELED, config, request);\n this.name = 'CanceledError';\n}\n\nutils.inherits(CanceledError, AxiosError, {\n __CANCEL__: true\n});\n\nexport default CanceledError;\n","'use strict';\n\nimport utils from './../utils.js';\n\n// RawAxiosHeaders whose duplicates are ignored by node\n// c.f. https://nodejs.org/api/http.html#http_message_headers\nconst ignoreDuplicateOf = utils.toObjectSet([\n 'age', 'authorization', 'content-length', 'content-type', 'etag',\n 'expires', 'from', 'host', 'if-modified-since', 'if-unmodified-since',\n 'last-modified', 'location', 'max-forwards', 'proxy-authorization',\n 'referer', 'retry-after', 'user-agent'\n]);\n\n/**\n * Parse headers into an object\n *\n * ```\n * Date: Wed, 27 Aug 2014 08:58:49 GMT\n * Content-Type: application/json\n * Connection: keep-alive\n * Transfer-Encoding: chunked\n * ```\n *\n * @param {String} rawHeaders Headers needing to be parsed\n *\n * @returns {Object} Headers parsed into an object\n */\nexport default rawHeaders => {\n const parsed = {};\n let key;\n let val;\n let i;\n\n rawHeaders && rawHeaders.split('\\n').forEach(function parser(line) {\n i = line.indexOf(':');\n key = line.substring(0, i).trim().toLowerCase();\n val = line.substring(i + 1).trim();\n\n if (!key || (parsed[key] && ignoreDuplicateOf[key])) {\n return;\n }\n\n if (key === 'set-cookie') {\n if (parsed[key]) {\n parsed[key].push(val);\n } else {\n parsed[key] = [val];\n }\n } else {\n parsed[key] = parsed[key] ? parsed[key] + ', ' + val : val;\n }\n });\n\n return parsed;\n};\n","'use strict';\n\nimport utils from '../utils.js';\nimport parseHeaders from '../helpers/parseHeaders.js';\n\nconst $internals = Symbol('internals');\nconst $defaults = Symbol('defaults');\n\nfunction normalizeHeader(header) {\n return header && String(header).trim().toLowerCase();\n}\n\nfunction normalizeValue(value) {\n if (value === false || value == null) {\n return value;\n }\n\n return utils.isArray(value) ? value.map(normalizeValue) : String(value);\n}\n\nfunction parseTokens(str) {\n const tokens = Object.create(null);\n const tokensRE = /([^\\s,;=]+)\\s*(?:=\\s*([^,;]+))?/g;\n let match;\n\n while ((match = tokensRE.exec(str))) {\n tokens[match[1]] = match[2];\n }\n\n return tokens;\n}\n\nfunction matchHeaderValue(context, value, header, filter) {\n if (utils.isFunction(filter)) {\n return filter.call(this, value, header);\n }\n\n if (!utils.isString(value)) return;\n\n if (utils.isString(filter)) {\n return value.indexOf(filter) !== -1;\n }\n\n if (utils.isRegExp(filter)) {\n return filter.test(value);\n }\n}\n\nfunction formatHeader(header) {\n return header.trim()\n .toLowerCase().replace(/([a-z\\d])(\\w*)/g, (w, char, str) => {\n return char.toUpperCase() + str;\n });\n}\n\nfunction buildAccessors(obj, header) {\n const accessorName = utils.toCamelCase(' ' + header);\n\n ['get', 'set', 'has'].forEach(methodName => {\n Object.defineProperty(obj, methodName + accessorName, {\n value: function(arg1, arg2, arg3) {\n return this[methodName].call(this, header, arg1, arg2, arg3);\n },\n configurable: true\n });\n });\n}\n\nfunction findKey(obj, key) {\n key = key.toLowerCase();\n const keys = Object.keys(obj);\n let i = keys.length;\n let _key;\n while (i-- > 0) {\n _key = keys[i];\n if (key === _key.toLowerCase()) {\n return _key;\n }\n }\n return null;\n}\n\nfunction AxiosHeaders(headers, defaults) {\n headers && this.set(headers);\n this[$defaults] = defaults || null;\n}\n\nObject.assign(AxiosHeaders.prototype, {\n set: function(header, valueOrRewrite, rewrite) {\n const self = this;\n\n function setHeader(_value, _header, _rewrite) {\n const lHeader = normalizeHeader(_header);\n\n if (!lHeader) {\n throw new Error('header name must be a non-empty string');\n }\n\n const key = findKey(self, lHeader);\n\n if (key && _rewrite !== true && (self[key] === false || _rewrite === false)) {\n return;\n }\n\n self[key || _header] = normalizeValue(_value);\n }\n\n if (utils.isPlainObject(header)) {\n utils.forEach(header, (_value, _header) => {\n setHeader(_value, _header, valueOrRewrite);\n });\n } else {\n setHeader(valueOrRewrite, header, rewrite);\n }\n\n return this;\n },\n\n get: function(header, parser) {\n header = normalizeHeader(header);\n\n if (!header) return undefined;\n\n const key = findKey(this, header);\n\n if (key) {\n const value = this[key];\n\n if (!parser) {\n return value;\n }\n\n if (parser === true) {\n return parseTokens(value);\n }\n\n if (utils.isFunction(parser)) {\n return parser.call(this, value, key);\n }\n\n if (utils.isRegExp(parser)) {\n return parser.exec(value);\n }\n\n throw new TypeError('parser must be boolean|regexp|function');\n }\n },\n\n has: function(header, matcher) {\n header = normalizeHeader(header);\n\n if (header) {\n const key = findKey(this, header);\n\n return !!(key && (!matcher || matchHeaderValue(this, this[key], key, matcher)));\n }\n\n return false;\n },\n\n delete: function(header, matcher) {\n const self = this;\n let deleted = false;\n\n function deleteHeader(_header) {\n _header = normalizeHeader(_header);\n\n if (_header) {\n const key = findKey(self, _header);\n\n if (key && (!matcher || matchHeaderValue(self, self[key], key, matcher))) {\n delete self[key];\n\n deleted = true;\n }\n }\n }\n\n if (utils.isArray(header)) {\n header.forEach(deleteHeader);\n } else {\n deleteHeader(header);\n }\n\n return deleted;\n },\n\n clear: function() {\n return Object.keys(this).forEach(this.delete.bind(this));\n },\n\n normalize: function(format) {\n const self = this;\n const headers = {};\n\n utils.forEach(this, (value, header) => {\n const key = findKey(headers, header);\n\n if (key) {\n self[key] = normalizeValue(value);\n delete self[header];\n return;\n }\n\n const normalized = format ? formatHeader(header) : String(header).trim();\n\n if (normalized !== header) {\n delete self[header];\n }\n\n self[normalized] = normalizeValue(value);\n\n headers[normalized] = true;\n });\n\n return this;\n },\n\n toJSON: function(asStrings) {\n const obj = Object.create(null);\n\n utils.forEach(Object.assign({}, this[$defaults] || null, this),\n (value, header) => {\n if (value == null || value === false) return;\n obj[header] = asStrings && utils.isArray(value) ? value.join(', ') : value;\n });\n\n return obj;\n }\n});\n\nObject.assign(AxiosHeaders, {\n from: function(thing) {\n if (utils.isString(thing)) {\n return new this(parseHeaders(thing));\n }\n return thing instanceof this ? thing : new this(thing);\n },\n\n accessor: function(header) {\n const internals = this[$internals] = (this[$internals] = {\n accessors: {}\n });\n\n const accessors = internals.accessors;\n const prototype = this.prototype;\n\n function defineAccessor(_header) {\n const lHeader = normalizeHeader(_header);\n\n if (!accessors[lHeader]) {\n buildAccessors(prototype, _header);\n accessors[lHeader] = true;\n }\n }\n\n utils.isArray(header) ? header.forEach(defineAccessor) : defineAccessor(header);\n\n return this;\n }\n});\n\nAxiosHeaders.accessor(['Content-Type', 'Content-Length', 'Accept', 'Accept-Encoding', 'User-Agent']);\n\nutils.freezeMethods(AxiosHeaders.prototype);\nutils.freezeMethods(AxiosHeaders);\n\nexport default AxiosHeaders;\n","'use strict';\n\nimport utils from './../utils.js';\nimport settle from './../core/settle.js';\nimport cookies from './../helpers/cookies.js';\nimport buildURL from './../helpers/buildURL.js';\nimport buildFullPath from '../core/buildFullPath.js';\nimport isURLSameOrigin from './../helpers/isURLSameOrigin.js';\nimport transitionalDefaults from '../defaults/transitional.js';\nimport AxiosError from '../core/AxiosError.js';\nimport CanceledError from '../cancel/CanceledError.js';\nimport parseProtocol from '../helpers/parseProtocol.js';\nimport platform from '../platform/index.js';\nimport AxiosHeaders from '../core/AxiosHeaders.js';\nimport speedometer from '../helpers/speedometer.js';\n\nfunction progressEventReducer(listener, isDownloadStream) {\n let bytesNotified = 0;\n const _speedometer = speedometer(50, 250);\n\n return e => {\n const loaded = e.loaded;\n const total = e.lengthComputable ? e.total : undefined;\n const progressBytes = loaded - bytesNotified;\n const rate = _speedometer(progressBytes);\n const inRange = loaded <= total;\n\n bytesNotified = loaded;\n\n const data = {\n loaded,\n total,\n progress: total ? (loaded / total) : undefined,\n bytes: progressBytes,\n rate: rate ? rate : undefined,\n estimated: rate && total && inRange ? (total - loaded) / rate : undefined\n };\n\n data[isDownloadStream ? 'download' : 'upload'] = true;\n\n listener(data);\n };\n}\n\nexport default function xhrAdapter(config) {\n return new Promise(function dispatchXhrRequest(resolve, reject) {\n let requestData = config.data;\n const requestHeaders = AxiosHeaders.from(config.headers).normalize();\n const responseType = config.responseType;\n let onCanceled;\n function done() {\n if (config.cancelToken) {\n config.cancelToken.unsubscribe(onCanceled);\n }\n\n if (config.signal) {\n config.signal.removeEventListener('abort', onCanceled);\n }\n }\n\n if (utils.isFormData(requestData) && platform.isStandardBrowserEnv) {\n requestHeaders.setContentType(false); // Let the browser set it\n }\n\n let request = new XMLHttpRequest();\n\n // HTTP basic authentication\n if (config.auth) {\n const username = config.auth.username || '';\n const password = config.auth.password ? unescape(encodeURIComponent(config.auth.password)) : '';\n requestHeaders.set('Authorization', 'Basic ' + btoa(username + ':' + password));\n }\n\n const fullPath = buildFullPath(config.baseURL, config.url);\n\n request.open(config.method.toUpperCase(), buildURL(fullPath, config.params, config.paramsSerializer), true);\n\n // Set the request timeout in MS\n request.timeout = config.timeout;\n\n function onloadend() {\n if (!request) {\n return;\n }\n // Prepare the response\n const responseHeaders = AxiosHeaders.from(\n 'getAllResponseHeaders' in request && request.getAllResponseHeaders()\n );\n const responseData = !responseType || responseType === 'text' || responseType === 'json' ?\n request.responseText : request.response;\n const response = {\n data: responseData,\n status: request.status,\n statusText: request.statusText,\n headers: responseHeaders,\n config,\n request\n };\n\n settle(function _resolve(value) {\n resolve(value);\n done();\n }, function _reject(err) {\n reject(err);\n done();\n }, response);\n\n // Clean up request\n request = null;\n }\n\n if ('onloadend' in request) {\n // Use onloadend if available\n request.onloadend = onloadend;\n } else {\n // Listen for ready state to emulate onloadend\n request.onreadystatechange = function handleLoad() {\n if (!request || request.readyState !== 4) {\n return;\n }\n\n // The request errored out and we didn't get a response, this will be\n // handled by onerror instead\n // With one exception: request that using file: protocol, most browsers\n // will return status as 0 even though it's a successful request\n if (request.status === 0 && !(request.responseURL && request.responseURL.indexOf('file:') === 0)) {\n return;\n }\n // readystate handler is calling before onerror or ontimeout handlers,\n // so we should call onloadend on the next 'tick'\n setTimeout(onloadend);\n };\n }\n\n // Handle browser request cancellation (as opposed to a manual cancellation)\n request.onabort = function handleAbort() {\n if (!request) {\n return;\n }\n\n reject(new AxiosError('Request aborted', AxiosError.ECONNABORTED, config, request));\n\n // Clean up request\n request = null;\n };\n\n // Handle low level network errors\n request.onerror = function handleError() {\n // Real errors are hidden from us by the browser\n // onerror should only fire if it's a network error\n reject(new AxiosError('Network Error', AxiosError.ERR_NETWORK, config, request));\n\n // Clean up request\n request = null;\n };\n\n // Handle timeout\n request.ontimeout = function handleTimeout() {\n let timeoutErrorMessage = config.timeout ? 'timeout of ' + config.timeout + 'ms exceeded' : 'timeout exceeded';\n const transitional = config.transitional || transitionalDefaults;\n if (config.timeoutErrorMessage) {\n timeoutErrorMessage = config.timeoutErrorMessage;\n }\n reject(new AxiosError(\n timeoutErrorMessage,\n transitional.clarifyTimeoutError ? AxiosError.ETIMEDOUT : AxiosError.ECONNABORTED,\n config,\n request));\n\n // Clean up request\n request = null;\n };\n\n // Add xsrf header\n // This is only done if running in a standard browser environment.\n // Specifically not if we're in a web worker, or react-native.\n if (platform.isStandardBrowserEnv) {\n // Add xsrf header\n const xsrfValue = (config.withCredentials || isURLSameOrigin(fullPath))\n && config.xsrfCookieName && cookies.read(config.xsrfCookieName);\n\n if (xsrfValue) {\n requestHeaders.set(config.xsrfHeaderName, xsrfValue);\n }\n }\n\n // Remove Content-Type if data is undefined\n requestData === undefined && requestHeaders.setContentType(null);\n\n // Add headers to the request\n if ('setRequestHeader' in request) {\n utils.forEach(requestHeaders.toJSON(), function setRequestHeader(val, key) {\n request.setRequestHeader(key, val);\n });\n }\n\n // Add withCredentials to request if needed\n if (!utils.isUndefined(config.withCredentials)) {\n request.withCredentials = !!config.withCredentials;\n }\n\n // Add responseType to request if needed\n if (responseType && responseType !== 'json') {\n request.responseType = config.responseType;\n }\n\n // Handle progress if needed\n if (typeof config.onDownloadProgress === 'function') {\n request.addEventListener('progress', progressEventReducer(config.onDownloadProgress, true));\n }\n\n // Not all browsers support upload events\n if (typeof config.onUploadProgress === 'function' && request.upload) {\n request.upload.addEventListener('progress', progressEventReducer(config.onUploadProgress));\n }\n\n if (config.cancelToken || config.signal) {\n // Handle cancellation\n // eslint-disable-next-line func-names\n onCanceled = cancel => {\n if (!request) {\n return;\n }\n reject(!cancel || cancel.type ? new CanceledError(null, config, request) : cancel);\n request.abort();\n request = null;\n };\n\n config.cancelToken && config.cancelToken.subscribe(onCanceled);\n if (config.signal) {\n config.signal.aborted ? onCanceled() : config.signal.addEventListener('abort', onCanceled);\n }\n }\n\n const protocol = parseProtocol(fullPath);\n\n if (protocol && platform.protocols.indexOf(protocol) === -1) {\n reject(new AxiosError('Unsupported protocol ' + protocol + ':', AxiosError.ERR_BAD_REQUEST, config));\n return;\n }\n\n\n // Send the request\n request.send(requestData || null);\n });\n}\n","'use strict';\n\n/**\n * Calculate data maxRate\n * @param {Number} [samplesCount= 10]\n * @param {Number} [min= 1000]\n * @returns {Function}\n */\nfunction speedometer(samplesCount, min) {\n samplesCount = samplesCount || 10;\n const bytes = new Array(samplesCount);\n const timestamps = new Array(samplesCount);\n let head = 0;\n let tail = 0;\n let firstSampleTS;\n\n min = min !== undefined ? min : 1000;\n\n return function push(chunkLength) {\n const now = Date.now();\n\n const startedAt = timestamps[tail];\n\n if (!firstSampleTS) {\n firstSampleTS = now;\n }\n\n bytes[head] = chunkLength;\n timestamps[head] = now;\n\n let i = tail;\n let bytesCount = 0;\n\n while (i !== head) {\n bytesCount += bytes[i++];\n i = i % samplesCount;\n }\n\n head = (head + 1) % samplesCount;\n\n if (head === tail) {\n tail = (tail + 1) % samplesCount;\n }\n\n if (now - firstSampleTS < min) {\n return;\n }\n\n const passed = startedAt && now - startedAt;\n\n return passed ? Math.round(bytesCount * 1000 / passed) : undefined;\n };\n}\n\nexport default speedometer;\n","'use strict';\n\nimport AxiosError from './AxiosError.js';\n\n/**\n * Resolve or reject a Promise based on response status.\n *\n * @param {Function} resolve A function that resolves the promise.\n * @param {Function} reject A function that rejects the promise.\n * @param {object} response The response.\n *\n * @returns {object} The response.\n */\nexport default function settle(resolve, reject, response) {\n const validateStatus = response.config.validateStatus;\n if (!response.status || !validateStatus || validateStatus(response.status)) {\n resolve(response);\n } else {\n reject(new AxiosError(\n 'Request failed with status code ' + response.status,\n [AxiosError.ERR_BAD_REQUEST, AxiosError.ERR_BAD_RESPONSE][Math.floor(response.status / 100) - 4],\n response.config,\n response.request,\n response\n ));\n }\n}\n","'use strict';\n\nexport default function parseProtocol(url) {\n const match = /^([-+\\w]{1,25})(:?\\/\\/|:)/.exec(url);\n return match && match[1] || '';\n}\n","import utils from '../utils.js';\nimport httpAdapter from './http.js';\nimport xhrAdapter from './xhr.js';\n\nconst adapters = {\n http: httpAdapter,\n xhr: xhrAdapter\n}\n\nexport default {\n getAdapter: (nameOrAdapter) => {\n if(utils.isString(nameOrAdapter)){\n const adapter = adapters[nameOrAdapter];\n\n if (!nameOrAdapter) {\n throw Error(\n utils.hasOwnProp(nameOrAdapter) ?\n `Adapter '${nameOrAdapter}' is not available in the build` :\n `Can not resolve adapter '${nameOrAdapter}'`\n );\n }\n\n return adapter\n }\n\n if (!utils.isFunction(nameOrAdapter)) {\n throw new TypeError('adapter is not a function');\n }\n\n return nameOrAdapter;\n },\n adapters\n}\n","'use strict';\n\nimport utils from '../utils.js';\nimport AxiosError from '../core/AxiosError.js';\nimport transitionalDefaults from './transitional.js';\nimport toFormData from '../helpers/toFormData.js';\nimport toURLEncodedForm from '../helpers/toURLEncodedForm.js';\nimport platform from '../platform/index.js';\nimport formDataToJSON from '../helpers/formDataToJSON.js';\nimport adapters from '../adapters/index.js';\n\nconst DEFAULT_CONTENT_TYPE = {\n 'Content-Type': 'application/x-www-form-urlencoded'\n};\n\n/**\n * If the browser has an XMLHttpRequest object, use the XHR adapter, otherwise use the HTTP\n * adapter\n *\n * @returns {Function}\n */\nfunction getDefaultAdapter() {\n let adapter;\n if (typeof XMLHttpRequest !== 'undefined') {\n // For browsers use XHR adapter\n adapter = adapters.getAdapter('xhr');\n } else if (typeof process !== 'undefined' && utils.kindOf(process) === 'process') {\n // For node use HTTP adapter\n adapter = adapters.getAdapter('http');\n }\n return adapter;\n}\n\n/**\n * It takes a string, tries to parse it, and if it fails, it returns the stringified version\n * of the input\n *\n * @param {any} rawValue - The value to be stringified.\n * @param {Function} parser - A function that parses a string into a JavaScript object.\n * @param {Function} encoder - A function that takes a value and returns a string.\n *\n * @returns {string} A stringified version of the rawValue.\n */\nfunction stringifySafely(rawValue, parser, encoder) {\n if (utils.isString(rawValue)) {\n try {\n (parser || JSON.parse)(rawValue);\n return utils.trim(rawValue);\n } catch (e) {\n if (e.name !== 'SyntaxError') {\n throw e;\n }\n }\n }\n\n return (encoder || JSON.stringify)(rawValue);\n}\n\nconst defaults = {\n\n transitional: transitionalDefaults,\n\n adapter: getDefaultAdapter(),\n\n transformRequest: [function transformRequest(data, headers) {\n const contentType = headers.getContentType() || '';\n const hasJSONContentType = contentType.indexOf('application/json') > -1;\n const isObjectPayload = utils.isObject(data);\n\n if (isObjectPayload && utils.isHTMLForm(data)) {\n data = new FormData(data);\n }\n\n const isFormData = utils.isFormData(data);\n\n if (isFormData) {\n if (!hasJSONContentType) {\n return data;\n }\n return hasJSONContentType ? JSON.stringify(formDataToJSON(data)) : data;\n }\n\n if (utils.isArrayBuffer(data) ||\n utils.isBuffer(data) ||\n utils.isStream(data) ||\n utils.isFile(data) ||\n utils.isBlob(data)\n ) {\n return data;\n }\n if (utils.isArrayBufferView(data)) {\n return data.buffer;\n }\n if (utils.isURLSearchParams(data)) {\n headers.setContentType('application/x-www-form-urlencoded;charset=utf-8', false);\n return data.toString();\n }\n\n let isFileList;\n\n if (isObjectPayload) {\n if (contentType.indexOf('application/x-www-form-urlencoded') > -1) {\n return toURLEncodedForm(data, this.formSerializer).toString();\n }\n\n if ((isFileList = utils.isFileList(data)) || contentType.indexOf('multipart/form-data') > -1) {\n const _FormData = this.env && this.env.FormData;\n\n return toFormData(\n isFileList ? {'files[]': data} : data,\n _FormData && new _FormData(),\n this.formSerializer\n );\n }\n }\n\n if (isObjectPayload || hasJSONContentType ) {\n headers.setContentType('application/json', false);\n return stringifySafely(data);\n }\n\n return data;\n }],\n\n transformResponse: [function transformResponse(data) {\n const transitional = this.transitional || defaults.transitional;\n const forcedJSONParsing = transitional && transitional.forcedJSONParsing;\n const JSONRequested = this.responseType === 'json';\n\n if (data && utils.isString(data) && ((forcedJSONParsing && !this.responseType) || JSONRequested)) {\n const silentJSONParsing = transitional && transitional.silentJSONParsing;\n const strictJSONParsing = !silentJSONParsing && JSONRequested;\n\n try {\n return JSON.parse(data);\n } catch (e) {\n if (strictJSONParsing) {\n if (e.name === 'SyntaxError') {\n throw AxiosError.from(e, AxiosError.ERR_BAD_RESPONSE, this, null, this.response);\n }\n throw e;\n }\n }\n }\n\n return data;\n }],\n\n /**\n * A timeout in milliseconds to abort a request. If set to 0 (default) a\n * timeout is not created.\n */\n timeout: 0,\n\n xsrfCookieName: 'XSRF-TOKEN',\n xsrfHeaderName: 'X-XSRF-TOKEN',\n\n maxContentLength: -1,\n maxBodyLength: -1,\n\n env: {\n FormData: platform.classes.FormData,\n Blob: platform.classes.Blob\n },\n\n validateStatus: function validateStatus(status) {\n return status >= 200 && status < 300;\n },\n\n headers: {\n common: {\n 'Accept': 'application/json, text/plain, */*'\n }\n }\n};\n\nutils.forEach(['delete', 'get', 'head'], function forEachMethodNoData(method) {\n defaults.headers[method] = {};\n});\n\nutils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {\n defaults.headers[method] = utils.merge(DEFAULT_CONTENT_TYPE);\n});\n\nexport default defaults;\n","'use strict';\n\nimport utils from '../utils.js';\nimport toFormData from './toFormData.js';\nimport platform from '../platform/index.js';\n\nexport default function toURLEncodedForm(data, options) {\n return toFormData(data, new platform.classes.URLSearchParams(), Object.assign({\n visitor: function(value, key, path, helpers) {\n if (platform.isNode && utils.isBuffer(value)) {\n this.append(key, value.toString('base64'));\n return false;\n }\n\n return helpers.defaultVisitor.apply(this, arguments);\n }\n }, options));\n}\n","'use strict';\n\nimport utils from './../utils.js';\nimport defaults from '../defaults/index.js';\nimport AxiosHeaders from '../core/AxiosHeaders.js';\n\n/**\n * Transform the data for a request or a response\n *\n * @param {Array|Function} fns A single function or Array of functions\n * @param {?Object} response The response object\n *\n * @returns {*} The resulting transformed data\n */\nexport default function transformData(fns, response) {\n const config = this || defaults;\n const context = response || config;\n const headers = AxiosHeaders.from(context.headers);\n let data = context.data;\n\n utils.forEach(fns, function transform(fn) {\n data = fn.call(config, data, headers.normalize(), response ? response.status : undefined);\n });\n\n headers.normalize();\n\n return data;\n}\n","'use strict';\n\nexport default function isCancel(value) {\n return !!(value && value.__CANCEL__);\n}\n","'use strict';\n\nimport transformData from './transformData.js';\nimport isCancel from '../cancel/isCancel.js';\nimport defaults from '../defaults/index.js';\nimport CanceledError from '../cancel/CanceledError.js';\nimport AxiosHeaders from '../core/AxiosHeaders.js';\n\n/**\n * Throws a `CanceledError` if cancellation has been requested.\n *\n * @param {Object} config The config that is to be used for the request\n *\n * @returns {void}\n */\nfunction throwIfCancellationRequested(config) {\n if (config.cancelToken) {\n config.cancelToken.throwIfRequested();\n }\n\n if (config.signal && config.signal.aborted) {\n throw new CanceledError();\n }\n}\n\n/**\n * Dispatch a request to the server using the configured adapter.\n *\n * @param {object} config The config that is to be used for the request\n *\n * @returns {Promise} The Promise to be fulfilled\n */\nexport default function dispatchRequest(config) {\n throwIfCancellationRequested(config);\n\n config.headers = AxiosHeaders.from(config.headers);\n\n // Transform request data\n config.data = transformData.call(\n config,\n config.transformRequest\n );\n\n const adapter = config.adapter || defaults.adapter;\n\n return adapter(config).then(function onAdapterResolution(response) {\n throwIfCancellationRequested(config);\n\n // Transform response data\n response.data = transformData.call(\n config,\n config.transformResponse,\n response\n );\n\n response.headers = AxiosHeaders.from(response.headers);\n\n return response;\n }, function onAdapterRejection(reason) {\n if (!isCancel(reason)) {\n throwIfCancellationRequested(config);\n\n // Transform response data\n if (reason && reason.response) {\n reason.response.data = transformData.call(\n config,\n config.transformResponse,\n reason.response\n );\n reason.response.headers = AxiosHeaders.from(reason.response.headers);\n }\n }\n\n return Promise.reject(reason);\n });\n}\n","'use strict';\n\nimport utils from '../utils.js';\n\n/**\n * Config-specific merge-function which creates a new config-object\n * by merging two configuration objects together.\n *\n * @param {Object} config1\n * @param {Object} config2\n *\n * @returns {Object} New object resulting from merging config2 to config1\n */\nexport default function mergeConfig(config1, config2) {\n // eslint-disable-next-line no-param-reassign\n config2 = config2 || {};\n const config = {};\n\n function getMergedValue(target, source) {\n if (utils.isPlainObject(target) && utils.isPlainObject(source)) {\n return utils.merge(target, source);\n } else if (utils.isPlainObject(source)) {\n return utils.merge({}, source);\n } else if (utils.isArray(source)) {\n return source.slice();\n }\n return source;\n }\n\n // eslint-disable-next-line consistent-return\n function mergeDeepProperties(prop) {\n if (!utils.isUndefined(config2[prop])) {\n return getMergedValue(config1[prop], config2[prop]);\n } else if (!utils.isUndefined(config1[prop])) {\n return getMergedValue(undefined, config1[prop]);\n }\n }\n\n // eslint-disable-next-line consistent-return\n function valueFromConfig2(prop) {\n if (!utils.isUndefined(config2[prop])) {\n return getMergedValue(undefined, config2[prop]);\n }\n }\n\n // eslint-disable-next-line consistent-return\n function defaultToConfig2(prop) {\n if (!utils.isUndefined(config2[prop])) {\n return getMergedValue(undefined, config2[prop]);\n } else if (!utils.isUndefined(config1[prop])) {\n return getMergedValue(undefined, config1[prop]);\n }\n }\n\n // eslint-disable-next-line consistent-return\n function mergeDirectKeys(prop) {\n if (prop in config2) {\n return getMergedValue(config1[prop], config2[prop]);\n } else if (prop in config1) {\n return getMergedValue(undefined, config1[prop]);\n }\n }\n\n const mergeMap = {\n 'url': valueFromConfig2,\n 'method': valueFromConfig2,\n 'data': valueFromConfig2,\n 'baseURL': defaultToConfig2,\n 'transformRequest': defaultToConfig2,\n 'transformResponse': defaultToConfig2,\n 'paramsSerializer': defaultToConfig2,\n 'timeout': defaultToConfig2,\n 'timeoutMessage': defaultToConfig2,\n 'withCredentials': defaultToConfig2,\n 'adapter': defaultToConfig2,\n 'responseType': defaultToConfig2,\n 'xsrfCookieName': defaultToConfig2,\n 'xsrfHeaderName': defaultToConfig2,\n 'onUploadProgress': defaultToConfig2,\n 'onDownloadProgress': defaultToConfig2,\n 'decompress': defaultToConfig2,\n 'maxContentLength': defaultToConfig2,\n 'maxBodyLength': defaultToConfig2,\n 'beforeRedirect': defaultToConfig2,\n 'transport': defaultToConfig2,\n 'httpAgent': defaultToConfig2,\n 'httpsAgent': defaultToConfig2,\n 'cancelToken': defaultToConfig2,\n 'socketPath': defaultToConfig2,\n 'responseEncoding': defaultToConfig2,\n 'validateStatus': mergeDirectKeys\n };\n\n utils.forEach(Object.keys(config1).concat(Object.keys(config2)), function computeConfigValue(prop) {\n const merge = mergeMap[prop] || mergeDeepProperties;\n const configValue = merge(prop);\n (utils.isUndefined(configValue) && merge !== mergeDirectKeys) || (config[prop] = configValue);\n });\n\n return config;\n}\n","export const VERSION = \"1.1.3\";","'use strict';\n\nimport {VERSION} from '../env/data.js';\nimport AxiosError from '../core/AxiosError.js';\n\nconst validators = {};\n\n// eslint-disable-next-line func-names\n['object', 'boolean', 'number', 'function', 'string', 'symbol'].forEach((type, i) => {\n validators[type] = function validator(thing) {\n return typeof thing === type || 'a' + (i < 1 ? 'n ' : ' ') + type;\n };\n});\n\nconst deprecatedWarnings = {};\n\n/**\n * Transitional option validator\n *\n * @param {function|boolean?} validator - set to false if the transitional option has been removed\n * @param {string?} version - deprecated version / removed since version\n * @param {string?} message - some message with additional info\n *\n * @returns {function}\n */\nvalidators.transitional = function transitional(validator, version, message) {\n function formatMessage(opt, desc) {\n return '[Axios v' + VERSION + '] Transitional option \\'' + opt + '\\'' + desc + (message ? '. ' + message : '');\n }\n\n // eslint-disable-next-line func-names\n return (value, opt, opts) => {\n if (validator === false) {\n throw new AxiosError(\n formatMessage(opt, ' has been removed' + (version ? ' in ' + version : '')),\n AxiosError.ERR_DEPRECATED\n );\n }\n\n if (version && !deprecatedWarnings[opt]) {\n deprecatedWarnings[opt] = true;\n // eslint-disable-next-line no-console\n console.warn(\n formatMessage(\n opt,\n ' has been deprecated since v' + version + ' and will be removed in the near future'\n )\n );\n }\n\n return validator ? validator(value, opt, opts) : true;\n };\n};\n\n/**\n * Assert object's properties type\n *\n * @param {object} options\n * @param {object} schema\n * @param {boolean?} allowUnknown\n *\n * @returns {object}\n */\n\nfunction assertOptions(options, schema, allowUnknown) {\n if (typeof options !== 'object') {\n throw new AxiosError('options must be an object', AxiosError.ERR_BAD_OPTION_VALUE);\n }\n const keys = Object.keys(options);\n let i = keys.length;\n while (i-- > 0) {\n const opt = keys[i];\n const validator = schema[opt];\n if (validator) {\n const value = options[opt];\n const result = value === undefined || validator(value, opt, options);\n if (result !== true) {\n throw new AxiosError('option ' + opt + ' must be ' + result, AxiosError.ERR_BAD_OPTION_VALUE);\n }\n continue;\n }\n if (allowUnknown !== true) {\n throw new AxiosError('Unknown option ' + opt, AxiosError.ERR_BAD_OPTION);\n }\n }\n}\n\nexport default {\n assertOptions,\n validators\n};\n","'use strict';\n\nimport utils from './../utils.js';\nimport buildURL from '../helpers/buildURL.js';\nimport InterceptorManager from './InterceptorManager.js';\nimport dispatchRequest from './dispatchRequest.js';\nimport mergeConfig from './mergeConfig.js';\nimport buildFullPath from './buildFullPath.js';\nimport validator from '../helpers/validator.js';\nimport AxiosHeaders from './AxiosHeaders.js';\n\nconst validators = validator.validators;\n\n/**\n * Create a new instance of Axios\n *\n * @param {Object} instanceConfig The default config for the instance\n *\n * @return {Axios} A new instance of Axios\n */\nclass Axios {\n constructor(instanceConfig) {\n this.defaults = instanceConfig;\n this.interceptors = {\n request: new InterceptorManager(),\n response: new InterceptorManager()\n };\n }\n\n /**\n * Dispatch a request\n *\n * @param {String|Object} configOrUrl The config specific for this request (merged with this.defaults)\n * @param {?Object} config\n *\n * @returns {Promise} The Promise to be fulfilled\n */\n request(configOrUrl, config) {\n /*eslint no-param-reassign:0*/\n // Allow for axios('example/url'[, config]) a la fetch API\n if (typeof configOrUrl === 'string') {\n config = config || {};\n config.url = configOrUrl;\n } else {\n config = configOrUrl || {};\n }\n\n config = mergeConfig(this.defaults, config);\n\n const {transitional, paramsSerializer} = config;\n\n if (transitional !== undefined) {\n validator.assertOptions(transitional, {\n silentJSONParsing: validators.transitional(validators.boolean),\n forcedJSONParsing: validators.transitional(validators.boolean),\n clarifyTimeoutError: validators.transitional(validators.boolean)\n }, false);\n }\n\n if (paramsSerializer !== undefined) {\n validator.assertOptions(paramsSerializer, {\n encode: validators.function,\n serialize: validators.function\n }, true);\n }\n\n // Set config.method\n config.method = (config.method || this.defaults.method || 'get').toLowerCase();\n\n // Flatten headers\n const defaultHeaders = config.headers && utils.merge(\n config.headers.common,\n config.headers[config.method]\n );\n\n defaultHeaders && utils.forEach(\n ['delete', 'get', 'head', 'post', 'put', 'patch', 'common'],\n function cleanHeaderConfig(method) {\n delete config.headers[method];\n }\n );\n\n config.headers = new AxiosHeaders(config.headers, defaultHeaders);\n\n // filter out skipped interceptors\n const requestInterceptorChain = [];\n let synchronousRequestInterceptors = true;\n this.interceptors.request.forEach(function unshiftRequestInterceptors(interceptor) {\n if (typeof interceptor.runWhen === 'function' && interceptor.runWhen(config) === false) {\n return;\n }\n\n synchronousRequestInterceptors = synchronousRequestInterceptors && interceptor.synchronous;\n\n requestInterceptorChain.unshift(interceptor.fulfilled, interceptor.rejected);\n });\n\n const responseInterceptorChain = [];\n this.interceptors.response.forEach(function pushResponseInterceptors(interceptor) {\n responseInterceptorChain.push(interceptor.fulfilled, interceptor.rejected);\n });\n\n let promise;\n let i = 0;\n let len;\n\n if (!synchronousRequestInterceptors) {\n const chain = [dispatchRequest.bind(this), undefined];\n chain.unshift.apply(chain, requestInterceptorChain);\n chain.push.apply(chain, responseInterceptorChain);\n len = chain.length;\n\n promise = Promise.resolve(config);\n\n while (i < len) {\n promise = promise.then(chain[i++], chain[i++]);\n }\n\n return promise;\n }\n\n len = requestInterceptorChain.length;\n\n let newConfig = config;\n\n i = 0;\n\n while (i < len) {\n const onFulfilled = requestInterceptorChain[i++];\n const onRejected = requestInterceptorChain[i++];\n try {\n newConfig = onFulfilled(newConfig);\n } catch (error) {\n onRejected.call(this, error);\n break;\n }\n }\n\n try {\n promise = dispatchRequest.call(this, newConfig);\n } catch (error) {\n return Promise.reject(error);\n }\n\n i = 0;\n len = responseInterceptorChain.length;\n\n while (i < len) {\n promise = promise.then(responseInterceptorChain[i++], responseInterceptorChain[i++]);\n }\n\n return promise;\n }\n\n getUri(config) {\n config = mergeConfig(this.defaults, config);\n const fullPath = buildFullPath(config.baseURL, config.url);\n return buildURL(fullPath, config.params, config.paramsSerializer);\n }\n}\n\n// Provide aliases for supported request methods\nutils.forEach(['delete', 'get', 'head', 'options'], function forEachMethodNoData(method) {\n /*eslint func-names:0*/\n Axios.prototype[method] = function(url, config) {\n return this.request(mergeConfig(config || {}, {\n method,\n url,\n data: (config || {}).data\n }));\n };\n});\n\nutils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {\n /*eslint func-names:0*/\n\n function generateHTTPMethod(isForm) {\n return function httpMethod(url, data, config) {\n return this.request(mergeConfig(config || {}, {\n method,\n headers: isForm ? {\n 'Content-Type': 'multipart/form-data'\n } : {},\n url,\n data\n }));\n };\n }\n\n Axios.prototype[method] = generateHTTPMethod();\n\n Axios.prototype[method + 'Form'] = generateHTTPMethod(true);\n});\n\nexport default Axios;\n","'use strict';\n\nimport CanceledError from './CanceledError.js';\n\n/**\n * A `CancelToken` is an object that can be used to request cancellation of an operation.\n *\n * @param {Function} executor The executor function.\n *\n * @returns {CancelToken}\n */\nclass CancelToken {\n constructor(executor) {\n if (typeof executor !== 'function') {\n throw new TypeError('executor must be a function.');\n }\n\n let resolvePromise;\n\n this.promise = new Promise(function promiseExecutor(resolve) {\n resolvePromise = resolve;\n });\n\n const token = this;\n\n // eslint-disable-next-line func-names\n this.promise.then(cancel => {\n if (!token._listeners) return;\n\n let i = token._listeners.length;\n\n while (i-- > 0) {\n token._listeners[i](cancel);\n }\n token._listeners = null;\n });\n\n // eslint-disable-next-line func-names\n this.promise.then = onfulfilled => {\n let _resolve;\n // eslint-disable-next-line func-names\n const promise = new Promise(resolve => {\n token.subscribe(resolve);\n _resolve = resolve;\n }).then(onfulfilled);\n\n promise.cancel = function reject() {\n token.unsubscribe(_resolve);\n };\n\n return promise;\n };\n\n executor(function cancel(message, config, request) {\n if (token.reason) {\n // Cancellation has already been requested\n return;\n }\n\n token.reason = new CanceledError(message, config, request);\n resolvePromise(token.reason);\n });\n }\n\n /**\n * Throws a `CanceledError` if cancellation has been requested.\n */\n throwIfRequested() {\n if (this.reason) {\n throw this.reason;\n }\n }\n\n /**\n * Subscribe to the cancel signal\n */\n\n subscribe(listener) {\n if (this.reason) {\n listener(this.reason);\n return;\n }\n\n if (this._listeners) {\n this._listeners.push(listener);\n } else {\n this._listeners = [listener];\n }\n }\n\n /**\n * Unsubscribe from the cancel signal\n */\n\n unsubscribe(listener) {\n if (!this._listeners) {\n return;\n }\n const index = this._listeners.indexOf(listener);\n if (index !== -1) {\n this._listeners.splice(index, 1);\n }\n }\n\n /**\n * Returns an object that contains a new `CancelToken` and a function that, when called,\n * cancels the `CancelToken`.\n */\n static source() {\n let cancel;\n const token = new CancelToken(function executor(c) {\n cancel = c;\n });\n return {\n token,\n cancel\n };\n }\n}\n\nexport default CancelToken;\n","'use strict';\n\nimport utils from './utils.js';\nimport bind from './helpers/bind.js';\nimport Axios from './core/Axios.js';\nimport mergeConfig from './core/mergeConfig.js';\nimport defaults from './defaults/index.js';\nimport formDataToJSON from './helpers/formDataToJSON.js';\nimport CanceledError from './cancel/CanceledError.js';\nimport CancelToken from './cancel/CancelToken.js';\nimport isCancel from './cancel/isCancel.js';\nimport {VERSION} from './env/data.js';\nimport toFormData from './helpers/toFormData.js';\nimport AxiosError from './core/AxiosError.js';\nimport spread from './helpers/spread.js';\nimport isAxiosError from './helpers/isAxiosError.js';\n\n/**\n * Create an instance of Axios\n *\n * @param {Object} defaultConfig The default config for the instance\n *\n * @returns {Axios} A new instance of Axios\n */\nfunction createInstance(defaultConfig) {\n const context = new Axios(defaultConfig);\n const instance = bind(Axios.prototype.request, context);\n\n // Copy axios.prototype to instance\n utils.extend(instance, Axios.prototype, context, {allOwnKeys: true});\n\n // Copy context to instance\n utils.extend(instance, context, null, {allOwnKeys: true});\n\n // Factory for creating new instances\n instance.create = function create(instanceConfig) {\n return createInstance(mergeConfig(defaultConfig, instanceConfig));\n };\n\n return instance;\n}\n\n// Create the default instance to be exported\nconst axios = createInstance(defaults);\n\n// Expose Axios class to allow class inheritance\naxios.Axios = Axios;\n\n// Expose Cancel & CancelToken\naxios.CanceledError = CanceledError;\naxios.CancelToken = CancelToken;\naxios.isCancel = isCancel;\naxios.VERSION = VERSION;\naxios.toFormData = toFormData;\n\n// Expose AxiosError class\naxios.AxiosError = AxiosError;\n\n// alias for CanceledError for backward compatibility\naxios.Cancel = axios.CanceledError;\n\n// Expose all/spread\naxios.all = function all(promises) {\n return Promise.all(promises);\n};\n\naxios.spread = spread;\n\n// Expose isAxiosError\naxios.isAxiosError = isAxiosError;\n\naxios.formToJSON = thing => {\n return formDataToJSON(utils.isHTMLForm(thing) ? new FormData(thing) : thing);\n};\n\nexport default axios\n","'use strict';\n\n/**\n * Syntactic sugar for invoking a function and expanding an array for arguments.\n *\n * Common use case would be to use `Function.prototype.apply`.\n *\n * ```js\n * function f(x, y, z) {}\n * var args = [1, 2, 3];\n * f.apply(null, args);\n * ```\n *\n * With `spread` this example can be re-written.\n *\n * ```js\n * spread(function(x, y, z) {})([1, 2, 3]);\n * ```\n *\n * @param {Function} callback\n *\n * @returns {Function}\n */\nexport default function spread(callback) {\n return function wrap(arr) {\n return callback.apply(null, arr);\n };\n}\n","'use strict';\n\nimport utils from './../utils.js';\n\n/**\n * Determines whether the payload is an error thrown by Axios\n *\n * @param {*} payload The value to test\n *\n * @returns {boolean} True if the payload is an error thrown by Axios, otherwise false\n */\nexport default function isAxiosError(payload) {\n return utils.isObject(payload) && (payload.isAxiosError === true);\n}\n"],"names":["bind","fn","thisArg","apply","arguments","cache","toString","Object","prototype","getPrototypeOf","kindOf","create","thing","str","call","slice","toLowerCase","kindOfTest","type","typeOfTest","_typeof","isArray","Array","isUndefined","isArrayBuffer","isString","isFunction","isNumber","isObject","isPlainObject","val","Symbol","toStringTag","iterator","isDate","isFile","isBlob","isFileList","isURLSearchParams","forEach","obj","i","l","_ref","length","undefined","_ref$allOwnKeys","allOwnKeys","key","keys","getOwnPropertyNames","len","TypedArray","isTypedArray","Uint8Array","isHTMLForm","hasOwnProperty","_ref3","prop","isRegExp","reduceDescriptors","reducer","descriptors","getOwnPropertyDescriptors","reducedDescriptors","descriptor","name","defineProperties","utils","isBuffer","constructor","isFormData","pattern","FormData","isArrayBufferView","ArrayBuffer","isView","buffer","isBoolean","isStream","pipe","merge","result","assignValue","extend","a","b","_ref2","trim","replace","stripBOM","content","charCodeAt","inherits","superConstructor","props","defineProperty","value","assign","toFlatObject","sourceObj","destObj","filter","propFilter","merged","endsWith","searchString","position","String","lastIndex","indexOf","toArray","arr","forEachEntry","next","done","pair","matchAll","regExp","matches","exec","push","hasOwnProp","freezeMethods","enumerable","writable","set","Error","toObjectSet","arrayOrString","delimiter","define","split","toCamelCase","m","p1","p2","toUpperCase","noop","toFiniteNumber","defaultValue","Number","isFinite","AxiosError","message","code","config","request","response","this","captureStackTrace","stack","toJSON","description","number","fileName","lineNumber","columnNumber","status","from","error","customProps","axiosError","cause","browser","self","window","isVisitable","removeBrackets","renderKey","path","dots","concat","map","token","join","predicates","test","toFormData","formData","options","TypeError","envFormData","metaTokens","indexes","option","source","visitor","defaultVisitor","useBlob","Blob","append","convertValue","toISOString","Buffer","JSON","stringify","some","isFlatArray","el","index","exposedHelpers","build","pop","encode","charMap","encodeURIComponent","match","AxiosURLSearchParams","params","_pairs","buildURL","url","serializedParams","_encode","serializeFn","serialize","hashmarkIndex","encoder","product","InterceptorManager","_classCallCheck","handlers","_createClass","fulfilled","rejected","synchronous","runWhen","id","h","transitionalDefaults","silentJSONParsing","forcedJSONParsing","clarifyTimeoutError","URLSearchParams$1","URLSearchParams","FormData$1","isStandardBrowserEnv","navigator","document","platform","isBrowser","classes","protocols","formDataToJSON","buildPath","target","isNumericKey","isLast","arrayToObject","entries","parsePropPath","write","expires","domain","secure","cookie","Date","toGMTString","read","RegExp","decodeURIComponent","remove","now","buildFullPath","baseURL","requestedURL","relativeURL","combineURLs","originURL","msie","userAgent","urlParsingNode","createElement","resolveURL","href","setAttribute","protocol","host","search","hash","hostname","port","pathname","charAt","location","requestURL","parsed","CanceledError","ERR_CANCELED","__CANCEL__","ignoreDuplicateOf","$internals","$defaults","normalizeHeader","header","normalizeValue","matchHeaderValue","context","findKey","_key","AxiosHeaders","headers","defaults","progressEventReducer","listener","isDownloadStream","bytesNotified","_speedometer","samplesCount","min","firstSampleTS","bytes","timestamps","head","tail","chunkLength","startedAt","bytesCount","passed","Math","round","speedometer","e","loaded","total","lengthComputable","progressBytes","rate","data","progress","estimated","xhrAdapter","Promise","resolve","reject","onCanceled","requestData","requestHeaders","normalize","responseType","cancelToken","unsubscribe","signal","removeEventListener","setContentType","XMLHttpRequest","auth","username","password","unescape","btoa","fullPath","onloadend","responseHeaders","getAllResponseHeaders","validateStatus","ERR_BAD_REQUEST","ERR_BAD_RESPONSE","floor","settle","err","responseText","statusText","open","method","paramsSerializer","timeout","onreadystatechange","readyState","responseURL","setTimeout","onabort","ECONNABORTED","onerror","ERR_NETWORK","ontimeout","timeoutErrorMessage","transitional","ETIMEDOUT","xsrfValue","withCredentials","isURLSameOrigin","xsrfCookieName","cookies","xsrfHeaderName","setRequestHeader","onDownloadProgress","addEventListener","onUploadProgress","upload","cancel","abort","subscribe","aborted","send","valueOrRewrite","rewrite","setHeader","_value","_header","_rewrite","lHeader","get","parser","tokens","tokensRE","parseTokens","has","matcher","delete","deleted","deleteHeader","clear","format","normalized","w","char","formatHeader","asStrings","rawHeaders","line","substring","accessor","accessors","defineAccessor","accessorName","methodName","arg1","arg2","arg3","configurable","buildAccessors","adapters","http","httpAdapter","xhr","adapters$1","nameOrAdapter","adapter","DEFAULT_CONTENT_TYPE","process","transformRequest","contentType","getContentType","hasJSONContentType","isObjectPayload","helpers","isNode","toURLEncodedForm","formSerializer","_FormData","env","rawValue","parse","stringifySafely","transformResponse","JSONRequested","strictJSONParsing","maxContentLength","maxBodyLength","common","Accept","transformData","fns","isCancel","throwIfCancellationRequested","throwIfRequested","dispatchRequest","then","reason","mergeConfig","config1","config2","getMergedValue","mergeDeepProperties","valueFromConfig2","defaultToConfig2","mergeDirectKeys","mergeMap","timeoutMessage","decompress","beforeRedirect","transport","httpAgent","httpsAgent","socketPath","responseEncoding","configValue","VERSION","validators","deprecatedWarnings","validators$1","validator","version","formatMessage","opt","desc","opts","ERR_DEPRECATED","console","warn","assertOptions","schema","allowUnknown","ERR_BAD_OPTION_VALUE","ERR_BAD_OPTION","Axios","instanceConfig","interceptors","configOrUrl","_config","defaultHeaders","requestInterceptorChain","synchronousRequestInterceptors","interceptor","unshift","promise","responseInterceptorChain","chain","newConfig","onFulfilled","onRejected","generateHTTPMethod","isForm","CancelToken","executor","resolvePromise","_listeners","onfulfilled","_resolve","splice","c","axios","createInstance","defaultConfig","instance","Cancel","all","promises","spread","callback","isAxiosError","payload","formToJSON"],"mappings":"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"} \ No newline at end of file
diff --git a/node_modules/axios/dist/esm/axios.js b/node_modules/axios/dist/esm/axios.js
new file mode 100644
index 0000000..b08fb87
--- /dev/null
+++ b/node_modules/axios/dist/esm/axios.js
@@ -0,0 +1,2950 @@
+// Axios v1.1.3 Copyright (c) 2022 Matt Zabriskie and contributors
+function bind(fn, thisArg) {
+ return function wrap() {
+ return fn.apply(thisArg, arguments);
+ };
+}
+
+// utils is a library of generic helper functions non-specific to axios
+
+const {toString} = Object.prototype;
+const {getPrototypeOf} = Object;
+
+const kindOf = (cache => thing => {
+ const str = toString.call(thing);
+ return cache[str] || (cache[str] = str.slice(8, -1).toLowerCase());
+})(Object.create(null));
+
+const kindOfTest = (type) => {
+ type = type.toLowerCase();
+ return (thing) => kindOf(thing) === type
+};
+
+const typeOfTest = type => thing => typeof thing === type;
+
+/**
+ * Determine if a value is an Array
+ *
+ * @param {Object} val The value to test
+ *
+ * @returns {boolean} True if value is an Array, otherwise false
+ */
+const {isArray} = Array;
+
+/**
+ * Determine if a value is undefined
+ *
+ * @param {*} val The value to test
+ *
+ * @returns {boolean} True if the value is undefined, otherwise false
+ */
+const isUndefined = typeOfTest('undefined');
+
+/**
+ * Determine if a value is a Buffer
+ *
+ * @param {*} val The value to test
+ *
+ * @returns {boolean} True if value is a Buffer, otherwise false
+ */
+function isBuffer(val) {
+ return val !== null && !isUndefined(val) && val.constructor !== null && !isUndefined(val.constructor)
+ && isFunction(val.constructor.isBuffer) && val.constructor.isBuffer(val);
+}
+
+/**
+ * Determine if a value is an ArrayBuffer
+ *
+ * @param {*} val The value to test
+ *
+ * @returns {boolean} True if value is an ArrayBuffer, otherwise false
+ */
+const isArrayBuffer = kindOfTest('ArrayBuffer');
+
+
+/**
+ * Determine if a value is a view on an ArrayBuffer
+ *
+ * @param {*} val The value to test
+ *
+ * @returns {boolean} True if value is a view on an ArrayBuffer, otherwise false
+ */
+function isArrayBufferView(val) {
+ let result;
+ if ((typeof ArrayBuffer !== 'undefined') && (ArrayBuffer.isView)) {
+ result = ArrayBuffer.isView(val);
+ } else {
+ result = (val) && (val.buffer) && (isArrayBuffer(val.buffer));
+ }
+ return result;
+}
+
+/**
+ * Determine if a value is a String
+ *
+ * @param {*} val The value to test
+ *
+ * @returns {boolean} True if value is a String, otherwise false
+ */
+const isString = typeOfTest('string');
+
+/**
+ * Determine if a value is a Function
+ *
+ * @param {*} val The value to test
+ * @returns {boolean} True if value is a Function, otherwise false
+ */
+const isFunction = typeOfTest('function');
+
+/**
+ * Determine if a value is a Number
+ *
+ * @param {*} val The value to test
+ *
+ * @returns {boolean} True if value is a Number, otherwise false
+ */
+const isNumber = typeOfTest('number');
+
+/**
+ * Determine if a value is an Object
+ *
+ * @param {*} thing The value to test
+ *
+ * @returns {boolean} True if value is an Object, otherwise false
+ */
+const isObject = (thing) => thing !== null && typeof thing === 'object';
+
+/**
+ * Determine if a value is a Boolean
+ *
+ * @param {*} thing The value to test
+ * @returns {boolean} True if value is a Boolean, otherwise false
+ */
+const isBoolean = thing => thing === true || thing === false;
+
+/**
+ * Determine if a value is a plain Object
+ *
+ * @param {*} val The value to test
+ *
+ * @returns {boolean} True if value is a plain Object, otherwise false
+ */
+const isPlainObject = (val) => {
+ if (kindOf(val) !== 'object') {
+ return false;
+ }
+
+ const prototype = getPrototypeOf(val);
+ return (prototype === null || prototype === Object.prototype || Object.getPrototypeOf(prototype) === null) && !(Symbol.toStringTag in val) && !(Symbol.iterator in val);
+};
+
+/**
+ * Determine if a value is a Date
+ *
+ * @param {*} val The value to test
+ *
+ * @returns {boolean} True if value is a Date, otherwise false
+ */
+const isDate = kindOfTest('Date');
+
+/**
+ * Determine if a value is a File
+ *
+ * @param {*} val The value to test
+ *
+ * @returns {boolean} True if value is a File, otherwise false
+ */
+const isFile = kindOfTest('File');
+
+/**
+ * Determine if a value is a Blob
+ *
+ * @param {*} val The value to test
+ *
+ * @returns {boolean} True if value is a Blob, otherwise false
+ */
+const isBlob = kindOfTest('Blob');
+
+/**
+ * Determine if a value is a FileList
+ *
+ * @param {*} val The value to test
+ *
+ * @returns {boolean} True if value is a File, otherwise false
+ */
+const isFileList = kindOfTest('FileList');
+
+/**
+ * Determine if a value is a Stream
+ *
+ * @param {*} val The value to test
+ *
+ * @returns {boolean} True if value is a Stream, otherwise false
+ */
+const isStream = (val) => isObject(val) && isFunction(val.pipe);
+
+/**
+ * Determine if a value is a FormData
+ *
+ * @param {*} thing The value to test
+ *
+ * @returns {boolean} True if value is an FormData, otherwise false
+ */
+const isFormData = (thing) => {
+ const pattern = '[object FormData]';
+ return thing && (
+ (typeof FormData === 'function' && thing instanceof FormData) ||
+ toString.call(thing) === pattern ||
+ (isFunction(thing.toString) && thing.toString() === pattern)
+ );
+};
+
+/**
+ * Determine if a value is a URLSearchParams object
+ *
+ * @param {*} val The value to test
+ *
+ * @returns {boolean} True if value is a URLSearchParams object, otherwise false
+ */
+const isURLSearchParams = kindOfTest('URLSearchParams');
+
+/**
+ * Trim excess whitespace off the beginning and end of a string
+ *
+ * @param {String} str The String to trim
+ *
+ * @returns {String} The String freed of excess whitespace
+ */
+const trim = (str) => str.trim ?
+ str.trim() : str.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, '');
+
+/**
+ * Iterate over an Array or an Object invoking a function for each item.
+ *
+ * If `obj` is an Array callback will be called passing
+ * the value, index, and complete array for each item.
+ *
+ * If 'obj' is an Object callback will be called passing
+ * the value, key, and complete object for each property.
+ *
+ * @param {Object|Array} obj The object to iterate
+ * @param {Function} fn The callback to invoke for each item
+ *
+ * @param {Boolean} [allOwnKeys = false]
+ * @returns {void}
+ */
+function forEach(obj, fn, {allOwnKeys = false} = {}) {
+ // Don't bother if no value provided
+ if (obj === null || typeof obj === 'undefined') {
+ return;
+ }
+
+ let i;
+ let l;
+
+ // Force an array if not already something iterable
+ if (typeof obj !== 'object') {
+ /*eslint no-param-reassign:0*/
+ obj = [obj];
+ }
+
+ if (isArray(obj)) {
+ // Iterate over array values
+ for (i = 0, l = obj.length; i < l; i++) {
+ fn.call(null, obj[i], i, obj);
+ }
+ } else {
+ // Iterate over object keys
+ const keys = allOwnKeys ? Object.getOwnPropertyNames(obj) : Object.keys(obj);
+ const len = keys.length;
+ let key;
+
+ for (i = 0; i < len; i++) {
+ key = keys[i];
+ fn.call(null, obj[key], key, obj);
+ }
+ }
+}
+
+/**
+ * Accepts varargs expecting each argument to be an object, then
+ * immutably merges the properties of each object and returns result.
+ *
+ * When multiple objects contain the same key the later object in
+ * the arguments list will take precedence.
+ *
+ * Example:
+ *
+ * ```js
+ * var result = merge({foo: 123}, {foo: 456});
+ * console.log(result.foo); // outputs 456
+ * ```
+ *
+ * @param {Object} obj1 Object to merge
+ *
+ * @returns {Object} Result of all merge properties
+ */
+function merge(/* obj1, obj2, obj3, ... */) {
+ const result = {};
+ const assignValue = (val, key) => {
+ if (isPlainObject(result[key]) && isPlainObject(val)) {
+ result[key] = merge(result[key], val);
+ } else if (isPlainObject(val)) {
+ result[key] = merge({}, val);
+ } else if (isArray(val)) {
+ result[key] = val.slice();
+ } else {
+ result[key] = val;
+ }
+ };
+
+ for (let i = 0, l = arguments.length; i < l; i++) {
+ arguments[i] && forEach(arguments[i], assignValue);
+ }
+ return result;
+}
+
+/**
+ * Extends object a by mutably adding to it the properties of object b.
+ *
+ * @param {Object} a The object to be extended
+ * @param {Object} b The object to copy properties from
+ * @param {Object} thisArg The object to bind function to
+ *
+ * @param {Boolean} [allOwnKeys]
+ * @returns {Object} The resulting value of object a
+ */
+const extend = (a, b, thisArg, {allOwnKeys}= {}) => {
+ forEach(b, (val, key) => {
+ if (thisArg && isFunction(val)) {
+ a[key] = bind(val, thisArg);
+ } else {
+ a[key] = val;
+ }
+ }, {allOwnKeys});
+ return a;
+};
+
+/**
+ * Remove byte order marker. This catches EF BB BF (the UTF-8 BOM)
+ *
+ * @param {string} content with BOM
+ *
+ * @returns {string} content value without BOM
+ */
+const stripBOM = (content) => {
+ if (content.charCodeAt(0) === 0xFEFF) {
+ content = content.slice(1);
+ }
+ return content;
+};
+
+/**
+ * Inherit the prototype methods from one constructor into another
+ * @param {function} constructor
+ * @param {function} superConstructor
+ * @param {object} [props]
+ * @param {object} [descriptors]
+ *
+ * @returns {void}
+ */
+const inherits = (constructor, superConstructor, props, descriptors) => {
+ constructor.prototype = Object.create(superConstructor.prototype, descriptors);
+ constructor.prototype.constructor = constructor;
+ Object.defineProperty(constructor, 'super', {
+ value: superConstructor.prototype
+ });
+ props && Object.assign(constructor.prototype, props);
+};
+
+/**
+ * Resolve object with deep prototype chain to a flat object
+ * @param {Object} sourceObj source object
+ * @param {Object} [destObj]
+ * @param {Function|Boolean} [filter]
+ * @param {Function} [propFilter]
+ *
+ * @returns {Object}
+ */
+const toFlatObject = (sourceObj, destObj, filter, propFilter) => {
+ let props;
+ let i;
+ let prop;
+ const merged = {};
+
+ destObj = destObj || {};
+ // eslint-disable-next-line no-eq-null,eqeqeq
+ if (sourceObj == null) return destObj;
+
+ do {
+ props = Object.getOwnPropertyNames(sourceObj);
+ i = props.length;
+ while (i-- > 0) {
+ prop = props[i];
+ if ((!propFilter || propFilter(prop, sourceObj, destObj)) && !merged[prop]) {
+ destObj[prop] = sourceObj[prop];
+ merged[prop] = true;
+ }
+ }
+ sourceObj = filter !== false && getPrototypeOf(sourceObj);
+ } while (sourceObj && (!filter || filter(sourceObj, destObj)) && sourceObj !== Object.prototype);
+
+ return destObj;
+};
+
+/**
+ * Determines whether a string ends with the characters of a specified string
+ *
+ * @param {String} str
+ * @param {String} searchString
+ * @param {Number} [position= 0]
+ *
+ * @returns {boolean}
+ */
+const endsWith = (str, searchString, position) => {
+ str = String(str);
+ if (position === undefined || position > str.length) {
+ position = str.length;
+ }
+ position -= searchString.length;
+ const lastIndex = str.indexOf(searchString, position);
+ return lastIndex !== -1 && lastIndex === position;
+};
+
+
+/**
+ * Returns new array from array like object or null if failed
+ *
+ * @param {*} [thing]
+ *
+ * @returns {?Array}
+ */
+const toArray = (thing) => {
+ if (!thing) return null;
+ if (isArray(thing)) return thing;
+ let i = thing.length;
+ if (!isNumber(i)) return null;
+ const arr = new Array(i);
+ while (i-- > 0) {
+ arr[i] = thing[i];
+ }
+ return arr;
+};
+
+/**
+ * Checking if the Uint8Array exists and if it does, it returns a function that checks if the
+ * thing passed in is an instance of Uint8Array
+ *
+ * @param {TypedArray}
+ *
+ * @returns {Array}
+ */
+// eslint-disable-next-line func-names
+const isTypedArray = (TypedArray => {
+ // eslint-disable-next-line func-names
+ return thing => {
+ return TypedArray && thing instanceof TypedArray;
+ };
+})(typeof Uint8Array !== 'undefined' && getPrototypeOf(Uint8Array));
+
+/**
+ * For each entry in the object, call the function with the key and value.
+ *
+ * @param {Object<any, any>} obj - The object to iterate over.
+ * @param {Function} fn - The function to call for each entry.
+ *
+ * @returns {void}
+ */
+const forEachEntry = (obj, fn) => {
+ const generator = obj && obj[Symbol.iterator];
+
+ const iterator = generator.call(obj);
+
+ let result;
+
+ while ((result = iterator.next()) && !result.done) {
+ const pair = result.value;
+ fn.call(obj, pair[0], pair[1]);
+ }
+};
+
+/**
+ * It takes a regular expression and a string, and returns an array of all the matches
+ *
+ * @param {string} regExp - The regular expression to match against.
+ * @param {string} str - The string to search.
+ *
+ * @returns {Array<boolean>}
+ */
+const matchAll = (regExp, str) => {
+ let matches;
+ const arr = [];
+
+ while ((matches = regExp.exec(str)) !== null) {
+ arr.push(matches);
+ }
+
+ return arr;
+};
+
+/* Checking if the kindOfTest function returns true when passed an HTMLFormElement. */
+const isHTMLForm = kindOfTest('HTMLFormElement');
+
+const toCamelCase = str => {
+ return str.toLowerCase().replace(/[_-\s]([a-z\d])(\w*)/g,
+ function replacer(m, p1, p2) {
+ return p1.toUpperCase() + p2;
+ }
+ );
+};
+
+/* Creating a function that will check if an object has a property. */
+const hasOwnProperty = (({hasOwnProperty}) => (obj, prop) => hasOwnProperty.call(obj, prop))(Object.prototype);
+
+/**
+ * Determine if a value is a RegExp object
+ *
+ * @param {*} val The value to test
+ *
+ * @returns {boolean} True if value is a RegExp object, otherwise false
+ */
+const isRegExp = kindOfTest('RegExp');
+
+const reduceDescriptors = (obj, reducer) => {
+ const descriptors = Object.getOwnPropertyDescriptors(obj);
+ const reducedDescriptors = {};
+
+ forEach(descriptors, (descriptor, name) => {
+ if (reducer(descriptor, name, obj) !== false) {
+ reducedDescriptors[name] = descriptor;
+ }
+ });
+
+ Object.defineProperties(obj, reducedDescriptors);
+};
+
+/**
+ * Makes all methods read-only
+ * @param {Object} obj
+ */
+
+const freezeMethods = (obj) => {
+ reduceDescriptors(obj, (descriptor, name) => {
+ const value = obj[name];
+
+ if (!isFunction(value)) return;
+
+ descriptor.enumerable = false;
+
+ if ('writable' in descriptor) {
+ descriptor.writable = false;
+ return;
+ }
+
+ if (!descriptor.set) {
+ descriptor.set = () => {
+ throw Error('Can not read-only method \'' + name + '\'');
+ };
+ }
+ });
+};
+
+const toObjectSet = (arrayOrString, delimiter) => {
+ const obj = {};
+
+ const define = (arr) => {
+ arr.forEach(value => {
+ obj[value] = true;
+ });
+ };
+
+ isArray(arrayOrString) ? define(arrayOrString) : define(String(arrayOrString).split(delimiter));
+
+ return obj;
+};
+
+const noop = () => {};
+
+const toFiniteNumber = (value, defaultValue) => {
+ value = +value;
+ return Number.isFinite(value) ? value : defaultValue;
+};
+
+const utils = {
+ isArray,
+ isArrayBuffer,
+ isBuffer,
+ isFormData,
+ isArrayBufferView,
+ isString,
+ isNumber,
+ isBoolean,
+ isObject,
+ isPlainObject,
+ isUndefined,
+ isDate,
+ isFile,
+ isBlob,
+ isRegExp,
+ isFunction,
+ isStream,
+ isURLSearchParams,
+ isTypedArray,
+ isFileList,
+ forEach,
+ merge,
+ extend,
+ trim,
+ stripBOM,
+ inherits,
+ toFlatObject,
+ kindOf,
+ kindOfTest,
+ endsWith,
+ toArray,
+ forEachEntry,
+ matchAll,
+ isHTMLForm,
+ hasOwnProperty,
+ hasOwnProp: hasOwnProperty, // an alias to avoid ESLint no-prototype-builtins detection
+ reduceDescriptors,
+ freezeMethods,
+ toObjectSet,
+ toCamelCase,
+ noop,
+ toFiniteNumber
+};
+
+/**
+ * Create an Error with the specified message, config, error code, request and response.
+ *
+ * @param {string} message The error message.
+ * @param {string} [code] The error code (for example, 'ECONNABORTED').
+ * @param {Object} [config] The config.
+ * @param {Object} [request] The request.
+ * @param {Object} [response] The response.
+ *
+ * @returns {Error} The created error.
+ */
+function AxiosError(message, code, config, request, response) {
+ Error.call(this);
+
+ if (Error.captureStackTrace) {
+ Error.captureStackTrace(this, this.constructor);
+ } else {
+ this.stack = (new Error()).stack;
+ }
+
+ this.message = message;
+ this.name = 'AxiosError';
+ code && (this.code = code);
+ config && (this.config = config);
+ request && (this.request = request);
+ response && (this.response = response);
+}
+
+utils.inherits(AxiosError, Error, {
+ toJSON: function toJSON() {
+ return {
+ // Standard
+ message: this.message,
+ name: this.name,
+ // Microsoft
+ description: this.description,
+ number: this.number,
+ // Mozilla
+ fileName: this.fileName,
+ lineNumber: this.lineNumber,
+ columnNumber: this.columnNumber,
+ stack: this.stack,
+ // Axios
+ config: this.config,
+ code: this.code,
+ status: this.response && this.response.status ? this.response.status : null
+ };
+ }
+});
+
+const prototype$1 = AxiosError.prototype;
+const descriptors = {};
+
+[
+ 'ERR_BAD_OPTION_VALUE',
+ 'ERR_BAD_OPTION',
+ 'ECONNABORTED',
+ 'ETIMEDOUT',
+ 'ERR_NETWORK',
+ 'ERR_FR_TOO_MANY_REDIRECTS',
+ 'ERR_DEPRECATED',
+ 'ERR_BAD_RESPONSE',
+ 'ERR_BAD_REQUEST',
+ 'ERR_CANCELED',
+ 'ERR_NOT_SUPPORT',
+ 'ERR_INVALID_URL'
+// eslint-disable-next-line func-names
+].forEach(code => {
+ descriptors[code] = {value: code};
+});
+
+Object.defineProperties(AxiosError, descriptors);
+Object.defineProperty(prototype$1, 'isAxiosError', {value: true});
+
+// eslint-disable-next-line func-names
+AxiosError.from = (error, code, config, request, response, customProps) => {
+ const axiosError = Object.create(prototype$1);
+
+ utils.toFlatObject(error, axiosError, function filter(obj) {
+ return obj !== Error.prototype;
+ }, prop => {
+ return prop !== 'isAxiosError';
+ });
+
+ AxiosError.call(axiosError, error.message, code, config, request, response);
+
+ axiosError.cause = error;
+
+ axiosError.name = error.name;
+
+ customProps && Object.assign(axiosError, customProps);
+
+ return axiosError;
+};
+
+/* eslint-env browser */
+var browser = typeof self == 'object' ? self.FormData : window.FormData;
+
+/**
+ * Determines if the given thing is a array or js object.
+ *
+ * @param {string} thing - The object or array to be visited.
+ *
+ * @returns {boolean}
+ */
+function isVisitable(thing) {
+ return utils.isPlainObject(thing) || utils.isArray(thing);
+}
+
+/**
+ * It removes the brackets from the end of a string
+ *
+ * @param {string} key - The key of the parameter.
+ *
+ * @returns {string} the key without the brackets.
+ */
+function removeBrackets(key) {
+ return utils.endsWith(key, '[]') ? key.slice(0, -2) : key;
+}
+
+/**
+ * It takes a path, a key, and a boolean, and returns a string
+ *
+ * @param {string} path - The path to the current key.
+ * @param {string} key - The key of the current object being iterated over.
+ * @param {string} dots - If true, the key will be rendered with dots instead of brackets.
+ *
+ * @returns {string} The path to the current key.
+ */
+function renderKey(path, key, dots) {
+ if (!path) return key;
+ return path.concat(key).map(function each(token, i) {
+ // eslint-disable-next-line no-param-reassign
+ token = removeBrackets(token);
+ return !dots && i ? '[' + token + ']' : token;
+ }).join(dots ? '.' : '');
+}
+
+/**
+ * If the array is an array and none of its elements are visitable, then it's a flat array.
+ *
+ * @param {Array<any>} arr - The array to check
+ *
+ * @returns {boolean}
+ */
+function isFlatArray(arr) {
+ return utils.isArray(arr) && !arr.some(isVisitable);
+}
+
+const predicates = utils.toFlatObject(utils, {}, null, function filter(prop) {
+ return /^is[A-Z]/.test(prop);
+});
+
+/**
+ * If the thing is a FormData object, return true, otherwise return false.
+ *
+ * @param {unknown} thing - The thing to check.
+ *
+ * @returns {boolean}
+ */
+function isSpecCompliant(thing) {
+ return thing && utils.isFunction(thing.append) && thing[Symbol.toStringTag] === 'FormData' && thing[Symbol.iterator];
+}
+
+/**
+ * Convert a data object to FormData
+ *
+ * @param {Object} obj
+ * @param {?Object} [formData]
+ * @param {?Object} [options]
+ * @param {Function} [options.visitor]
+ * @param {Boolean} [options.metaTokens = true]
+ * @param {Boolean} [options.dots = false]
+ * @param {?Boolean} [options.indexes = false]
+ *
+ * @returns {Object}
+ **/
+
+/**
+ * It converts an object into a FormData object
+ *
+ * @param {Object<any, any>} obj - The object to convert to form data.
+ * @param {string} formData - The FormData object to append to.
+ * @param {Object<string, any>} options
+ *
+ * @returns
+ */
+function toFormData(obj, formData, options) {
+ if (!utils.isObject(obj)) {
+ throw new TypeError('target must be an object');
+ }
+
+ // eslint-disable-next-line no-param-reassign
+ formData = formData || new (browser || FormData)();
+
+ // eslint-disable-next-line no-param-reassign
+ options = utils.toFlatObject(options, {
+ metaTokens: true,
+ dots: false,
+ indexes: false
+ }, false, function defined(option, source) {
+ // eslint-disable-next-line no-eq-null,eqeqeq
+ return !utils.isUndefined(source[option]);
+ });
+
+ const metaTokens = options.metaTokens;
+ // eslint-disable-next-line no-use-before-define
+ const visitor = options.visitor || defaultVisitor;
+ const dots = options.dots;
+ const indexes = options.indexes;
+ const _Blob = options.Blob || typeof Blob !== 'undefined' && Blob;
+ const useBlob = _Blob && isSpecCompliant(formData);
+
+ if (!utils.isFunction(visitor)) {
+ throw new TypeError('visitor must be a function');
+ }
+
+ function convertValue(value) {
+ if (value === null) return '';
+
+ if (utils.isDate(value)) {
+ return value.toISOString();
+ }
+
+ if (!useBlob && utils.isBlob(value)) {
+ throw new AxiosError('Blob is not supported. Use a Buffer instead.');
+ }
+
+ if (utils.isArrayBuffer(value) || utils.isTypedArray(value)) {
+ return useBlob && typeof Blob === 'function' ? new Blob([value]) : Buffer.from(value);
+ }
+
+ return value;
+ }
+
+ /**
+ * Default visitor.
+ *
+ * @param {*} value
+ * @param {String|Number} key
+ * @param {Array<String|Number>} path
+ * @this {FormData}
+ *
+ * @returns {boolean} return true to visit the each prop of the value recursively
+ */
+ function defaultVisitor(value, key, path) {
+ let arr = value;
+
+ if (value && !path && typeof value === 'object') {
+ if (utils.endsWith(key, '{}')) {
+ // eslint-disable-next-line no-param-reassign
+ key = metaTokens ? key : key.slice(0, -2);
+ // eslint-disable-next-line no-param-reassign
+ value = JSON.stringify(value);
+ } else if (
+ (utils.isArray(value) && isFlatArray(value)) ||
+ (utils.isFileList(value) || utils.endsWith(key, '[]') && (arr = utils.toArray(value))
+ )) {
+ // eslint-disable-next-line no-param-reassign
+ key = removeBrackets(key);
+
+ arr.forEach(function each(el, index) {
+ !(utils.isUndefined(el) || el === null) && formData.append(
+ // eslint-disable-next-line no-nested-ternary
+ indexes === true ? renderKey([key], index, dots) : (indexes === null ? key : key + '[]'),
+ convertValue(el)
+ );
+ });
+ return false;
+ }
+ }
+
+ if (isVisitable(value)) {
+ return true;
+ }
+
+ formData.append(renderKey(path, key, dots), convertValue(value));
+
+ return false;
+ }
+
+ const stack = [];
+
+ const exposedHelpers = Object.assign(predicates, {
+ defaultVisitor,
+ convertValue,
+ isVisitable
+ });
+
+ function build(value, path) {
+ if (utils.isUndefined(value)) return;
+
+ if (stack.indexOf(value) !== -1) {
+ throw Error('Circular reference detected in ' + path.join('.'));
+ }
+
+ stack.push(value);
+
+ utils.forEach(value, function each(el, key) {
+ const result = !(utils.isUndefined(el) || el === null) && visitor.call(
+ formData, el, utils.isString(key) ? key.trim() : key, path, exposedHelpers
+ );
+
+ if (result === true) {
+ build(el, path ? path.concat(key) : [key]);
+ }
+ });
+
+ stack.pop();
+ }
+
+ if (!utils.isObject(obj)) {
+ throw new TypeError('data must be an object');
+ }
+
+ build(obj);
+
+ return formData;
+}
+
+/**
+ * It encodes a string by replacing all characters that are not in the unreserved set with
+ * their percent-encoded equivalents
+ *
+ * @param {string} str - The string to encode.
+ *
+ * @returns {string} The encoded string.
+ */
+function encode$1(str) {
+ const charMap = {
+ '!': '%21',
+ "'": '%27',
+ '(': '%28',
+ ')': '%29',
+ '~': '%7E',
+ '%20': '+',
+ '%00': '\x00'
+ };
+ return encodeURIComponent(str).replace(/[!'()~]|%20|%00/g, function replacer(match) {
+ return charMap[match];
+ });
+}
+
+/**
+ * It takes a params object and converts it to a FormData object
+ *
+ * @param {Object<string, any>} params - The parameters to be converted to a FormData object.
+ * @param {Object<string, any>} options - The options object passed to the Axios constructor.
+ *
+ * @returns {void}
+ */
+function AxiosURLSearchParams(params, options) {
+ this._pairs = [];
+
+ params && toFormData(params, this, options);
+}
+
+const prototype = AxiosURLSearchParams.prototype;
+
+prototype.append = function append(name, value) {
+ this._pairs.push([name, value]);
+};
+
+prototype.toString = function toString(encoder) {
+ const _encode = encoder ? function(value) {
+ return encoder.call(this, value, encode$1);
+ } : encode$1;
+
+ return this._pairs.map(function each(pair) {
+ return _encode(pair[0]) + '=' + _encode(pair[1]);
+ }, '').join('&');
+};
+
+/**
+ * It replaces all instances of the characters `:`, `$`, `,`, `+`, `[`, and `]` with their
+ * URI encoded counterparts
+ *
+ * @param {string} val The value to be encoded.
+ *
+ * @returns {string} The encoded value.
+ */
+function encode(val) {
+ return encodeURIComponent(val).
+ replace(/%3A/gi, ':').
+ replace(/%24/g, '$').
+ replace(/%2C/gi, ',').
+ replace(/%20/g, '+').
+ replace(/%5B/gi, '[').
+ replace(/%5D/gi, ']');
+}
+
+/**
+ * Build a URL by appending params to the end
+ *
+ * @param {string} url The base of the url (e.g., http://www.google.com)
+ * @param {object} [params] The params to be appended
+ * @param {?object} options
+ *
+ * @returns {string} The formatted url
+ */
+function buildURL(url, params, options) {
+ /*eslint no-param-reassign:0*/
+ if (!params) {
+ return url;
+ }
+
+ const _encode = options && options.encode || encode;
+
+ const serializeFn = options && options.serialize;
+
+ let serializedParams;
+
+ if (serializeFn) {
+ serializedParams = serializeFn(params, options);
+ } else {
+ serializedParams = utils.isURLSearchParams(params) ?
+ params.toString() :
+ new AxiosURLSearchParams(params, options).toString(_encode);
+ }
+
+ if (serializedParams) {
+ const hashmarkIndex = url.indexOf("#");
+
+ if (hashmarkIndex !== -1) {
+ url = url.slice(0, hashmarkIndex);
+ }
+ url += (url.indexOf('?') === -1 ? '?' : '&') + serializedParams;
+ }
+
+ return url;
+}
+
+class InterceptorManager {
+ constructor() {
+ this.handlers = [];
+ }
+
+ /**
+ * Add a new interceptor to the stack
+ *
+ * @param {Function} fulfilled The function to handle `then` for a `Promise`
+ * @param {Function} rejected The function to handle `reject` for a `Promise`
+ *
+ * @return {Number} An ID used to remove interceptor later
+ */
+ use(fulfilled, rejected, options) {
+ this.handlers.push({
+ fulfilled,
+ rejected,
+ synchronous: options ? options.synchronous : false,
+ runWhen: options ? options.runWhen : null
+ });
+ return this.handlers.length - 1;
+ }
+
+ /**
+ * Remove an interceptor from the stack
+ *
+ * @param {Number} id The ID that was returned by `use`
+ *
+ * @returns {Boolean} `true` if the interceptor was removed, `false` otherwise
+ */
+ eject(id) {
+ if (this.handlers[id]) {
+ this.handlers[id] = null;
+ }
+ }
+
+ /**
+ * Clear all interceptors from the stack
+ *
+ * @returns {void}
+ */
+ clear() {
+ if (this.handlers) {
+ this.handlers = [];
+ }
+ }
+
+ /**
+ * Iterate over all the registered interceptors
+ *
+ * This method is particularly useful for skipping over any
+ * interceptors that may have become `null` calling `eject`.
+ *
+ * @param {Function} fn The function to call for each interceptor
+ *
+ * @returns {void}
+ */
+ forEach(fn) {
+ utils.forEach(this.handlers, function forEachHandler(h) {
+ if (h !== null) {
+ fn(h);
+ }
+ });
+ }
+}
+
+const transitionalDefaults = {
+ silentJSONParsing: true,
+ forcedJSONParsing: true,
+ clarifyTimeoutError: false
+};
+
+const URLSearchParams$1 = typeof URLSearchParams !== 'undefined' ? URLSearchParams : AxiosURLSearchParams;
+
+const FormData$1 = FormData;
+
+/**
+ * Determine if we're running in a standard browser environment
+ *
+ * This allows axios to run in a web worker, and react-native.
+ * Both environments support XMLHttpRequest, but not fully standard globals.
+ *
+ * web workers:
+ * typeof window -> undefined
+ * typeof document -> undefined
+ *
+ * react-native:
+ * navigator.product -> 'ReactNative'
+ * nativescript
+ * navigator.product -> 'NativeScript' or 'NS'
+ *
+ * @returns {boolean}
+ */
+const isStandardBrowserEnv = (() => {
+ let product;
+ if (typeof navigator !== 'undefined' && (
+ (product = navigator.product) === 'ReactNative' ||
+ product === 'NativeScript' ||
+ product === 'NS')
+ ) {
+ return false;
+ }
+
+ return typeof window !== 'undefined' && typeof document !== 'undefined';
+})();
+
+const platform = {
+ isBrowser: true,
+ classes: {
+ URLSearchParams: URLSearchParams$1,
+ FormData: FormData$1,
+ Blob
+ },
+ isStandardBrowserEnv,
+ protocols: ['http', 'https', 'file', 'blob', 'url', 'data']
+};
+
+function toURLEncodedForm(data, options) {
+ return toFormData(data, new platform.classes.URLSearchParams(), Object.assign({
+ visitor: function(value, key, path, helpers) {
+ if (platform.isNode && utils.isBuffer(value)) {
+ this.append(key, value.toString('base64'));
+ return false;
+ }
+
+ return helpers.defaultVisitor.apply(this, arguments);
+ }
+ }, options));
+}
+
+/**
+ * It takes a string like `foo[x][y][z]` and returns an array like `['foo', 'x', 'y', 'z']
+ *
+ * @param {string} name - The name of the property to get.
+ *
+ * @returns An array of strings.
+ */
+function parsePropPath(name) {
+ // foo[x][y][z]
+ // foo.x.y.z
+ // foo-x-y-z
+ // foo x y z
+ return utils.matchAll(/\w+|\[(\w*)]/g, name).map(match => {
+ return match[0] === '[]' ? '' : match[1] || match[0];
+ });
+}
+
+/**
+ * Convert an array to an object.
+ *
+ * @param {Array<any>} arr - The array to convert to an object.
+ *
+ * @returns An object with the same keys and values as the array.
+ */
+function arrayToObject(arr) {
+ const obj = {};
+ const keys = Object.keys(arr);
+ let i;
+ const len = keys.length;
+ let key;
+ for (i = 0; i < len; i++) {
+ key = keys[i];
+ obj[key] = arr[key];
+ }
+ return obj;
+}
+
+/**
+ * It takes a FormData object and returns a JavaScript object
+ *
+ * @param {string} formData The FormData object to convert to JSON.
+ *
+ * @returns {Object<string, any> | null} The converted object.
+ */
+function formDataToJSON(formData) {
+ function buildPath(path, value, target, index) {
+ let name = path[index++];
+ const isNumericKey = Number.isFinite(+name);
+ const isLast = index >= path.length;
+ name = !name && utils.isArray(target) ? target.length : name;
+
+ if (isLast) {
+ if (utils.hasOwnProp(target, name)) {
+ target[name] = [target[name], value];
+ } else {
+ target[name] = value;
+ }
+
+ return !isNumericKey;
+ }
+
+ if (!target[name] || !utils.isObject(target[name])) {
+ target[name] = [];
+ }
+
+ const result = buildPath(path, value, target[name], index);
+
+ if (result && utils.isArray(target[name])) {
+ target[name] = arrayToObject(target[name]);
+ }
+
+ return !isNumericKey;
+ }
+
+ if (utils.isFormData(formData) && utils.isFunction(formData.entries)) {
+ const obj = {};
+
+ utils.forEachEntry(formData, (name, value) => {
+ buildPath(parsePropPath(name), value, obj, 0);
+ });
+
+ return obj;
+ }
+
+ return null;
+}
+
+/**
+ * Resolve or reject a Promise based on response status.
+ *
+ * @param {Function} resolve A function that resolves the promise.
+ * @param {Function} reject A function that rejects the promise.
+ * @param {object} response The response.
+ *
+ * @returns {object} The response.
+ */
+function settle(resolve, reject, response) {
+ const validateStatus = response.config.validateStatus;
+ if (!response.status || !validateStatus || validateStatus(response.status)) {
+ resolve(response);
+ } else {
+ reject(new AxiosError(
+ 'Request failed with status code ' + response.status,
+ [AxiosError.ERR_BAD_REQUEST, AxiosError.ERR_BAD_RESPONSE][Math.floor(response.status / 100) - 4],
+ response.config,
+ response.request,
+ response
+ ));
+ }
+}
+
+const cookies = platform.isStandardBrowserEnv ?
+
+// Standard browser envs support document.cookie
+ (function standardBrowserEnv() {
+ return {
+ write: function write(name, value, expires, path, domain, secure) {
+ const cookie = [];
+ cookie.push(name + '=' + encodeURIComponent(value));
+
+ if (utils.isNumber(expires)) {
+ cookie.push('expires=' + new Date(expires).toGMTString());
+ }
+
+ if (utils.isString(path)) {
+ cookie.push('path=' + path);
+ }
+
+ if (utils.isString(domain)) {
+ cookie.push('domain=' + domain);
+ }
+
+ if (secure === true) {
+ cookie.push('secure');
+ }
+
+ document.cookie = cookie.join('; ');
+ },
+
+ read: function read(name) {
+ const match = document.cookie.match(new RegExp('(^|;\\s*)(' + name + ')=([^;]*)'));
+ return (match ? decodeURIComponent(match[3]) : null);
+ },
+
+ remove: function remove(name) {
+ this.write(name, '', Date.now() - 86400000);
+ }
+ };
+ })() :
+
+// Non standard browser env (web workers, react-native) lack needed support.
+ (function nonStandardBrowserEnv() {
+ return {
+ write: function write() {},
+ read: function read() { return null; },
+ remove: function remove() {}
+ };
+ })();
+
+/**
+ * Determines whether the specified URL is absolute
+ *
+ * @param {string} url The URL to test
+ *
+ * @returns {boolean} True if the specified URL is absolute, otherwise false
+ */
+function isAbsoluteURL(url) {
+ // A URL is considered absolute if it begins with "<scheme>://" or "//" (protocol-relative URL).
+ // RFC 3986 defines scheme name as a sequence of characters beginning with a letter and followed
+ // by any combination of letters, digits, plus, period, or hyphen.
+ return /^([a-z][a-z\d+\-.]*:)?\/\//i.test(url);
+}
+
+/**
+ * Creates a new URL by combining the specified URLs
+ *
+ * @param {string} baseURL The base URL
+ * @param {string} relativeURL The relative URL
+ *
+ * @returns {string} The combined URL
+ */
+function combineURLs(baseURL, relativeURL) {
+ return relativeURL
+ ? baseURL.replace(/\/+$/, '') + '/' + relativeURL.replace(/^\/+/, '')
+ : baseURL;
+}
+
+/**
+ * Creates a new URL by combining the baseURL with the requestedURL,
+ * only when the requestedURL is not already an absolute URL.
+ * If the requestURL is absolute, this function returns the requestedURL untouched.
+ *
+ * @param {string} baseURL The base URL
+ * @param {string} requestedURL Absolute or relative URL to combine
+ *
+ * @returns {string} The combined full path
+ */
+function buildFullPath(baseURL, requestedURL) {
+ if (baseURL && !isAbsoluteURL(requestedURL)) {
+ return combineURLs(baseURL, requestedURL);
+ }
+ return requestedURL;
+}
+
+const isURLSameOrigin = platform.isStandardBrowserEnv ?
+
+// Standard browser envs have full support of the APIs needed to test
+// whether the request URL is of the same origin as current location.
+ (function standardBrowserEnv() {
+ const msie = /(msie|trident)/i.test(navigator.userAgent);
+ const urlParsingNode = document.createElement('a');
+ let originURL;
+
+ /**
+ * Parse a URL to discover it's components
+ *
+ * @param {String} url The URL to be parsed
+ * @returns {Object}
+ */
+ function resolveURL(url) {
+ let href = url;
+
+ if (msie) {
+ // IE needs attribute set twice to normalize properties
+ urlParsingNode.setAttribute('href', href);
+ href = urlParsingNode.href;
+ }
+
+ urlParsingNode.setAttribute('href', href);
+
+ // urlParsingNode provides the UrlUtils interface - http://url.spec.whatwg.org/#urlutils
+ return {
+ href: urlParsingNode.href,
+ protocol: urlParsingNode.protocol ? urlParsingNode.protocol.replace(/:$/, '') : '',
+ host: urlParsingNode.host,
+ search: urlParsingNode.search ? urlParsingNode.search.replace(/^\?/, '') : '',
+ hash: urlParsingNode.hash ? urlParsingNode.hash.replace(/^#/, '') : '',
+ hostname: urlParsingNode.hostname,
+ port: urlParsingNode.port,
+ pathname: (urlParsingNode.pathname.charAt(0) === '/') ?
+ urlParsingNode.pathname :
+ '/' + urlParsingNode.pathname
+ };
+ }
+
+ originURL = resolveURL(window.location.href);
+
+ /**
+ * Determine if a URL shares the same origin as the current location
+ *
+ * @param {String} requestURL The URL to test
+ * @returns {boolean} True if URL shares the same origin, otherwise false
+ */
+ return function isURLSameOrigin(requestURL) {
+ const parsed = (utils.isString(requestURL)) ? resolveURL(requestURL) : requestURL;
+ return (parsed.protocol === originURL.protocol &&
+ parsed.host === originURL.host);
+ };
+ })() :
+
+ // Non standard browser envs (web workers, react-native) lack needed support.
+ (function nonStandardBrowserEnv() {
+ return function isURLSameOrigin() {
+ return true;
+ };
+ })();
+
+/**
+ * A `CanceledError` is an object that is thrown when an operation is canceled.
+ *
+ * @param {string=} message The message.
+ * @param {Object=} config The config.
+ * @param {Object=} request The request.
+ *
+ * @returns {CanceledError} The created error.
+ */
+function CanceledError(message, config, request) {
+ // eslint-disable-next-line no-eq-null,eqeqeq
+ AxiosError.call(this, message == null ? 'canceled' : message, AxiosError.ERR_CANCELED, config, request);
+ this.name = 'CanceledError';
+}
+
+utils.inherits(CanceledError, AxiosError, {
+ __CANCEL__: true
+});
+
+function parseProtocol(url) {
+ const match = /^([-+\w]{1,25})(:?\/\/|:)/.exec(url);
+ return match && match[1] || '';
+}
+
+// RawAxiosHeaders whose duplicates are ignored by node
+// c.f. https://nodejs.org/api/http.html#http_message_headers
+const ignoreDuplicateOf = utils.toObjectSet([
+ 'age', 'authorization', 'content-length', 'content-type', 'etag',
+ 'expires', 'from', 'host', 'if-modified-since', 'if-unmodified-since',
+ 'last-modified', 'location', 'max-forwards', 'proxy-authorization',
+ 'referer', 'retry-after', 'user-agent'
+]);
+
+/**
+ * Parse headers into an object
+ *
+ * ```
+ * Date: Wed, 27 Aug 2014 08:58:49 GMT
+ * Content-Type: application/json
+ * Connection: keep-alive
+ * Transfer-Encoding: chunked
+ * ```
+ *
+ * @param {String} rawHeaders Headers needing to be parsed
+ *
+ * @returns {Object} Headers parsed into an object
+ */
+const parseHeaders = rawHeaders => {
+ const parsed = {};
+ let key;
+ let val;
+ let i;
+
+ rawHeaders && rawHeaders.split('\n').forEach(function parser(line) {
+ i = line.indexOf(':');
+ key = line.substring(0, i).trim().toLowerCase();
+ val = line.substring(i + 1).trim();
+
+ if (!key || (parsed[key] && ignoreDuplicateOf[key])) {
+ return;
+ }
+
+ if (key === 'set-cookie') {
+ if (parsed[key]) {
+ parsed[key].push(val);
+ } else {
+ parsed[key] = [val];
+ }
+ } else {
+ parsed[key] = parsed[key] ? parsed[key] + ', ' + val : val;
+ }
+ });
+
+ return parsed;
+};
+
+const $internals = Symbol('internals');
+const $defaults = Symbol('defaults');
+
+function normalizeHeader(header) {
+ return header && String(header).trim().toLowerCase();
+}
+
+function normalizeValue(value) {
+ if (value === false || value == null) {
+ return value;
+ }
+
+ return utils.isArray(value) ? value.map(normalizeValue) : String(value);
+}
+
+function parseTokens(str) {
+ const tokens = Object.create(null);
+ const tokensRE = /([^\s,;=]+)\s*(?:=\s*([^,;]+))?/g;
+ let match;
+
+ while ((match = tokensRE.exec(str))) {
+ tokens[match[1]] = match[2];
+ }
+
+ return tokens;
+}
+
+function matchHeaderValue(context, value, header, filter) {
+ if (utils.isFunction(filter)) {
+ return filter.call(this, value, header);
+ }
+
+ if (!utils.isString(value)) return;
+
+ if (utils.isString(filter)) {
+ return value.indexOf(filter) !== -1;
+ }
+
+ if (utils.isRegExp(filter)) {
+ return filter.test(value);
+ }
+}
+
+function formatHeader(header) {
+ return header.trim()
+ .toLowerCase().replace(/([a-z\d])(\w*)/g, (w, char, str) => {
+ return char.toUpperCase() + str;
+ });
+}
+
+function buildAccessors(obj, header) {
+ const accessorName = utils.toCamelCase(' ' + header);
+
+ ['get', 'set', 'has'].forEach(methodName => {
+ Object.defineProperty(obj, methodName + accessorName, {
+ value: function(arg1, arg2, arg3) {
+ return this[methodName].call(this, header, arg1, arg2, arg3);
+ },
+ configurable: true
+ });
+ });
+}
+
+function findKey(obj, key) {
+ key = key.toLowerCase();
+ const keys = Object.keys(obj);
+ let i = keys.length;
+ let _key;
+ while (i-- > 0) {
+ _key = keys[i];
+ if (key === _key.toLowerCase()) {
+ return _key;
+ }
+ }
+ return null;
+}
+
+function AxiosHeaders(headers, defaults) {
+ headers && this.set(headers);
+ this[$defaults] = defaults || null;
+}
+
+Object.assign(AxiosHeaders.prototype, {
+ set: function(header, valueOrRewrite, rewrite) {
+ const self = this;
+
+ function setHeader(_value, _header, _rewrite) {
+ const lHeader = normalizeHeader(_header);
+
+ if (!lHeader) {
+ throw new Error('header name must be a non-empty string');
+ }
+
+ const key = findKey(self, lHeader);
+
+ if (key && _rewrite !== true && (self[key] === false || _rewrite === false)) {
+ return;
+ }
+
+ self[key || _header] = normalizeValue(_value);
+ }
+
+ if (utils.isPlainObject(header)) {
+ utils.forEach(header, (_value, _header) => {
+ setHeader(_value, _header, valueOrRewrite);
+ });
+ } else {
+ setHeader(valueOrRewrite, header, rewrite);
+ }
+
+ return this;
+ },
+
+ get: function(header, parser) {
+ header = normalizeHeader(header);
+
+ if (!header) return undefined;
+
+ const key = findKey(this, header);
+
+ if (key) {
+ const value = this[key];
+
+ if (!parser) {
+ return value;
+ }
+
+ if (parser === true) {
+ return parseTokens(value);
+ }
+
+ if (utils.isFunction(parser)) {
+ return parser.call(this, value, key);
+ }
+
+ if (utils.isRegExp(parser)) {
+ return parser.exec(value);
+ }
+
+ throw new TypeError('parser must be boolean|regexp|function');
+ }
+ },
+
+ has: function(header, matcher) {
+ header = normalizeHeader(header);
+
+ if (header) {
+ const key = findKey(this, header);
+
+ return !!(key && (!matcher || matchHeaderValue(this, this[key], key, matcher)));
+ }
+
+ return false;
+ },
+
+ delete: function(header, matcher) {
+ const self = this;
+ let deleted = false;
+
+ function deleteHeader(_header) {
+ _header = normalizeHeader(_header);
+
+ if (_header) {
+ const key = findKey(self, _header);
+
+ if (key && (!matcher || matchHeaderValue(self, self[key], key, matcher))) {
+ delete self[key];
+
+ deleted = true;
+ }
+ }
+ }
+
+ if (utils.isArray(header)) {
+ header.forEach(deleteHeader);
+ } else {
+ deleteHeader(header);
+ }
+
+ return deleted;
+ },
+
+ clear: function() {
+ return Object.keys(this).forEach(this.delete.bind(this));
+ },
+
+ normalize: function(format) {
+ const self = this;
+ const headers = {};
+
+ utils.forEach(this, (value, header) => {
+ const key = findKey(headers, header);
+
+ if (key) {
+ self[key] = normalizeValue(value);
+ delete self[header];
+ return;
+ }
+
+ const normalized = format ? formatHeader(header) : String(header).trim();
+
+ if (normalized !== header) {
+ delete self[header];
+ }
+
+ self[normalized] = normalizeValue(value);
+
+ headers[normalized] = true;
+ });
+
+ return this;
+ },
+
+ toJSON: function(asStrings) {
+ const obj = Object.create(null);
+
+ utils.forEach(Object.assign({}, this[$defaults] || null, this),
+ (value, header) => {
+ if (value == null || value === false) return;
+ obj[header] = asStrings && utils.isArray(value) ? value.join(', ') : value;
+ });
+
+ return obj;
+ }
+});
+
+Object.assign(AxiosHeaders, {
+ from: function(thing) {
+ if (utils.isString(thing)) {
+ return new this(parseHeaders(thing));
+ }
+ return thing instanceof this ? thing : new this(thing);
+ },
+
+ accessor: function(header) {
+ const internals = this[$internals] = (this[$internals] = {
+ accessors: {}
+ });
+
+ const accessors = internals.accessors;
+ const prototype = this.prototype;
+
+ function defineAccessor(_header) {
+ const lHeader = normalizeHeader(_header);
+
+ if (!accessors[lHeader]) {
+ buildAccessors(prototype, _header);
+ accessors[lHeader] = true;
+ }
+ }
+
+ utils.isArray(header) ? header.forEach(defineAccessor) : defineAccessor(header);
+
+ return this;
+ }
+});
+
+AxiosHeaders.accessor(['Content-Type', 'Content-Length', 'Accept', 'Accept-Encoding', 'User-Agent']);
+
+utils.freezeMethods(AxiosHeaders.prototype);
+utils.freezeMethods(AxiosHeaders);
+
+/**
+ * Calculate data maxRate
+ * @param {Number} [samplesCount= 10]
+ * @param {Number} [min= 1000]
+ * @returns {Function}
+ */
+function speedometer(samplesCount, min) {
+ samplesCount = samplesCount || 10;
+ const bytes = new Array(samplesCount);
+ const timestamps = new Array(samplesCount);
+ let head = 0;
+ let tail = 0;
+ let firstSampleTS;
+
+ min = min !== undefined ? min : 1000;
+
+ return function push(chunkLength) {
+ const now = Date.now();
+
+ const startedAt = timestamps[tail];
+
+ if (!firstSampleTS) {
+ firstSampleTS = now;
+ }
+
+ bytes[head] = chunkLength;
+ timestamps[head] = now;
+
+ let i = tail;
+ let bytesCount = 0;
+
+ while (i !== head) {
+ bytesCount += bytes[i++];
+ i = i % samplesCount;
+ }
+
+ head = (head + 1) % samplesCount;
+
+ if (head === tail) {
+ tail = (tail + 1) % samplesCount;
+ }
+
+ if (now - firstSampleTS < min) {
+ return;
+ }
+
+ const passed = startedAt && now - startedAt;
+
+ return passed ? Math.round(bytesCount * 1000 / passed) : undefined;
+ };
+}
+
+function progressEventReducer(listener, isDownloadStream) {
+ let bytesNotified = 0;
+ const _speedometer = speedometer(50, 250);
+
+ return e => {
+ const loaded = e.loaded;
+ const total = e.lengthComputable ? e.total : undefined;
+ const progressBytes = loaded - bytesNotified;
+ const rate = _speedometer(progressBytes);
+ const inRange = loaded <= total;
+
+ bytesNotified = loaded;
+
+ const data = {
+ loaded,
+ total,
+ progress: total ? (loaded / total) : undefined,
+ bytes: progressBytes,
+ rate: rate ? rate : undefined,
+ estimated: rate && total && inRange ? (total - loaded) / rate : undefined
+ };
+
+ data[isDownloadStream ? 'download' : 'upload'] = true;
+
+ listener(data);
+ };
+}
+
+function xhrAdapter(config) {
+ return new Promise(function dispatchXhrRequest(resolve, reject) {
+ let requestData = config.data;
+ const requestHeaders = AxiosHeaders.from(config.headers).normalize();
+ const responseType = config.responseType;
+ let onCanceled;
+ function done() {
+ if (config.cancelToken) {
+ config.cancelToken.unsubscribe(onCanceled);
+ }
+
+ if (config.signal) {
+ config.signal.removeEventListener('abort', onCanceled);
+ }
+ }
+
+ if (utils.isFormData(requestData) && platform.isStandardBrowserEnv) {
+ requestHeaders.setContentType(false); // Let the browser set it
+ }
+
+ let request = new XMLHttpRequest();
+
+ // HTTP basic authentication
+ if (config.auth) {
+ const username = config.auth.username || '';
+ const password = config.auth.password ? unescape(encodeURIComponent(config.auth.password)) : '';
+ requestHeaders.set('Authorization', 'Basic ' + btoa(username + ':' + password));
+ }
+
+ const fullPath = buildFullPath(config.baseURL, config.url);
+
+ request.open(config.method.toUpperCase(), buildURL(fullPath, config.params, config.paramsSerializer), true);
+
+ // Set the request timeout in MS
+ request.timeout = config.timeout;
+
+ function onloadend() {
+ if (!request) {
+ return;
+ }
+ // Prepare the response
+ const responseHeaders = AxiosHeaders.from(
+ 'getAllResponseHeaders' in request && request.getAllResponseHeaders()
+ );
+ const responseData = !responseType || responseType === 'text' || responseType === 'json' ?
+ request.responseText : request.response;
+ const response = {
+ data: responseData,
+ status: request.status,
+ statusText: request.statusText,
+ headers: responseHeaders,
+ config,
+ request
+ };
+
+ settle(function _resolve(value) {
+ resolve(value);
+ done();
+ }, function _reject(err) {
+ reject(err);
+ done();
+ }, response);
+
+ // Clean up request
+ request = null;
+ }
+
+ if ('onloadend' in request) {
+ // Use onloadend if available
+ request.onloadend = onloadend;
+ } else {
+ // Listen for ready state to emulate onloadend
+ request.onreadystatechange = function handleLoad() {
+ if (!request || request.readyState !== 4) {
+ return;
+ }
+
+ // The request errored out and we didn't get a response, this will be
+ // handled by onerror instead
+ // With one exception: request that using file: protocol, most browsers
+ // will return status as 0 even though it's a successful request
+ if (request.status === 0 && !(request.responseURL && request.responseURL.indexOf('file:') === 0)) {
+ return;
+ }
+ // readystate handler is calling before onerror or ontimeout handlers,
+ // so we should call onloadend on the next 'tick'
+ setTimeout(onloadend);
+ };
+ }
+
+ // Handle browser request cancellation (as opposed to a manual cancellation)
+ request.onabort = function handleAbort() {
+ if (!request) {
+ return;
+ }
+
+ reject(new AxiosError('Request aborted', AxiosError.ECONNABORTED, config, request));
+
+ // Clean up request
+ request = null;
+ };
+
+ // Handle low level network errors
+ request.onerror = function handleError() {
+ // Real errors are hidden from us by the browser
+ // onerror should only fire if it's a network error
+ reject(new AxiosError('Network Error', AxiosError.ERR_NETWORK, config, request));
+
+ // Clean up request
+ request = null;
+ };
+
+ // Handle timeout
+ request.ontimeout = function handleTimeout() {
+ let timeoutErrorMessage = config.timeout ? 'timeout of ' + config.timeout + 'ms exceeded' : 'timeout exceeded';
+ const transitional = config.transitional || transitionalDefaults;
+ if (config.timeoutErrorMessage) {
+ timeoutErrorMessage = config.timeoutErrorMessage;
+ }
+ reject(new AxiosError(
+ timeoutErrorMessage,
+ transitional.clarifyTimeoutError ? AxiosError.ETIMEDOUT : AxiosError.ECONNABORTED,
+ config,
+ request));
+
+ // Clean up request
+ request = null;
+ };
+
+ // Add xsrf header
+ // This is only done if running in a standard browser environment.
+ // Specifically not if we're in a web worker, or react-native.
+ if (platform.isStandardBrowserEnv) {
+ // Add xsrf header
+ const xsrfValue = (config.withCredentials || isURLSameOrigin(fullPath))
+ && config.xsrfCookieName && cookies.read(config.xsrfCookieName);
+
+ if (xsrfValue) {
+ requestHeaders.set(config.xsrfHeaderName, xsrfValue);
+ }
+ }
+
+ // Remove Content-Type if data is undefined
+ requestData === undefined && requestHeaders.setContentType(null);
+
+ // Add headers to the request
+ if ('setRequestHeader' in request) {
+ utils.forEach(requestHeaders.toJSON(), function setRequestHeader(val, key) {
+ request.setRequestHeader(key, val);
+ });
+ }
+
+ // Add withCredentials to request if needed
+ if (!utils.isUndefined(config.withCredentials)) {
+ request.withCredentials = !!config.withCredentials;
+ }
+
+ // Add responseType to request if needed
+ if (responseType && responseType !== 'json') {
+ request.responseType = config.responseType;
+ }
+
+ // Handle progress if needed
+ if (typeof config.onDownloadProgress === 'function') {
+ request.addEventListener('progress', progressEventReducer(config.onDownloadProgress, true));
+ }
+
+ // Not all browsers support upload events
+ if (typeof config.onUploadProgress === 'function' && request.upload) {
+ request.upload.addEventListener('progress', progressEventReducer(config.onUploadProgress));
+ }
+
+ if (config.cancelToken || config.signal) {
+ // Handle cancellation
+ // eslint-disable-next-line func-names
+ onCanceled = cancel => {
+ if (!request) {
+ return;
+ }
+ reject(!cancel || cancel.type ? new CanceledError(null, config, request) : cancel);
+ request.abort();
+ request = null;
+ };
+
+ config.cancelToken && config.cancelToken.subscribe(onCanceled);
+ if (config.signal) {
+ config.signal.aborted ? onCanceled() : config.signal.addEventListener('abort', onCanceled);
+ }
+ }
+
+ const protocol = parseProtocol(fullPath);
+
+ if (protocol && platform.protocols.indexOf(protocol) === -1) {
+ reject(new AxiosError('Unsupported protocol ' + protocol + ':', AxiosError.ERR_BAD_REQUEST, config));
+ return;
+ }
+
+
+ // Send the request
+ request.send(requestData || null);
+ });
+}
+
+const adapters = {
+ http: xhrAdapter,
+ xhr: xhrAdapter
+};
+
+const adapters$1 = {
+ getAdapter: (nameOrAdapter) => {
+ if(utils.isString(nameOrAdapter)){
+ const adapter = adapters[nameOrAdapter];
+
+ if (!nameOrAdapter) {
+ throw Error(
+ utils.hasOwnProp(nameOrAdapter) ?
+ `Adapter '${nameOrAdapter}' is not available in the build` :
+ `Can not resolve adapter '${nameOrAdapter}'`
+ );
+ }
+
+ return adapter
+ }
+
+ if (!utils.isFunction(nameOrAdapter)) {
+ throw new TypeError('adapter is not a function');
+ }
+
+ return nameOrAdapter;
+ },
+ adapters
+};
+
+const DEFAULT_CONTENT_TYPE = {
+ 'Content-Type': 'application/x-www-form-urlencoded'
+};
+
+/**
+ * If the browser has an XMLHttpRequest object, use the XHR adapter, otherwise use the HTTP
+ * adapter
+ *
+ * @returns {Function}
+ */
+function getDefaultAdapter() {
+ let adapter;
+ if (typeof XMLHttpRequest !== 'undefined') {
+ // For browsers use XHR adapter
+ adapter = adapters$1.getAdapter('xhr');
+ } else if (typeof process !== 'undefined' && utils.kindOf(process) === 'process') {
+ // For node use HTTP adapter
+ adapter = adapters$1.getAdapter('http');
+ }
+ return adapter;
+}
+
+/**
+ * It takes a string, tries to parse it, and if it fails, it returns the stringified version
+ * of the input
+ *
+ * @param {any} rawValue - The value to be stringified.
+ * @param {Function} parser - A function that parses a string into a JavaScript object.
+ * @param {Function} encoder - A function that takes a value and returns a string.
+ *
+ * @returns {string} A stringified version of the rawValue.
+ */
+function stringifySafely(rawValue, parser, encoder) {
+ if (utils.isString(rawValue)) {
+ try {
+ (parser || JSON.parse)(rawValue);
+ return utils.trim(rawValue);
+ } catch (e) {
+ if (e.name !== 'SyntaxError') {
+ throw e;
+ }
+ }
+ }
+
+ return (encoder || JSON.stringify)(rawValue);
+}
+
+const defaults = {
+
+ transitional: transitionalDefaults,
+
+ adapter: getDefaultAdapter(),
+
+ transformRequest: [function transformRequest(data, headers) {
+ const contentType = headers.getContentType() || '';
+ const hasJSONContentType = contentType.indexOf('application/json') > -1;
+ const isObjectPayload = utils.isObject(data);
+
+ if (isObjectPayload && utils.isHTMLForm(data)) {
+ data = new FormData(data);
+ }
+
+ const isFormData = utils.isFormData(data);
+
+ if (isFormData) {
+ if (!hasJSONContentType) {
+ return data;
+ }
+ return hasJSONContentType ? JSON.stringify(formDataToJSON(data)) : data;
+ }
+
+ if (utils.isArrayBuffer(data) ||
+ utils.isBuffer(data) ||
+ utils.isStream(data) ||
+ utils.isFile(data) ||
+ utils.isBlob(data)
+ ) {
+ return data;
+ }
+ if (utils.isArrayBufferView(data)) {
+ return data.buffer;
+ }
+ if (utils.isURLSearchParams(data)) {
+ headers.setContentType('application/x-www-form-urlencoded;charset=utf-8', false);
+ return data.toString();
+ }
+
+ let isFileList;
+
+ if (isObjectPayload) {
+ if (contentType.indexOf('application/x-www-form-urlencoded') > -1) {
+ return toURLEncodedForm(data, this.formSerializer).toString();
+ }
+
+ if ((isFileList = utils.isFileList(data)) || contentType.indexOf('multipart/form-data') > -1) {
+ const _FormData = this.env && this.env.FormData;
+
+ return toFormData(
+ isFileList ? {'files[]': data} : data,
+ _FormData && new _FormData(),
+ this.formSerializer
+ );
+ }
+ }
+
+ if (isObjectPayload || hasJSONContentType ) {
+ headers.setContentType('application/json', false);
+ return stringifySafely(data);
+ }
+
+ return data;
+ }],
+
+ transformResponse: [function transformResponse(data) {
+ const transitional = this.transitional || defaults.transitional;
+ const forcedJSONParsing = transitional && transitional.forcedJSONParsing;
+ const JSONRequested = this.responseType === 'json';
+
+ if (data && utils.isString(data) && ((forcedJSONParsing && !this.responseType) || JSONRequested)) {
+ const silentJSONParsing = transitional && transitional.silentJSONParsing;
+ const strictJSONParsing = !silentJSONParsing && JSONRequested;
+
+ try {
+ return JSON.parse(data);
+ } catch (e) {
+ if (strictJSONParsing) {
+ if (e.name === 'SyntaxError') {
+ throw AxiosError.from(e, AxiosError.ERR_BAD_RESPONSE, this, null, this.response);
+ }
+ throw e;
+ }
+ }
+ }
+
+ return data;
+ }],
+
+ /**
+ * A timeout in milliseconds to abort a request. If set to 0 (default) a
+ * timeout is not created.
+ */
+ timeout: 0,
+
+ xsrfCookieName: 'XSRF-TOKEN',
+ xsrfHeaderName: 'X-XSRF-TOKEN',
+
+ maxContentLength: -1,
+ maxBodyLength: -1,
+
+ env: {
+ FormData: platform.classes.FormData,
+ Blob: platform.classes.Blob
+ },
+
+ validateStatus: function validateStatus(status) {
+ return status >= 200 && status < 300;
+ },
+
+ headers: {
+ common: {
+ 'Accept': 'application/json, text/plain, */*'
+ }
+ }
+};
+
+utils.forEach(['delete', 'get', 'head'], function forEachMethodNoData(method) {
+ defaults.headers[method] = {};
+});
+
+utils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {
+ defaults.headers[method] = utils.merge(DEFAULT_CONTENT_TYPE);
+});
+
+/**
+ * Transform the data for a request or a response
+ *
+ * @param {Array|Function} fns A single function or Array of functions
+ * @param {?Object} response The response object
+ *
+ * @returns {*} The resulting transformed data
+ */
+function transformData(fns, response) {
+ const config = this || defaults;
+ const context = response || config;
+ const headers = AxiosHeaders.from(context.headers);
+ let data = context.data;
+
+ utils.forEach(fns, function transform(fn) {
+ data = fn.call(config, data, headers.normalize(), response ? response.status : undefined);
+ });
+
+ headers.normalize();
+
+ return data;
+}
+
+function isCancel(value) {
+ return !!(value && value.__CANCEL__);
+}
+
+/**
+ * Throws a `CanceledError` if cancellation has been requested.
+ *
+ * @param {Object} config The config that is to be used for the request
+ *
+ * @returns {void}
+ */
+function throwIfCancellationRequested(config) {
+ if (config.cancelToken) {
+ config.cancelToken.throwIfRequested();
+ }
+
+ if (config.signal && config.signal.aborted) {
+ throw new CanceledError();
+ }
+}
+
+/**
+ * Dispatch a request to the server using the configured adapter.
+ *
+ * @param {object} config The config that is to be used for the request
+ *
+ * @returns {Promise} The Promise to be fulfilled
+ */
+function dispatchRequest(config) {
+ throwIfCancellationRequested(config);
+
+ config.headers = AxiosHeaders.from(config.headers);
+
+ // Transform request data
+ config.data = transformData.call(
+ config,
+ config.transformRequest
+ );
+
+ const adapter = config.adapter || defaults.adapter;
+
+ return adapter(config).then(function onAdapterResolution(response) {
+ throwIfCancellationRequested(config);
+
+ // Transform response data
+ response.data = transformData.call(
+ config,
+ config.transformResponse,
+ response
+ );
+
+ response.headers = AxiosHeaders.from(response.headers);
+
+ return response;
+ }, function onAdapterRejection(reason) {
+ if (!isCancel(reason)) {
+ throwIfCancellationRequested(config);
+
+ // Transform response data
+ if (reason && reason.response) {
+ reason.response.data = transformData.call(
+ config,
+ config.transformResponse,
+ reason.response
+ );
+ reason.response.headers = AxiosHeaders.from(reason.response.headers);
+ }
+ }
+
+ return Promise.reject(reason);
+ });
+}
+
+/**
+ * Config-specific merge-function which creates a new config-object
+ * by merging two configuration objects together.
+ *
+ * @param {Object} config1
+ * @param {Object} config2
+ *
+ * @returns {Object} New object resulting from merging config2 to config1
+ */
+function mergeConfig(config1, config2) {
+ // eslint-disable-next-line no-param-reassign
+ config2 = config2 || {};
+ const config = {};
+
+ function getMergedValue(target, source) {
+ if (utils.isPlainObject(target) && utils.isPlainObject(source)) {
+ return utils.merge(target, source);
+ } else if (utils.isPlainObject(source)) {
+ return utils.merge({}, source);
+ } else if (utils.isArray(source)) {
+ return source.slice();
+ }
+ return source;
+ }
+
+ // eslint-disable-next-line consistent-return
+ function mergeDeepProperties(prop) {
+ if (!utils.isUndefined(config2[prop])) {
+ return getMergedValue(config1[prop], config2[prop]);
+ } else if (!utils.isUndefined(config1[prop])) {
+ return getMergedValue(undefined, config1[prop]);
+ }
+ }
+
+ // eslint-disable-next-line consistent-return
+ function valueFromConfig2(prop) {
+ if (!utils.isUndefined(config2[prop])) {
+ return getMergedValue(undefined, config2[prop]);
+ }
+ }
+
+ // eslint-disable-next-line consistent-return
+ function defaultToConfig2(prop) {
+ if (!utils.isUndefined(config2[prop])) {
+ return getMergedValue(undefined, config2[prop]);
+ } else if (!utils.isUndefined(config1[prop])) {
+ return getMergedValue(undefined, config1[prop]);
+ }
+ }
+
+ // eslint-disable-next-line consistent-return
+ function mergeDirectKeys(prop) {
+ if (prop in config2) {
+ return getMergedValue(config1[prop], config2[prop]);
+ } else if (prop in config1) {
+ return getMergedValue(undefined, config1[prop]);
+ }
+ }
+
+ const mergeMap = {
+ 'url': valueFromConfig2,
+ 'method': valueFromConfig2,
+ 'data': valueFromConfig2,
+ 'baseURL': defaultToConfig2,
+ 'transformRequest': defaultToConfig2,
+ 'transformResponse': defaultToConfig2,
+ 'paramsSerializer': defaultToConfig2,
+ 'timeout': defaultToConfig2,
+ 'timeoutMessage': defaultToConfig2,
+ 'withCredentials': defaultToConfig2,
+ 'adapter': defaultToConfig2,
+ 'responseType': defaultToConfig2,
+ 'xsrfCookieName': defaultToConfig2,
+ 'xsrfHeaderName': defaultToConfig2,
+ 'onUploadProgress': defaultToConfig2,
+ 'onDownloadProgress': defaultToConfig2,
+ 'decompress': defaultToConfig2,
+ 'maxContentLength': defaultToConfig2,
+ 'maxBodyLength': defaultToConfig2,
+ 'beforeRedirect': defaultToConfig2,
+ 'transport': defaultToConfig2,
+ 'httpAgent': defaultToConfig2,
+ 'httpsAgent': defaultToConfig2,
+ 'cancelToken': defaultToConfig2,
+ 'socketPath': defaultToConfig2,
+ 'responseEncoding': defaultToConfig2,
+ 'validateStatus': mergeDirectKeys
+ };
+
+ utils.forEach(Object.keys(config1).concat(Object.keys(config2)), function computeConfigValue(prop) {
+ const merge = mergeMap[prop] || mergeDeepProperties;
+ const configValue = merge(prop);
+ (utils.isUndefined(configValue) && merge !== mergeDirectKeys) || (config[prop] = configValue);
+ });
+
+ return config;
+}
+
+const VERSION = "1.1.3";
+
+const validators$1 = {};
+
+// eslint-disable-next-line func-names
+['object', 'boolean', 'number', 'function', 'string', 'symbol'].forEach((type, i) => {
+ validators$1[type] = function validator(thing) {
+ return typeof thing === type || 'a' + (i < 1 ? 'n ' : ' ') + type;
+ };
+});
+
+const deprecatedWarnings = {};
+
+/**
+ * Transitional option validator
+ *
+ * @param {function|boolean?} validator - set to false if the transitional option has been removed
+ * @param {string?} version - deprecated version / removed since version
+ * @param {string?} message - some message with additional info
+ *
+ * @returns {function}
+ */
+validators$1.transitional = function transitional(validator, version, message) {
+ function formatMessage(opt, desc) {
+ return '[Axios v' + VERSION + '] Transitional option \'' + opt + '\'' + desc + (message ? '. ' + message : '');
+ }
+
+ // eslint-disable-next-line func-names
+ return (value, opt, opts) => {
+ if (validator === false) {
+ throw new AxiosError(
+ formatMessage(opt, ' has been removed' + (version ? ' in ' + version : '')),
+ AxiosError.ERR_DEPRECATED
+ );
+ }
+
+ if (version && !deprecatedWarnings[opt]) {
+ deprecatedWarnings[opt] = true;
+ // eslint-disable-next-line no-console
+ console.warn(
+ formatMessage(
+ opt,
+ ' has been deprecated since v' + version + ' and will be removed in the near future'
+ )
+ );
+ }
+
+ return validator ? validator(value, opt, opts) : true;
+ };
+};
+
+/**
+ * Assert object's properties type
+ *
+ * @param {object} options
+ * @param {object} schema
+ * @param {boolean?} allowUnknown
+ *
+ * @returns {object}
+ */
+
+function assertOptions(options, schema, allowUnknown) {
+ if (typeof options !== 'object') {
+ throw new AxiosError('options must be an object', AxiosError.ERR_BAD_OPTION_VALUE);
+ }
+ const keys = Object.keys(options);
+ let i = keys.length;
+ while (i-- > 0) {
+ const opt = keys[i];
+ const validator = schema[opt];
+ if (validator) {
+ const value = options[opt];
+ const result = value === undefined || validator(value, opt, options);
+ if (result !== true) {
+ throw new AxiosError('option ' + opt + ' must be ' + result, AxiosError.ERR_BAD_OPTION_VALUE);
+ }
+ continue;
+ }
+ if (allowUnknown !== true) {
+ throw new AxiosError('Unknown option ' + opt, AxiosError.ERR_BAD_OPTION);
+ }
+ }
+}
+
+const validator = {
+ assertOptions,
+ validators: validators$1
+};
+
+const validators = validator.validators;
+
+/**
+ * Create a new instance of Axios
+ *
+ * @param {Object} instanceConfig The default config for the instance
+ *
+ * @return {Axios} A new instance of Axios
+ */
+class Axios {
+ constructor(instanceConfig) {
+ this.defaults = instanceConfig;
+ this.interceptors = {
+ request: new InterceptorManager(),
+ response: new InterceptorManager()
+ };
+ }
+
+ /**
+ * Dispatch a request
+ *
+ * @param {String|Object} configOrUrl The config specific for this request (merged with this.defaults)
+ * @param {?Object} config
+ *
+ * @returns {Promise} The Promise to be fulfilled
+ */
+ request(configOrUrl, config) {
+ /*eslint no-param-reassign:0*/
+ // Allow for axios('example/url'[, config]) a la fetch API
+ if (typeof configOrUrl === 'string') {
+ config = config || {};
+ config.url = configOrUrl;
+ } else {
+ config = configOrUrl || {};
+ }
+
+ config = mergeConfig(this.defaults, config);
+
+ const {transitional, paramsSerializer} = config;
+
+ if (transitional !== undefined) {
+ validator.assertOptions(transitional, {
+ silentJSONParsing: validators.transitional(validators.boolean),
+ forcedJSONParsing: validators.transitional(validators.boolean),
+ clarifyTimeoutError: validators.transitional(validators.boolean)
+ }, false);
+ }
+
+ if (paramsSerializer !== undefined) {
+ validator.assertOptions(paramsSerializer, {
+ encode: validators.function,
+ serialize: validators.function
+ }, true);
+ }
+
+ // Set config.method
+ config.method = (config.method || this.defaults.method || 'get').toLowerCase();
+
+ // Flatten headers
+ const defaultHeaders = config.headers && utils.merge(
+ config.headers.common,
+ config.headers[config.method]
+ );
+
+ defaultHeaders && utils.forEach(
+ ['delete', 'get', 'head', 'post', 'put', 'patch', 'common'],
+ function cleanHeaderConfig(method) {
+ delete config.headers[method];
+ }
+ );
+
+ config.headers = new AxiosHeaders(config.headers, defaultHeaders);
+
+ // filter out skipped interceptors
+ const requestInterceptorChain = [];
+ let synchronousRequestInterceptors = true;
+ this.interceptors.request.forEach(function unshiftRequestInterceptors(interceptor) {
+ if (typeof interceptor.runWhen === 'function' && interceptor.runWhen(config) === false) {
+ return;
+ }
+
+ synchronousRequestInterceptors = synchronousRequestInterceptors && interceptor.synchronous;
+
+ requestInterceptorChain.unshift(interceptor.fulfilled, interceptor.rejected);
+ });
+
+ const responseInterceptorChain = [];
+ this.interceptors.response.forEach(function pushResponseInterceptors(interceptor) {
+ responseInterceptorChain.push(interceptor.fulfilled, interceptor.rejected);
+ });
+
+ let promise;
+ let i = 0;
+ let len;
+
+ if (!synchronousRequestInterceptors) {
+ const chain = [dispatchRequest.bind(this), undefined];
+ chain.unshift.apply(chain, requestInterceptorChain);
+ chain.push.apply(chain, responseInterceptorChain);
+ len = chain.length;
+
+ promise = Promise.resolve(config);
+
+ while (i < len) {
+ promise = promise.then(chain[i++], chain[i++]);
+ }
+
+ return promise;
+ }
+
+ len = requestInterceptorChain.length;
+
+ let newConfig = config;
+
+ i = 0;
+
+ while (i < len) {
+ const onFulfilled = requestInterceptorChain[i++];
+ const onRejected = requestInterceptorChain[i++];
+ try {
+ newConfig = onFulfilled(newConfig);
+ } catch (error) {
+ onRejected.call(this, error);
+ break;
+ }
+ }
+
+ try {
+ promise = dispatchRequest.call(this, newConfig);
+ } catch (error) {
+ return Promise.reject(error);
+ }
+
+ i = 0;
+ len = responseInterceptorChain.length;
+
+ while (i < len) {
+ promise = promise.then(responseInterceptorChain[i++], responseInterceptorChain[i++]);
+ }
+
+ return promise;
+ }
+
+ getUri(config) {
+ config = mergeConfig(this.defaults, config);
+ const fullPath = buildFullPath(config.baseURL, config.url);
+ return buildURL(fullPath, config.params, config.paramsSerializer);
+ }
+}
+
+// Provide aliases for supported request methods
+utils.forEach(['delete', 'get', 'head', 'options'], function forEachMethodNoData(method) {
+ /*eslint func-names:0*/
+ Axios.prototype[method] = function(url, config) {
+ return this.request(mergeConfig(config || {}, {
+ method,
+ url,
+ data: (config || {}).data
+ }));
+ };
+});
+
+utils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {
+ /*eslint func-names:0*/
+
+ function generateHTTPMethod(isForm) {
+ return function httpMethod(url, data, config) {
+ return this.request(mergeConfig(config || {}, {
+ method,
+ headers: isForm ? {
+ 'Content-Type': 'multipart/form-data'
+ } : {},
+ url,
+ data
+ }));
+ };
+ }
+
+ Axios.prototype[method] = generateHTTPMethod();
+
+ Axios.prototype[method + 'Form'] = generateHTTPMethod(true);
+});
+
+/**
+ * A `CancelToken` is an object that can be used to request cancellation of an operation.
+ *
+ * @param {Function} executor The executor function.
+ *
+ * @returns {CancelToken}
+ */
+class CancelToken {
+ constructor(executor) {
+ if (typeof executor !== 'function') {
+ throw new TypeError('executor must be a function.');
+ }
+
+ let resolvePromise;
+
+ this.promise = new Promise(function promiseExecutor(resolve) {
+ resolvePromise = resolve;
+ });
+
+ const token = this;
+
+ // eslint-disable-next-line func-names
+ this.promise.then(cancel => {
+ if (!token._listeners) return;
+
+ let i = token._listeners.length;
+
+ while (i-- > 0) {
+ token._listeners[i](cancel);
+ }
+ token._listeners = null;
+ });
+
+ // eslint-disable-next-line func-names
+ this.promise.then = onfulfilled => {
+ let _resolve;
+ // eslint-disable-next-line func-names
+ const promise = new Promise(resolve => {
+ token.subscribe(resolve);
+ _resolve = resolve;
+ }).then(onfulfilled);
+
+ promise.cancel = function reject() {
+ token.unsubscribe(_resolve);
+ };
+
+ return promise;
+ };
+
+ executor(function cancel(message, config, request) {
+ if (token.reason) {
+ // Cancellation has already been requested
+ return;
+ }
+
+ token.reason = new CanceledError(message, config, request);
+ resolvePromise(token.reason);
+ });
+ }
+
+ /**
+ * Throws a `CanceledError` if cancellation has been requested.
+ */
+ throwIfRequested() {
+ if (this.reason) {
+ throw this.reason;
+ }
+ }
+
+ /**
+ * Subscribe to the cancel signal
+ */
+
+ subscribe(listener) {
+ if (this.reason) {
+ listener(this.reason);
+ return;
+ }
+
+ if (this._listeners) {
+ this._listeners.push(listener);
+ } else {
+ this._listeners = [listener];
+ }
+ }
+
+ /**
+ * Unsubscribe from the cancel signal
+ */
+
+ unsubscribe(listener) {
+ if (!this._listeners) {
+ return;
+ }
+ const index = this._listeners.indexOf(listener);
+ if (index !== -1) {
+ this._listeners.splice(index, 1);
+ }
+ }
+
+ /**
+ * Returns an object that contains a new `CancelToken` and a function that, when called,
+ * cancels the `CancelToken`.
+ */
+ static source() {
+ let cancel;
+ const token = new CancelToken(function executor(c) {
+ cancel = c;
+ });
+ return {
+ token,
+ cancel
+ };
+ }
+}
+
+/**
+ * Syntactic sugar for invoking a function and expanding an array for arguments.
+ *
+ * Common use case would be to use `Function.prototype.apply`.
+ *
+ * ```js
+ * function f(x, y, z) {}
+ * var args = [1, 2, 3];
+ * f.apply(null, args);
+ * ```
+ *
+ * With `spread` this example can be re-written.
+ *
+ * ```js
+ * spread(function(x, y, z) {})([1, 2, 3]);
+ * ```
+ *
+ * @param {Function} callback
+ *
+ * @returns {Function}
+ */
+function spread(callback) {
+ return function wrap(arr) {
+ return callback.apply(null, arr);
+ };
+}
+
+/**
+ * Determines whether the payload is an error thrown by Axios
+ *
+ * @param {*} payload The value to test
+ *
+ * @returns {boolean} True if the payload is an error thrown by Axios, otherwise false
+ */
+function isAxiosError(payload) {
+ return utils.isObject(payload) && (payload.isAxiosError === true);
+}
+
+/**
+ * Create an instance of Axios
+ *
+ * @param {Object} defaultConfig The default config for the instance
+ *
+ * @returns {Axios} A new instance of Axios
+ */
+function createInstance(defaultConfig) {
+ const context = new Axios(defaultConfig);
+ const instance = bind(Axios.prototype.request, context);
+
+ // Copy axios.prototype to instance
+ utils.extend(instance, Axios.prototype, context, {allOwnKeys: true});
+
+ // Copy context to instance
+ utils.extend(instance, context, null, {allOwnKeys: true});
+
+ // Factory for creating new instances
+ instance.create = function create(instanceConfig) {
+ return createInstance(mergeConfig(defaultConfig, instanceConfig));
+ };
+
+ return instance;
+}
+
+// Create the default instance to be exported
+const axios = createInstance(defaults);
+
+// Expose Axios class to allow class inheritance
+axios.Axios = Axios;
+
+// Expose Cancel & CancelToken
+axios.CanceledError = CanceledError;
+axios.CancelToken = CancelToken;
+axios.isCancel = isCancel;
+axios.VERSION = VERSION;
+axios.toFormData = toFormData;
+
+// Expose AxiosError class
+axios.AxiosError = AxiosError;
+
+// alias for CanceledError for backward compatibility
+axios.Cancel = axios.CanceledError;
+
+// Expose all/spread
+axios.all = function all(promises) {
+ return Promise.all(promises);
+};
+
+axios.spread = spread;
+
+// Expose isAxiosError
+axios.isAxiosError = isAxiosError;
+
+axios.formToJSON = thing => {
+ return formDataToJSON(utils.isHTMLForm(thing) ? new FormData(thing) : thing);
+};
+
+export { axios as default };
+//# sourceMappingURL=axios.js.map
diff --git a/node_modules/axios/dist/esm/axios.js.map b/node_modules/axios/dist/esm/axios.js.map
new file mode 100644
index 0000000..8980591
--- /dev/null
+++ b/node_modules/axios/dist/esm/axios.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"axios.js","sources":["../../lib/helpers/bind.js","../../lib/utils.js","../../lib/core/AxiosError.js","../../node_modules/form-data/lib/browser.js","../../lib/helpers/toFormData.js","../../lib/helpers/AxiosURLSearchParams.js","../../lib/helpers/buildURL.js","../../lib/core/InterceptorManager.js","../../lib/defaults/transitional.js","../../lib/platform/browser/classes/URLSearchParams.js","../../lib/platform/browser/classes/FormData.js","../../lib/platform/browser/index.js","../../lib/helpers/toURLEncodedForm.js","../../lib/helpers/formDataToJSON.js","../../lib/core/settle.js","../../lib/helpers/cookies.js","../../lib/helpers/isAbsoluteURL.js","../../lib/helpers/combineURLs.js","../../lib/core/buildFullPath.js","../../lib/helpers/isURLSameOrigin.js","../../lib/cancel/CanceledError.js","../../lib/helpers/parseProtocol.js","../../lib/helpers/parseHeaders.js","../../lib/core/AxiosHeaders.js","../../lib/helpers/speedometer.js","../../lib/adapters/xhr.js","../../lib/adapters/index.js","../../lib/defaults/index.js","../../lib/core/transformData.js","../../lib/cancel/isCancel.js","../../lib/core/dispatchRequest.js","../../lib/core/mergeConfig.js","../../lib/env/data.js","../../lib/helpers/validator.js","../../lib/core/Axios.js","../../lib/cancel/CancelToken.js","../../lib/helpers/spread.js","../../lib/helpers/isAxiosError.js","../../lib/axios.js"],"sourcesContent":["'use strict';\n\nexport default function bind(fn, thisArg) {\n return function wrap() {\n return fn.apply(thisArg, arguments);\n };\n}\n","'use strict';\n\nimport bind from './helpers/bind.js';\n\n// utils is a library of generic helper functions non-specific to axios\n\nconst {toString} = Object.prototype;\nconst {getPrototypeOf} = Object;\n\nconst kindOf = (cache => thing => {\n const str = toString.call(thing);\n return cache[str] || (cache[str] = str.slice(8, -1).toLowerCase());\n})(Object.create(null));\n\nconst kindOfTest = (type) => {\n type = type.toLowerCase();\n return (thing) => kindOf(thing) === type\n}\n\nconst typeOfTest = type => thing => typeof thing === type;\n\n/**\n * Determine if a value is an Array\n *\n * @param {Object} val The value to test\n *\n * @returns {boolean} True if value is an Array, otherwise false\n */\nconst {isArray} = Array;\n\n/**\n * Determine if a value is undefined\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if the value is undefined, otherwise false\n */\nconst isUndefined = typeOfTest('undefined');\n\n/**\n * Determine if a value is a Buffer\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Buffer, otherwise false\n */\nfunction isBuffer(val) {\n return val !== null && !isUndefined(val) && val.constructor !== null && !isUndefined(val.constructor)\n && isFunction(val.constructor.isBuffer) && val.constructor.isBuffer(val);\n}\n\n/**\n * Determine if a value is an ArrayBuffer\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is an ArrayBuffer, otherwise false\n */\nconst isArrayBuffer = kindOfTest('ArrayBuffer');\n\n\n/**\n * Determine if a value is a view on an ArrayBuffer\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a view on an ArrayBuffer, otherwise false\n */\nfunction isArrayBufferView(val) {\n let result;\n if ((typeof ArrayBuffer !== 'undefined') && (ArrayBuffer.isView)) {\n result = ArrayBuffer.isView(val);\n } else {\n result = (val) && (val.buffer) && (isArrayBuffer(val.buffer));\n }\n return result;\n}\n\n/**\n * Determine if a value is a String\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a String, otherwise false\n */\nconst isString = typeOfTest('string');\n\n/**\n * Determine if a value is a Function\n *\n * @param {*} val The value to test\n * @returns {boolean} True if value is a Function, otherwise false\n */\nconst isFunction = typeOfTest('function');\n\n/**\n * Determine if a value is a Number\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Number, otherwise false\n */\nconst isNumber = typeOfTest('number');\n\n/**\n * Determine if a value is an Object\n *\n * @param {*} thing The value to test\n *\n * @returns {boolean} True if value is an Object, otherwise false\n */\nconst isObject = (thing) => thing !== null && typeof thing === 'object';\n\n/**\n * Determine if a value is a Boolean\n *\n * @param {*} thing The value to test\n * @returns {boolean} True if value is a Boolean, otherwise false\n */\nconst isBoolean = thing => thing === true || thing === false;\n\n/**\n * Determine if a value is a plain Object\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a plain Object, otherwise false\n */\nconst isPlainObject = (val) => {\n if (kindOf(val) !== 'object') {\n return false;\n }\n\n const prototype = getPrototypeOf(val);\n return (prototype === null || prototype === Object.prototype || Object.getPrototypeOf(prototype) === null) && !(Symbol.toStringTag in val) && !(Symbol.iterator in val);\n}\n\n/**\n * Determine if a value is a Date\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Date, otherwise false\n */\nconst isDate = kindOfTest('Date');\n\n/**\n * Determine if a value is a File\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a File, otherwise false\n */\nconst isFile = kindOfTest('File');\n\n/**\n * Determine if a value is a Blob\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Blob, otherwise false\n */\nconst isBlob = kindOfTest('Blob');\n\n/**\n * Determine if a value is a FileList\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a File, otherwise false\n */\nconst isFileList = kindOfTest('FileList');\n\n/**\n * Determine if a value is a Stream\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Stream, otherwise false\n */\nconst isStream = (val) => isObject(val) && isFunction(val.pipe);\n\n/**\n * Determine if a value is a FormData\n *\n * @param {*} thing The value to test\n *\n * @returns {boolean} True if value is an FormData, otherwise false\n */\nconst isFormData = (thing) => {\n const pattern = '[object FormData]';\n return thing && (\n (typeof FormData === 'function' && thing instanceof FormData) ||\n toString.call(thing) === pattern ||\n (isFunction(thing.toString) && thing.toString() === pattern)\n );\n}\n\n/**\n * Determine if a value is a URLSearchParams object\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a URLSearchParams object, otherwise false\n */\nconst isURLSearchParams = kindOfTest('URLSearchParams');\n\n/**\n * Trim excess whitespace off the beginning and end of a string\n *\n * @param {String} str The String to trim\n *\n * @returns {String} The String freed of excess whitespace\n */\nconst trim = (str) => str.trim ?\n str.trim() : str.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n\n/**\n * Iterate over an Array or an Object invoking a function for each item.\n *\n * If `obj` is an Array callback will be called passing\n * the value, index, and complete array for each item.\n *\n * If 'obj' is an Object callback will be called passing\n * the value, key, and complete object for each property.\n *\n * @param {Object|Array} obj The object to iterate\n * @param {Function} fn The callback to invoke for each item\n *\n * @param {Boolean} [allOwnKeys = false]\n * @returns {void}\n */\nfunction forEach(obj, fn, {allOwnKeys = false} = {}) {\n // Don't bother if no value provided\n if (obj === null || typeof obj === 'undefined') {\n return;\n }\n\n let i;\n let l;\n\n // Force an array if not already something iterable\n if (typeof obj !== 'object') {\n /*eslint no-param-reassign:0*/\n obj = [obj];\n }\n\n if (isArray(obj)) {\n // Iterate over array values\n for (i = 0, l = obj.length; i < l; i++) {\n fn.call(null, obj[i], i, obj);\n }\n } else {\n // Iterate over object keys\n const keys = allOwnKeys ? Object.getOwnPropertyNames(obj) : Object.keys(obj);\n const len = keys.length;\n let key;\n\n for (i = 0; i < len; i++) {\n key = keys[i];\n fn.call(null, obj[key], key, obj);\n }\n }\n}\n\n/**\n * Accepts varargs expecting each argument to be an object, then\n * immutably merges the properties of each object and returns result.\n *\n * When multiple objects contain the same key the later object in\n * the arguments list will take precedence.\n *\n * Example:\n *\n * ```js\n * var result = merge({foo: 123}, {foo: 456});\n * console.log(result.foo); // outputs 456\n * ```\n *\n * @param {Object} obj1 Object to merge\n *\n * @returns {Object} Result of all merge properties\n */\nfunction merge(/* obj1, obj2, obj3, ... */) {\n const result = {};\n const assignValue = (val, key) => {\n if (isPlainObject(result[key]) && isPlainObject(val)) {\n result[key] = merge(result[key], val);\n } else if (isPlainObject(val)) {\n result[key] = merge({}, val);\n } else if (isArray(val)) {\n result[key] = val.slice();\n } else {\n result[key] = val;\n }\n }\n\n for (let i = 0, l = arguments.length; i < l; i++) {\n arguments[i] && forEach(arguments[i], assignValue);\n }\n return result;\n}\n\n/**\n * Extends object a by mutably adding to it the properties of object b.\n *\n * @param {Object} a The object to be extended\n * @param {Object} b The object to copy properties from\n * @param {Object} thisArg The object to bind function to\n *\n * @param {Boolean} [allOwnKeys]\n * @returns {Object} The resulting value of object a\n */\nconst extend = (a, b, thisArg, {allOwnKeys}= {}) => {\n forEach(b, (val, key) => {\n if (thisArg && isFunction(val)) {\n a[key] = bind(val, thisArg);\n } else {\n a[key] = val;\n }\n }, {allOwnKeys});\n return a;\n}\n\n/**\n * Remove byte order marker. This catches EF BB BF (the UTF-8 BOM)\n *\n * @param {string} content with BOM\n *\n * @returns {string} content value without BOM\n */\nconst stripBOM = (content) => {\n if (content.charCodeAt(0) === 0xFEFF) {\n content = content.slice(1);\n }\n return content;\n}\n\n/**\n * Inherit the prototype methods from one constructor into another\n * @param {function} constructor\n * @param {function} superConstructor\n * @param {object} [props]\n * @param {object} [descriptors]\n *\n * @returns {void}\n */\nconst inherits = (constructor, superConstructor, props, descriptors) => {\n constructor.prototype = Object.create(superConstructor.prototype, descriptors);\n constructor.prototype.constructor = constructor;\n Object.defineProperty(constructor, 'super', {\n value: superConstructor.prototype\n });\n props && Object.assign(constructor.prototype, props);\n}\n\n/**\n * Resolve object with deep prototype chain to a flat object\n * @param {Object} sourceObj source object\n * @param {Object} [destObj]\n * @param {Function|Boolean} [filter]\n * @param {Function} [propFilter]\n *\n * @returns {Object}\n */\nconst toFlatObject = (sourceObj, destObj, filter, propFilter) => {\n let props;\n let i;\n let prop;\n const merged = {};\n\n destObj = destObj || {};\n // eslint-disable-next-line no-eq-null,eqeqeq\n if (sourceObj == null) return destObj;\n\n do {\n props = Object.getOwnPropertyNames(sourceObj);\n i = props.length;\n while (i-- > 0) {\n prop = props[i];\n if ((!propFilter || propFilter(prop, sourceObj, destObj)) && !merged[prop]) {\n destObj[prop] = sourceObj[prop];\n merged[prop] = true;\n }\n }\n sourceObj = filter !== false && getPrototypeOf(sourceObj);\n } while (sourceObj && (!filter || filter(sourceObj, destObj)) && sourceObj !== Object.prototype);\n\n return destObj;\n}\n\n/**\n * Determines whether a string ends with the characters of a specified string\n *\n * @param {String} str\n * @param {String} searchString\n * @param {Number} [position= 0]\n *\n * @returns {boolean}\n */\nconst endsWith = (str, searchString, position) => {\n str = String(str);\n if (position === undefined || position > str.length) {\n position = str.length;\n }\n position -= searchString.length;\n const lastIndex = str.indexOf(searchString, position);\n return lastIndex !== -1 && lastIndex === position;\n}\n\n\n/**\n * Returns new array from array like object or null if failed\n *\n * @param {*} [thing]\n *\n * @returns {?Array}\n */\nconst toArray = (thing) => {\n if (!thing) return null;\n if (isArray(thing)) return thing;\n let i = thing.length;\n if (!isNumber(i)) return null;\n const arr = new Array(i);\n while (i-- > 0) {\n arr[i] = thing[i];\n }\n return arr;\n}\n\n/**\n * Checking if the Uint8Array exists and if it does, it returns a function that checks if the\n * thing passed in is an instance of Uint8Array\n *\n * @param {TypedArray}\n *\n * @returns {Array}\n */\n// eslint-disable-next-line func-names\nconst isTypedArray = (TypedArray => {\n // eslint-disable-next-line func-names\n return thing => {\n return TypedArray && thing instanceof TypedArray;\n };\n})(typeof Uint8Array !== 'undefined' && getPrototypeOf(Uint8Array));\n\n/**\n * For each entry in the object, call the function with the key and value.\n *\n * @param {Object<any, any>} obj - The object to iterate over.\n * @param {Function} fn - The function to call for each entry.\n *\n * @returns {void}\n */\nconst forEachEntry = (obj, fn) => {\n const generator = obj && obj[Symbol.iterator];\n\n const iterator = generator.call(obj);\n\n let result;\n\n while ((result = iterator.next()) && !result.done) {\n const pair = result.value;\n fn.call(obj, pair[0], pair[1]);\n }\n}\n\n/**\n * It takes a regular expression and a string, and returns an array of all the matches\n *\n * @param {string} regExp - The regular expression to match against.\n * @param {string} str - The string to search.\n *\n * @returns {Array<boolean>}\n */\nconst matchAll = (regExp, str) => {\n let matches;\n const arr = [];\n\n while ((matches = regExp.exec(str)) !== null) {\n arr.push(matches);\n }\n\n return arr;\n}\n\n/* Checking if the kindOfTest function returns true when passed an HTMLFormElement. */\nconst isHTMLForm = kindOfTest('HTMLFormElement');\n\nconst toCamelCase = str => {\n return str.toLowerCase().replace(/[_-\\s]([a-z\\d])(\\w*)/g,\n function replacer(m, p1, p2) {\n return p1.toUpperCase() + p2;\n }\n );\n};\n\n/* Creating a function that will check if an object has a property. */\nconst hasOwnProperty = (({hasOwnProperty}) => (obj, prop) => hasOwnProperty.call(obj, prop))(Object.prototype);\n\n/**\n * Determine if a value is a RegExp object\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a RegExp object, otherwise false\n */\nconst isRegExp = kindOfTest('RegExp');\n\nconst reduceDescriptors = (obj, reducer) => {\n const descriptors = Object.getOwnPropertyDescriptors(obj);\n const reducedDescriptors = {};\n\n forEach(descriptors, (descriptor, name) => {\n if (reducer(descriptor, name, obj) !== false) {\n reducedDescriptors[name] = descriptor;\n }\n });\n\n Object.defineProperties(obj, reducedDescriptors);\n}\n\n/**\n * Makes all methods read-only\n * @param {Object} obj\n */\n\nconst freezeMethods = (obj) => {\n reduceDescriptors(obj, (descriptor, name) => {\n const value = obj[name];\n\n if (!isFunction(value)) return;\n\n descriptor.enumerable = false;\n\n if ('writable' in descriptor) {\n descriptor.writable = false;\n return;\n }\n\n if (!descriptor.set) {\n descriptor.set = () => {\n throw Error('Can not read-only method \\'' + name + '\\'');\n };\n }\n });\n}\n\nconst toObjectSet = (arrayOrString, delimiter) => {\n const obj = {};\n\n const define = (arr) => {\n arr.forEach(value => {\n obj[value] = true;\n });\n }\n\n isArray(arrayOrString) ? define(arrayOrString) : define(String(arrayOrString).split(delimiter));\n\n return obj;\n}\n\nconst noop = () => {}\n\nconst toFiniteNumber = (value, defaultValue) => {\n value = +value;\n return Number.isFinite(value) ? value : defaultValue;\n}\n\nexport default {\n isArray,\n isArrayBuffer,\n isBuffer,\n isFormData,\n isArrayBufferView,\n isString,\n isNumber,\n isBoolean,\n isObject,\n isPlainObject,\n isUndefined,\n isDate,\n isFile,\n isBlob,\n isRegExp,\n isFunction,\n isStream,\n isURLSearchParams,\n isTypedArray,\n isFileList,\n forEach,\n merge,\n extend,\n trim,\n stripBOM,\n inherits,\n toFlatObject,\n kindOf,\n kindOfTest,\n endsWith,\n toArray,\n forEachEntry,\n matchAll,\n isHTMLForm,\n hasOwnProperty,\n hasOwnProp: hasOwnProperty, // an alias to avoid ESLint no-prototype-builtins detection\n reduceDescriptors,\n freezeMethods,\n toObjectSet,\n toCamelCase,\n noop,\n toFiniteNumber\n};\n","'use strict';\n\nimport utils from '../utils.js';\n\n/**\n * Create an Error with the specified message, config, error code, request and response.\n *\n * @param {string} message The error message.\n * @param {string} [code] The error code (for example, 'ECONNABORTED').\n * @param {Object} [config] The config.\n * @param {Object} [request] The request.\n * @param {Object} [response] The response.\n *\n * @returns {Error} The created error.\n */\nfunction AxiosError(message, code, config, request, response) {\n Error.call(this);\n\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, this.constructor);\n } else {\n this.stack = (new Error()).stack;\n }\n\n this.message = message;\n this.name = 'AxiosError';\n code && (this.code = code);\n config && (this.config = config);\n request && (this.request = request);\n response && (this.response = response);\n}\n\nutils.inherits(AxiosError, Error, {\n toJSON: function toJSON() {\n return {\n // Standard\n message: this.message,\n name: this.name,\n // Microsoft\n description: this.description,\n number: this.number,\n // Mozilla\n fileName: this.fileName,\n lineNumber: this.lineNumber,\n columnNumber: this.columnNumber,\n stack: this.stack,\n // Axios\n config: this.config,\n code: this.code,\n status: this.response && this.response.status ? this.response.status : null\n };\n }\n});\n\nconst prototype = AxiosError.prototype;\nconst descriptors = {};\n\n[\n 'ERR_BAD_OPTION_VALUE',\n 'ERR_BAD_OPTION',\n 'ECONNABORTED',\n 'ETIMEDOUT',\n 'ERR_NETWORK',\n 'ERR_FR_TOO_MANY_REDIRECTS',\n 'ERR_DEPRECATED',\n 'ERR_BAD_RESPONSE',\n 'ERR_BAD_REQUEST',\n 'ERR_CANCELED',\n 'ERR_NOT_SUPPORT',\n 'ERR_INVALID_URL'\n// eslint-disable-next-line func-names\n].forEach(code => {\n descriptors[code] = {value: code};\n});\n\nObject.defineProperties(AxiosError, descriptors);\nObject.defineProperty(prototype, 'isAxiosError', {value: true});\n\n// eslint-disable-next-line func-names\nAxiosError.from = (error, code, config, request, response, customProps) => {\n const axiosError = Object.create(prototype);\n\n utils.toFlatObject(error, axiosError, function filter(obj) {\n return obj !== Error.prototype;\n }, prop => {\n return prop !== 'isAxiosError';\n });\n\n AxiosError.call(axiosError, error.message, code, config, request, response);\n\n axiosError.cause = error;\n\n axiosError.name = error.name;\n\n customProps && Object.assign(axiosError, customProps);\n\n return axiosError;\n};\n\nexport default AxiosError;\n","/* eslint-env browser */\nmodule.exports = typeof self == 'object' ? self.FormData : window.FormData;\n","'use strict';\n\nimport utils from '../utils.js';\nimport AxiosError from '../core/AxiosError.js';\nimport envFormData from '../env/classes/FormData.js';\n\n/**\n * Determines if the given thing is a array or js object.\n *\n * @param {string} thing - The object or array to be visited.\n *\n * @returns {boolean}\n */\nfunction isVisitable(thing) {\n return utils.isPlainObject(thing) || utils.isArray(thing);\n}\n\n/**\n * It removes the brackets from the end of a string\n *\n * @param {string} key - The key of the parameter.\n *\n * @returns {string} the key without the brackets.\n */\nfunction removeBrackets(key) {\n return utils.endsWith(key, '[]') ? key.slice(0, -2) : key;\n}\n\n/**\n * It takes a path, a key, and a boolean, and returns a string\n *\n * @param {string} path - The path to the current key.\n * @param {string} key - The key of the current object being iterated over.\n * @param {string} dots - If true, the key will be rendered with dots instead of brackets.\n *\n * @returns {string} The path to the current key.\n */\nfunction renderKey(path, key, dots) {\n if (!path) return key;\n return path.concat(key).map(function each(token, i) {\n // eslint-disable-next-line no-param-reassign\n token = removeBrackets(token);\n return !dots && i ? '[' + token + ']' : token;\n }).join(dots ? '.' : '');\n}\n\n/**\n * If the array is an array and none of its elements are visitable, then it's a flat array.\n *\n * @param {Array<any>} arr - The array to check\n *\n * @returns {boolean}\n */\nfunction isFlatArray(arr) {\n return utils.isArray(arr) && !arr.some(isVisitable);\n}\n\nconst predicates = utils.toFlatObject(utils, {}, null, function filter(prop) {\n return /^is[A-Z]/.test(prop);\n});\n\n/**\n * If the thing is a FormData object, return true, otherwise return false.\n *\n * @param {unknown} thing - The thing to check.\n *\n * @returns {boolean}\n */\nfunction isSpecCompliant(thing) {\n return thing && utils.isFunction(thing.append) && thing[Symbol.toStringTag] === 'FormData' && thing[Symbol.iterator];\n}\n\n/**\n * Convert a data object to FormData\n *\n * @param {Object} obj\n * @param {?Object} [formData]\n * @param {?Object} [options]\n * @param {Function} [options.visitor]\n * @param {Boolean} [options.metaTokens = true]\n * @param {Boolean} [options.dots = false]\n * @param {?Boolean} [options.indexes = false]\n *\n * @returns {Object}\n **/\n\n/**\n * It converts an object into a FormData object\n *\n * @param {Object<any, any>} obj - The object to convert to form data.\n * @param {string} formData - The FormData object to append to.\n * @param {Object<string, any>} options\n *\n * @returns\n */\nfunction toFormData(obj, formData, options) {\n if (!utils.isObject(obj)) {\n throw new TypeError('target must be an object');\n }\n\n // eslint-disable-next-line no-param-reassign\n formData = formData || new (envFormData || FormData)();\n\n // eslint-disable-next-line no-param-reassign\n options = utils.toFlatObject(options, {\n metaTokens: true,\n dots: false,\n indexes: false\n }, false, function defined(option, source) {\n // eslint-disable-next-line no-eq-null,eqeqeq\n return !utils.isUndefined(source[option]);\n });\n\n const metaTokens = options.metaTokens;\n // eslint-disable-next-line no-use-before-define\n const visitor = options.visitor || defaultVisitor;\n const dots = options.dots;\n const indexes = options.indexes;\n const _Blob = options.Blob || typeof Blob !== 'undefined' && Blob;\n const useBlob = _Blob && isSpecCompliant(formData);\n\n if (!utils.isFunction(visitor)) {\n throw new TypeError('visitor must be a function');\n }\n\n function convertValue(value) {\n if (value === null) return '';\n\n if (utils.isDate(value)) {\n return value.toISOString();\n }\n\n if (!useBlob && utils.isBlob(value)) {\n throw new AxiosError('Blob is not supported. Use a Buffer instead.');\n }\n\n if (utils.isArrayBuffer(value) || utils.isTypedArray(value)) {\n return useBlob && typeof Blob === 'function' ? new Blob([value]) : Buffer.from(value);\n }\n\n return value;\n }\n\n /**\n * Default visitor.\n *\n * @param {*} value\n * @param {String|Number} key\n * @param {Array<String|Number>} path\n * @this {FormData}\n *\n * @returns {boolean} return true to visit the each prop of the value recursively\n */\n function defaultVisitor(value, key, path) {\n let arr = value;\n\n if (value && !path && typeof value === 'object') {\n if (utils.endsWith(key, '{}')) {\n // eslint-disable-next-line no-param-reassign\n key = metaTokens ? key : key.slice(0, -2);\n // eslint-disable-next-line no-param-reassign\n value = JSON.stringify(value);\n } else if (\n (utils.isArray(value) && isFlatArray(value)) ||\n (utils.isFileList(value) || utils.endsWith(key, '[]') && (arr = utils.toArray(value))\n )) {\n // eslint-disable-next-line no-param-reassign\n key = removeBrackets(key);\n\n arr.forEach(function each(el, index) {\n !(utils.isUndefined(el) || el === null) && formData.append(\n // eslint-disable-next-line no-nested-ternary\n indexes === true ? renderKey([key], index, dots) : (indexes === null ? key : key + '[]'),\n convertValue(el)\n );\n });\n return false;\n }\n }\n\n if (isVisitable(value)) {\n return true;\n }\n\n formData.append(renderKey(path, key, dots), convertValue(value));\n\n return false;\n }\n\n const stack = [];\n\n const exposedHelpers = Object.assign(predicates, {\n defaultVisitor,\n convertValue,\n isVisitable\n });\n\n function build(value, path) {\n if (utils.isUndefined(value)) return;\n\n if (stack.indexOf(value) !== -1) {\n throw Error('Circular reference detected in ' + path.join('.'));\n }\n\n stack.push(value);\n\n utils.forEach(value, function each(el, key) {\n const result = !(utils.isUndefined(el) || el === null) && visitor.call(\n formData, el, utils.isString(key) ? key.trim() : key, path, exposedHelpers\n );\n\n if (result === true) {\n build(el, path ? path.concat(key) : [key]);\n }\n });\n\n stack.pop();\n }\n\n if (!utils.isObject(obj)) {\n throw new TypeError('data must be an object');\n }\n\n build(obj);\n\n return formData;\n}\n\nexport default toFormData;\n","'use strict';\n\nimport toFormData from './toFormData.js';\n\n/**\n * It encodes a string by replacing all characters that are not in the unreserved set with\n * their percent-encoded equivalents\n *\n * @param {string} str - The string to encode.\n *\n * @returns {string} The encoded string.\n */\nfunction encode(str) {\n const charMap = {\n '!': '%21',\n \"'\": '%27',\n '(': '%28',\n ')': '%29',\n '~': '%7E',\n '%20': '+',\n '%00': '\\x00'\n };\n return encodeURIComponent(str).replace(/[!'()~]|%20|%00/g, function replacer(match) {\n return charMap[match];\n });\n}\n\n/**\n * It takes a params object and converts it to a FormData object\n *\n * @param {Object<string, any>} params - The parameters to be converted to a FormData object.\n * @param {Object<string, any>} options - The options object passed to the Axios constructor.\n *\n * @returns {void}\n */\nfunction AxiosURLSearchParams(params, options) {\n this._pairs = [];\n\n params && toFormData(params, this, options);\n}\n\nconst prototype = AxiosURLSearchParams.prototype;\n\nprototype.append = function append(name, value) {\n this._pairs.push([name, value]);\n};\n\nprototype.toString = function toString(encoder) {\n const _encode = encoder ? function(value) {\n return encoder.call(this, value, encode);\n } : encode;\n\n return this._pairs.map(function each(pair) {\n return _encode(pair[0]) + '=' + _encode(pair[1]);\n }, '').join('&');\n};\n\nexport default AxiosURLSearchParams;\n","'use strict';\n\nimport utils from '../utils.js';\nimport AxiosURLSearchParams from '../helpers/AxiosURLSearchParams.js';\n\n/**\n * It replaces all instances of the characters `:`, `$`, `,`, `+`, `[`, and `]` with their\n * URI encoded counterparts\n *\n * @param {string} val The value to be encoded.\n *\n * @returns {string} The encoded value.\n */\nfunction encode(val) {\n return encodeURIComponent(val).\n replace(/%3A/gi, ':').\n replace(/%24/g, '$').\n replace(/%2C/gi, ',').\n replace(/%20/g, '+').\n replace(/%5B/gi, '[').\n replace(/%5D/gi, ']');\n}\n\n/**\n * Build a URL by appending params to the end\n *\n * @param {string} url The base of the url (e.g., http://www.google.com)\n * @param {object} [params] The params to be appended\n * @param {?object} options\n *\n * @returns {string} The formatted url\n */\nexport default function buildURL(url, params, options) {\n /*eslint no-param-reassign:0*/\n if (!params) {\n return url;\n }\n \n const _encode = options && options.encode || encode;\n\n const serializeFn = options && options.serialize;\n\n let serializedParams;\n\n if (serializeFn) {\n serializedParams = serializeFn(params, options);\n } else {\n serializedParams = utils.isURLSearchParams(params) ?\n params.toString() :\n new AxiosURLSearchParams(params, options).toString(_encode);\n }\n\n if (serializedParams) {\n const hashmarkIndex = url.indexOf(\"#\");\n\n if (hashmarkIndex !== -1) {\n url = url.slice(0, hashmarkIndex);\n }\n url += (url.indexOf('?') === -1 ? '?' : '&') + serializedParams;\n }\n\n return url;\n}\n","'use strict';\n\nimport utils from './../utils.js';\n\nclass InterceptorManager {\n constructor() {\n this.handlers = [];\n }\n\n /**\n * Add a new interceptor to the stack\n *\n * @param {Function} fulfilled The function to handle `then` for a `Promise`\n * @param {Function} rejected The function to handle `reject` for a `Promise`\n *\n * @return {Number} An ID used to remove interceptor later\n */\n use(fulfilled, rejected, options) {\n this.handlers.push({\n fulfilled,\n rejected,\n synchronous: options ? options.synchronous : false,\n runWhen: options ? options.runWhen : null\n });\n return this.handlers.length - 1;\n }\n\n /**\n * Remove an interceptor from the stack\n *\n * @param {Number} id The ID that was returned by `use`\n *\n * @returns {Boolean} `true` if the interceptor was removed, `false` otherwise\n */\n eject(id) {\n if (this.handlers[id]) {\n this.handlers[id] = null;\n }\n }\n\n /**\n * Clear all interceptors from the stack\n *\n * @returns {void}\n */\n clear() {\n if (this.handlers) {\n this.handlers = [];\n }\n }\n\n /**\n * Iterate over all the registered interceptors\n *\n * This method is particularly useful for skipping over any\n * interceptors that may have become `null` calling `eject`.\n *\n * @param {Function} fn The function to call for each interceptor\n *\n * @returns {void}\n */\n forEach(fn) {\n utils.forEach(this.handlers, function forEachHandler(h) {\n if (h !== null) {\n fn(h);\n }\n });\n }\n}\n\nexport default InterceptorManager;\n","'use strict';\n\nexport default {\n silentJSONParsing: true,\n forcedJSONParsing: true,\n clarifyTimeoutError: false\n};\n","'use strict';\n\nimport AxiosURLSearchParams from '../../../helpers/AxiosURLSearchParams.js';\nexport default typeof URLSearchParams !== 'undefined' ? URLSearchParams : AxiosURLSearchParams;\n","'use strict';\n\nexport default FormData;\n","import URLSearchParams from './classes/URLSearchParams.js'\nimport FormData from './classes/FormData.js'\n\n/**\n * Determine if we're running in a standard browser environment\n *\n * This allows axios to run in a web worker, and react-native.\n * Both environments support XMLHttpRequest, but not fully standard globals.\n *\n * web workers:\n * typeof window -> undefined\n * typeof document -> undefined\n *\n * react-native:\n * navigator.product -> 'ReactNative'\n * nativescript\n * navigator.product -> 'NativeScript' or 'NS'\n *\n * @returns {boolean}\n */\nconst isStandardBrowserEnv = (() => {\n let product;\n if (typeof navigator !== 'undefined' && (\n (product = navigator.product) === 'ReactNative' ||\n product === 'NativeScript' ||\n product === 'NS')\n ) {\n return false;\n }\n\n return typeof window !== 'undefined' && typeof document !== 'undefined';\n})();\n\nexport default {\n isBrowser: true,\n classes: {\n URLSearchParams,\n FormData,\n Blob\n },\n isStandardBrowserEnv,\n protocols: ['http', 'https', 'file', 'blob', 'url', 'data']\n};\n","'use strict';\n\nimport utils from '../utils.js';\nimport toFormData from './toFormData.js';\nimport platform from '../platform/index.js';\n\nexport default function toURLEncodedForm(data, options) {\n return toFormData(data, new platform.classes.URLSearchParams(), Object.assign({\n visitor: function(value, key, path, helpers) {\n if (platform.isNode && utils.isBuffer(value)) {\n this.append(key, value.toString('base64'));\n return false;\n }\n\n return helpers.defaultVisitor.apply(this, arguments);\n }\n }, options));\n}\n","'use strict';\n\nimport utils from '../utils.js';\n\n/**\n * It takes a string like `foo[x][y][z]` and returns an array like `['foo', 'x', 'y', 'z']\n *\n * @param {string} name - The name of the property to get.\n *\n * @returns An array of strings.\n */\nfunction parsePropPath(name) {\n // foo[x][y][z]\n // foo.x.y.z\n // foo-x-y-z\n // foo x y z\n return utils.matchAll(/\\w+|\\[(\\w*)]/g, name).map(match => {\n return match[0] === '[]' ? '' : match[1] || match[0];\n });\n}\n\n/**\n * Convert an array to an object.\n *\n * @param {Array<any>} arr - The array to convert to an object.\n *\n * @returns An object with the same keys and values as the array.\n */\nfunction arrayToObject(arr) {\n const obj = {};\n const keys = Object.keys(arr);\n let i;\n const len = keys.length;\n let key;\n for (i = 0; i < len; i++) {\n key = keys[i];\n obj[key] = arr[key];\n }\n return obj;\n}\n\n/**\n * It takes a FormData object and returns a JavaScript object\n *\n * @param {string} formData The FormData object to convert to JSON.\n *\n * @returns {Object<string, any> | null} The converted object.\n */\nfunction formDataToJSON(formData) {\n function buildPath(path, value, target, index) {\n let name = path[index++];\n const isNumericKey = Number.isFinite(+name);\n const isLast = index >= path.length;\n name = !name && utils.isArray(target) ? target.length : name;\n\n if (isLast) {\n if (utils.hasOwnProp(target, name)) {\n target[name] = [target[name], value];\n } else {\n target[name] = value;\n }\n\n return !isNumericKey;\n }\n\n if (!target[name] || !utils.isObject(target[name])) {\n target[name] = [];\n }\n\n const result = buildPath(path, value, target[name], index);\n\n if (result && utils.isArray(target[name])) {\n target[name] = arrayToObject(target[name]);\n }\n\n return !isNumericKey;\n }\n\n if (utils.isFormData(formData) && utils.isFunction(formData.entries)) {\n const obj = {};\n\n utils.forEachEntry(formData, (name, value) => {\n buildPath(parsePropPath(name), value, obj, 0);\n });\n\n return obj;\n }\n\n return null;\n}\n\nexport default formDataToJSON;\n","'use strict';\n\nimport AxiosError from './AxiosError.js';\n\n/**\n * Resolve or reject a Promise based on response status.\n *\n * @param {Function} resolve A function that resolves the promise.\n * @param {Function} reject A function that rejects the promise.\n * @param {object} response The response.\n *\n * @returns {object} The response.\n */\nexport default function settle(resolve, reject, response) {\n const validateStatus = response.config.validateStatus;\n if (!response.status || !validateStatus || validateStatus(response.status)) {\n resolve(response);\n } else {\n reject(new AxiosError(\n 'Request failed with status code ' + response.status,\n [AxiosError.ERR_BAD_REQUEST, AxiosError.ERR_BAD_RESPONSE][Math.floor(response.status / 100) - 4],\n response.config,\n response.request,\n response\n ));\n }\n}\n","'use strict';\n\nimport utils from './../utils.js';\nimport platform from '../platform/index.js';\n\nexport default platform.isStandardBrowserEnv ?\n\n// Standard browser envs support document.cookie\n (function standardBrowserEnv() {\n return {\n write: function write(name, value, expires, path, domain, secure) {\n const cookie = [];\n cookie.push(name + '=' + encodeURIComponent(value));\n\n if (utils.isNumber(expires)) {\n cookie.push('expires=' + new Date(expires).toGMTString());\n }\n\n if (utils.isString(path)) {\n cookie.push('path=' + path);\n }\n\n if (utils.isString(domain)) {\n cookie.push('domain=' + domain);\n }\n\n if (secure === true) {\n cookie.push('secure');\n }\n\n document.cookie = cookie.join('; ');\n },\n\n read: function read(name) {\n const match = document.cookie.match(new RegExp('(^|;\\\\s*)(' + name + ')=([^;]*)'));\n return (match ? decodeURIComponent(match[3]) : null);\n },\n\n remove: function remove(name) {\n this.write(name, '', Date.now() - 86400000);\n }\n };\n })() :\n\n// Non standard browser env (web workers, react-native) lack needed support.\n (function nonStandardBrowserEnv() {\n return {\n write: function write() {},\n read: function read() { return null; },\n remove: function remove() {}\n };\n })();\n","'use strict';\n\n/**\n * Determines whether the specified URL is absolute\n *\n * @param {string} url The URL to test\n *\n * @returns {boolean} True if the specified URL is absolute, otherwise false\n */\nexport default function isAbsoluteURL(url) {\n // A URL is considered absolute if it begins with \"<scheme>://\" or \"//\" (protocol-relative URL).\n // RFC 3986 defines scheme name as a sequence of characters beginning with a letter and followed\n // by any combination of letters, digits, plus, period, or hyphen.\n return /^([a-z][a-z\\d+\\-.]*:)?\\/\\//i.test(url);\n}\n","'use strict';\n\n/**\n * Creates a new URL by combining the specified URLs\n *\n * @param {string} baseURL The base URL\n * @param {string} relativeURL The relative URL\n *\n * @returns {string} The combined URL\n */\nexport default function combineURLs(baseURL, relativeURL) {\n return relativeURL\n ? baseURL.replace(/\\/+$/, '') + '/' + relativeURL.replace(/^\\/+/, '')\n : baseURL;\n}\n","'use strict';\n\nimport isAbsoluteURL from '../helpers/isAbsoluteURL.js';\nimport combineURLs from '../helpers/combineURLs.js';\n\n/**\n * Creates a new URL by combining the baseURL with the requestedURL,\n * only when the requestedURL is not already an absolute URL.\n * If the requestURL is absolute, this function returns the requestedURL untouched.\n *\n * @param {string} baseURL The base URL\n * @param {string} requestedURL Absolute or relative URL to combine\n *\n * @returns {string} The combined full path\n */\nexport default function buildFullPath(baseURL, requestedURL) {\n if (baseURL && !isAbsoluteURL(requestedURL)) {\n return combineURLs(baseURL, requestedURL);\n }\n return requestedURL;\n}\n","'use strict';\n\nimport utils from './../utils.js';\nimport platform from '../platform/index.js';\n\nexport default platform.isStandardBrowserEnv ?\n\n// Standard browser envs have full support of the APIs needed to test\n// whether the request URL is of the same origin as current location.\n (function standardBrowserEnv() {\n const msie = /(msie|trident)/i.test(navigator.userAgent);\n const urlParsingNode = document.createElement('a');\n let originURL;\n\n /**\n * Parse a URL to discover it's components\n *\n * @param {String} url The URL to be parsed\n * @returns {Object}\n */\n function resolveURL(url) {\n let href = url;\n\n if (msie) {\n // IE needs attribute set twice to normalize properties\n urlParsingNode.setAttribute('href', href);\n href = urlParsingNode.href;\n }\n\n urlParsingNode.setAttribute('href', href);\n\n // urlParsingNode provides the UrlUtils interface - http://url.spec.whatwg.org/#urlutils\n return {\n href: urlParsingNode.href,\n protocol: urlParsingNode.protocol ? urlParsingNode.protocol.replace(/:$/, '') : '',\n host: urlParsingNode.host,\n search: urlParsingNode.search ? urlParsingNode.search.replace(/^\\?/, '') : '',\n hash: urlParsingNode.hash ? urlParsingNode.hash.replace(/^#/, '') : '',\n hostname: urlParsingNode.hostname,\n port: urlParsingNode.port,\n pathname: (urlParsingNode.pathname.charAt(0) === '/') ?\n urlParsingNode.pathname :\n '/' + urlParsingNode.pathname\n };\n }\n\n originURL = resolveURL(window.location.href);\n\n /**\n * Determine if a URL shares the same origin as the current location\n *\n * @param {String} requestURL The URL to test\n * @returns {boolean} True if URL shares the same origin, otherwise false\n */\n return function isURLSameOrigin(requestURL) {\n const parsed = (utils.isString(requestURL)) ? resolveURL(requestURL) : requestURL;\n return (parsed.protocol === originURL.protocol &&\n parsed.host === originURL.host);\n };\n })() :\n\n // Non standard browser envs (web workers, react-native) lack needed support.\n (function nonStandardBrowserEnv() {\n return function isURLSameOrigin() {\n return true;\n };\n })();\n","'use strict';\n\nimport AxiosError from '../core/AxiosError.js';\nimport utils from '../utils.js';\n\n/**\n * A `CanceledError` is an object that is thrown when an operation is canceled.\n *\n * @param {string=} message The message.\n * @param {Object=} config The config.\n * @param {Object=} request The request.\n *\n * @returns {CanceledError} The created error.\n */\nfunction CanceledError(message, config, request) {\n // eslint-disable-next-line no-eq-null,eqeqeq\n AxiosError.call(this, message == null ? 'canceled' : message, AxiosError.ERR_CANCELED, config, request);\n this.name = 'CanceledError';\n}\n\nutils.inherits(CanceledError, AxiosError, {\n __CANCEL__: true\n});\n\nexport default CanceledError;\n","'use strict';\n\nexport default function parseProtocol(url) {\n const match = /^([-+\\w]{1,25})(:?\\/\\/|:)/.exec(url);\n return match && match[1] || '';\n}\n","'use strict';\n\nimport utils from './../utils.js';\n\n// RawAxiosHeaders whose duplicates are ignored by node\n// c.f. https://nodejs.org/api/http.html#http_message_headers\nconst ignoreDuplicateOf = utils.toObjectSet([\n 'age', 'authorization', 'content-length', 'content-type', 'etag',\n 'expires', 'from', 'host', 'if-modified-since', 'if-unmodified-since',\n 'last-modified', 'location', 'max-forwards', 'proxy-authorization',\n 'referer', 'retry-after', 'user-agent'\n]);\n\n/**\n * Parse headers into an object\n *\n * ```\n * Date: Wed, 27 Aug 2014 08:58:49 GMT\n * Content-Type: application/json\n * Connection: keep-alive\n * Transfer-Encoding: chunked\n * ```\n *\n * @param {String} rawHeaders Headers needing to be parsed\n *\n * @returns {Object} Headers parsed into an object\n */\nexport default rawHeaders => {\n const parsed = {};\n let key;\n let val;\n let i;\n\n rawHeaders && rawHeaders.split('\\n').forEach(function parser(line) {\n i = line.indexOf(':');\n key = line.substring(0, i).trim().toLowerCase();\n val = line.substring(i + 1).trim();\n\n if (!key || (parsed[key] && ignoreDuplicateOf[key])) {\n return;\n }\n\n if (key === 'set-cookie') {\n if (parsed[key]) {\n parsed[key].push(val);\n } else {\n parsed[key] = [val];\n }\n } else {\n parsed[key] = parsed[key] ? parsed[key] + ', ' + val : val;\n }\n });\n\n return parsed;\n};\n","'use strict';\n\nimport utils from '../utils.js';\nimport parseHeaders from '../helpers/parseHeaders.js';\n\nconst $internals = Symbol('internals');\nconst $defaults = Symbol('defaults');\n\nfunction normalizeHeader(header) {\n return header && String(header).trim().toLowerCase();\n}\n\nfunction normalizeValue(value) {\n if (value === false || value == null) {\n return value;\n }\n\n return utils.isArray(value) ? value.map(normalizeValue) : String(value);\n}\n\nfunction parseTokens(str) {\n const tokens = Object.create(null);\n const tokensRE = /([^\\s,;=]+)\\s*(?:=\\s*([^,;]+))?/g;\n let match;\n\n while ((match = tokensRE.exec(str))) {\n tokens[match[1]] = match[2];\n }\n\n return tokens;\n}\n\nfunction matchHeaderValue(context, value, header, filter) {\n if (utils.isFunction(filter)) {\n return filter.call(this, value, header);\n }\n\n if (!utils.isString(value)) return;\n\n if (utils.isString(filter)) {\n return value.indexOf(filter) !== -1;\n }\n\n if (utils.isRegExp(filter)) {\n return filter.test(value);\n }\n}\n\nfunction formatHeader(header) {\n return header.trim()\n .toLowerCase().replace(/([a-z\\d])(\\w*)/g, (w, char, str) => {\n return char.toUpperCase() + str;\n });\n}\n\nfunction buildAccessors(obj, header) {\n const accessorName = utils.toCamelCase(' ' + header);\n\n ['get', 'set', 'has'].forEach(methodName => {\n Object.defineProperty(obj, methodName + accessorName, {\n value: function(arg1, arg2, arg3) {\n return this[methodName].call(this, header, arg1, arg2, arg3);\n },\n configurable: true\n });\n });\n}\n\nfunction findKey(obj, key) {\n key = key.toLowerCase();\n const keys = Object.keys(obj);\n let i = keys.length;\n let _key;\n while (i-- > 0) {\n _key = keys[i];\n if (key === _key.toLowerCase()) {\n return _key;\n }\n }\n return null;\n}\n\nfunction AxiosHeaders(headers, defaults) {\n headers && this.set(headers);\n this[$defaults] = defaults || null;\n}\n\nObject.assign(AxiosHeaders.prototype, {\n set: function(header, valueOrRewrite, rewrite) {\n const self = this;\n\n function setHeader(_value, _header, _rewrite) {\n const lHeader = normalizeHeader(_header);\n\n if (!lHeader) {\n throw new Error('header name must be a non-empty string');\n }\n\n const key = findKey(self, lHeader);\n\n if (key && _rewrite !== true && (self[key] === false || _rewrite === false)) {\n return;\n }\n\n self[key || _header] = normalizeValue(_value);\n }\n\n if (utils.isPlainObject(header)) {\n utils.forEach(header, (_value, _header) => {\n setHeader(_value, _header, valueOrRewrite);\n });\n } else {\n setHeader(valueOrRewrite, header, rewrite);\n }\n\n return this;\n },\n\n get: function(header, parser) {\n header = normalizeHeader(header);\n\n if (!header) return undefined;\n\n const key = findKey(this, header);\n\n if (key) {\n const value = this[key];\n\n if (!parser) {\n return value;\n }\n\n if (parser === true) {\n return parseTokens(value);\n }\n\n if (utils.isFunction(parser)) {\n return parser.call(this, value, key);\n }\n\n if (utils.isRegExp(parser)) {\n return parser.exec(value);\n }\n\n throw new TypeError('parser must be boolean|regexp|function');\n }\n },\n\n has: function(header, matcher) {\n header = normalizeHeader(header);\n\n if (header) {\n const key = findKey(this, header);\n\n return !!(key && (!matcher || matchHeaderValue(this, this[key], key, matcher)));\n }\n\n return false;\n },\n\n delete: function(header, matcher) {\n const self = this;\n let deleted = false;\n\n function deleteHeader(_header) {\n _header = normalizeHeader(_header);\n\n if (_header) {\n const key = findKey(self, _header);\n\n if (key && (!matcher || matchHeaderValue(self, self[key], key, matcher))) {\n delete self[key];\n\n deleted = true;\n }\n }\n }\n\n if (utils.isArray(header)) {\n header.forEach(deleteHeader);\n } else {\n deleteHeader(header);\n }\n\n return deleted;\n },\n\n clear: function() {\n return Object.keys(this).forEach(this.delete.bind(this));\n },\n\n normalize: function(format) {\n const self = this;\n const headers = {};\n\n utils.forEach(this, (value, header) => {\n const key = findKey(headers, header);\n\n if (key) {\n self[key] = normalizeValue(value);\n delete self[header];\n return;\n }\n\n const normalized = format ? formatHeader(header) : String(header).trim();\n\n if (normalized !== header) {\n delete self[header];\n }\n\n self[normalized] = normalizeValue(value);\n\n headers[normalized] = true;\n });\n\n return this;\n },\n\n toJSON: function(asStrings) {\n const obj = Object.create(null);\n\n utils.forEach(Object.assign({}, this[$defaults] || null, this),\n (value, header) => {\n if (value == null || value === false) return;\n obj[header] = asStrings && utils.isArray(value) ? value.join(', ') : value;\n });\n\n return obj;\n }\n});\n\nObject.assign(AxiosHeaders, {\n from: function(thing) {\n if (utils.isString(thing)) {\n return new this(parseHeaders(thing));\n }\n return thing instanceof this ? thing : new this(thing);\n },\n\n accessor: function(header) {\n const internals = this[$internals] = (this[$internals] = {\n accessors: {}\n });\n\n const accessors = internals.accessors;\n const prototype = this.prototype;\n\n function defineAccessor(_header) {\n const lHeader = normalizeHeader(_header);\n\n if (!accessors[lHeader]) {\n buildAccessors(prototype, _header);\n accessors[lHeader] = true;\n }\n }\n\n utils.isArray(header) ? header.forEach(defineAccessor) : defineAccessor(header);\n\n return this;\n }\n});\n\nAxiosHeaders.accessor(['Content-Type', 'Content-Length', 'Accept', 'Accept-Encoding', 'User-Agent']);\n\nutils.freezeMethods(AxiosHeaders.prototype);\nutils.freezeMethods(AxiosHeaders);\n\nexport default AxiosHeaders;\n","'use strict';\n\n/**\n * Calculate data maxRate\n * @param {Number} [samplesCount= 10]\n * @param {Number} [min= 1000]\n * @returns {Function}\n */\nfunction speedometer(samplesCount, min) {\n samplesCount = samplesCount || 10;\n const bytes = new Array(samplesCount);\n const timestamps = new Array(samplesCount);\n let head = 0;\n let tail = 0;\n let firstSampleTS;\n\n min = min !== undefined ? min : 1000;\n\n return function push(chunkLength) {\n const now = Date.now();\n\n const startedAt = timestamps[tail];\n\n if (!firstSampleTS) {\n firstSampleTS = now;\n }\n\n bytes[head] = chunkLength;\n timestamps[head] = now;\n\n let i = tail;\n let bytesCount = 0;\n\n while (i !== head) {\n bytesCount += bytes[i++];\n i = i % samplesCount;\n }\n\n head = (head + 1) % samplesCount;\n\n if (head === tail) {\n tail = (tail + 1) % samplesCount;\n }\n\n if (now - firstSampleTS < min) {\n return;\n }\n\n const passed = startedAt && now - startedAt;\n\n return passed ? Math.round(bytesCount * 1000 / passed) : undefined;\n };\n}\n\nexport default speedometer;\n","'use strict';\n\nimport utils from './../utils.js';\nimport settle from './../core/settle.js';\nimport cookies from './../helpers/cookies.js';\nimport buildURL from './../helpers/buildURL.js';\nimport buildFullPath from '../core/buildFullPath.js';\nimport isURLSameOrigin from './../helpers/isURLSameOrigin.js';\nimport transitionalDefaults from '../defaults/transitional.js';\nimport AxiosError from '../core/AxiosError.js';\nimport CanceledError from '../cancel/CanceledError.js';\nimport parseProtocol from '../helpers/parseProtocol.js';\nimport platform from '../platform/index.js';\nimport AxiosHeaders from '../core/AxiosHeaders.js';\nimport speedometer from '../helpers/speedometer.js';\n\nfunction progressEventReducer(listener, isDownloadStream) {\n let bytesNotified = 0;\n const _speedometer = speedometer(50, 250);\n\n return e => {\n const loaded = e.loaded;\n const total = e.lengthComputable ? e.total : undefined;\n const progressBytes = loaded - bytesNotified;\n const rate = _speedometer(progressBytes);\n const inRange = loaded <= total;\n\n bytesNotified = loaded;\n\n const data = {\n loaded,\n total,\n progress: total ? (loaded / total) : undefined,\n bytes: progressBytes,\n rate: rate ? rate : undefined,\n estimated: rate && total && inRange ? (total - loaded) / rate : undefined\n };\n\n data[isDownloadStream ? 'download' : 'upload'] = true;\n\n listener(data);\n };\n}\n\nexport default function xhrAdapter(config) {\n return new Promise(function dispatchXhrRequest(resolve, reject) {\n let requestData = config.data;\n const requestHeaders = AxiosHeaders.from(config.headers).normalize();\n const responseType = config.responseType;\n let onCanceled;\n function done() {\n if (config.cancelToken) {\n config.cancelToken.unsubscribe(onCanceled);\n }\n\n if (config.signal) {\n config.signal.removeEventListener('abort', onCanceled);\n }\n }\n\n if (utils.isFormData(requestData) && platform.isStandardBrowserEnv) {\n requestHeaders.setContentType(false); // Let the browser set it\n }\n\n let request = new XMLHttpRequest();\n\n // HTTP basic authentication\n if (config.auth) {\n const username = config.auth.username || '';\n const password = config.auth.password ? unescape(encodeURIComponent(config.auth.password)) : '';\n requestHeaders.set('Authorization', 'Basic ' + btoa(username + ':' + password));\n }\n\n const fullPath = buildFullPath(config.baseURL, config.url);\n\n request.open(config.method.toUpperCase(), buildURL(fullPath, config.params, config.paramsSerializer), true);\n\n // Set the request timeout in MS\n request.timeout = config.timeout;\n\n function onloadend() {\n if (!request) {\n return;\n }\n // Prepare the response\n const responseHeaders = AxiosHeaders.from(\n 'getAllResponseHeaders' in request && request.getAllResponseHeaders()\n );\n const responseData = !responseType || responseType === 'text' || responseType === 'json' ?\n request.responseText : request.response;\n const response = {\n data: responseData,\n status: request.status,\n statusText: request.statusText,\n headers: responseHeaders,\n config,\n request\n };\n\n settle(function _resolve(value) {\n resolve(value);\n done();\n }, function _reject(err) {\n reject(err);\n done();\n }, response);\n\n // Clean up request\n request = null;\n }\n\n if ('onloadend' in request) {\n // Use onloadend if available\n request.onloadend = onloadend;\n } else {\n // Listen for ready state to emulate onloadend\n request.onreadystatechange = function handleLoad() {\n if (!request || request.readyState !== 4) {\n return;\n }\n\n // The request errored out and we didn't get a response, this will be\n // handled by onerror instead\n // With one exception: request that using file: protocol, most browsers\n // will return status as 0 even though it's a successful request\n if (request.status === 0 && !(request.responseURL && request.responseURL.indexOf('file:') === 0)) {\n return;\n }\n // readystate handler is calling before onerror or ontimeout handlers,\n // so we should call onloadend on the next 'tick'\n setTimeout(onloadend);\n };\n }\n\n // Handle browser request cancellation (as opposed to a manual cancellation)\n request.onabort = function handleAbort() {\n if (!request) {\n return;\n }\n\n reject(new AxiosError('Request aborted', AxiosError.ECONNABORTED, config, request));\n\n // Clean up request\n request = null;\n };\n\n // Handle low level network errors\n request.onerror = function handleError() {\n // Real errors are hidden from us by the browser\n // onerror should only fire if it's a network error\n reject(new AxiosError('Network Error', AxiosError.ERR_NETWORK, config, request));\n\n // Clean up request\n request = null;\n };\n\n // Handle timeout\n request.ontimeout = function handleTimeout() {\n let timeoutErrorMessage = config.timeout ? 'timeout of ' + config.timeout + 'ms exceeded' : 'timeout exceeded';\n const transitional = config.transitional || transitionalDefaults;\n if (config.timeoutErrorMessage) {\n timeoutErrorMessage = config.timeoutErrorMessage;\n }\n reject(new AxiosError(\n timeoutErrorMessage,\n transitional.clarifyTimeoutError ? AxiosError.ETIMEDOUT : AxiosError.ECONNABORTED,\n config,\n request));\n\n // Clean up request\n request = null;\n };\n\n // Add xsrf header\n // This is only done if running in a standard browser environment.\n // Specifically not if we're in a web worker, or react-native.\n if (platform.isStandardBrowserEnv) {\n // Add xsrf header\n const xsrfValue = (config.withCredentials || isURLSameOrigin(fullPath))\n && config.xsrfCookieName && cookies.read(config.xsrfCookieName);\n\n if (xsrfValue) {\n requestHeaders.set(config.xsrfHeaderName, xsrfValue);\n }\n }\n\n // Remove Content-Type if data is undefined\n requestData === undefined && requestHeaders.setContentType(null);\n\n // Add headers to the request\n if ('setRequestHeader' in request) {\n utils.forEach(requestHeaders.toJSON(), function setRequestHeader(val, key) {\n request.setRequestHeader(key, val);\n });\n }\n\n // Add withCredentials to request if needed\n if (!utils.isUndefined(config.withCredentials)) {\n request.withCredentials = !!config.withCredentials;\n }\n\n // Add responseType to request if needed\n if (responseType && responseType !== 'json') {\n request.responseType = config.responseType;\n }\n\n // Handle progress if needed\n if (typeof config.onDownloadProgress === 'function') {\n request.addEventListener('progress', progressEventReducer(config.onDownloadProgress, true));\n }\n\n // Not all browsers support upload events\n if (typeof config.onUploadProgress === 'function' && request.upload) {\n request.upload.addEventListener('progress', progressEventReducer(config.onUploadProgress));\n }\n\n if (config.cancelToken || config.signal) {\n // Handle cancellation\n // eslint-disable-next-line func-names\n onCanceled = cancel => {\n if (!request) {\n return;\n }\n reject(!cancel || cancel.type ? new CanceledError(null, config, request) : cancel);\n request.abort();\n request = null;\n };\n\n config.cancelToken && config.cancelToken.subscribe(onCanceled);\n if (config.signal) {\n config.signal.aborted ? onCanceled() : config.signal.addEventListener('abort', onCanceled);\n }\n }\n\n const protocol = parseProtocol(fullPath);\n\n if (protocol && platform.protocols.indexOf(protocol) === -1) {\n reject(new AxiosError('Unsupported protocol ' + protocol + ':', AxiosError.ERR_BAD_REQUEST, config));\n return;\n }\n\n\n // Send the request\n request.send(requestData || null);\n });\n}\n","import utils from '../utils.js';\nimport httpAdapter from './http.js';\nimport xhrAdapter from './xhr.js';\n\nconst adapters = {\n http: httpAdapter,\n xhr: xhrAdapter\n}\n\nexport default {\n getAdapter: (nameOrAdapter) => {\n if(utils.isString(nameOrAdapter)){\n const adapter = adapters[nameOrAdapter];\n\n if (!nameOrAdapter) {\n throw Error(\n utils.hasOwnProp(nameOrAdapter) ?\n `Adapter '${nameOrAdapter}' is not available in the build` :\n `Can not resolve adapter '${nameOrAdapter}'`\n );\n }\n\n return adapter\n }\n\n if (!utils.isFunction(nameOrAdapter)) {\n throw new TypeError('adapter is not a function');\n }\n\n return nameOrAdapter;\n },\n adapters\n}\n","'use strict';\n\nimport utils from '../utils.js';\nimport AxiosError from '../core/AxiosError.js';\nimport transitionalDefaults from './transitional.js';\nimport toFormData from '../helpers/toFormData.js';\nimport toURLEncodedForm from '../helpers/toURLEncodedForm.js';\nimport platform from '../platform/index.js';\nimport formDataToJSON from '../helpers/formDataToJSON.js';\nimport adapters from '../adapters/index.js';\n\nconst DEFAULT_CONTENT_TYPE = {\n 'Content-Type': 'application/x-www-form-urlencoded'\n};\n\n/**\n * If the browser has an XMLHttpRequest object, use the XHR adapter, otherwise use the HTTP\n * adapter\n *\n * @returns {Function}\n */\nfunction getDefaultAdapter() {\n let adapter;\n if (typeof XMLHttpRequest !== 'undefined') {\n // For browsers use XHR adapter\n adapter = adapters.getAdapter('xhr');\n } else if (typeof process !== 'undefined' && utils.kindOf(process) === 'process') {\n // For node use HTTP adapter\n adapter = adapters.getAdapter('http');\n }\n return adapter;\n}\n\n/**\n * It takes a string, tries to parse it, and if it fails, it returns the stringified version\n * of the input\n *\n * @param {any} rawValue - The value to be stringified.\n * @param {Function} parser - A function that parses a string into a JavaScript object.\n * @param {Function} encoder - A function that takes a value and returns a string.\n *\n * @returns {string} A stringified version of the rawValue.\n */\nfunction stringifySafely(rawValue, parser, encoder) {\n if (utils.isString(rawValue)) {\n try {\n (parser || JSON.parse)(rawValue);\n return utils.trim(rawValue);\n } catch (e) {\n if (e.name !== 'SyntaxError') {\n throw e;\n }\n }\n }\n\n return (encoder || JSON.stringify)(rawValue);\n}\n\nconst defaults = {\n\n transitional: transitionalDefaults,\n\n adapter: getDefaultAdapter(),\n\n transformRequest: [function transformRequest(data, headers) {\n const contentType = headers.getContentType() || '';\n const hasJSONContentType = contentType.indexOf('application/json') > -1;\n const isObjectPayload = utils.isObject(data);\n\n if (isObjectPayload && utils.isHTMLForm(data)) {\n data = new FormData(data);\n }\n\n const isFormData = utils.isFormData(data);\n\n if (isFormData) {\n if (!hasJSONContentType) {\n return data;\n }\n return hasJSONContentType ? JSON.stringify(formDataToJSON(data)) : data;\n }\n\n if (utils.isArrayBuffer(data) ||\n utils.isBuffer(data) ||\n utils.isStream(data) ||\n utils.isFile(data) ||\n utils.isBlob(data)\n ) {\n return data;\n }\n if (utils.isArrayBufferView(data)) {\n return data.buffer;\n }\n if (utils.isURLSearchParams(data)) {\n headers.setContentType('application/x-www-form-urlencoded;charset=utf-8', false);\n return data.toString();\n }\n\n let isFileList;\n\n if (isObjectPayload) {\n if (contentType.indexOf('application/x-www-form-urlencoded') > -1) {\n return toURLEncodedForm(data, this.formSerializer).toString();\n }\n\n if ((isFileList = utils.isFileList(data)) || contentType.indexOf('multipart/form-data') > -1) {\n const _FormData = this.env && this.env.FormData;\n\n return toFormData(\n isFileList ? {'files[]': data} : data,\n _FormData && new _FormData(),\n this.formSerializer\n );\n }\n }\n\n if (isObjectPayload || hasJSONContentType ) {\n headers.setContentType('application/json', false);\n return stringifySafely(data);\n }\n\n return data;\n }],\n\n transformResponse: [function transformResponse(data) {\n const transitional = this.transitional || defaults.transitional;\n const forcedJSONParsing = transitional && transitional.forcedJSONParsing;\n const JSONRequested = this.responseType === 'json';\n\n if (data && utils.isString(data) && ((forcedJSONParsing && !this.responseType) || JSONRequested)) {\n const silentJSONParsing = transitional && transitional.silentJSONParsing;\n const strictJSONParsing = !silentJSONParsing && JSONRequested;\n\n try {\n return JSON.parse(data);\n } catch (e) {\n if (strictJSONParsing) {\n if (e.name === 'SyntaxError') {\n throw AxiosError.from(e, AxiosError.ERR_BAD_RESPONSE, this, null, this.response);\n }\n throw e;\n }\n }\n }\n\n return data;\n }],\n\n /**\n * A timeout in milliseconds to abort a request. If set to 0 (default) a\n * timeout is not created.\n */\n timeout: 0,\n\n xsrfCookieName: 'XSRF-TOKEN',\n xsrfHeaderName: 'X-XSRF-TOKEN',\n\n maxContentLength: -1,\n maxBodyLength: -1,\n\n env: {\n FormData: platform.classes.FormData,\n Blob: platform.classes.Blob\n },\n\n validateStatus: function validateStatus(status) {\n return status >= 200 && status < 300;\n },\n\n headers: {\n common: {\n 'Accept': 'application/json, text/plain, */*'\n }\n }\n};\n\nutils.forEach(['delete', 'get', 'head'], function forEachMethodNoData(method) {\n defaults.headers[method] = {};\n});\n\nutils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {\n defaults.headers[method] = utils.merge(DEFAULT_CONTENT_TYPE);\n});\n\nexport default defaults;\n","'use strict';\n\nimport utils from './../utils.js';\nimport defaults from '../defaults/index.js';\nimport AxiosHeaders from '../core/AxiosHeaders.js';\n\n/**\n * Transform the data for a request or a response\n *\n * @param {Array|Function} fns A single function or Array of functions\n * @param {?Object} response The response object\n *\n * @returns {*} The resulting transformed data\n */\nexport default function transformData(fns, response) {\n const config = this || defaults;\n const context = response || config;\n const headers = AxiosHeaders.from(context.headers);\n let data = context.data;\n\n utils.forEach(fns, function transform(fn) {\n data = fn.call(config, data, headers.normalize(), response ? response.status : undefined);\n });\n\n headers.normalize();\n\n return data;\n}\n","'use strict';\n\nexport default function isCancel(value) {\n return !!(value && value.__CANCEL__);\n}\n","'use strict';\n\nimport transformData from './transformData.js';\nimport isCancel from '../cancel/isCancel.js';\nimport defaults from '../defaults/index.js';\nimport CanceledError from '../cancel/CanceledError.js';\nimport AxiosHeaders from '../core/AxiosHeaders.js';\n\n/**\n * Throws a `CanceledError` if cancellation has been requested.\n *\n * @param {Object} config The config that is to be used for the request\n *\n * @returns {void}\n */\nfunction throwIfCancellationRequested(config) {\n if (config.cancelToken) {\n config.cancelToken.throwIfRequested();\n }\n\n if (config.signal && config.signal.aborted) {\n throw new CanceledError();\n }\n}\n\n/**\n * Dispatch a request to the server using the configured adapter.\n *\n * @param {object} config The config that is to be used for the request\n *\n * @returns {Promise} The Promise to be fulfilled\n */\nexport default function dispatchRequest(config) {\n throwIfCancellationRequested(config);\n\n config.headers = AxiosHeaders.from(config.headers);\n\n // Transform request data\n config.data = transformData.call(\n config,\n config.transformRequest\n );\n\n const adapter = config.adapter || defaults.adapter;\n\n return adapter(config).then(function onAdapterResolution(response) {\n throwIfCancellationRequested(config);\n\n // Transform response data\n response.data = transformData.call(\n config,\n config.transformResponse,\n response\n );\n\n response.headers = AxiosHeaders.from(response.headers);\n\n return response;\n }, function onAdapterRejection(reason) {\n if (!isCancel(reason)) {\n throwIfCancellationRequested(config);\n\n // Transform response data\n if (reason && reason.response) {\n reason.response.data = transformData.call(\n config,\n config.transformResponse,\n reason.response\n );\n reason.response.headers = AxiosHeaders.from(reason.response.headers);\n }\n }\n\n return Promise.reject(reason);\n });\n}\n","'use strict';\n\nimport utils from '../utils.js';\n\n/**\n * Config-specific merge-function which creates a new config-object\n * by merging two configuration objects together.\n *\n * @param {Object} config1\n * @param {Object} config2\n *\n * @returns {Object} New object resulting from merging config2 to config1\n */\nexport default function mergeConfig(config1, config2) {\n // eslint-disable-next-line no-param-reassign\n config2 = config2 || {};\n const config = {};\n\n function getMergedValue(target, source) {\n if (utils.isPlainObject(target) && utils.isPlainObject(source)) {\n return utils.merge(target, source);\n } else if (utils.isPlainObject(source)) {\n return utils.merge({}, source);\n } else if (utils.isArray(source)) {\n return source.slice();\n }\n return source;\n }\n\n // eslint-disable-next-line consistent-return\n function mergeDeepProperties(prop) {\n if (!utils.isUndefined(config2[prop])) {\n return getMergedValue(config1[prop], config2[prop]);\n } else if (!utils.isUndefined(config1[prop])) {\n return getMergedValue(undefined, config1[prop]);\n }\n }\n\n // eslint-disable-next-line consistent-return\n function valueFromConfig2(prop) {\n if (!utils.isUndefined(config2[prop])) {\n return getMergedValue(undefined, config2[prop]);\n }\n }\n\n // eslint-disable-next-line consistent-return\n function defaultToConfig2(prop) {\n if (!utils.isUndefined(config2[prop])) {\n return getMergedValue(undefined, config2[prop]);\n } else if (!utils.isUndefined(config1[prop])) {\n return getMergedValue(undefined, config1[prop]);\n }\n }\n\n // eslint-disable-next-line consistent-return\n function mergeDirectKeys(prop) {\n if (prop in config2) {\n return getMergedValue(config1[prop], config2[prop]);\n } else if (prop in config1) {\n return getMergedValue(undefined, config1[prop]);\n }\n }\n\n const mergeMap = {\n 'url': valueFromConfig2,\n 'method': valueFromConfig2,\n 'data': valueFromConfig2,\n 'baseURL': defaultToConfig2,\n 'transformRequest': defaultToConfig2,\n 'transformResponse': defaultToConfig2,\n 'paramsSerializer': defaultToConfig2,\n 'timeout': defaultToConfig2,\n 'timeoutMessage': defaultToConfig2,\n 'withCredentials': defaultToConfig2,\n 'adapter': defaultToConfig2,\n 'responseType': defaultToConfig2,\n 'xsrfCookieName': defaultToConfig2,\n 'xsrfHeaderName': defaultToConfig2,\n 'onUploadProgress': defaultToConfig2,\n 'onDownloadProgress': defaultToConfig2,\n 'decompress': defaultToConfig2,\n 'maxContentLength': defaultToConfig2,\n 'maxBodyLength': defaultToConfig2,\n 'beforeRedirect': defaultToConfig2,\n 'transport': defaultToConfig2,\n 'httpAgent': defaultToConfig2,\n 'httpsAgent': defaultToConfig2,\n 'cancelToken': defaultToConfig2,\n 'socketPath': defaultToConfig2,\n 'responseEncoding': defaultToConfig2,\n 'validateStatus': mergeDirectKeys\n };\n\n utils.forEach(Object.keys(config1).concat(Object.keys(config2)), function computeConfigValue(prop) {\n const merge = mergeMap[prop] || mergeDeepProperties;\n const configValue = merge(prop);\n (utils.isUndefined(configValue) && merge !== mergeDirectKeys) || (config[prop] = configValue);\n });\n\n return config;\n}\n","export const VERSION = \"1.1.3\";","'use strict';\n\nimport {VERSION} from '../env/data.js';\nimport AxiosError from '../core/AxiosError.js';\n\nconst validators = {};\n\n// eslint-disable-next-line func-names\n['object', 'boolean', 'number', 'function', 'string', 'symbol'].forEach((type, i) => {\n validators[type] = function validator(thing) {\n return typeof thing === type || 'a' + (i < 1 ? 'n ' : ' ') + type;\n };\n});\n\nconst deprecatedWarnings = {};\n\n/**\n * Transitional option validator\n *\n * @param {function|boolean?} validator - set to false if the transitional option has been removed\n * @param {string?} version - deprecated version / removed since version\n * @param {string?} message - some message with additional info\n *\n * @returns {function}\n */\nvalidators.transitional = function transitional(validator, version, message) {\n function formatMessage(opt, desc) {\n return '[Axios v' + VERSION + '] Transitional option \\'' + opt + '\\'' + desc + (message ? '. ' + message : '');\n }\n\n // eslint-disable-next-line func-names\n return (value, opt, opts) => {\n if (validator === false) {\n throw new AxiosError(\n formatMessage(opt, ' has been removed' + (version ? ' in ' + version : '')),\n AxiosError.ERR_DEPRECATED\n );\n }\n\n if (version && !deprecatedWarnings[opt]) {\n deprecatedWarnings[opt] = true;\n // eslint-disable-next-line no-console\n console.warn(\n formatMessage(\n opt,\n ' has been deprecated since v' + version + ' and will be removed in the near future'\n )\n );\n }\n\n return validator ? validator(value, opt, opts) : true;\n };\n};\n\n/**\n * Assert object's properties type\n *\n * @param {object} options\n * @param {object} schema\n * @param {boolean?} allowUnknown\n *\n * @returns {object}\n */\n\nfunction assertOptions(options, schema, allowUnknown) {\n if (typeof options !== 'object') {\n throw new AxiosError('options must be an object', AxiosError.ERR_BAD_OPTION_VALUE);\n }\n const keys = Object.keys(options);\n let i = keys.length;\n while (i-- > 0) {\n const opt = keys[i];\n const validator = schema[opt];\n if (validator) {\n const value = options[opt];\n const result = value === undefined || validator(value, opt, options);\n if (result !== true) {\n throw new AxiosError('option ' + opt + ' must be ' + result, AxiosError.ERR_BAD_OPTION_VALUE);\n }\n continue;\n }\n if (allowUnknown !== true) {\n throw new AxiosError('Unknown option ' + opt, AxiosError.ERR_BAD_OPTION);\n }\n }\n}\n\nexport default {\n assertOptions,\n validators\n};\n","'use strict';\n\nimport utils from './../utils.js';\nimport buildURL from '../helpers/buildURL.js';\nimport InterceptorManager from './InterceptorManager.js';\nimport dispatchRequest from './dispatchRequest.js';\nimport mergeConfig from './mergeConfig.js';\nimport buildFullPath from './buildFullPath.js';\nimport validator from '../helpers/validator.js';\nimport AxiosHeaders from './AxiosHeaders.js';\n\nconst validators = validator.validators;\n\n/**\n * Create a new instance of Axios\n *\n * @param {Object} instanceConfig The default config for the instance\n *\n * @return {Axios} A new instance of Axios\n */\nclass Axios {\n constructor(instanceConfig) {\n this.defaults = instanceConfig;\n this.interceptors = {\n request: new InterceptorManager(),\n response: new InterceptorManager()\n };\n }\n\n /**\n * Dispatch a request\n *\n * @param {String|Object} configOrUrl The config specific for this request (merged with this.defaults)\n * @param {?Object} config\n *\n * @returns {Promise} The Promise to be fulfilled\n */\n request(configOrUrl, config) {\n /*eslint no-param-reassign:0*/\n // Allow for axios('example/url'[, config]) a la fetch API\n if (typeof configOrUrl === 'string') {\n config = config || {};\n config.url = configOrUrl;\n } else {\n config = configOrUrl || {};\n }\n\n config = mergeConfig(this.defaults, config);\n\n const {transitional, paramsSerializer} = config;\n\n if (transitional !== undefined) {\n validator.assertOptions(transitional, {\n silentJSONParsing: validators.transitional(validators.boolean),\n forcedJSONParsing: validators.transitional(validators.boolean),\n clarifyTimeoutError: validators.transitional(validators.boolean)\n }, false);\n }\n\n if (paramsSerializer !== undefined) {\n validator.assertOptions(paramsSerializer, {\n encode: validators.function,\n serialize: validators.function\n }, true);\n }\n\n // Set config.method\n config.method = (config.method || this.defaults.method || 'get').toLowerCase();\n\n // Flatten headers\n const defaultHeaders = config.headers && utils.merge(\n config.headers.common,\n config.headers[config.method]\n );\n\n defaultHeaders && utils.forEach(\n ['delete', 'get', 'head', 'post', 'put', 'patch', 'common'],\n function cleanHeaderConfig(method) {\n delete config.headers[method];\n }\n );\n\n config.headers = new AxiosHeaders(config.headers, defaultHeaders);\n\n // filter out skipped interceptors\n const requestInterceptorChain = [];\n let synchronousRequestInterceptors = true;\n this.interceptors.request.forEach(function unshiftRequestInterceptors(interceptor) {\n if (typeof interceptor.runWhen === 'function' && interceptor.runWhen(config) === false) {\n return;\n }\n\n synchronousRequestInterceptors = synchronousRequestInterceptors && interceptor.synchronous;\n\n requestInterceptorChain.unshift(interceptor.fulfilled, interceptor.rejected);\n });\n\n const responseInterceptorChain = [];\n this.interceptors.response.forEach(function pushResponseInterceptors(interceptor) {\n responseInterceptorChain.push(interceptor.fulfilled, interceptor.rejected);\n });\n\n let promise;\n let i = 0;\n let len;\n\n if (!synchronousRequestInterceptors) {\n const chain = [dispatchRequest.bind(this), undefined];\n chain.unshift.apply(chain, requestInterceptorChain);\n chain.push.apply(chain, responseInterceptorChain);\n len = chain.length;\n\n promise = Promise.resolve(config);\n\n while (i < len) {\n promise = promise.then(chain[i++], chain[i++]);\n }\n\n return promise;\n }\n\n len = requestInterceptorChain.length;\n\n let newConfig = config;\n\n i = 0;\n\n while (i < len) {\n const onFulfilled = requestInterceptorChain[i++];\n const onRejected = requestInterceptorChain[i++];\n try {\n newConfig = onFulfilled(newConfig);\n } catch (error) {\n onRejected.call(this, error);\n break;\n }\n }\n\n try {\n promise = dispatchRequest.call(this, newConfig);\n } catch (error) {\n return Promise.reject(error);\n }\n\n i = 0;\n len = responseInterceptorChain.length;\n\n while (i < len) {\n promise = promise.then(responseInterceptorChain[i++], responseInterceptorChain[i++]);\n }\n\n return promise;\n }\n\n getUri(config) {\n config = mergeConfig(this.defaults, config);\n const fullPath = buildFullPath(config.baseURL, config.url);\n return buildURL(fullPath, config.params, config.paramsSerializer);\n }\n}\n\n// Provide aliases for supported request methods\nutils.forEach(['delete', 'get', 'head', 'options'], function forEachMethodNoData(method) {\n /*eslint func-names:0*/\n Axios.prototype[method] = function(url, config) {\n return this.request(mergeConfig(config || {}, {\n method,\n url,\n data: (config || {}).data\n }));\n };\n});\n\nutils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {\n /*eslint func-names:0*/\n\n function generateHTTPMethod(isForm) {\n return function httpMethod(url, data, config) {\n return this.request(mergeConfig(config || {}, {\n method,\n headers: isForm ? {\n 'Content-Type': 'multipart/form-data'\n } : {},\n url,\n data\n }));\n };\n }\n\n Axios.prototype[method] = generateHTTPMethod();\n\n Axios.prototype[method + 'Form'] = generateHTTPMethod(true);\n});\n\nexport default Axios;\n","'use strict';\n\nimport CanceledError from './CanceledError.js';\n\n/**\n * A `CancelToken` is an object that can be used to request cancellation of an operation.\n *\n * @param {Function} executor The executor function.\n *\n * @returns {CancelToken}\n */\nclass CancelToken {\n constructor(executor) {\n if (typeof executor !== 'function') {\n throw new TypeError('executor must be a function.');\n }\n\n let resolvePromise;\n\n this.promise = new Promise(function promiseExecutor(resolve) {\n resolvePromise = resolve;\n });\n\n const token = this;\n\n // eslint-disable-next-line func-names\n this.promise.then(cancel => {\n if (!token._listeners) return;\n\n let i = token._listeners.length;\n\n while (i-- > 0) {\n token._listeners[i](cancel);\n }\n token._listeners = null;\n });\n\n // eslint-disable-next-line func-names\n this.promise.then = onfulfilled => {\n let _resolve;\n // eslint-disable-next-line func-names\n const promise = new Promise(resolve => {\n token.subscribe(resolve);\n _resolve = resolve;\n }).then(onfulfilled);\n\n promise.cancel = function reject() {\n token.unsubscribe(_resolve);\n };\n\n return promise;\n };\n\n executor(function cancel(message, config, request) {\n if (token.reason) {\n // Cancellation has already been requested\n return;\n }\n\n token.reason = new CanceledError(message, config, request);\n resolvePromise(token.reason);\n });\n }\n\n /**\n * Throws a `CanceledError` if cancellation has been requested.\n */\n throwIfRequested() {\n if (this.reason) {\n throw this.reason;\n }\n }\n\n /**\n * Subscribe to the cancel signal\n */\n\n subscribe(listener) {\n if (this.reason) {\n listener(this.reason);\n return;\n }\n\n if (this._listeners) {\n this._listeners.push(listener);\n } else {\n this._listeners = [listener];\n }\n }\n\n /**\n * Unsubscribe from the cancel signal\n */\n\n unsubscribe(listener) {\n if (!this._listeners) {\n return;\n }\n const index = this._listeners.indexOf(listener);\n if (index !== -1) {\n this._listeners.splice(index, 1);\n }\n }\n\n /**\n * Returns an object that contains a new `CancelToken` and a function that, when called,\n * cancels the `CancelToken`.\n */\n static source() {\n let cancel;\n const token = new CancelToken(function executor(c) {\n cancel = c;\n });\n return {\n token,\n cancel\n };\n }\n}\n\nexport default CancelToken;\n","'use strict';\n\n/**\n * Syntactic sugar for invoking a function and expanding an array for arguments.\n *\n * Common use case would be to use `Function.prototype.apply`.\n *\n * ```js\n * function f(x, y, z) {}\n * var args = [1, 2, 3];\n * f.apply(null, args);\n * ```\n *\n * With `spread` this example can be re-written.\n *\n * ```js\n * spread(function(x, y, z) {})([1, 2, 3]);\n * ```\n *\n * @param {Function} callback\n *\n * @returns {Function}\n */\nexport default function spread(callback) {\n return function wrap(arr) {\n return callback.apply(null, arr);\n };\n}\n","'use strict';\n\nimport utils from './../utils.js';\n\n/**\n * Determines whether the payload is an error thrown by Axios\n *\n * @param {*} payload The value to test\n *\n * @returns {boolean} True if the payload is an error thrown by Axios, otherwise false\n */\nexport default function isAxiosError(payload) {\n return utils.isObject(payload) && (payload.isAxiosError === true);\n}\n","'use strict';\n\nimport utils from './utils.js';\nimport bind from './helpers/bind.js';\nimport Axios from './core/Axios.js';\nimport mergeConfig from './core/mergeConfig.js';\nimport defaults from './defaults/index.js';\nimport formDataToJSON from './helpers/formDataToJSON.js';\nimport CanceledError from './cancel/CanceledError.js';\nimport CancelToken from './cancel/CancelToken.js';\nimport isCancel from './cancel/isCancel.js';\nimport {VERSION} from './env/data.js';\nimport toFormData from './helpers/toFormData.js';\nimport AxiosError from './core/AxiosError.js';\nimport spread from './helpers/spread.js';\nimport isAxiosError from './helpers/isAxiosError.js';\n\n/**\n * Create an instance of Axios\n *\n * @param {Object} defaultConfig The default config for the instance\n *\n * @returns {Axios} A new instance of Axios\n */\nfunction createInstance(defaultConfig) {\n const context = new Axios(defaultConfig);\n const instance = bind(Axios.prototype.request, context);\n\n // Copy axios.prototype to instance\n utils.extend(instance, Axios.prototype, context, {allOwnKeys: true});\n\n // Copy context to instance\n utils.extend(instance, context, null, {allOwnKeys: true});\n\n // Factory for creating new instances\n instance.create = function create(instanceConfig) {\n return createInstance(mergeConfig(defaultConfig, instanceConfig));\n };\n\n return instance;\n}\n\n// Create the default instance to be exported\nconst axios = createInstance(defaults);\n\n// Expose Axios class to allow class inheritance\naxios.Axios = Axios;\n\n// Expose Cancel & CancelToken\naxios.CanceledError = CanceledError;\naxios.CancelToken = CancelToken;\naxios.isCancel = isCancel;\naxios.VERSION = VERSION;\naxios.toFormData = toFormData;\n\n// Expose AxiosError class\naxios.AxiosError = AxiosError;\n\n// alias for CanceledError for backward compatibility\naxios.Cancel = axios.CanceledError;\n\n// Expose all/spread\naxios.all = function all(promises) {\n return Promise.all(promises);\n};\n\naxios.spread = spread;\n\n// Expose isAxiosError\naxios.isAxiosError = isAxiosError;\n\naxios.formToJSON = thing => {\n return formDataToJSON(utils.isHTMLForm(thing) ? new FormData(thing) : thing);\n};\n\nexport default axios\n"],"names":["prototype","envFormData","encode","URLSearchParams","FormData","httpAdapter","adapters","validators"],"mappings":";AAEe,SAAS,IAAI,CAAC,EAAE,EAAE,OAAO,EAAE;AAC1C,EAAE,OAAO,SAAS,IAAI,GAAG;AACzB,IAAI,OAAO,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;AACxC,GAAG,CAAC;AACJ;;ACFA;AACA;AACA,MAAM,CAAC,QAAQ,CAAC,GAAG,MAAM,CAAC,SAAS,CAAC;AACpC,MAAM,CAAC,cAAc,CAAC,GAAG,MAAM,CAAC;AAChC;AACA,MAAM,MAAM,GAAG,CAAC,KAAK,IAAI,KAAK,IAAI;AAClC,IAAI,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACrC,IAAI,OAAO,KAAK,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;AACvE,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;AACxB;AACA,MAAM,UAAU,GAAG,CAAC,IAAI,KAAK;AAC7B,EAAE,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;AAC5B,EAAE,OAAO,CAAC,KAAK,KAAK,MAAM,CAAC,KAAK,CAAC,KAAK,IAAI;AAC1C,EAAC;AACD;AACA,MAAM,UAAU,GAAG,IAAI,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,IAAI,CAAC;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,CAAC,OAAO,CAAC,GAAG,KAAK,CAAC;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,WAAW,GAAG,UAAU,CAAC,WAAW,CAAC,CAAC;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,QAAQ,CAAC,GAAG,EAAE;AACvB,EAAE,OAAO,GAAG,KAAK,IAAI,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,WAAW,KAAK,IAAI,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,WAAW,CAAC;AACvG,OAAO,UAAU,CAAC,GAAG,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;AAC7E,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,aAAa,GAAG,UAAU,CAAC,aAAa,CAAC,CAAC;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,iBAAiB,CAAC,GAAG,EAAE;AAChC,EAAE,IAAI,MAAM,CAAC;AACb,EAAE,IAAI,CAAC,OAAO,WAAW,KAAK,WAAW,MAAM,WAAW,CAAC,MAAM,CAAC,EAAE;AACpE,IAAI,MAAM,GAAG,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;AACrC,GAAG,MAAM;AACT,IAAI,MAAM,GAAG,CAAC,GAAG,MAAM,GAAG,CAAC,MAAM,CAAC,KAAK,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;AAClE,GAAG;AACH,EAAE,OAAO,MAAM,CAAC;AAChB,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,QAAQ,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,UAAU,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,QAAQ,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,QAAQ,GAAG,CAAC,KAAK,KAAK,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,CAAC;AACxE;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,SAAS,GAAG,KAAK,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,KAAK,CAAC;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,aAAa,GAAG,CAAC,GAAG,KAAK;AAC/B,EAAE,IAAI,MAAM,CAAC,GAAG,CAAC,KAAK,QAAQ,EAAE;AAChC,IAAI,OAAO,KAAK,CAAC;AACjB,GAAG;AACH;AACA,EAAE,MAAM,SAAS,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;AACxC,EAAE,OAAO,CAAC,SAAS,KAAK,IAAI,IAAI,SAAS,KAAK,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,cAAc,CAAC,SAAS,CAAC,KAAK,IAAI,KAAK,EAAE,MAAM,CAAC,WAAW,IAAI,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,QAAQ,IAAI,GAAG,CAAC,CAAC;AAC1K,EAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,UAAU,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,QAAQ,GAAG,CAAC,GAAG,KAAK,QAAQ,CAAC,GAAG,CAAC,IAAI,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AAChE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,UAAU,GAAG,CAAC,KAAK,KAAK;AAC9B,EAAE,MAAM,OAAO,GAAG,mBAAmB,CAAC;AACtC,EAAE,OAAO,KAAK;AACd,IAAI,CAAC,OAAO,QAAQ,KAAK,UAAU,IAAI,KAAK,YAAY,QAAQ;AAChE,IAAI,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,OAAO;AACpC,KAAK,UAAU,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC,QAAQ,EAAE,KAAK,OAAO,CAAC;AAChE,GAAG,CAAC;AACJ,EAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,iBAAiB,GAAG,UAAU,CAAC,iBAAiB,CAAC,CAAC;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,IAAI,GAAG,CAAC,GAAG,KAAK,GAAG,CAAC,IAAI;AAC9B,EAAE,GAAG,CAAC,IAAI,EAAE,GAAG,GAAG,CAAC,OAAO,CAAC,oCAAoC,EAAE,EAAE,CAAC,CAAC;AACrE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC,UAAU,GAAG,KAAK,CAAC,GAAG,EAAE,EAAE;AACrD;AACA,EAAE,IAAI,GAAG,KAAK,IAAI,IAAI,OAAO,GAAG,KAAK,WAAW,EAAE;AAClD,IAAI,OAAO;AACX,GAAG;AACH;AACA,EAAE,IAAI,CAAC,CAAC;AACR,EAAE,IAAI,CAAC,CAAC;AACR;AACA;AACA,EAAE,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE;AAC/B;AACA,IAAI,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;AAChB,GAAG;AACH;AACA,EAAE,IAAI,OAAO,CAAC,GAAG,CAAC,EAAE;AACpB;AACA,IAAI,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;AAC5C,MAAM,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;AACpC,KAAK;AACL,GAAG,MAAM;AACT;AACA,IAAI,MAAM,IAAI,GAAG,UAAU,GAAG,MAAM,CAAC,mBAAmB,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACjF,IAAI,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC;AAC5B,IAAI,IAAI,GAAG,CAAC;AACZ;AACA,IAAI,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE;AAC9B,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;AACpB,MAAM,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;AACxC,KAAK;AACL,GAAG;AACH,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,KAAK,8BAA8B;AAC5C,EAAE,MAAM,MAAM,GAAG,EAAE,CAAC;AACpB,EAAE,MAAM,WAAW,GAAG,CAAC,GAAG,EAAE,GAAG,KAAK;AACpC,IAAI,IAAI,aAAa,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,aAAa,CAAC,GAAG,CAAC,EAAE;AAC1D,MAAM,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;AAC5C,KAAK,MAAM,IAAI,aAAa,CAAC,GAAG,CAAC,EAAE;AACnC,MAAM,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;AACnC,KAAK,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,EAAE;AAC7B,MAAM,MAAM,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,KAAK,EAAE,CAAC;AAChC,KAAK,MAAM;AACX,MAAM,MAAM,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;AACxB,KAAK;AACL,IAAG;AACH;AACA,EAAE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;AACpD,IAAI,SAAS,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;AACvD,GAAG;AACH,EAAE,OAAO,MAAM,CAAC;AAChB,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,UAAU,CAAC,EAAE,EAAE,KAAK;AACpD,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK;AAC3B,IAAI,IAAI,OAAO,IAAI,UAAU,CAAC,GAAG,CAAC,EAAE;AACpC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;AAClC,KAAK,MAAM;AACX,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;AACnB,KAAK;AACL,GAAG,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC;AACnB,EAAE,OAAO,CAAC,CAAC;AACX,EAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,QAAQ,GAAG,CAAC,OAAO,KAAK;AAC9B,EAAE,IAAI,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,MAAM,EAAE;AACxC,IAAI,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAC/B,GAAG;AACH,EAAE,OAAO,OAAO,CAAC;AACjB,EAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,QAAQ,GAAG,CAAC,WAAW,EAAE,gBAAgB,EAAE,KAAK,EAAE,WAAW,KAAK;AACxE,EAAE,WAAW,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;AACjF,EAAE,WAAW,CAAC,SAAS,CAAC,WAAW,GAAG,WAAW,CAAC;AAClD,EAAE,MAAM,CAAC,cAAc,CAAC,WAAW,EAAE,OAAO,EAAE;AAC9C,IAAI,KAAK,EAAE,gBAAgB,CAAC,SAAS;AACrC,GAAG,CAAC,CAAC;AACL,EAAE,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;AACvD,EAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,YAAY,GAAG,CAAC,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,KAAK;AACjE,EAAE,IAAI,KAAK,CAAC;AACZ,EAAE,IAAI,CAAC,CAAC;AACR,EAAE,IAAI,IAAI,CAAC;AACX,EAAE,MAAM,MAAM,GAAG,EAAE,CAAC;AACpB;AACA,EAAE,OAAO,GAAG,OAAO,IAAI,EAAE,CAAC;AAC1B;AACA,EAAE,IAAI,SAAS,IAAI,IAAI,EAAE,OAAO,OAAO,CAAC;AACxC;AACA,EAAE,GAAG;AACL,IAAI,KAAK,GAAG,MAAM,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAC;AAClD,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC;AACrB,IAAI,OAAO,CAAC,EAAE,GAAG,CAAC,EAAE;AACpB,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;AACtB,MAAM,IAAI,CAAC,CAAC,UAAU,IAAI,UAAU,CAAC,IAAI,EAAE,SAAS,EAAE,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE;AAClF,QAAQ,OAAO,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;AACxC,QAAQ,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;AAC5B,OAAO;AACP,KAAK;AACL,IAAI,SAAS,GAAG,MAAM,KAAK,KAAK,IAAI,cAAc,CAAC,SAAS,CAAC,CAAC;AAC9D,GAAG,QAAQ,SAAS,KAAK,CAAC,MAAM,IAAI,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,IAAI,SAAS,KAAK,MAAM,CAAC,SAAS,EAAE;AACnG;AACA,EAAE,OAAO,OAAO,CAAC;AACjB,EAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,QAAQ,GAAG,CAAC,GAAG,EAAE,YAAY,EAAE,QAAQ,KAAK;AAClD,EAAE,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;AACpB,EAAE,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,GAAG,GAAG,CAAC,MAAM,EAAE;AACvD,IAAI,QAAQ,GAAG,GAAG,CAAC,MAAM,CAAC;AAC1B,GAAG;AACH,EAAE,QAAQ,IAAI,YAAY,CAAC,MAAM,CAAC;AAClC,EAAE,MAAM,SAAS,GAAG,GAAG,CAAC,OAAO,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;AACxD,EAAE,OAAO,SAAS,KAAK,CAAC,CAAC,IAAI,SAAS,KAAK,QAAQ,CAAC;AACpD,EAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,OAAO,GAAG,CAAC,KAAK,KAAK;AAC3B,EAAE,IAAI,CAAC,KAAK,EAAE,OAAO,IAAI,CAAC;AAC1B,EAAE,IAAI,OAAO,CAAC,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;AACnC,EAAE,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC;AACvB,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,OAAO,IAAI,CAAC;AAChC,EAAE,MAAM,GAAG,GAAG,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC;AAC3B,EAAE,OAAO,CAAC,EAAE,GAAG,CAAC,EAAE;AAClB,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;AACtB,GAAG;AACH,EAAE,OAAO,GAAG,CAAC;AACb,EAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,YAAY,GAAG,CAAC,UAAU,IAAI;AACpC;AACA,EAAE,OAAO,KAAK,IAAI;AAClB,IAAI,OAAO,UAAU,IAAI,KAAK,YAAY,UAAU,CAAC;AACrD,GAAG,CAAC;AACJ,CAAC,EAAE,OAAO,UAAU,KAAK,WAAW,IAAI,cAAc,CAAC,UAAU,CAAC,CAAC,CAAC;AACpE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,YAAY,GAAG,CAAC,GAAG,EAAE,EAAE,KAAK;AAClC,EAAE,MAAM,SAAS,GAAG,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;AAChD;AACA,EAAE,MAAM,QAAQ,GAAG,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACvC;AACA,EAAE,IAAI,MAAM,CAAC;AACb;AACA,EAAE,OAAO,CAAC,MAAM,GAAG,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE;AACrD,IAAI,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC;AAC9B,IAAI,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AACnC,GAAG;AACH,EAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,QAAQ,GAAG,CAAC,MAAM,EAAE,GAAG,KAAK;AAClC,EAAE,IAAI,OAAO,CAAC;AACd,EAAE,MAAM,GAAG,GAAG,EAAE,CAAC;AACjB;AACA,EAAE,OAAO,CAAC,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,IAAI,EAAE;AAChD,IAAI,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AACtB,GAAG;AACH;AACA,EAAE,OAAO,GAAG,CAAC;AACb,EAAC;AACD;AACA;AACA,MAAM,UAAU,GAAG,UAAU,CAAC,iBAAiB,CAAC,CAAC;AACjD;AACA,MAAM,WAAW,GAAG,GAAG,IAAI;AAC3B,EAAE,OAAO,GAAG,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,uBAAuB;AAC1D,IAAI,SAAS,QAAQ,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE;AACjC,MAAM,OAAO,EAAE,CAAC,WAAW,EAAE,GAAG,EAAE,CAAC;AACnC,KAAK;AACL,GAAG,CAAC;AACJ,CAAC,CAAC;AACF;AACA;AACA,MAAM,cAAc,GAAG,CAAC,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG,EAAE,IAAI,KAAK,cAAc,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;AAC/G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,QAAQ,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;AACtC;AACA,MAAM,iBAAiB,GAAG,CAAC,GAAG,EAAE,OAAO,KAAK;AAC5C,EAAE,MAAM,WAAW,GAAG,MAAM,CAAC,yBAAyB,CAAC,GAAG,CAAC,CAAC;AAC5D,EAAE,MAAM,kBAAkB,GAAG,EAAE,CAAC;AAChC;AACA,EAAE,OAAO,CAAC,WAAW,EAAE,CAAC,UAAU,EAAE,IAAI,KAAK;AAC7C,IAAI,IAAI,OAAO,CAAC,UAAU,EAAE,IAAI,EAAE,GAAG,CAAC,KAAK,KAAK,EAAE;AAClD,MAAM,kBAAkB,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC;AAC5C,KAAK;AACL,GAAG,CAAC,CAAC;AACL;AACA,EAAE,MAAM,CAAC,gBAAgB,CAAC,GAAG,EAAE,kBAAkB,CAAC,CAAC;AACnD,EAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,aAAa,GAAG,CAAC,GAAG,KAAK;AAC/B,EAAE,iBAAiB,CAAC,GAAG,EAAE,CAAC,UAAU,EAAE,IAAI,KAAK;AAC/C,IAAI,MAAM,KAAK,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC;AAC5B;AACA,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,OAAO;AACnC;AACA,IAAI,UAAU,CAAC,UAAU,GAAG,KAAK,CAAC;AAClC;AACA,IAAI,IAAI,UAAU,IAAI,UAAU,EAAE;AAClC,MAAM,UAAU,CAAC,QAAQ,GAAG,KAAK,CAAC;AAClC,MAAM,OAAO;AACb,KAAK;AACL;AACA,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE;AACzB,MAAM,UAAU,CAAC,GAAG,GAAG,MAAM;AAC7B,QAAQ,MAAM,KAAK,CAAC,6BAA6B,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC;AACjE,OAAO,CAAC;AACR,KAAK;AACL,GAAG,CAAC,CAAC;AACL,EAAC;AACD;AACA,MAAM,WAAW,GAAG,CAAC,aAAa,EAAE,SAAS,KAAK;AAClD,EAAE,MAAM,GAAG,GAAG,EAAE,CAAC;AACjB;AACA,EAAE,MAAM,MAAM,GAAG,CAAC,GAAG,KAAK;AAC1B,IAAI,GAAG,CAAC,OAAO,CAAC,KAAK,IAAI;AACzB,MAAM,GAAG,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC;AACxB,KAAK,CAAC,CAAC;AACP,IAAG;AACH;AACA,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG,MAAM,CAAC,aAAa,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;AAClG;AACA,EAAE,OAAO,GAAG,CAAC;AACb,EAAC;AACD;AACA,MAAM,IAAI,GAAG,MAAM,GAAE;AACrB;AACA,MAAM,cAAc,GAAG,CAAC,KAAK,EAAE,YAAY,KAAK;AAChD,EAAE,KAAK,GAAG,CAAC,KAAK,CAAC;AACjB,EAAE,OAAO,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,KAAK,GAAG,YAAY,CAAC;AACvD,EAAC;AACD;AACA,cAAe;AACf,EAAE,OAAO;AACT,EAAE,aAAa;AACf,EAAE,QAAQ;AACV,EAAE,UAAU;AACZ,EAAE,iBAAiB;AACnB,EAAE,QAAQ;AACV,EAAE,QAAQ;AACV,EAAE,SAAS;AACX,EAAE,QAAQ;AACV,EAAE,aAAa;AACf,EAAE,WAAW;AACb,EAAE,MAAM;AACR,EAAE,MAAM;AACR,EAAE,MAAM;AACR,EAAE,QAAQ;AACV,EAAE,UAAU;AACZ,EAAE,QAAQ;AACV,EAAE,iBAAiB;AACnB,EAAE,YAAY;AACd,EAAE,UAAU;AACZ,EAAE,OAAO;AACT,EAAE,KAAK;AACP,EAAE,MAAM;AACR,EAAE,IAAI;AACN,EAAE,QAAQ;AACV,EAAE,QAAQ;AACV,EAAE,YAAY;AACd,EAAE,MAAM;AACR,EAAE,UAAU;AACZ,EAAE,QAAQ;AACV,EAAE,OAAO;AACT,EAAE,YAAY;AACd,EAAE,QAAQ;AACV,EAAE,UAAU;AACZ,EAAE,cAAc;AAChB,EAAE,UAAU,EAAE,cAAc;AAC5B,EAAE,iBAAiB;AACnB,EAAE,aAAa;AACf,EAAE,WAAW;AACb,EAAE,WAAW;AACb,EAAE,IAAI;AACN,EAAE,cAAc;AAChB,CAAC;;AChmBD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,UAAU,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE;AAC9D,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACnB;AACA,EAAE,IAAI,KAAK,CAAC,iBAAiB,EAAE;AAC/B,IAAI,KAAK,CAAC,iBAAiB,CAAC,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;AACpD,GAAG,MAAM;AACT,IAAI,IAAI,CAAC,KAAK,GAAG,CAAC,IAAI,KAAK,EAAE,EAAE,KAAK,CAAC;AACrC,GAAG;AACH;AACA,EAAE,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;AACzB,EAAE,IAAI,CAAC,IAAI,GAAG,YAAY,CAAC;AAC3B,EAAE,IAAI,KAAK,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;AAC7B,EAAE,MAAM,KAAK,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC;AACnC,EAAE,OAAO,KAAK,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,CAAC;AACtC,EAAE,QAAQ,KAAK,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC,CAAC;AACzC,CAAC;AACD;AACA,KAAK,CAAC,QAAQ,CAAC,UAAU,EAAE,KAAK,EAAE;AAClC,EAAE,MAAM,EAAE,SAAS,MAAM,GAAG;AAC5B,IAAI,OAAO;AACX;AACA,MAAM,OAAO,EAAE,IAAI,CAAC,OAAO;AAC3B,MAAM,IAAI,EAAE,IAAI,CAAC,IAAI;AACrB;AACA,MAAM,WAAW,EAAE,IAAI,CAAC,WAAW;AACnC,MAAM,MAAM,EAAE,IAAI,CAAC,MAAM;AACzB;AACA,MAAM,QAAQ,EAAE,IAAI,CAAC,QAAQ;AAC7B,MAAM,UAAU,EAAE,IAAI,CAAC,UAAU;AACjC,MAAM,YAAY,EAAE,IAAI,CAAC,YAAY;AACrC,MAAM,KAAK,EAAE,IAAI,CAAC,KAAK;AACvB;AACA,MAAM,MAAM,EAAE,IAAI,CAAC,MAAM;AACzB,MAAM,IAAI,EAAE,IAAI,CAAC,IAAI;AACrB,MAAM,MAAM,EAAE,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,IAAI;AACjF,KAAK,CAAC;AACN,GAAG;AACH,CAAC,CAAC,CAAC;AACH;AACA,MAAMA,WAAS,GAAG,UAAU,CAAC,SAAS,CAAC;AACvC,MAAM,WAAW,GAAG,EAAE,CAAC;AACvB;AACA;AACA,EAAE,sBAAsB;AACxB,EAAE,gBAAgB;AAClB,EAAE,cAAc;AAChB,EAAE,WAAW;AACb,EAAE,aAAa;AACf,EAAE,2BAA2B;AAC7B,EAAE,gBAAgB;AAClB,EAAE,kBAAkB;AACpB,EAAE,iBAAiB;AACnB,EAAE,cAAc;AAChB,EAAE,iBAAiB;AACnB,EAAE,iBAAiB;AACnB;AACA,CAAC,CAAC,OAAO,CAAC,IAAI,IAAI;AAClB,EAAE,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;AACpC,CAAC,CAAC,CAAC;AACH;AACA,MAAM,CAAC,gBAAgB,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;AACjD,MAAM,CAAC,cAAc,CAACA,WAAS,EAAE,cAAc,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;AAChE;AACA;AACA,UAAU,CAAC,IAAI,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,WAAW,KAAK;AAC3E,EAAE,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAACA,WAAS,CAAC,CAAC;AAC9C;AACA,EAAE,KAAK,CAAC,YAAY,CAAC,KAAK,EAAE,UAAU,EAAE,SAAS,MAAM,CAAC,GAAG,EAAE;AAC7D,IAAI,OAAO,GAAG,KAAK,KAAK,CAAC,SAAS,CAAC;AACnC,GAAG,EAAE,IAAI,IAAI;AACb,IAAI,OAAO,IAAI,KAAK,cAAc,CAAC;AACnC,GAAG,CAAC,CAAC;AACL;AACA,EAAE,UAAU,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;AAC9E;AACA,EAAE,UAAU,CAAC,KAAK,GAAG,KAAK,CAAC;AAC3B;AACA,EAAE,UAAU,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;AAC/B;AACA,EAAE,WAAW,IAAI,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;AACxD;AACA,EAAE,OAAO,UAAU,CAAC;AACpB,CAAC;;ACjGD;AACA,IAAA,OAAc,GAAG,OAAO,IAAI,IAAI,QAAQ,GAAG,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ;;ACK1E;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,WAAW,CAAC,KAAK,EAAE;AAC5B,EAAE,OAAO,KAAK,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC5D,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,cAAc,CAAC,GAAG,EAAE;AAC7B,EAAE,OAAO,KAAK,CAAC,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;AAC5D,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,SAAS,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE;AACpC,EAAE,IAAI,CAAC,IAAI,EAAE,OAAO,GAAG,CAAC;AACxB,EAAE,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,SAAS,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE;AACtD;AACA,IAAI,KAAK,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;AAClC,IAAI,OAAO,CAAC,IAAI,IAAI,CAAC,GAAG,GAAG,GAAG,KAAK,GAAG,GAAG,GAAG,KAAK,CAAC;AAClD,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,GAAG,GAAG,GAAG,EAAE,CAAC,CAAC;AAC3B,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,WAAW,CAAC,GAAG,EAAE;AAC1B,EAAE,OAAO,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;AACtD,CAAC;AACD;AACA,MAAM,UAAU,GAAG,KAAK,CAAC,YAAY,CAAC,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,MAAM,CAAC,IAAI,EAAE;AAC7E,EAAE,OAAO,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC/B,CAAC,CAAC,CAAC;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,eAAe,CAAC,KAAK,EAAE;AAChC,EAAE,OAAO,KAAK,IAAI,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,KAAK,UAAU,IAAI,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;AACvH,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,UAAU,CAAC,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE;AAC5C,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;AAC5B,IAAI,MAAM,IAAI,SAAS,CAAC,0BAA0B,CAAC,CAAC;AACpD,GAAG;AACH;AACA;AACA,EAAE,QAAQ,GAAG,QAAQ,IAAI,KAAKC,OAAW,IAAI,QAAQ,GAAG,CAAC;AACzD;AACA;AACA,EAAE,OAAO,GAAG,KAAK,CAAC,YAAY,CAAC,OAAO,EAAE;AACxC,IAAI,UAAU,EAAE,IAAI;AACpB,IAAI,IAAI,EAAE,KAAK;AACf,IAAI,OAAO,EAAE,KAAK;AAClB,GAAG,EAAE,KAAK,EAAE,SAAS,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE;AAC7C;AACA,IAAI,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;AAC9C,GAAG,CAAC,CAAC;AACL;AACA,EAAE,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;AACxC;AACA,EAAE,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,cAAc,CAAC;AACpD,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;AAC5B,EAAE,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;AAClC,EAAE,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,WAAW,IAAI,IAAI,CAAC;AACpE,EAAE,MAAM,OAAO,GAAG,KAAK,IAAI,eAAe,CAAC,QAAQ,CAAC,CAAC;AACrD;AACA,EAAE,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE;AAClC,IAAI,MAAM,IAAI,SAAS,CAAC,4BAA4B,CAAC,CAAC;AACtD,GAAG;AACH;AACA,EAAE,SAAS,YAAY,CAAC,KAAK,EAAE;AAC/B,IAAI,IAAI,KAAK,KAAK,IAAI,EAAE,OAAO,EAAE,CAAC;AAClC;AACA,IAAI,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;AAC7B,MAAM,OAAO,KAAK,CAAC,WAAW,EAAE,CAAC;AACjC,KAAK;AACL;AACA,IAAI,IAAI,CAAC,OAAO,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;AACzC,MAAM,MAAM,IAAI,UAAU,CAAC,8CAA8C,CAAC,CAAC;AAC3E,KAAK;AACL;AACA,IAAI,IAAI,KAAK,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE;AACjE,MAAM,OAAO,OAAO,IAAI,OAAO,IAAI,KAAK,UAAU,GAAG,IAAI,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC5F,KAAK;AACL;AACA,IAAI,OAAO,KAAK,CAAC;AACjB,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,SAAS,cAAc,CAAC,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE;AAC5C,IAAI,IAAI,GAAG,GAAG,KAAK,CAAC;AACpB;AACA,IAAI,IAAI,KAAK,IAAI,CAAC,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;AACrD,MAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE;AACrC;AACA,QAAQ,GAAG,GAAG,UAAU,GAAG,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AAClD;AACA,QAAQ,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;AACtC,OAAO,MAAM;AACb,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,WAAW,CAAC,KAAK,CAAC;AACnD,SAAS,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC7F,SAAS,EAAE;AACX;AACA,QAAQ,GAAG,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;AAClC;AACA,QAAQ,GAAG,CAAC,OAAO,CAAC,SAAS,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE;AAC7C,UAAU,EAAE,KAAK,CAAC,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,KAAK,IAAI,CAAC,IAAI,QAAQ,CAAC,MAAM;AACpE;AACA,YAAY,OAAO,KAAK,IAAI,GAAG,SAAS,CAAC,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,OAAO,KAAK,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC;AACpG,YAAY,YAAY,CAAC,EAAE,CAAC;AAC5B,WAAW,CAAC;AACZ,SAAS,CAAC,CAAC;AACX,QAAQ,OAAO,KAAK,CAAC;AACrB,OAAO;AACP,KAAK;AACL;AACA,IAAI,IAAI,WAAW,CAAC,KAAK,CAAC,EAAE;AAC5B,MAAM,OAAO,IAAI,CAAC;AAClB,KAAK;AACL;AACA,IAAI,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,CAAC,EAAE,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC;AACrE;AACA,IAAI,OAAO,KAAK,CAAC;AACjB,GAAG;AACH;AACA,EAAE,MAAM,KAAK,GAAG,EAAE,CAAC;AACnB;AACA,EAAE,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE;AACnD,IAAI,cAAc;AAClB,IAAI,YAAY;AAChB,IAAI,WAAW;AACf,GAAG,CAAC,CAAC;AACL;AACA,EAAE,SAAS,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE;AAC9B,IAAI,IAAI,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,OAAO;AACzC;AACA,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE;AACrC,MAAM,MAAM,KAAK,CAAC,iCAAiC,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AACtE,KAAK;AACL;AACA,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACtB;AACA,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,SAAS,IAAI,CAAC,EAAE,EAAE,GAAG,EAAE;AAChD,MAAM,MAAM,MAAM,GAAG,EAAE,KAAK,CAAC,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,KAAK,IAAI,CAAC,IAAI,OAAO,CAAC,IAAI;AAC5E,QAAQ,QAAQ,EAAE,EAAE,EAAE,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,IAAI,EAAE,GAAG,GAAG,EAAE,IAAI,EAAE,cAAc;AAClF,OAAO,CAAC;AACR;AACA,MAAM,IAAI,MAAM,KAAK,IAAI,EAAE;AAC3B,QAAQ,KAAK,CAAC,EAAE,EAAE,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;AACnD,OAAO;AACP,KAAK,CAAC,CAAC;AACP;AACA,IAAI,KAAK,CAAC,GAAG,EAAE,CAAC;AAChB,GAAG;AACH;AACA,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;AAC5B,IAAI,MAAM,IAAI,SAAS,CAAC,wBAAwB,CAAC,CAAC;AAClD,GAAG;AACH;AACA,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;AACb;AACA,EAAE,OAAO,QAAQ,CAAC;AAClB;;AC9NA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAASC,QAAM,CAAC,GAAG,EAAE;AACrB,EAAE,MAAM,OAAO,GAAG;AAClB,IAAI,GAAG,EAAE,KAAK;AACd,IAAI,GAAG,EAAE,KAAK;AACd,IAAI,GAAG,EAAE,KAAK;AACd,IAAI,GAAG,EAAE,KAAK;AACd,IAAI,GAAG,EAAE,KAAK;AACd,IAAI,KAAK,EAAE,GAAG;AACd,IAAI,KAAK,EAAE,MAAM;AACjB,GAAG,CAAC;AACJ,EAAE,OAAO,kBAAkB,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,kBAAkB,EAAE,SAAS,QAAQ,CAAC,KAAK,EAAE;AACtF,IAAI,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC;AAC1B,GAAG,CAAC,CAAC;AACL,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,oBAAoB,CAAC,MAAM,EAAE,OAAO,EAAE;AAC/C,EAAE,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;AACnB;AACA,EAAE,MAAM,IAAI,UAAU,CAAC,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;AAC9C,CAAC;AACD;AACA,MAAM,SAAS,GAAG,oBAAoB,CAAC,SAAS,CAAC;AACjD;AACA,SAAS,CAAC,MAAM,GAAG,SAAS,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE;AAChD,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;AAClC,CAAC,CAAC;AACF;AACA,SAAS,CAAC,QAAQ,GAAG,SAAS,QAAQ,CAAC,OAAO,EAAE;AAChD,EAAE,MAAM,OAAO,GAAG,OAAO,GAAG,SAAS,KAAK,EAAE;AAC5C,IAAI,OAAO,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAEA,QAAM,CAAC,CAAC;AAC7C,GAAG,GAAGA,QAAM,CAAC;AACb;AACA,EAAE,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,IAAI,CAAC,IAAI,EAAE;AAC7C,IAAI,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AACrD,GAAG,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACnB,CAAC;;AClDD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,MAAM,CAAC,GAAG,EAAE;AACrB,EAAE,OAAO,kBAAkB,CAAC,GAAG,CAAC;AAChC,IAAI,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC;AACzB,IAAI,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC;AACxB,IAAI,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC;AACzB,IAAI,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC;AACxB,IAAI,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC;AACzB,IAAI,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;AAC1B,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACe,SAAS,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE;AACvD;AACA,EAAE,IAAI,CAAC,MAAM,EAAE;AACf,IAAI,OAAO,GAAG,CAAC;AACf,GAAG;AACH;AACA,EAAE,MAAM,OAAO,GAAG,OAAO,IAAI,OAAO,CAAC,MAAM,IAAI,MAAM,CAAC;AACtD;AACA,EAAE,MAAM,WAAW,GAAG,OAAO,IAAI,OAAO,CAAC,SAAS,CAAC;AACnD;AACA,EAAE,IAAI,gBAAgB,CAAC;AACvB;AACA,EAAE,IAAI,WAAW,EAAE;AACnB,IAAI,gBAAgB,GAAG,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AACpD,GAAG,MAAM;AACT,IAAI,gBAAgB,GAAG,KAAK,CAAC,iBAAiB,CAAC,MAAM,CAAC;AACtD,MAAM,MAAM,CAAC,QAAQ,EAAE;AACvB,MAAM,IAAI,oBAAoB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;AAClE,GAAG;AACH;AACA,EAAE,IAAI,gBAAgB,EAAE;AACxB,IAAI,MAAM,aAAa,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;AAC3C;AACA,IAAI,IAAI,aAAa,KAAK,CAAC,CAAC,EAAE;AAC9B,MAAM,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC;AACxC,KAAK;AACL,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,GAAG,GAAG,IAAI,gBAAgB,CAAC;AACpE,GAAG;AACH;AACA,EAAE,OAAO,GAAG,CAAC;AACb;;AC1DA,MAAM,kBAAkB,CAAC;AACzB,EAAE,WAAW,GAAG;AAChB,IAAI,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;AACvB,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,GAAG,CAAC,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE;AACpC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;AACvB,MAAM,SAAS;AACf,MAAM,QAAQ;AACd,MAAM,WAAW,EAAE,OAAO,GAAG,OAAO,CAAC,WAAW,GAAG,KAAK;AACxD,MAAM,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI;AAC/C,KAAK,CAAC,CAAC;AACP,IAAI,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;AACpC,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,KAAK,CAAC,EAAE,EAAE;AACZ,IAAI,IAAI,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE;AAC3B,MAAM,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC;AAC/B,KAAK;AACL,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,KAAK,GAAG;AACV,IAAI,IAAI,IAAI,CAAC,QAAQ,EAAE;AACvB,MAAM,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;AACzB,KAAK;AACL,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,OAAO,CAAC,EAAE,EAAE;AACd,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,cAAc,CAAC,CAAC,EAAE;AAC5D,MAAM,IAAI,CAAC,KAAK,IAAI,EAAE;AACtB,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC;AACd,OAAO;AACP,KAAK,CAAC,CAAC;AACP,GAAG;AACH;;AClEA,6BAAe;AACf,EAAE,iBAAiB,EAAE,IAAI;AACzB,EAAE,iBAAiB,EAAE,IAAI;AACzB,EAAE,mBAAmB,EAAE,KAAK;AAC5B,CAAC;;ACHD,0BAAe,OAAO,eAAe,KAAK,WAAW,GAAG,eAAe,GAAG,oBAAoB;;ACD9F,mBAAe,QAAQ;;ACCvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,oBAAoB,GAAG,CAAC,MAAM;AACpC,EAAE,IAAI,OAAO,CAAC;AACd,EAAE,IAAI,OAAO,SAAS,KAAK,WAAW;AACtC,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC,OAAO,MAAM,aAAa;AACnD,IAAI,OAAO,KAAK,cAAc;AAC9B,IAAI,OAAO,KAAK,IAAI,CAAC;AACrB,IAAI;AACJ,IAAI,OAAO,KAAK,CAAC;AACjB,GAAG;AACH;AACA,EAAE,OAAO,OAAO,MAAM,KAAK,WAAW,IAAI,OAAO,QAAQ,KAAK,WAAW,CAAC;AAC1E,CAAC,GAAG,CAAC;AACL;AACA,iBAAe;AACf,EAAE,SAAS,EAAE,IAAI;AACjB,EAAE,OAAO,EAAE;AACX,qBAAIC,iBAAe;AACnB,cAAIC,UAAQ;AACZ,IAAI,IAAI;AACR,GAAG;AACH,EAAE,oBAAoB;AACtB,EAAE,SAAS,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC;AAC7D,CAAC;;ACpCc,SAAS,gBAAgB,CAAC,IAAI,EAAE,OAAO,EAAE;AACxD,EAAE,OAAO,UAAU,CAAC,IAAI,EAAE,IAAI,QAAQ,CAAC,OAAO,CAAC,eAAe,EAAE,EAAE,MAAM,CAAC,MAAM,CAAC;AAChF,IAAI,OAAO,EAAE,SAAS,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE;AACjD,MAAM,IAAI,QAAQ,CAAC,MAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE;AACpD,QAAQ,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;AACnD,QAAQ,OAAO,KAAK,CAAC;AACrB,OAAO;AACP;AACA,MAAM,OAAO,OAAO,CAAC,cAAc,CAAC,KAAK,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;AAC3D,KAAK;AACL,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC;AACf;;ACbA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,aAAa,CAAC,IAAI,EAAE;AAC7B;AACA;AACA;AACA;AACA,EAAE,OAAO,KAAK,CAAC,QAAQ,CAAC,eAAe,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,KAAK,IAAI;AAC5D,IAAI,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC;AACzD,GAAG,CAAC,CAAC;AACL,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,aAAa,CAAC,GAAG,EAAE;AAC5B,EAAE,MAAM,GAAG,GAAG,EAAE,CAAC;AACjB,EAAE,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAChC,EAAE,IAAI,CAAC,CAAC;AACR,EAAE,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC;AAC1B,EAAE,IAAI,GAAG,CAAC;AACV,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE;AAC5B,IAAI,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;AACxB,GAAG;AACH,EAAE,OAAO,GAAG,CAAC;AACb,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,cAAc,CAAC,QAAQ,EAAE;AAClC,EAAE,SAAS,SAAS,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE;AACjD,IAAI,IAAI,IAAI,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;AAC7B,IAAI,MAAM,YAAY,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC;AAChD,IAAI,MAAM,MAAM,GAAG,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC;AACxC,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC;AACjE;AACA,IAAI,IAAI,MAAM,EAAE;AAChB,MAAM,IAAI,KAAK,CAAC,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE;AAC1C,QAAQ,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC,CAAC;AAC7C,OAAO,MAAM;AACb,QAAQ,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;AAC7B,OAAO;AACP;AACA,MAAM,OAAO,CAAC,YAAY,CAAC;AAC3B,KAAK;AACL;AACA,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE;AACxD,MAAM,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;AACxB,KAAK;AACL;AACA,IAAI,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC,CAAC;AAC/D;AACA,IAAI,IAAI,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE;AAC/C,MAAM,MAAM,CAAC,IAAI,CAAC,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;AACjD,KAAK;AACL;AACA,IAAI,OAAO,CAAC,YAAY,CAAC;AACzB,GAAG;AACH;AACA,EAAE,IAAI,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE;AACxE,IAAI,MAAM,GAAG,GAAG,EAAE,CAAC;AACnB;AACA,IAAI,KAAK,CAAC,YAAY,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,KAAK,KAAK;AAClD,MAAM,SAAS,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;AACpD,KAAK,CAAC,CAAC;AACP;AACA,IAAI,OAAO,GAAG,CAAC;AACf,GAAG;AACH;AACA,EAAE,OAAO,IAAI,CAAC;AACd;;ACrFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACe,SAAS,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE;AAC1D,EAAE,MAAM,cAAc,GAAG,QAAQ,CAAC,MAAM,CAAC,cAAc,CAAC;AACxD,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,IAAI,CAAC,cAAc,IAAI,cAAc,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE;AAC9E,IAAI,OAAO,CAAC,QAAQ,CAAC,CAAC;AACtB,GAAG,MAAM;AACT,IAAI,MAAM,CAAC,IAAI,UAAU;AACzB,MAAM,kCAAkC,GAAG,QAAQ,CAAC,MAAM;AAC1D,MAAM,CAAC,UAAU,CAAC,eAAe,EAAE,UAAU,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;AACtG,MAAM,QAAQ,CAAC,MAAM;AACrB,MAAM,QAAQ,CAAC,OAAO;AACtB,MAAM,QAAQ;AACd,KAAK,CAAC,CAAC;AACP,GAAG;AACH;;ACrBA,gBAAe,QAAQ,CAAC,oBAAoB;AAC5C;AACA;AACA,EAAE,CAAC,SAAS,kBAAkB,GAAG;AACjC,IAAI,OAAO;AACX,MAAM,KAAK,EAAE,SAAS,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE;AACxE,QAAQ,MAAM,MAAM,GAAG,EAAE,CAAC;AAC1B,QAAQ,MAAM,CAAC,IAAI,CAAC,IAAI,GAAG,GAAG,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC;AAC5D;AACA,QAAQ,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE;AACrC,UAAU,MAAM,CAAC,IAAI,CAAC,UAAU,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;AACpE,SAAS;AACT;AACA,QAAQ,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE;AAClC,UAAU,MAAM,CAAC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;AACtC,SAAS;AACT;AACA,QAAQ,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE;AACpC,UAAU,MAAM,CAAC,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,CAAC;AAC1C,SAAS;AACT;AACA,QAAQ,IAAI,MAAM,KAAK,IAAI,EAAE;AAC7B,UAAU,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAChC,SAAS;AACT;AACA,QAAQ,QAAQ,CAAC,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC5C,OAAO;AACP;AACA,MAAM,IAAI,EAAE,SAAS,IAAI,CAAC,IAAI,EAAE;AAChC,QAAQ,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,YAAY,GAAG,IAAI,GAAG,WAAW,CAAC,CAAC,CAAC;AAC3F,QAAQ,QAAQ,KAAK,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,EAAE;AAC7D,OAAO;AACP;AACA,MAAM,MAAM,EAAE,SAAS,MAAM,CAAC,IAAI,EAAE;AACpC,QAAQ,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,CAAC,CAAC;AACpD,OAAO;AACP,KAAK,CAAC;AACN,GAAG,GAAG;AACN;AACA;AACA,EAAE,CAAC,SAAS,qBAAqB,GAAG;AACpC,IAAI,OAAO;AACX,MAAM,KAAK,EAAE,SAAS,KAAK,GAAG,EAAE;AAChC,MAAM,IAAI,EAAE,SAAS,IAAI,GAAG,EAAE,OAAO,IAAI,CAAC,EAAE;AAC5C,MAAM,MAAM,EAAE,SAAS,MAAM,GAAG,EAAE;AAClC,KAAK,CAAC;AACN,GAAG,GAAG;;ACjDN;AACA;AACA;AACA;AACA;AACA;AACA;AACe,SAAS,aAAa,CAAC,GAAG,EAAE;AAC3C;AACA;AACA;AACA,EAAE,OAAO,6BAA6B,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACjD;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACe,SAAS,WAAW,CAAC,OAAO,EAAE,WAAW,EAAE;AAC1D,EAAE,OAAO,WAAW;AACpB,MAAM,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,GAAG,GAAG,WAAW,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;AACzE,MAAM,OAAO,CAAC;AACd;;ACTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACe,SAAS,aAAa,CAAC,OAAO,EAAE,YAAY,EAAE;AAC7D,EAAE,IAAI,OAAO,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,EAAE;AAC/C,IAAI,OAAO,WAAW,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;AAC9C,GAAG;AACH,EAAE,OAAO,YAAY,CAAC;AACtB;;ACfA,wBAAe,QAAQ,CAAC,oBAAoB;AAC5C;AACA;AACA;AACA,EAAE,CAAC,SAAS,kBAAkB,GAAG;AACjC,IAAI,MAAM,IAAI,GAAG,iBAAiB,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;AAC7D,IAAI,MAAM,cAAc,GAAG,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;AACvD,IAAI,IAAI,SAAS,CAAC;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,SAAS,UAAU,CAAC,GAAG,EAAE;AAC7B,MAAM,IAAI,IAAI,GAAG,GAAG,CAAC;AACrB;AACA,MAAM,IAAI,IAAI,EAAE;AAChB;AACA,QAAQ,cAAc,CAAC,YAAY,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;AAClD,QAAQ,IAAI,GAAG,cAAc,CAAC,IAAI,CAAC;AACnC,OAAO;AACP;AACA,MAAM,cAAc,CAAC,YAAY,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;AAChD;AACA;AACA,MAAM,OAAO;AACb,QAAQ,IAAI,EAAE,cAAc,CAAC,IAAI;AACjC,QAAQ,QAAQ,EAAE,cAAc,CAAC,QAAQ,GAAG,cAAc,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,EAAE;AAC1F,QAAQ,IAAI,EAAE,cAAc,CAAC,IAAI;AACjC,QAAQ,MAAM,EAAE,cAAc,CAAC,MAAM,GAAG,cAAc,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,EAAE;AACrF,QAAQ,IAAI,EAAE,cAAc,CAAC,IAAI,GAAG,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,EAAE;AAC9E,QAAQ,QAAQ,EAAE,cAAc,CAAC,QAAQ;AACzC,QAAQ,IAAI,EAAE,cAAc,CAAC,IAAI;AACjC,QAAQ,QAAQ,EAAE,CAAC,cAAc,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG;AAC5D,UAAU,cAAc,CAAC,QAAQ;AACjC,UAAU,GAAG,GAAG,cAAc,CAAC,QAAQ;AACvC,OAAO,CAAC;AACR,KAAK;AACL;AACA,IAAI,SAAS,GAAG,UAAU,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,OAAO,SAAS,eAAe,CAAC,UAAU,EAAE;AAChD,MAAM,MAAM,MAAM,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,UAAU,CAAC,UAAU,CAAC,GAAG,UAAU,CAAC;AACxF,MAAM,QAAQ,MAAM,CAAC,QAAQ,KAAK,SAAS,CAAC,QAAQ;AACpD,UAAU,MAAM,CAAC,IAAI,KAAK,SAAS,CAAC,IAAI,EAAE;AAC1C,KAAK,CAAC;AACN,GAAG,GAAG;AACN;AACA;AACA,EAAE,CAAC,SAAS,qBAAqB,GAAG;AACpC,IAAI,OAAO,SAAS,eAAe,GAAG;AACtC,MAAM,OAAO,IAAI,CAAC;AAClB,KAAK,CAAC;AACN,GAAG,GAAG;;AC7DN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE;AACjD;AACA,EAAE,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,IAAI,IAAI,GAAG,UAAU,GAAG,OAAO,EAAE,UAAU,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;AAC1G,EAAE,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;AAC9B,CAAC;AACD;AACA,KAAK,CAAC,QAAQ,CAAC,aAAa,EAAE,UAAU,EAAE;AAC1C,EAAE,UAAU,EAAE,IAAI;AAClB,CAAC,CAAC;;ACpBa,SAAS,aAAa,CAAC,GAAG,EAAE;AAC3C,EAAE,MAAM,KAAK,GAAG,2BAA2B,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACtD,EAAE,OAAO,KAAK,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;AACjC;;ACDA;AACA;AACA,MAAM,iBAAiB,GAAG,KAAK,CAAC,WAAW,CAAC;AAC5C,EAAE,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM;AAClE,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,mBAAmB,EAAE,qBAAqB;AACvE,EAAE,eAAe,EAAE,UAAU,EAAE,cAAc,EAAE,qBAAqB;AACpE,EAAE,SAAS,EAAE,aAAa,EAAE,YAAY;AACxC,CAAC,CAAC,CAAC;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAe,UAAU,IAAI;AAC7B,EAAE,MAAM,MAAM,GAAG,EAAE,CAAC;AACpB,EAAE,IAAI,GAAG,CAAC;AACV,EAAE,IAAI,GAAG,CAAC;AACV,EAAE,IAAI,CAAC,CAAC;AACR;AACA,EAAE,UAAU,IAAI,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,SAAS,MAAM,CAAC,IAAI,EAAE;AACrE,IAAI,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;AAC1B,IAAI,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;AACpD,IAAI,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;AACvC;AACA,IAAI,IAAI,CAAC,GAAG,KAAK,MAAM,CAAC,GAAG,CAAC,IAAI,iBAAiB,CAAC,GAAG,CAAC,CAAC,EAAE;AACzD,MAAM,OAAO;AACb,KAAK;AACL;AACA,IAAI,IAAI,GAAG,KAAK,YAAY,EAAE;AAC9B,MAAM,IAAI,MAAM,CAAC,GAAG,CAAC,EAAE;AACvB,QAAQ,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC9B,OAAO,MAAM;AACb,QAAQ,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AAC5B,OAAO;AACP,KAAK,MAAM;AACX,MAAM,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,CAAC;AACjE,KAAK;AACL,GAAG,CAAC,CAAC;AACL;AACA,EAAE,OAAO,MAAM,CAAC;AAChB,CAAC;;ACjDD,MAAM,UAAU,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC;AACvC,MAAM,SAAS,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;AACrC;AACA,SAAS,eAAe,CAAC,MAAM,EAAE;AACjC,EAAE,OAAO,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;AACvD,CAAC;AACD;AACA,SAAS,cAAc,CAAC,KAAK,EAAE;AAC/B,EAAE,IAAI,KAAK,KAAK,KAAK,IAAI,KAAK,IAAI,IAAI,EAAE;AACxC,IAAI,OAAO,KAAK,CAAC;AACjB,GAAG;AACH;AACA,EAAE,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;AAC1E,CAAC;AACD;AACA,SAAS,WAAW,CAAC,GAAG,EAAE;AAC1B,EAAE,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;AACrC,EAAE,MAAM,QAAQ,GAAG,kCAAkC,CAAC;AACtD,EAAE,IAAI,KAAK,CAAC;AACZ;AACA,EAAE,QAAQ,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG;AACvC,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;AAChC,GAAG;AACH;AACA,EAAE,OAAO,MAAM,CAAC;AAChB,CAAC;AACD;AACA,SAAS,gBAAgB,CAAC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE;AAC1D,EAAE,IAAI,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE;AAChC,IAAI,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;AAC5C,GAAG;AACH;AACA,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO;AACrC;AACA,EAAE,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE;AAC9B,IAAI,OAAO,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;AACxC,GAAG;AACH;AACA,EAAE,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE;AAC9B,IAAI,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC9B,GAAG;AACH,CAAC;AACD;AACA,SAAS,YAAY,CAAC,MAAM,EAAE;AAC9B,EAAE,OAAO,MAAM,CAAC,IAAI,EAAE;AACtB,KAAK,WAAW,EAAE,CAAC,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,KAAK;AAChE,MAAM,OAAO,IAAI,CAAC,WAAW,EAAE,GAAG,GAAG,CAAC;AACtC,KAAK,CAAC,CAAC;AACP,CAAC;AACD;AACA,SAAS,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE;AACrC,EAAE,MAAM,YAAY,GAAG,KAAK,CAAC,WAAW,CAAC,GAAG,GAAG,MAAM,CAAC,CAAC;AACvD;AACA,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,UAAU,IAAI;AAC9C,IAAI,MAAM,CAAC,cAAc,CAAC,GAAG,EAAE,UAAU,GAAG,YAAY,EAAE;AAC1D,MAAM,KAAK,EAAE,SAAS,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE;AACxC,QAAQ,OAAO,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AACrE,OAAO;AACP,MAAM,YAAY,EAAE,IAAI;AACxB,KAAK,CAAC,CAAC;AACP,GAAG,CAAC,CAAC;AACL,CAAC;AACD;AACA,SAAS,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE;AAC3B,EAAE,GAAG,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC;AAC1B,EAAE,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAChC,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;AACtB,EAAE,IAAI,IAAI,CAAC;AACX,EAAE,OAAO,CAAC,EAAE,GAAG,CAAC,EAAE;AAClB,IAAI,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;AACnB,IAAI,IAAI,GAAG,KAAK,IAAI,CAAC,WAAW,EAAE,EAAE;AACpC,MAAM,OAAO,IAAI,CAAC;AAClB,KAAK;AACL,GAAG;AACH,EAAE,OAAO,IAAI,CAAC;AACd,CAAC;AACD;AACA,SAAS,YAAY,CAAC,OAAO,EAAE,QAAQ,EAAE;AACzC,EAAE,OAAO,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AAC/B,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,QAAQ,IAAI,IAAI,CAAC;AACrC,CAAC;AACD;AACA,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,SAAS,EAAE;AACtC,EAAE,GAAG,EAAE,SAAS,MAAM,EAAE,cAAc,EAAE,OAAO,EAAE;AACjD,IAAI,MAAM,IAAI,GAAG,IAAI,CAAC;AACtB;AACA,IAAI,SAAS,SAAS,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE;AAClD,MAAM,MAAM,OAAO,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;AAC/C;AACA,MAAM,IAAI,CAAC,OAAO,EAAE;AACpB,QAAQ,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;AAClE,OAAO;AACP;AACA,MAAM,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AACzC;AACA,MAAM,IAAI,GAAG,IAAI,QAAQ,KAAK,IAAI,KAAK,IAAI,CAAC,GAAG,CAAC,KAAK,KAAK,IAAI,QAAQ,KAAK,KAAK,CAAC,EAAE;AACnF,QAAQ,OAAO;AACf,OAAO;AACP;AACA,MAAM,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;AACpD,KAAK;AACL;AACA,IAAI,IAAI,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE;AACrC,MAAM,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK;AACjD,QAAQ,SAAS,CAAC,MAAM,EAAE,OAAO,EAAE,cAAc,CAAC,CAAC;AACnD,OAAO,CAAC,CAAC;AACT,KAAK,MAAM;AACX,MAAM,SAAS,CAAC,cAAc,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;AACjD,KAAK;AACL;AACA,IAAI,OAAO,IAAI,CAAC;AAChB,GAAG;AACH;AACA,EAAE,GAAG,EAAE,SAAS,MAAM,EAAE,MAAM,EAAE;AAChC,IAAI,MAAM,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;AACrC;AACA,IAAI,IAAI,CAAC,MAAM,EAAE,OAAO,SAAS,CAAC;AAClC;AACA,IAAI,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AACtC;AACA,IAAI,IAAI,GAAG,EAAE;AACb,MAAM,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;AAC9B;AACA,MAAM,IAAI,CAAC,MAAM,EAAE;AACnB,QAAQ,OAAO,KAAK,CAAC;AACrB,OAAO;AACP;AACA,MAAM,IAAI,MAAM,KAAK,IAAI,EAAE;AAC3B,QAAQ,OAAO,WAAW,CAAC,KAAK,CAAC,CAAC;AAClC,OAAO;AACP;AACA,MAAM,IAAI,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE;AACpC,QAAQ,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;AAC7C,OAAO;AACP;AACA,MAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE;AAClC,QAAQ,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAClC,OAAO;AACP;AACA,MAAM,MAAM,IAAI,SAAS,CAAC,wCAAwC,CAAC,CAAC;AACpE,KAAK;AACL,GAAG;AACH;AACA,EAAE,GAAG,EAAE,SAAS,MAAM,EAAE,OAAO,EAAE;AACjC,IAAI,MAAM,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;AACrC;AACA,IAAI,IAAI,MAAM,EAAE;AAChB,MAAM,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AACxC;AACA,MAAM,OAAO,CAAC,EAAE,GAAG,KAAK,CAAC,OAAO,IAAI,gBAAgB,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;AACtF,KAAK;AACL;AACA,IAAI,OAAO,KAAK,CAAC;AACjB,GAAG;AACH;AACA,EAAE,MAAM,EAAE,SAAS,MAAM,EAAE,OAAO,EAAE;AACpC,IAAI,MAAM,IAAI,GAAG,IAAI,CAAC;AACtB,IAAI,IAAI,OAAO,GAAG,KAAK,CAAC;AACxB;AACA,IAAI,SAAS,YAAY,CAAC,OAAO,EAAE;AACnC,MAAM,OAAO,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;AACzC;AACA,MAAM,IAAI,OAAO,EAAE;AACnB,QAAQ,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AAC3C;AACA,QAAQ,IAAI,GAAG,KAAK,CAAC,OAAO,IAAI,gBAAgB,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC,EAAE;AAClF,UAAU,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC;AAC3B;AACA,UAAU,OAAO,GAAG,IAAI,CAAC;AACzB,SAAS;AACT,OAAO;AACP,KAAK;AACL;AACA,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;AAC/B,MAAM,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;AACnC,KAAK,MAAM;AACX,MAAM,YAAY,CAAC,MAAM,CAAC,CAAC;AAC3B,KAAK;AACL;AACA,IAAI,OAAO,OAAO,CAAC;AACnB,GAAG;AACH;AACA,EAAE,KAAK,EAAE,WAAW;AACpB,IAAI,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AAC7D,GAAG;AACH;AACA,EAAE,SAAS,EAAE,SAAS,MAAM,EAAE;AAC9B,IAAI,MAAM,IAAI,GAAG,IAAI,CAAC;AACtB,IAAI,MAAM,OAAO,GAAG,EAAE,CAAC;AACvB;AACA,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK;AAC3C,MAAM,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;AAC3C;AACA,MAAM,IAAI,GAAG,EAAE;AACf,QAAQ,IAAI,CAAC,GAAG,CAAC,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;AAC1C,QAAQ,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC;AAC5B,QAAQ,OAAO;AACf,OAAO;AACP;AACA,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;AAC/E;AACA,MAAM,IAAI,UAAU,KAAK,MAAM,EAAE;AACjC,QAAQ,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC;AAC5B,OAAO;AACP;AACA,MAAM,IAAI,CAAC,UAAU,CAAC,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;AAC/C;AACA,MAAM,OAAO,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC;AACjC,KAAK,CAAC,CAAC;AACP;AACA,IAAI,OAAO,IAAI,CAAC;AAChB,GAAG;AACH;AACA,EAAE,MAAM,EAAE,SAAS,SAAS,EAAE;AAC9B,IAAI,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;AACpC;AACA,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,IAAI,EAAE,IAAI,CAAC;AAClE,MAAM,CAAC,KAAK,EAAE,MAAM,KAAK;AACzB,QAAQ,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,KAAK,KAAK,EAAE,OAAO;AACrD,QAAQ,GAAG,CAAC,MAAM,CAAC,GAAG,SAAS,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;AACnF,OAAO,CAAC,CAAC;AACT;AACA,IAAI,OAAO,GAAG,CAAC;AACf,GAAG;AACH,CAAC,CAAC,CAAC;AACH;AACA,MAAM,CAAC,MAAM,CAAC,YAAY,EAAE;AAC5B,EAAE,IAAI,EAAE,SAAS,KAAK,EAAE;AACxB,IAAI,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE;AAC/B,MAAM,OAAO,IAAI,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC;AAC3C,KAAK;AACL,IAAI,OAAO,KAAK,YAAY,IAAI,GAAG,KAAK,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC;AAC3D,GAAG;AACH;AACA,EAAE,QAAQ,EAAE,SAAS,MAAM,EAAE;AAC7B,IAAI,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG;AAC7D,MAAM,SAAS,EAAE,EAAE;AACnB,KAAK,CAAC,CAAC;AACP;AACA,IAAI,MAAM,SAAS,GAAG,SAAS,CAAC,SAAS,CAAC;AAC1C,IAAI,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;AACrC;AACA,IAAI,SAAS,cAAc,CAAC,OAAO,EAAE;AACrC,MAAM,MAAM,OAAO,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;AAC/C;AACA,MAAM,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE;AAC/B,QAAQ,cAAc,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;AAC3C,QAAQ,SAAS,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC;AAClC,OAAO;AACP,KAAK;AACL;AACA,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;AACpF;AACA,IAAI,OAAO,IAAI,CAAC;AAChB,GAAG;AACH,CAAC,CAAC,CAAC;AACH;AACA,YAAY,CAAC,QAAQ,CAAC,CAAC,cAAc,EAAE,gBAAgB,EAAE,QAAQ,EAAE,iBAAiB,EAAE,YAAY,CAAC,CAAC,CAAC;AACrG;AACA,KAAK,CAAC,aAAa,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;AAC5C,KAAK,CAAC,aAAa,CAAC,YAAY,CAAC;;ACvQjC;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,WAAW,CAAC,YAAY,EAAE,GAAG,EAAE;AACxC,EAAE,YAAY,GAAG,YAAY,IAAI,EAAE,CAAC;AACpC,EAAE,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,YAAY,CAAC,CAAC;AACxC,EAAE,MAAM,UAAU,GAAG,IAAI,KAAK,CAAC,YAAY,CAAC,CAAC;AAC7C,EAAE,IAAI,IAAI,GAAG,CAAC,CAAC;AACf,EAAE,IAAI,IAAI,GAAG,CAAC,CAAC;AACf,EAAE,IAAI,aAAa,CAAC;AACpB;AACA,EAAE,GAAG,GAAG,GAAG,KAAK,SAAS,GAAG,GAAG,GAAG,IAAI,CAAC;AACvC;AACA,EAAE,OAAO,SAAS,IAAI,CAAC,WAAW,EAAE;AACpC,IAAI,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;AAC3B;AACA,IAAI,MAAM,SAAS,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;AACvC;AACA,IAAI,IAAI,CAAC,aAAa,EAAE;AACxB,MAAM,aAAa,GAAG,GAAG,CAAC;AAC1B,KAAK;AACL;AACA,IAAI,KAAK,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC;AAC9B,IAAI,UAAU,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC;AAC3B;AACA,IAAI,IAAI,CAAC,GAAG,IAAI,CAAC;AACjB,IAAI,IAAI,UAAU,GAAG,CAAC,CAAC;AACvB;AACA,IAAI,OAAO,CAAC,KAAK,IAAI,EAAE;AACvB,MAAM,UAAU,IAAI,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;AAC/B,MAAM,CAAC,GAAG,CAAC,GAAG,YAAY,CAAC;AAC3B,KAAK;AACL;AACA,IAAI,IAAI,GAAG,CAAC,IAAI,GAAG,CAAC,IAAI,YAAY,CAAC;AACrC;AACA,IAAI,IAAI,IAAI,KAAK,IAAI,EAAE;AACvB,MAAM,IAAI,GAAG,CAAC,IAAI,GAAG,CAAC,IAAI,YAAY,CAAC;AACvC,KAAK;AACL;AACA,IAAI,IAAI,GAAG,GAAG,aAAa,GAAG,GAAG,EAAE;AACnC,MAAM,OAAO;AACb,KAAK;AACL;AACA,IAAI,MAAM,MAAM,GAAG,SAAS,IAAI,GAAG,GAAG,SAAS,CAAC;AAChD;AACA,IAAI,QAAQ,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,IAAI,GAAG,MAAM,CAAC,GAAG,SAAS,CAAC;AACxE,GAAG,CAAC;AACJ;;ACpCA,SAAS,oBAAoB,CAAC,QAAQ,EAAE,gBAAgB,EAAE;AAC1D,EAAE,IAAI,aAAa,GAAG,CAAC,CAAC;AACxB,EAAE,MAAM,YAAY,GAAG,WAAW,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;AAC5C;AACA,EAAE,OAAO,CAAC,IAAI;AACd,IAAI,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC;AAC5B,IAAI,MAAM,KAAK,GAAG,CAAC,CAAC,gBAAgB,GAAG,CAAC,CAAC,KAAK,GAAG,SAAS,CAAC;AAC3D,IAAI,MAAM,aAAa,GAAG,MAAM,GAAG,aAAa,CAAC;AACjD,IAAI,MAAM,IAAI,GAAG,YAAY,CAAC,aAAa,CAAC,CAAC;AAC7C,IAAI,MAAM,OAAO,GAAG,MAAM,IAAI,KAAK,CAAC;AACpC;AACA,IAAI,aAAa,GAAG,MAAM,CAAC;AAC3B;AACA,IAAI,MAAM,IAAI,GAAG;AACjB,MAAM,MAAM;AACZ,MAAM,KAAK;AACX,MAAM,QAAQ,EAAE,KAAK,IAAI,MAAM,GAAG,KAAK,IAAI,SAAS;AACpD,MAAM,KAAK,EAAE,aAAa;AAC1B,MAAM,IAAI,EAAE,IAAI,GAAG,IAAI,GAAG,SAAS;AACnC,MAAM,SAAS,EAAE,IAAI,IAAI,KAAK,IAAI,OAAO,GAAG,CAAC,KAAK,GAAG,MAAM,IAAI,IAAI,GAAG,SAAS;AAC/E,KAAK,CAAC;AACN;AACA,IAAI,IAAI,CAAC,gBAAgB,GAAG,UAAU,GAAG,QAAQ,CAAC,GAAG,IAAI,CAAC;AAC1D;AACA,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC;AACnB,GAAG,CAAC;AACJ,CAAC;AACD;AACe,SAAS,UAAU,CAAC,MAAM,EAAE;AAC3C,EAAE,OAAO,IAAI,OAAO,CAAC,SAAS,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE;AAClE,IAAI,IAAI,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC;AAClC,IAAI,MAAM,cAAc,GAAG,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,CAAC;AACzE,IAAI,MAAM,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC;AAC7C,IAAI,IAAI,UAAU,CAAC;AACnB,IAAI,SAAS,IAAI,GAAG;AACpB,MAAM,IAAI,MAAM,CAAC,WAAW,EAAE;AAC9B,QAAQ,MAAM,CAAC,WAAW,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;AACnD,OAAO;AACP;AACA,MAAM,IAAI,MAAM,CAAC,MAAM,EAAE;AACzB,QAAQ,MAAM,CAAC,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;AAC/D,OAAO;AACP,KAAK;AACL;AACA,IAAI,IAAI,KAAK,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,QAAQ,CAAC,oBAAoB,EAAE;AACxE,MAAM,cAAc,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;AAC3C,KAAK;AACL;AACA,IAAI,IAAI,OAAO,GAAG,IAAI,cAAc,EAAE,CAAC;AACvC;AACA;AACA,IAAI,IAAI,MAAM,CAAC,IAAI,EAAE;AACrB,MAAM,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC;AAClD,MAAM,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC,kBAAkB,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,GAAG,EAAE,CAAC;AACtG,MAAM,cAAc,CAAC,GAAG,CAAC,eAAe,EAAE,QAAQ,GAAG,IAAI,CAAC,QAAQ,GAAG,GAAG,GAAG,QAAQ,CAAC,CAAC,CAAC;AACtF,KAAK;AACL;AACA,IAAI,MAAM,QAAQ,GAAG,aAAa,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC;AAC/D;AACA,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,gBAAgB,CAAC,EAAE,IAAI,CAAC,CAAC;AAChH;AACA;AACA,IAAI,OAAO,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;AACrC;AACA,IAAI,SAAS,SAAS,GAAG;AACzB,MAAM,IAAI,CAAC,OAAO,EAAE;AACpB,QAAQ,OAAO;AACf,OAAO;AACP;AACA,MAAM,MAAM,eAAe,GAAG,YAAY,CAAC,IAAI;AAC/C,QAAQ,uBAAuB,IAAI,OAAO,IAAI,OAAO,CAAC,qBAAqB,EAAE;AAC7E,OAAO,CAAC;AACR,MAAM,MAAM,YAAY,GAAG,CAAC,YAAY,IAAI,YAAY,KAAK,MAAM,KAAK,YAAY,KAAK,MAAM;AAC/F,QAAQ,OAAO,CAAC,YAAY,GAAG,OAAO,CAAC,QAAQ,CAAC;AAChD,MAAM,MAAM,QAAQ,GAAG;AACvB,QAAQ,IAAI,EAAE,YAAY;AAC1B,QAAQ,MAAM,EAAE,OAAO,CAAC,MAAM;AAC9B,QAAQ,UAAU,EAAE,OAAO,CAAC,UAAU;AACtC,QAAQ,OAAO,EAAE,eAAe;AAChC,QAAQ,MAAM;AACd,QAAQ,OAAO;AACf,OAAO,CAAC;AACR;AACA,MAAM,MAAM,CAAC,SAAS,QAAQ,CAAC,KAAK,EAAE;AACtC,QAAQ,OAAO,CAAC,KAAK,CAAC,CAAC;AACvB,QAAQ,IAAI,EAAE,CAAC;AACf,OAAO,EAAE,SAAS,OAAO,CAAC,GAAG,EAAE;AAC/B,QAAQ,MAAM,CAAC,GAAG,CAAC,CAAC;AACpB,QAAQ,IAAI,EAAE,CAAC;AACf,OAAO,EAAE,QAAQ,CAAC,CAAC;AACnB;AACA;AACA,MAAM,OAAO,GAAG,IAAI,CAAC;AACrB,KAAK;AACL;AACA,IAAI,IAAI,WAAW,IAAI,OAAO,EAAE;AAChC;AACA,MAAM,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC;AACpC,KAAK,MAAM;AACX;AACA,MAAM,OAAO,CAAC,kBAAkB,GAAG,SAAS,UAAU,GAAG;AACzD,QAAQ,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,UAAU,KAAK,CAAC,EAAE;AAClD,UAAU,OAAO;AACjB,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,QAAQ,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE;AAC1G,UAAU,OAAO;AACjB,SAAS;AACT;AACA;AACA,QAAQ,UAAU,CAAC,SAAS,CAAC,CAAC;AAC9B,OAAO,CAAC;AACR,KAAK;AACL;AACA;AACA,IAAI,OAAO,CAAC,OAAO,GAAG,SAAS,WAAW,GAAG;AAC7C,MAAM,IAAI,CAAC,OAAO,EAAE;AACpB,QAAQ,OAAO;AACf,OAAO;AACP;AACA,MAAM,MAAM,CAAC,IAAI,UAAU,CAAC,iBAAiB,EAAE,UAAU,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;AAC1F;AACA;AACA,MAAM,OAAO,GAAG,IAAI,CAAC;AACrB,KAAK,CAAC;AACN;AACA;AACA,IAAI,OAAO,CAAC,OAAO,GAAG,SAAS,WAAW,GAAG;AAC7C;AACA;AACA,MAAM,MAAM,CAAC,IAAI,UAAU,CAAC,eAAe,EAAE,UAAU,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;AACvF;AACA;AACA,MAAM,OAAO,GAAG,IAAI,CAAC;AACrB,KAAK,CAAC;AACN;AACA;AACA,IAAI,OAAO,CAAC,SAAS,GAAG,SAAS,aAAa,GAAG;AACjD,MAAM,IAAI,mBAAmB,GAAG,MAAM,CAAC,OAAO,GAAG,aAAa,GAAG,MAAM,CAAC,OAAO,GAAG,aAAa,GAAG,kBAAkB,CAAC;AACrH,MAAM,MAAM,YAAY,GAAG,MAAM,CAAC,YAAY,IAAI,oBAAoB,CAAC;AACvE,MAAM,IAAI,MAAM,CAAC,mBAAmB,EAAE;AACtC,QAAQ,mBAAmB,GAAG,MAAM,CAAC,mBAAmB,CAAC;AACzD,OAAO;AACP,MAAM,MAAM,CAAC,IAAI,UAAU;AAC3B,QAAQ,mBAAmB;AAC3B,QAAQ,YAAY,CAAC,mBAAmB,GAAG,UAAU,CAAC,SAAS,GAAG,UAAU,CAAC,YAAY;AACzF,QAAQ,MAAM;AACd,QAAQ,OAAO,CAAC,CAAC,CAAC;AAClB;AACA;AACA,MAAM,OAAO,GAAG,IAAI,CAAC;AACrB,KAAK,CAAC;AACN;AACA;AACA;AACA;AACA,IAAI,IAAI,QAAQ,CAAC,oBAAoB,EAAE;AACvC;AACA,MAAM,MAAM,SAAS,GAAG,CAAC,MAAM,CAAC,eAAe,IAAI,eAAe,CAAC,QAAQ,CAAC;AAC5E,WAAW,MAAM,CAAC,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;AACxE;AACA,MAAM,IAAI,SAAS,EAAE;AACrB,QAAQ,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,cAAc,EAAE,SAAS,CAAC,CAAC;AAC7D,OAAO;AACP,KAAK;AACL;AACA;AACA,IAAI,WAAW,KAAK,SAAS,IAAI,cAAc,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;AACrE;AACA;AACA,IAAI,IAAI,kBAAkB,IAAI,OAAO,EAAE;AACvC,MAAM,KAAK,CAAC,OAAO,CAAC,cAAc,CAAC,MAAM,EAAE,EAAE,SAAS,gBAAgB,CAAC,GAAG,EAAE,GAAG,EAAE;AACjF,QAAQ,OAAO,CAAC,gBAAgB,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;AAC3C,OAAO,CAAC,CAAC;AACT,KAAK;AACL;AACA;AACA,IAAI,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,eAAe,CAAC,EAAE;AACpD,MAAM,OAAO,CAAC,eAAe,GAAG,CAAC,CAAC,MAAM,CAAC,eAAe,CAAC;AACzD,KAAK;AACL;AACA;AACA,IAAI,IAAI,YAAY,IAAI,YAAY,KAAK,MAAM,EAAE;AACjD,MAAM,OAAO,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC;AACjD,KAAK;AACL;AACA;AACA,IAAI,IAAI,OAAO,MAAM,CAAC,kBAAkB,KAAK,UAAU,EAAE;AACzD,MAAM,OAAO,CAAC,gBAAgB,CAAC,UAAU,EAAE,oBAAoB,CAAC,MAAM,CAAC,kBAAkB,EAAE,IAAI,CAAC,CAAC,CAAC;AAClG,KAAK;AACL;AACA;AACA,IAAI,IAAI,OAAO,MAAM,CAAC,gBAAgB,KAAK,UAAU,IAAI,OAAO,CAAC,MAAM,EAAE;AACzE,MAAM,OAAO,CAAC,MAAM,CAAC,gBAAgB,CAAC,UAAU,EAAE,oBAAoB,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,CAAC;AACjG,KAAK;AACL;AACA,IAAI,IAAI,MAAM,CAAC,WAAW,IAAI,MAAM,CAAC,MAAM,EAAE;AAC7C;AACA;AACA,MAAM,UAAU,GAAG,MAAM,IAAI;AAC7B,QAAQ,IAAI,CAAC,OAAO,EAAE;AACtB,UAAU,OAAO;AACjB,SAAS;AACT,QAAQ,MAAM,CAAC,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI,GAAG,IAAI,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,CAAC;AAC3F,QAAQ,OAAO,CAAC,KAAK,EAAE,CAAC;AACxB,QAAQ,OAAO,GAAG,IAAI,CAAC;AACvB,OAAO,CAAC;AACR;AACA,MAAM,MAAM,CAAC,WAAW,IAAI,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;AACrE,MAAM,IAAI,MAAM,CAAC,MAAM,EAAE;AACzB,QAAQ,MAAM,CAAC,MAAM,CAAC,OAAO,GAAG,UAAU,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;AACnG,OAAO;AACP,KAAK;AACL;AACA,IAAI,MAAM,QAAQ,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC;AAC7C;AACA,IAAI,IAAI,QAAQ,IAAI,QAAQ,CAAC,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE;AACjE,MAAM,MAAM,CAAC,IAAI,UAAU,CAAC,uBAAuB,GAAG,QAAQ,GAAG,GAAG,EAAE,UAAU,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC,CAAC;AAC3G,MAAM,OAAO;AACb,KAAK;AACL;AACA;AACA;AACA,IAAI,OAAO,CAAC,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,CAAC;AACtC,GAAG,CAAC,CAAC;AACL;;ACjPA,MAAM,QAAQ,GAAG;AACjB,EAAE,IAAI,EAAEC,UAAW;AACnB,EAAE,GAAG,EAAE,UAAU;AACjB,EAAC;AACD;AACA,mBAAe;AACf,EAAE,UAAU,EAAE,CAAC,aAAa,KAAK;AACjC,IAAI,GAAG,KAAK,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;AACrC,MAAM,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,CAAC;AAC9C;AACA,MAAM,IAAI,CAAC,aAAa,EAAE;AAC1B,QAAQ,MAAM,KAAK;AACnB,UAAU,KAAK,CAAC,UAAU,CAAC,aAAa,CAAC;AACzC,YAAY,CAAC,SAAS,EAAE,aAAa,CAAC,+BAA+B,CAAC;AACtE,YAAY,CAAC,yBAAyB,EAAE,aAAa,CAAC,CAAC,CAAC;AACxD,SAAS,CAAC;AACV,OAAO;AACP;AACA,MAAM,OAAO,OAAO;AACpB,KAAK;AACL;AACA,IAAI,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE;AAC1C,MAAM,MAAM,IAAI,SAAS,CAAC,2BAA2B,CAAC,CAAC;AACvD,KAAK;AACL;AACA,IAAI,OAAO,aAAa,CAAC;AACzB,GAAG;AACH,EAAE,QAAQ;AACV;;ACrBA,MAAM,oBAAoB,GAAG;AAC7B,EAAE,cAAc,EAAE,mCAAmC;AACrD,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,iBAAiB,GAAG;AAC7B,EAAE,IAAI,OAAO,CAAC;AACd,EAAE,IAAI,OAAO,cAAc,KAAK,WAAW,EAAE;AAC7C;AACA,IAAI,OAAO,GAAGC,UAAQ,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;AACzC,GAAG,MAAM,IAAI,OAAO,OAAO,KAAK,WAAW,IAAI,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,SAAS,EAAE;AACpF;AACA,IAAI,OAAO,GAAGA,UAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;AAC1C,GAAG;AACH,EAAE,OAAO,OAAO,CAAC;AACjB,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE;AACpD,EAAE,IAAI,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE;AAChC,IAAI,IAAI;AACR,MAAM,CAAC,MAAM,IAAI,IAAI,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;AACvC,MAAM,OAAO,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAClC,KAAK,CAAC,OAAO,CAAC,EAAE;AAChB,MAAM,IAAI,CAAC,CAAC,IAAI,KAAK,aAAa,EAAE;AACpC,QAAQ,MAAM,CAAC,CAAC;AAChB,OAAO;AACP,KAAK;AACL,GAAG;AACH;AACA,EAAE,OAAO,CAAC,OAAO,IAAI,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;AAC/C,CAAC;AACD;AACA,MAAM,QAAQ,GAAG;AACjB;AACA,EAAE,YAAY,EAAE,oBAAoB;AACpC;AACA,EAAE,OAAO,EAAE,iBAAiB,EAAE;AAC9B;AACA,EAAE,gBAAgB,EAAE,CAAC,SAAS,gBAAgB,CAAC,IAAI,EAAE,OAAO,EAAE;AAC9D,IAAI,MAAM,WAAW,GAAG,OAAO,CAAC,cAAc,EAAE,IAAI,EAAE,CAAC;AACvD,IAAI,MAAM,kBAAkB,GAAG,WAAW,CAAC,OAAO,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAAC;AAC5E,IAAI,MAAM,eAAe,GAAG,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;AACjD;AACA,IAAI,IAAI,eAAe,IAAI,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE;AACnD,MAAM,IAAI,GAAG,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC;AAChC,KAAK;AACL;AACA,IAAI,MAAM,UAAU,GAAG,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;AAC9C;AACA,IAAI,IAAI,UAAU,EAAE;AACpB,MAAM,IAAI,CAAC,kBAAkB,EAAE;AAC/B,QAAQ,OAAO,IAAI,CAAC;AACpB,OAAO;AACP,MAAM,OAAO,kBAAkB,GAAG,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC;AAC9E,KAAK;AACL;AACA,IAAI,IAAI,KAAK,CAAC,aAAa,CAAC,IAAI,CAAC;AACjC,MAAM,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC;AAC1B,MAAM,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC;AAC1B,MAAM,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC;AACxB,MAAM,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC;AACxB,MAAM;AACN,MAAM,OAAO,IAAI,CAAC;AAClB,KAAK;AACL,IAAI,IAAI,KAAK,CAAC,iBAAiB,CAAC,IAAI,CAAC,EAAE;AACvC,MAAM,OAAO,IAAI,CAAC,MAAM,CAAC;AACzB,KAAK;AACL,IAAI,IAAI,KAAK,CAAC,iBAAiB,CAAC,IAAI,CAAC,EAAE;AACvC,MAAM,OAAO,CAAC,cAAc,CAAC,iDAAiD,EAAE,KAAK,CAAC,CAAC;AACvF,MAAM,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC;AAC7B,KAAK;AACL;AACA,IAAI,IAAI,UAAU,CAAC;AACnB;AACA,IAAI,IAAI,eAAe,EAAE;AACzB,MAAM,IAAI,WAAW,CAAC,OAAO,CAAC,mCAAmC,CAAC,GAAG,CAAC,CAAC,EAAE;AACzE,QAAQ,OAAO,gBAAgB,CAAC,IAAI,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC,QAAQ,EAAE,CAAC;AACtE,OAAO;AACP;AACA,MAAM,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,WAAW,CAAC,OAAO,CAAC,qBAAqB,CAAC,GAAG,CAAC,CAAC,EAAE;AACpG,QAAQ,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC;AACxD;AACA,QAAQ,OAAO,UAAU;AACzB,UAAU,UAAU,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,GAAG,IAAI;AAC/C,UAAU,SAAS,IAAI,IAAI,SAAS,EAAE;AACtC,UAAU,IAAI,CAAC,cAAc;AAC7B,SAAS,CAAC;AACV,OAAO;AACP,KAAK;AACL;AACA,IAAI,IAAI,eAAe,IAAI,kBAAkB,GAAG;AAChD,MAAM,OAAO,CAAC,cAAc,CAAC,kBAAkB,EAAE,KAAK,CAAC,CAAC;AACxD,MAAM,OAAO,eAAe,CAAC,IAAI,CAAC,CAAC;AACnC,KAAK;AACL;AACA,IAAI,OAAO,IAAI,CAAC;AAChB,GAAG,CAAC;AACJ;AACA,EAAE,iBAAiB,EAAE,CAAC,SAAS,iBAAiB,CAAC,IAAI,EAAE;AACvD,IAAI,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,IAAI,QAAQ,CAAC,YAAY,CAAC;AACpE,IAAI,MAAM,iBAAiB,GAAG,YAAY,IAAI,YAAY,CAAC,iBAAiB,CAAC;AAC7E,IAAI,MAAM,aAAa,GAAG,IAAI,CAAC,YAAY,KAAK,MAAM,CAAC;AACvD;AACA,IAAI,IAAI,IAAI,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,iBAAiB,IAAI,CAAC,IAAI,CAAC,YAAY,KAAK,aAAa,CAAC,EAAE;AACtG,MAAM,MAAM,iBAAiB,GAAG,YAAY,IAAI,YAAY,CAAC,iBAAiB,CAAC;AAC/E,MAAM,MAAM,iBAAiB,GAAG,CAAC,iBAAiB,IAAI,aAAa,CAAC;AACpE;AACA,MAAM,IAAI;AACV,QAAQ,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AAChC,OAAO,CAAC,OAAO,CAAC,EAAE;AAClB,QAAQ,IAAI,iBAAiB,EAAE;AAC/B,UAAU,IAAI,CAAC,CAAC,IAAI,KAAK,aAAa,EAAE;AACxC,YAAY,MAAM,UAAU,CAAC,IAAI,CAAC,CAAC,EAAE,UAAU,CAAC,gBAAgB,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;AAC7F,WAAW;AACX,UAAU,MAAM,CAAC,CAAC;AAClB,SAAS;AACT,OAAO;AACP,KAAK;AACL;AACA,IAAI,OAAO,IAAI,CAAC;AAChB,GAAG,CAAC;AACJ;AACA;AACA;AACA;AACA;AACA,EAAE,OAAO,EAAE,CAAC;AACZ;AACA,EAAE,cAAc,EAAE,YAAY;AAC9B,EAAE,cAAc,EAAE,cAAc;AAChC;AACA,EAAE,gBAAgB,EAAE,CAAC,CAAC;AACtB,EAAE,aAAa,EAAE,CAAC,CAAC;AACnB;AACA,EAAE,GAAG,EAAE;AACP,IAAI,QAAQ,EAAE,QAAQ,CAAC,OAAO,CAAC,QAAQ;AACvC,IAAI,IAAI,EAAE,QAAQ,CAAC,OAAO,CAAC,IAAI;AAC/B,GAAG;AACH;AACA,EAAE,cAAc,EAAE,SAAS,cAAc,CAAC,MAAM,EAAE;AAClD,IAAI,OAAO,MAAM,IAAI,GAAG,IAAI,MAAM,GAAG,GAAG,CAAC;AACzC,GAAG;AACH;AACA,EAAE,OAAO,EAAE;AACX,IAAI,MAAM,EAAE;AACZ,MAAM,QAAQ,EAAE,mCAAmC;AACnD,KAAK;AACL,GAAG;AACH,CAAC,CAAC;AACF;AACA,KAAK,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,KAAK,EAAE,MAAM,CAAC,EAAE,SAAS,mBAAmB,CAAC,MAAM,EAAE;AAC9E,EAAE,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;AAChC,CAAC,CAAC,CAAC;AACH;AACA,KAAK,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,EAAE,SAAS,qBAAqB,CAAC,MAAM,EAAE;AAC/E,EAAE,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;AAC/D,CAAC,CAAC;;AChLF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACe,SAAS,aAAa,CAAC,GAAG,EAAE,QAAQ,EAAE;AACrD,EAAE,MAAM,MAAM,GAAG,IAAI,IAAI,QAAQ,CAAC;AAClC,EAAE,MAAM,OAAO,GAAG,QAAQ,IAAI,MAAM,CAAC;AACrC,EAAE,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;AACrD,EAAE,IAAI,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;AAC1B;AACA,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,SAAS,SAAS,CAAC,EAAE,EAAE;AAC5C,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,SAAS,EAAE,EAAE,QAAQ,GAAG,QAAQ,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;AAC9F,GAAG,CAAC,CAAC;AACL;AACA,EAAE,OAAO,CAAC,SAAS,EAAE,CAAC;AACtB;AACA,EAAE,OAAO,IAAI,CAAC;AACd;;ACzBe,SAAS,QAAQ,CAAC,KAAK,EAAE;AACxC,EAAE,OAAO,CAAC,EAAE,KAAK,IAAI,KAAK,CAAC,UAAU,CAAC,CAAC;AACvC;;ACIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,4BAA4B,CAAC,MAAM,EAAE;AAC9C,EAAE,IAAI,MAAM,CAAC,WAAW,EAAE;AAC1B,IAAI,MAAM,CAAC,WAAW,CAAC,gBAAgB,EAAE,CAAC;AAC1C,GAAG;AACH;AACA,EAAE,IAAI,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE;AAC9C,IAAI,MAAM,IAAI,aAAa,EAAE,CAAC;AAC9B,GAAG;AACH,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACe,SAAS,eAAe,CAAC,MAAM,EAAE;AAChD,EAAE,4BAA4B,CAAC,MAAM,CAAC,CAAC;AACvC;AACA,EAAE,MAAM,CAAC,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;AACrD;AACA;AACA,EAAE,MAAM,CAAC,IAAI,GAAG,aAAa,CAAC,IAAI;AAClC,IAAI,MAAM;AACV,IAAI,MAAM,CAAC,gBAAgB;AAC3B,GAAG,CAAC;AACJ;AACA,EAAE,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,QAAQ,CAAC,OAAO,CAAC;AACrD;AACA,EAAE,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,SAAS,mBAAmB,CAAC,QAAQ,EAAE;AACrE,IAAI,4BAA4B,CAAC,MAAM,CAAC,CAAC;AACzC;AACA;AACA,IAAI,QAAQ,CAAC,IAAI,GAAG,aAAa,CAAC,IAAI;AACtC,MAAM,MAAM;AACZ,MAAM,MAAM,CAAC,iBAAiB;AAC9B,MAAM,QAAQ;AACd,KAAK,CAAC;AACN;AACA,IAAI,QAAQ,CAAC,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;AAC3D;AACA,IAAI,OAAO,QAAQ,CAAC;AACpB,GAAG,EAAE,SAAS,kBAAkB,CAAC,MAAM,EAAE;AACzC,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE;AAC3B,MAAM,4BAA4B,CAAC,MAAM,CAAC,CAAC;AAC3C;AACA;AACA,MAAM,IAAI,MAAM,IAAI,MAAM,CAAC,QAAQ,EAAE;AACrC,QAAQ,MAAM,CAAC,QAAQ,CAAC,IAAI,GAAG,aAAa,CAAC,IAAI;AACjD,UAAU,MAAM;AAChB,UAAU,MAAM,CAAC,iBAAiB;AAClC,UAAU,MAAM,CAAC,QAAQ;AACzB,SAAS,CAAC;AACV,QAAQ,MAAM,CAAC,QAAQ,CAAC,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;AAC7E,OAAO;AACP,KAAK;AACL;AACA,IAAI,OAAO,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;AAClC,GAAG,CAAC,CAAC;AACL;;ACvEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACe,SAAS,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE;AACtD;AACA,EAAE,OAAO,GAAG,OAAO,IAAI,EAAE,CAAC;AAC1B,EAAE,MAAM,MAAM,GAAG,EAAE,CAAC;AACpB;AACA,EAAE,SAAS,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE;AAC1C,IAAI,IAAI,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE;AACpE,MAAM,OAAO,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AACzC,KAAK,MAAM,IAAI,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE;AAC5C,MAAM,OAAO,KAAK,CAAC,KAAK,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;AACrC,KAAK,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;AACtC,MAAM,OAAO,MAAM,CAAC,KAAK,EAAE,CAAC;AAC5B,KAAK;AACL,IAAI,OAAO,MAAM,CAAC;AAClB,GAAG;AACH;AACA;AACA,EAAE,SAAS,mBAAmB,CAAC,IAAI,EAAE;AACrC,IAAI,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE;AAC3C,MAAM,OAAO,cAAc,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;AAC1D,KAAK,MAAM,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE;AAClD,MAAM,OAAO,cAAc,CAAC,SAAS,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;AACtD,KAAK;AACL,GAAG;AACH;AACA;AACA,EAAE,SAAS,gBAAgB,CAAC,IAAI,EAAE;AAClC,IAAI,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE;AAC3C,MAAM,OAAO,cAAc,CAAC,SAAS,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;AACtD,KAAK;AACL,GAAG;AACH;AACA;AACA,EAAE,SAAS,gBAAgB,CAAC,IAAI,EAAE;AAClC,IAAI,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE;AAC3C,MAAM,OAAO,cAAc,CAAC,SAAS,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;AACtD,KAAK,MAAM,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE;AAClD,MAAM,OAAO,cAAc,CAAC,SAAS,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;AACtD,KAAK;AACL,GAAG;AACH;AACA;AACA,EAAE,SAAS,eAAe,CAAC,IAAI,EAAE;AACjC,IAAI,IAAI,IAAI,IAAI,OAAO,EAAE;AACzB,MAAM,OAAO,cAAc,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;AAC1D,KAAK,MAAM,IAAI,IAAI,IAAI,OAAO,EAAE;AAChC,MAAM,OAAO,cAAc,CAAC,SAAS,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;AACtD,KAAK;AACL,GAAG;AACH;AACA,EAAE,MAAM,QAAQ,GAAG;AACnB,IAAI,KAAK,EAAE,gBAAgB;AAC3B,IAAI,QAAQ,EAAE,gBAAgB;AAC9B,IAAI,MAAM,EAAE,gBAAgB;AAC5B,IAAI,SAAS,EAAE,gBAAgB;AAC/B,IAAI,kBAAkB,EAAE,gBAAgB;AACxC,IAAI,mBAAmB,EAAE,gBAAgB;AACzC,IAAI,kBAAkB,EAAE,gBAAgB;AACxC,IAAI,SAAS,EAAE,gBAAgB;AAC/B,IAAI,gBAAgB,EAAE,gBAAgB;AACtC,IAAI,iBAAiB,EAAE,gBAAgB;AACvC,IAAI,SAAS,EAAE,gBAAgB;AAC/B,IAAI,cAAc,EAAE,gBAAgB;AACpC,IAAI,gBAAgB,EAAE,gBAAgB;AACtC,IAAI,gBAAgB,EAAE,gBAAgB;AACtC,IAAI,kBAAkB,EAAE,gBAAgB;AACxC,IAAI,oBAAoB,EAAE,gBAAgB;AAC1C,IAAI,YAAY,EAAE,gBAAgB;AAClC,IAAI,kBAAkB,EAAE,gBAAgB;AACxC,IAAI,eAAe,EAAE,gBAAgB;AACrC,IAAI,gBAAgB,EAAE,gBAAgB;AACtC,IAAI,WAAW,EAAE,gBAAgB;AACjC,IAAI,WAAW,EAAE,gBAAgB;AACjC,IAAI,YAAY,EAAE,gBAAgB;AAClC,IAAI,aAAa,EAAE,gBAAgB;AACnC,IAAI,YAAY,EAAE,gBAAgB;AAClC,IAAI,kBAAkB,EAAE,gBAAgB;AACxC,IAAI,gBAAgB,EAAE,eAAe;AACrC,GAAG,CAAC;AACJ;AACA,EAAE,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,SAAS,kBAAkB,CAAC,IAAI,EAAE;AACrG,IAAI,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,mBAAmB,CAAC;AACxD,IAAI,MAAM,WAAW,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC;AACpC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,WAAW,CAAC,IAAI,KAAK,KAAK,eAAe,MAAM,MAAM,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC,CAAC;AAClG,GAAG,CAAC,CAAC;AACL;AACA,EAAE,OAAO,MAAM,CAAC;AAChB;;ACpGO,MAAM,OAAO,GAAG,OAAO;;ACK9B,MAAMC,YAAU,GAAG,EAAE,CAAC;AACtB;AACA;AACA,CAAC,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK;AACrF,EAAEA,YAAU,CAAC,IAAI,CAAC,GAAG,SAAS,SAAS,CAAC,KAAK,EAAE;AAC/C,IAAI,OAAO,OAAO,KAAK,KAAK,IAAI,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC;AACtE,GAAG,CAAC;AACJ,CAAC,CAAC,CAAC;AACH;AACA,MAAM,kBAAkB,GAAG,EAAE,CAAC;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACAA,YAAU,CAAC,YAAY,GAAG,SAAS,YAAY,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE;AAC7E,EAAE,SAAS,aAAa,CAAC,GAAG,EAAE,IAAI,EAAE;AACpC,IAAI,OAAO,UAAU,GAAG,OAAO,GAAG,0BAA0B,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,OAAO,GAAG,IAAI,GAAG,OAAO,GAAG,EAAE,CAAC,CAAC;AACnH,GAAG;AACH;AACA;AACA,EAAE,OAAO,CAAC,KAAK,EAAE,GAAG,EAAE,IAAI,KAAK;AAC/B,IAAI,IAAI,SAAS,KAAK,KAAK,EAAE;AAC7B,MAAM,MAAM,IAAI,UAAU;AAC1B,QAAQ,aAAa,CAAC,GAAG,EAAE,mBAAmB,IAAI,OAAO,GAAG,MAAM,GAAG,OAAO,GAAG,EAAE,CAAC,CAAC;AACnF,QAAQ,UAAU,CAAC,cAAc;AACjC,OAAO,CAAC;AACR,KAAK;AACL;AACA,IAAI,IAAI,OAAO,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,EAAE;AAC7C,MAAM,kBAAkB,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;AACrC;AACA,MAAM,OAAO,CAAC,IAAI;AAClB,QAAQ,aAAa;AACrB,UAAU,GAAG;AACb,UAAU,8BAA8B,GAAG,OAAO,GAAG,yCAAyC;AAC9F,SAAS;AACT,OAAO,CAAC;AACR,KAAK;AACL;AACA,IAAI,OAAO,SAAS,GAAG,SAAS,CAAC,KAAK,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC;AAC1D,GAAG,CAAC;AACJ,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE;AACtD,EAAE,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE;AACnC,IAAI,MAAM,IAAI,UAAU,CAAC,2BAA2B,EAAE,UAAU,CAAC,oBAAoB,CAAC,CAAC;AACvF,GAAG;AACH,EAAE,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AACpC,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;AACtB,EAAE,OAAO,CAAC,EAAE,GAAG,CAAC,EAAE;AAClB,IAAI,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;AACxB,IAAI,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;AAClC,IAAI,IAAI,SAAS,EAAE;AACnB,MAAM,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;AACjC,MAAM,MAAM,MAAM,GAAG,KAAK,KAAK,SAAS,IAAI,SAAS,CAAC,KAAK,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;AAC3E,MAAM,IAAI,MAAM,KAAK,IAAI,EAAE;AAC3B,QAAQ,MAAM,IAAI,UAAU,CAAC,SAAS,GAAG,GAAG,GAAG,WAAW,GAAG,MAAM,EAAE,UAAU,CAAC,oBAAoB,CAAC,CAAC;AACtG,OAAO;AACP,MAAM,SAAS;AACf,KAAK;AACL,IAAI,IAAI,YAAY,KAAK,IAAI,EAAE;AAC/B,MAAM,MAAM,IAAI,UAAU,CAAC,iBAAiB,GAAG,GAAG,EAAE,UAAU,CAAC,cAAc,CAAC,CAAC;AAC/E,KAAK;AACL,GAAG;AACH,CAAC;AACD;AACA,kBAAe;AACf,EAAE,aAAa;AACf,cAAEA,YAAU;AACZ,CAAC;;AC/ED,MAAM,UAAU,GAAG,SAAS,CAAC,UAAU,CAAC;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,KAAK,CAAC;AACZ,EAAE,WAAW,CAAC,cAAc,EAAE;AAC9B,IAAI,IAAI,CAAC,QAAQ,GAAG,cAAc,CAAC;AACnC,IAAI,IAAI,CAAC,YAAY,GAAG;AACxB,MAAM,OAAO,EAAE,IAAI,kBAAkB,EAAE;AACvC,MAAM,QAAQ,EAAE,IAAI,kBAAkB,EAAE;AACxC,KAAK,CAAC;AACN,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,OAAO,CAAC,WAAW,EAAE,MAAM,EAAE;AAC/B;AACA;AACA,IAAI,IAAI,OAAO,WAAW,KAAK,QAAQ,EAAE;AACzC,MAAM,MAAM,GAAG,MAAM,IAAI,EAAE,CAAC;AAC5B,MAAM,MAAM,CAAC,GAAG,GAAG,WAAW,CAAC;AAC/B,KAAK,MAAM;AACX,MAAM,MAAM,GAAG,WAAW,IAAI,EAAE,CAAC;AACjC,KAAK;AACL;AACA,IAAI,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;AAChD;AACA,IAAI,MAAM,CAAC,YAAY,EAAE,gBAAgB,CAAC,GAAG,MAAM,CAAC;AACpD;AACA,IAAI,IAAI,YAAY,KAAK,SAAS,EAAE;AACpC,MAAM,SAAS,CAAC,aAAa,CAAC,YAAY,EAAE;AAC5C,QAAQ,iBAAiB,EAAE,UAAU,CAAC,YAAY,CAAC,UAAU,CAAC,OAAO,CAAC;AACtE,QAAQ,iBAAiB,EAAE,UAAU,CAAC,YAAY,CAAC,UAAU,CAAC,OAAO,CAAC;AACtE,QAAQ,mBAAmB,EAAE,UAAU,CAAC,YAAY,CAAC,UAAU,CAAC,OAAO,CAAC;AACxE,OAAO,EAAE,KAAK,CAAC,CAAC;AAChB,KAAK;AACL;AACA,IAAI,IAAI,gBAAgB,KAAK,SAAS,EAAE;AACxC,MAAM,SAAS,CAAC,aAAa,CAAC,gBAAgB,EAAE;AAChD,QAAQ,MAAM,EAAE,UAAU,CAAC,QAAQ;AACnC,QAAQ,SAAS,EAAE,UAAU,CAAC,QAAQ;AACtC,OAAO,EAAE,IAAI,CAAC,CAAC;AACf,KAAK;AACL;AACA;AACA,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,MAAM,CAAC,MAAM,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,IAAI,KAAK,EAAE,WAAW,EAAE,CAAC;AACnF;AACA;AACA,IAAI,MAAM,cAAc,GAAG,MAAM,CAAC,OAAO,IAAI,KAAK,CAAC,KAAK;AACxD,MAAM,MAAM,CAAC,OAAO,CAAC,MAAM;AAC3B,MAAM,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC;AACnC,KAAK,CAAC;AACN;AACA,IAAI,cAAc,IAAI,KAAK,CAAC,OAAO;AACnC,MAAM,CAAC,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,CAAC;AACjE,MAAM,SAAS,iBAAiB,CAAC,MAAM,EAAE;AACzC,QAAQ,OAAO,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;AACtC,OAAO;AACP,KAAK,CAAC;AACN;AACA,IAAI,MAAM,CAAC,OAAO,GAAG,IAAI,YAAY,CAAC,MAAM,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;AACtE;AACA;AACA,IAAI,MAAM,uBAAuB,GAAG,EAAE,CAAC;AACvC,IAAI,IAAI,8BAA8B,GAAG,IAAI,CAAC;AAC9C,IAAI,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,0BAA0B,CAAC,WAAW,EAAE;AACvF,MAAM,IAAI,OAAO,WAAW,CAAC,OAAO,KAAK,UAAU,IAAI,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,KAAK,EAAE;AAC9F,QAAQ,OAAO;AACf,OAAO;AACP;AACA,MAAM,8BAA8B,GAAG,8BAA8B,IAAI,WAAW,CAAC,WAAW,CAAC;AACjG;AACA,MAAM,uBAAuB,CAAC,OAAO,CAAC,WAAW,CAAC,SAAS,EAAE,WAAW,CAAC,QAAQ,CAAC,CAAC;AACnF,KAAK,CAAC,CAAC;AACP;AACA,IAAI,MAAM,wBAAwB,GAAG,EAAE,CAAC;AACxC,IAAI,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC,SAAS,wBAAwB,CAAC,WAAW,EAAE;AACtF,MAAM,wBAAwB,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE,WAAW,CAAC,QAAQ,CAAC,CAAC;AACjF,KAAK,CAAC,CAAC;AACP;AACA,IAAI,IAAI,OAAO,CAAC;AAChB,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC;AACd,IAAI,IAAI,GAAG,CAAC;AACZ;AACA,IAAI,IAAI,CAAC,8BAA8B,EAAE;AACzC,MAAM,MAAM,KAAK,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,SAAS,CAAC,CAAC;AAC5D,MAAM,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,uBAAuB,CAAC,CAAC;AAC1D,MAAM,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,wBAAwB,CAAC,CAAC;AACxD,MAAM,GAAG,GAAG,KAAK,CAAC,MAAM,CAAC;AACzB;AACA,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;AACxC;AACA,MAAM,OAAO,CAAC,GAAG,GAAG,EAAE;AACtB,QAAQ,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AACvD,OAAO;AACP;AACA,MAAM,OAAO,OAAO,CAAC;AACrB,KAAK;AACL;AACA,IAAI,GAAG,GAAG,uBAAuB,CAAC,MAAM,CAAC;AACzC;AACA,IAAI,IAAI,SAAS,GAAG,MAAM,CAAC;AAC3B;AACA,IAAI,CAAC,GAAG,CAAC,CAAC;AACV;AACA,IAAI,OAAO,CAAC,GAAG,GAAG,EAAE;AACpB,MAAM,MAAM,WAAW,GAAG,uBAAuB,CAAC,CAAC,EAAE,CAAC,CAAC;AACvD,MAAM,MAAM,UAAU,GAAG,uBAAuB,CAAC,CAAC,EAAE,CAAC,CAAC;AACtD,MAAM,IAAI;AACV,QAAQ,SAAS,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC;AAC3C,OAAO,CAAC,OAAO,KAAK,EAAE;AACtB,QAAQ,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AACrC,QAAQ,MAAM;AACd,OAAO;AACP,KAAK;AACL;AACA,IAAI,IAAI;AACR,MAAM,OAAO,GAAG,eAAe,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;AACtD,KAAK,CAAC,OAAO,KAAK,EAAE;AACpB,MAAM,OAAO,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACnC,KAAK;AACL;AACA,IAAI,CAAC,GAAG,CAAC,CAAC;AACV,IAAI,GAAG,GAAG,wBAAwB,CAAC,MAAM,CAAC;AAC1C;AACA,IAAI,OAAO,CAAC,GAAG,GAAG,EAAE;AACpB,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC,EAAE,CAAC,EAAE,wBAAwB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAC3F,KAAK;AACL;AACA,IAAI,OAAO,OAAO,CAAC;AACnB,GAAG;AACH;AACA,EAAE,MAAM,CAAC,MAAM,EAAE;AACjB,IAAI,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;AAChD,IAAI,MAAM,QAAQ,GAAG,aAAa,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC;AAC/D,IAAI,OAAO,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,gBAAgB,CAAC,CAAC;AACtE,GAAG;AACH,CAAC;AACD;AACA;AACA,KAAK,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,SAAS,mBAAmB,CAAC,MAAM,EAAE;AACzF;AACA,EAAE,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,SAAS,GAAG,EAAE,MAAM,EAAE;AAClD,IAAI,OAAO,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,MAAM,IAAI,EAAE,EAAE;AAClD,MAAM,MAAM;AACZ,MAAM,GAAG;AACT,MAAM,IAAI,EAAE,CAAC,MAAM,IAAI,EAAE,EAAE,IAAI;AAC/B,KAAK,CAAC,CAAC,CAAC;AACR,GAAG,CAAC;AACJ,CAAC,CAAC,CAAC;AACH;AACA,KAAK,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,EAAE,SAAS,qBAAqB,CAAC,MAAM,EAAE;AAC/E;AACA;AACA,EAAE,SAAS,kBAAkB,CAAC,MAAM,EAAE;AACtC,IAAI,OAAO,SAAS,UAAU,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE;AAClD,MAAM,OAAO,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,MAAM,IAAI,EAAE,EAAE;AACpD,QAAQ,MAAM;AACd,QAAQ,OAAO,EAAE,MAAM,GAAG;AAC1B,UAAU,cAAc,EAAE,qBAAqB;AAC/C,SAAS,GAAG,EAAE;AACd,QAAQ,GAAG;AACX,QAAQ,IAAI;AACZ,OAAO,CAAC,CAAC,CAAC;AACV,KAAK,CAAC;AACN,GAAG;AACH;AACA,EAAE,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,kBAAkB,EAAE,CAAC;AACjD;AACA,EAAE,KAAK,CAAC,SAAS,CAAC,MAAM,GAAG,MAAM,CAAC,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC;AAC9D,CAAC,CAAC;;AC5LF;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,WAAW,CAAC;AAClB,EAAE,WAAW,CAAC,QAAQ,EAAE;AACxB,IAAI,IAAI,OAAO,QAAQ,KAAK,UAAU,EAAE;AACxC,MAAM,MAAM,IAAI,SAAS,CAAC,8BAA8B,CAAC,CAAC;AAC1D,KAAK;AACL;AACA,IAAI,IAAI,cAAc,CAAC;AACvB;AACA,IAAI,IAAI,CAAC,OAAO,GAAG,IAAI,OAAO,CAAC,SAAS,eAAe,CAAC,OAAO,EAAE;AACjE,MAAM,cAAc,GAAG,OAAO,CAAC;AAC/B,KAAK,CAAC,CAAC;AACP;AACA,IAAI,MAAM,KAAK,GAAG,IAAI,CAAC;AACvB;AACA;AACA,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,IAAI;AAChC,MAAM,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,OAAO;AACpC;AACA,MAAM,IAAI,CAAC,GAAG,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC;AACtC;AACA,MAAM,OAAO,CAAC,EAAE,GAAG,CAAC,EAAE;AACtB,QAAQ,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;AACpC,OAAO;AACP,MAAM,KAAK,CAAC,UAAU,GAAG,IAAI,CAAC;AAC9B,KAAK,CAAC,CAAC;AACP;AACA;AACA,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,GAAG,WAAW,IAAI;AACvC,MAAM,IAAI,QAAQ,CAAC;AACnB;AACA,MAAM,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,OAAO,IAAI;AAC7C,QAAQ,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;AACjC,QAAQ,QAAQ,GAAG,OAAO,CAAC;AAC3B,OAAO,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;AAC3B;AACA,MAAM,OAAO,CAAC,MAAM,GAAG,SAAS,MAAM,GAAG;AACzC,QAAQ,KAAK,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;AACpC,OAAO,CAAC;AACR;AACA,MAAM,OAAO,OAAO,CAAC;AACrB,KAAK,CAAC;AACN;AACA,IAAI,QAAQ,CAAC,SAAS,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE;AACvD,MAAM,IAAI,KAAK,CAAC,MAAM,EAAE;AACxB;AACA,QAAQ,OAAO;AACf,OAAO;AACP;AACA,MAAM,KAAK,CAAC,MAAM,GAAG,IAAI,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;AACjE,MAAM,cAAc,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;AACnC,KAAK,CAAC,CAAC;AACP,GAAG;AACH;AACA;AACA;AACA;AACA,EAAE,gBAAgB,GAAG;AACrB,IAAI,IAAI,IAAI,CAAC,MAAM,EAAE;AACrB,MAAM,MAAM,IAAI,CAAC,MAAM,CAAC;AACxB,KAAK;AACL,GAAG;AACH;AACA;AACA;AACA;AACA;AACA,EAAE,SAAS,CAAC,QAAQ,EAAE;AACtB,IAAI,IAAI,IAAI,CAAC,MAAM,EAAE;AACrB,MAAM,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAC5B,MAAM,OAAO;AACb,KAAK;AACL;AACA,IAAI,IAAI,IAAI,CAAC,UAAU,EAAE;AACzB,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AACrC,KAAK,MAAM;AACX,MAAM,IAAI,CAAC,UAAU,GAAG,CAAC,QAAQ,CAAC,CAAC;AACnC,KAAK;AACL,GAAG;AACH;AACA;AACA;AACA;AACA;AACA,EAAE,WAAW,CAAC,QAAQ,EAAE;AACxB,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;AAC1B,MAAM,OAAO;AACb,KAAK;AACL,IAAI,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;AACpD,IAAI,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE;AACtB,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;AACvC,KAAK;AACL,GAAG;AACH;AACA;AACA;AACA;AACA;AACA,EAAE,OAAO,MAAM,GAAG;AAClB,IAAI,IAAI,MAAM,CAAC;AACf,IAAI,MAAM,KAAK,GAAG,IAAI,WAAW,CAAC,SAAS,QAAQ,CAAC,CAAC,EAAE;AACvD,MAAM,MAAM,GAAG,CAAC,CAAC;AACjB,KAAK,CAAC,CAAC;AACP,IAAI,OAAO;AACX,MAAM,KAAK;AACX,MAAM,MAAM;AACZ,KAAK,CAAC;AACN,GAAG;AACH;;ACpHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACe,SAAS,MAAM,CAAC,QAAQ,EAAE;AACzC,EAAE,OAAO,SAAS,IAAI,CAAC,GAAG,EAAE;AAC5B,IAAI,OAAO,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;AACrC,GAAG,CAAC;AACJ;;ACvBA;AACA;AACA;AACA;AACA;AACA;AACA;AACe,SAAS,YAAY,CAAC,OAAO,EAAE;AAC9C,EAAE,OAAO,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,OAAO,CAAC,YAAY,KAAK,IAAI,CAAC,CAAC;AACpE;;ACIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,cAAc,CAAC,aAAa,EAAE;AACvC,EAAE,MAAM,OAAO,GAAG,IAAI,KAAK,CAAC,aAAa,CAAC,CAAC;AAC3C,EAAE,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;AAC1D;AACA;AACA,EAAE,KAAK,CAAC,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,SAAS,EAAE,OAAO,EAAE,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC,CAAC;AACvE;AACA;AACA,EAAE,KAAK,CAAC,MAAM,CAAC,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC,CAAC;AAC5D;AACA;AACA,EAAE,QAAQ,CAAC,MAAM,GAAG,SAAS,MAAM,CAAC,cAAc,EAAE;AACpD,IAAI,OAAO,cAAc,CAAC,WAAW,CAAC,aAAa,EAAE,cAAc,CAAC,CAAC,CAAC;AACtE,GAAG,CAAC;AACJ;AACA,EAAE,OAAO,QAAQ,CAAC;AAClB,CAAC;AACD;AACA;AACK,MAAC,KAAK,GAAG,cAAc,CAAC,QAAQ,EAAE;AACvC;AACA;AACA,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC;AACpB;AACA;AACA,KAAK,CAAC,aAAa,GAAG,aAAa,CAAC;AACpC,KAAK,CAAC,WAAW,GAAG,WAAW,CAAC;AAChC,KAAK,CAAC,QAAQ,GAAG,QAAQ,CAAC;AAC1B,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;AACxB,KAAK,CAAC,UAAU,GAAG,UAAU,CAAC;AAC9B;AACA;AACA,KAAK,CAAC,UAAU,GAAG,UAAU,CAAC;AAC9B;AACA;AACA,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,aAAa,CAAC;AACnC;AACA;AACA,KAAK,CAAC,GAAG,GAAG,SAAS,GAAG,CAAC,QAAQ,EAAE;AACnC,EAAE,OAAO,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;AAC/B,CAAC,CAAC;AACF;AACA,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC;AACtB;AACA;AACA,KAAK,CAAC,YAAY,GAAG,YAAY,CAAC;AAClC;AACA,KAAK,CAAC,UAAU,GAAG,KAAK,IAAI;AAC5B,EAAE,OAAO,cAAc,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,IAAI,QAAQ,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,CAAC;AAC/E,CAAC;;;;"} \ No newline at end of file
diff --git a/node_modules/axios/dist/esm/axios.min.js b/node_modules/axios/dist/esm/axios.min.js
new file mode 100644
index 0000000..0eb3b9f
--- /dev/null
+++ b/node_modules/axios/dist/esm/axios.min.js
@@ -0,0 +1,2 @@
+function e(e,t){return function(){return e.apply(t,arguments)}}const{toString:t}=Object.prototype,{getPrototypeOf:n}=Object,r=(o=Object.create(null),e=>{const n=t.call(e);return o[n]||(o[n]=n.slice(8,-1).toLowerCase())});var o;const s=e=>(e=e.toLowerCase(),t=>r(t)===e),i=e=>t=>typeof t===e,{isArray:a}=Array,c=i("undefined");const u=s("ArrayBuffer");const l=i("string"),f=i("function"),h=i("number"),d=e=>null!==e&&"object"==typeof e,p=e=>{if("object"!==r(e))return!1;const t=n(e);return!(null!==t&&t!==Object.prototype&&null!==Object.getPrototypeOf(t)||Symbol.toStringTag in e||Symbol.iterator in e)},m=s("Date"),g=s("File"),b=s("Blob"),y=s("FileList"),E=s("URLSearchParams");function w(e,t,{allOwnKeys:n=!1}={}){if(null==e)return;let r,o;if("object"!=typeof e&&(e=[e]),a(e))for(r=0,o=e.length;r<o;r++)t.call(null,e[r],r,e);else{const o=n?Object.getOwnPropertyNames(e):Object.keys(e),s=o.length;let i;for(r=0;r<s;r++)i=o[r],t.call(null,e[i],i,e)}}const O=(R="undefined"!=typeof Uint8Array&&n(Uint8Array),e=>R&&e instanceof R);var R;const S=s("HTMLFormElement"),A=(({hasOwnProperty:e})=>(t,n)=>e.call(t,n))(Object.prototype),j=s("RegExp"),T=(e,t)=>{const n=Object.getOwnPropertyDescriptors(e),r={};w(n,((n,o)=>{!1!==t(n,o,e)&&(r[o]=n)})),Object.defineProperties(e,r)},v={isArray:a,isArrayBuffer:u,isBuffer:function(e){return null!==e&&!c(e)&&null!==e.constructor&&!c(e.constructor)&&f(e.constructor.isBuffer)&&e.constructor.isBuffer(e)},isFormData:e=>{const n="[object FormData]";return e&&("function"==typeof FormData&&e instanceof FormData||t.call(e)===n||f(e.toString)&&e.toString()===n)},isArrayBufferView:function(e){let t;return t="undefined"!=typeof ArrayBuffer&&ArrayBuffer.isView?ArrayBuffer.isView(e):e&&e.buffer&&u(e.buffer),t},isString:l,isNumber:h,isBoolean:e=>!0===e||!1===e,isObject:d,isPlainObject:p,isUndefined:c,isDate:m,isFile:g,isBlob:b,isRegExp:j,isFunction:f,isStream:e=>d(e)&&f(e.pipe),isURLSearchParams:E,isTypedArray:O,isFileList:y,forEach:w,merge:function e(){const t={},n=(n,r)=>{p(t[r])&&p(n)?t[r]=e(t[r],n):p(n)?t[r]=e({},n):a(n)?t[r]=n.slice():t[r]=n};for(let e=0,t=arguments.length;e<t;e++)arguments[e]&&w(arguments[e],n);return t},extend:(t,n,r,{allOwnKeys:o}={})=>(w(n,((n,o)=>{r&&f(n)?t[o]=e(n,r):t[o]=n}),{allOwnKeys:o}),t),trim:e=>e.trim?e.trim():e.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,""),stripBOM:e=>(65279===e.charCodeAt(0)&&(e=e.slice(1)),e),inherits:(e,t,n,r)=>{e.prototype=Object.create(t.prototype,r),e.prototype.constructor=e,Object.defineProperty(e,"super",{value:t.prototype}),n&&Object.assign(e.prototype,n)},toFlatObject:(e,t,r,o)=>{let s,i,a;const c={};if(t=t||{},null==e)return t;do{for(s=Object.getOwnPropertyNames(e),i=s.length;i-- >0;)a=s[i],o&&!o(a,e,t)||c[a]||(t[a]=e[a],c[a]=!0);e=!1!==r&&n(e)}while(e&&(!r||r(e,t))&&e!==Object.prototype);return t},kindOf:r,kindOfTest:s,endsWith:(e,t,n)=>{e=String(e),(void 0===n||n>e.length)&&(n=e.length),n-=t.length;const r=e.indexOf(t,n);return-1!==r&&r===n},toArray:e=>{if(!e)return null;if(a(e))return e;let t=e.length;if(!h(t))return null;const n=new Array(t);for(;t-- >0;)n[t]=e[t];return n},forEachEntry:(e,t)=>{const n=(e&&e[Symbol.iterator]).call(e);let r;for(;(r=n.next())&&!r.done;){const n=r.value;t.call(e,n[0],n[1])}},matchAll:(e,t)=>{let n;const r=[];for(;null!==(n=e.exec(t));)r.push(n);return r},isHTMLForm:S,hasOwnProperty:A,hasOwnProp:A,reduceDescriptors:T,freezeMethods:e=>{T(e,((t,n)=>{const r=e[n];f(r)&&(t.enumerable=!1,"writable"in t?t.writable=!1:t.set||(t.set=()=>{throw Error("Can not read-only method '"+n+"'")}))}))},toObjectSet:(e,t)=>{const n={},r=e=>{e.forEach((e=>{n[e]=!0}))};return a(e)?r(e):r(String(e).split(t)),n},toCamelCase:e=>e.toLowerCase().replace(/[_-\s]([a-z\d])(\w*)/g,(function(e,t,n){return t.toUpperCase()+n})),noop:()=>{},toFiniteNumber:(e,t)=>(e=+e,Number.isFinite(e)?e:t)};function x(e,t,n,r,o){Error.call(this),Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=(new Error).stack,this.message=e,this.name="AxiosError",t&&(this.code=t),n&&(this.config=n),r&&(this.request=r),o&&(this.response=o)}v.inherits(x,Error,{toJSON:function(){return{message:this.message,name:this.name,description:this.description,number:this.number,fileName:this.fileName,lineNumber:this.lineNumber,columnNumber:this.columnNumber,stack:this.stack,config:this.config,code:this.code,status:this.response&&this.response.status?this.response.status:null}}});const C=x.prototype,N={};["ERR_BAD_OPTION_VALUE","ERR_BAD_OPTION","ECONNABORTED","ETIMEDOUT","ERR_NETWORK","ERR_FR_TOO_MANY_REDIRECTS","ERR_DEPRECATED","ERR_BAD_RESPONSE","ERR_BAD_REQUEST","ERR_CANCELED","ERR_NOT_SUPPORT","ERR_INVALID_URL"].forEach((e=>{N[e]={value:e}})),Object.defineProperties(x,N),Object.defineProperty(C,"isAxiosError",{value:!0}),x.from=(e,t,n,r,o,s)=>{const i=Object.create(C);return v.toFlatObject(e,i,(function(e){return e!==Error.prototype}),(e=>"isAxiosError"!==e)),x.call(i,e.message,t,n,r,o),i.cause=e,i.name=e.name,s&&Object.assign(i,s),i};var P="object"==typeof self?self.FormData:window.FormData;function _(e){return v.isPlainObject(e)||v.isArray(e)}function B(e){return v.endsWith(e,"[]")?e.slice(0,-2):e}function D(e,t,n){return e?e.concat(t).map((function(e,t){return e=B(e),!n&&t?"["+e+"]":e})).join(n?".":""):t}const F=v.toFlatObject(v,{},null,(function(e){return/^is[A-Z]/.test(e)}));function U(e,t,n){if(!v.isObject(e))throw new TypeError("target must be an object");t=t||new(P||FormData);const r=(n=v.toFlatObject(n,{metaTokens:!0,dots:!1,indexes:!1},!1,(function(e,t){return!v.isUndefined(t[e])}))).metaTokens,o=n.visitor||l,s=n.dots,i=n.indexes,a=(n.Blob||"undefined"!=typeof Blob&&Blob)&&((c=t)&&v.isFunction(c.append)&&"FormData"===c[Symbol.toStringTag]&&c[Symbol.iterator]);var c;if(!v.isFunction(o))throw new TypeError("visitor must be a function");function u(e){if(null===e)return"";if(v.isDate(e))return e.toISOString();if(!a&&v.isBlob(e))throw new x("Blob is not supported. Use a Buffer instead.");return v.isArrayBuffer(e)||v.isTypedArray(e)?a&&"function"==typeof Blob?new Blob([e]):Buffer.from(e):e}function l(e,n,o){let a=e;if(e&&!o&&"object"==typeof e)if(v.endsWith(n,"{}"))n=r?n:n.slice(0,-2),e=JSON.stringify(e);else if(v.isArray(e)&&function(e){return v.isArray(e)&&!e.some(_)}(e)||v.isFileList(e)||v.endsWith(n,"[]")&&(a=v.toArray(e)))return n=B(n),a.forEach((function(e,r){!v.isUndefined(e)&&null!==e&&t.append(!0===i?D([n],r,s):null===i?n:n+"[]",u(e))})),!1;return!!_(e)||(t.append(D(o,n,s),u(e)),!1)}const f=[],h=Object.assign(F,{defaultVisitor:l,convertValue:u,isVisitable:_});if(!v.isObject(e))throw new TypeError("data must be an object");return function e(n,r){if(!v.isUndefined(n)){if(-1!==f.indexOf(n))throw Error("Circular reference detected in "+r.join("."));f.push(n),v.forEach(n,(function(n,s){!0===(!(v.isUndefined(n)||null===n)&&o.call(t,n,v.isString(s)?s.trim():s,r,h))&&e(n,r?r.concat(s):[s])})),f.pop()}}(e),t}function L(e){const t={"!":"%21","'":"%27","(":"%28",")":"%29","~":"%7E","%20":"+","%00":"\0"};return encodeURIComponent(e).replace(/[!'()~]|%20|%00/g,(function(e){return t[e]}))}function k(e,t){this._pairs=[],e&&U(e,this,t)}const z=k.prototype;function q(e){return encodeURIComponent(e).replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,"+").replace(/%5B/gi,"[").replace(/%5D/gi,"]")}function I(e,t,n){if(!t)return e;const r=n&&n.encode||q,o=n&&n.serialize;let s;if(s=o?o(t,n):v.isURLSearchParams(t)?t.toString():new k(t,n).toString(r),s){const t=e.indexOf("#");-1!==t&&(e=e.slice(0,t)),e+=(-1===e.indexOf("?")?"?":"&")+s}return e}z.append=function(e,t){this._pairs.push([e,t])},z.toString=function(e){const t=e?function(t){return e.call(this,t,L)}:L;return this._pairs.map((function(e){return t(e[0])+"="+t(e[1])}),"").join("&")};class M{constructor(){this.handlers=[]}use(e,t,n){return this.handlers.push({fulfilled:e,rejected:t,synchronous:!!n&&n.synchronous,runWhen:n?n.runWhen:null}),this.handlers.length-1}eject(e){this.handlers[e]&&(this.handlers[e]=null)}clear(){this.handlers&&(this.handlers=[])}forEach(e){v.forEach(this.handlers,(function(t){null!==t&&e(t)}))}}const J={silentJSONParsing:!0,forcedJSONParsing:!0,clarifyTimeoutError:!1},H="undefined"!=typeof URLSearchParams?URLSearchParams:k,V=FormData,W=(()=>{let e;return("undefined"==typeof navigator||"ReactNative"!==(e=navigator.product)&&"NativeScript"!==e&&"NS"!==e)&&("undefined"!=typeof window&&"undefined"!=typeof document)})(),K={isBrowser:!0,classes:{URLSearchParams:H,FormData:V,Blob:Blob},isStandardBrowserEnv:W,protocols:["http","https","file","blob","url","data"]};function $(e){function t(e,n,r,o){let s=e[o++];const i=Number.isFinite(+s),a=o>=e.length;if(s=!s&&v.isArray(r)?r.length:s,a)return v.hasOwnProp(r,s)?r[s]=[r[s],n]:r[s]=n,!i;r[s]&&v.isObject(r[s])||(r[s]=[]);return t(e,n,r[s],o)&&v.isArray(r[s])&&(r[s]=function(e){const t={},n=Object.keys(e);let r;const o=n.length;let s;for(r=0;r<o;r++)s=n[r],t[s]=e[s];return t}(r[s])),!i}if(v.isFormData(e)&&v.isFunction(e.entries)){const n={};return v.forEachEntry(e,((e,r)=>{t(function(e){return v.matchAll(/\w+|\[(\w*)]/g,e).map((e=>"[]"===e[0]?"":e[1]||e[0]))}(e),r,n,0)})),n}return null}const X=K.isStandardBrowserEnv?{write:function(e,t,n,r,o,s){const i=[];i.push(e+"="+encodeURIComponent(t)),v.isNumber(n)&&i.push("expires="+new Date(n).toGMTString()),v.isString(r)&&i.push("path="+r),v.isString(o)&&i.push("domain="+o),!0===s&&i.push("secure"),document.cookie=i.join("; ")},read:function(e){const t=document.cookie.match(new RegExp("(^|;\\s*)("+e+")=([^;]*)"));return t?decodeURIComponent(t[3]):null},remove:function(e){this.write(e,"",Date.now()-864e5)}}:{write:function(){},read:function(){return null},remove:function(){}};function Q(e,t){return e&&!/^([a-z][a-z\d+\-.]*:)?\/\//i.test(t)?function(e,t){return t?e.replace(/\/+$/,"")+"/"+t.replace(/^\/+/,""):e}(e,t):t}const G=K.isStandardBrowserEnv?function(){const e=/(msie|trident)/i.test(navigator.userAgent),t=document.createElement("a");let n;function r(n){let r=n;return e&&(t.setAttribute("href",r),r=t.href),t.setAttribute("href",r),{href:t.href,protocol:t.protocol?t.protocol.replace(/:$/,""):"",host:t.host,search:t.search?t.search.replace(/^\?/,""):"",hash:t.hash?t.hash.replace(/^#/,""):"",hostname:t.hostname,port:t.port,pathname:"/"===t.pathname.charAt(0)?t.pathname:"/"+t.pathname}}return n=r(window.location.href),function(e){const t=v.isString(e)?r(e):e;return t.protocol===n.protocol&&t.host===n.host}}():function(){return!0};function Y(e,t,n){x.call(this,null==e?"canceled":e,x.ERR_CANCELED,t,n),this.name="CanceledError"}v.inherits(Y,x,{__CANCEL__:!0});const Z=v.toObjectSet(["age","authorization","content-length","content-type","etag","expires","from","host","if-modified-since","if-unmodified-since","last-modified","location","max-forwards","proxy-authorization","referer","retry-after","user-agent"]),ee=Symbol("internals"),te=Symbol("defaults");function ne(e){return e&&String(e).trim().toLowerCase()}function re(e){return!1===e||null==e?e:v.isArray(e)?e.map(re):String(e)}function oe(e,t,n,r){return v.isFunction(r)?r.call(this,t,n):v.isString(t)?v.isString(r)?-1!==t.indexOf(r):v.isRegExp(r)?r.test(t):void 0:void 0}function se(e,t){t=t.toLowerCase();const n=Object.keys(e);let r,o=n.length;for(;o-- >0;)if(r=n[o],t===r.toLowerCase())return r;return null}function ie(e,t){e&&this.set(e),this[te]=t||null}function ae(e,t){let n=0;const r=function(e,t){e=e||10;const n=new Array(e),r=new Array(e);let o,s=0,i=0;return t=void 0!==t?t:1e3,function(a){const c=Date.now(),u=r[i];o||(o=c),n[s]=a,r[s]=c;let l=i,f=0;for(;l!==s;)f+=n[l++],l%=e;if(s=(s+1)%e,s===i&&(i=(i+1)%e),c-o<t)return;const h=u&&c-u;return h?Math.round(1e3*f/h):void 0}}(50,250);return o=>{const s=o.loaded,i=o.lengthComputable?o.total:void 0,a=s-n,c=r(a);n=s;const u={loaded:s,total:i,progress:i?s/i:void 0,bytes:a,rate:c||void 0,estimated:c&&i&&s<=i?(i-s)/c:void 0};u[t?"download":"upload"]=!0,e(u)}}function ce(e){return new Promise((function(t,n){let r=e.data;const o=ie.from(e.headers).normalize(),s=e.responseType;let i;function a(){e.cancelToken&&e.cancelToken.unsubscribe(i),e.signal&&e.signal.removeEventListener("abort",i)}v.isFormData(r)&&K.isStandardBrowserEnv&&o.setContentType(!1);let c=new XMLHttpRequest;if(e.auth){const t=e.auth.username||"",n=e.auth.password?unescape(encodeURIComponent(e.auth.password)):"";o.set("Authorization","Basic "+btoa(t+":"+n))}const u=Q(e.baseURL,e.url);function l(){if(!c)return;const r=ie.from("getAllResponseHeaders"in c&&c.getAllResponseHeaders());!function(e,t,n){const r=n.config.validateStatus;n.status&&r&&!r(n.status)?t(new x("Request failed with status code "+n.status,[x.ERR_BAD_REQUEST,x.ERR_BAD_RESPONSE][Math.floor(n.status/100)-4],n.config,n.request,n)):e(n)}((function(e){t(e),a()}),(function(e){n(e),a()}),{data:s&&"text"!==s&&"json"!==s?c.response:c.responseText,status:c.status,statusText:c.statusText,headers:r,config:e,request:c}),c=null}if(c.open(e.method.toUpperCase(),I(u,e.params,e.paramsSerializer),!0),c.timeout=e.timeout,"onloadend"in c?c.onloadend=l:c.onreadystatechange=function(){c&&4===c.readyState&&(0!==c.status||c.responseURL&&0===c.responseURL.indexOf("file:"))&&setTimeout(l)},c.onabort=function(){c&&(n(new x("Request aborted",x.ECONNABORTED,e,c)),c=null)},c.onerror=function(){n(new x("Network Error",x.ERR_NETWORK,e,c)),c=null},c.ontimeout=function(){let t=e.timeout?"timeout of "+e.timeout+"ms exceeded":"timeout exceeded";const r=e.transitional||J;e.timeoutErrorMessage&&(t=e.timeoutErrorMessage),n(new x(t,r.clarifyTimeoutError?x.ETIMEDOUT:x.ECONNABORTED,e,c)),c=null},K.isStandardBrowserEnv){const t=(e.withCredentials||G(u))&&e.xsrfCookieName&&X.read(e.xsrfCookieName);t&&o.set(e.xsrfHeaderName,t)}void 0===r&&o.setContentType(null),"setRequestHeader"in c&&v.forEach(o.toJSON(),(function(e,t){c.setRequestHeader(t,e)})),v.isUndefined(e.withCredentials)||(c.withCredentials=!!e.withCredentials),s&&"json"!==s&&(c.responseType=e.responseType),"function"==typeof e.onDownloadProgress&&c.addEventListener("progress",ae(e.onDownloadProgress,!0)),"function"==typeof e.onUploadProgress&&c.upload&&c.upload.addEventListener("progress",ae(e.onUploadProgress)),(e.cancelToken||e.signal)&&(i=t=>{c&&(n(!t||t.type?new Y(null,e,c):t),c.abort(),c=null)},e.cancelToken&&e.cancelToken.subscribe(i),e.signal&&(e.signal.aborted?i():e.signal.addEventListener("abort",i)));const f=function(e){const t=/^([-+\w]{1,25})(:?\/\/|:)/.exec(e);return t&&t[1]||""}(u);f&&-1===K.protocols.indexOf(f)?n(new x("Unsupported protocol "+f+":",x.ERR_BAD_REQUEST,e)):c.send(r||null)}))}Object.assign(ie.prototype,{set:function(e,t,n){const r=this;function o(e,t,n){const o=ne(t);if(!o)throw new Error("header name must be a non-empty string");const s=se(r,o);(!s||!0===n||!1!==r[s]&&!1!==n)&&(r[s||t]=re(e))}return v.isPlainObject(e)?v.forEach(e,((e,n)=>{o(e,n,t)})):o(t,e,n),this},get:function(e,t){if(!(e=ne(e)))return;const n=se(this,e);if(n){const e=this[n];if(!t)return e;if(!0===t)return function(e){const t=Object.create(null),n=/([^\s,;=]+)\s*(?:=\s*([^,;]+))?/g;let r;for(;r=n.exec(e);)t[r[1]]=r[2];return t}(e);if(v.isFunction(t))return t.call(this,e,n);if(v.isRegExp(t))return t.exec(e);throw new TypeError("parser must be boolean|regexp|function")}},has:function(e,t){if(e=ne(e)){const n=se(this,e);return!(!n||t&&!oe(0,this[n],n,t))}return!1},delete:function(e,t){const n=this;let r=!1;function o(e){if(e=ne(e)){const o=se(n,e);!o||t&&!oe(0,n[o],o,t)||(delete n[o],r=!0)}}return v.isArray(e)?e.forEach(o):o(e),r},clear:function(){return Object.keys(this).forEach(this.delete.bind(this))},normalize:function(e){const t=this,n={};return v.forEach(this,((r,o)=>{const s=se(n,o);if(s)return t[s]=re(r),void delete t[o];const i=e?function(e){return e.trim().toLowerCase().replace(/([a-z\d])(\w*)/g,((e,t,n)=>t.toUpperCase()+n))}(o):String(o).trim();i!==o&&delete t[o],t[i]=re(r),n[i]=!0})),this},toJSON:function(e){const t=Object.create(null);return v.forEach(Object.assign({},this[te]||null,this),((n,r)=>{null!=n&&!1!==n&&(t[r]=e&&v.isArray(n)?n.join(", "):n)})),t}}),Object.assign(ie,{from:function(e){return v.isString(e)?new this((e=>{const t={};let n,r,o;return e&&e.split("\n").forEach((function(e){o=e.indexOf(":"),n=e.substring(0,o).trim().toLowerCase(),r=e.substring(o+1).trim(),!n||t[n]&&Z[n]||("set-cookie"===n?t[n]?t[n].push(r):t[n]=[r]:t[n]=t[n]?t[n]+", "+r:r)})),t})(e)):e instanceof this?e:new this(e)},accessor:function(e){const t=(this[ee]=this[ee]={accessors:{}}).accessors,n=this.prototype;function r(e){const r=ne(e);t[r]||(!function(e,t){const n=v.toCamelCase(" "+t);["get","set","has"].forEach((r=>{Object.defineProperty(e,r+n,{value:function(e,n,o){return this[r].call(this,t,e,n,o)},configurable:!0})}))}(n,e),t[r]=!0)}return v.isArray(e)?e.forEach(r):r(e),this}}),ie.accessor(["Content-Type","Content-Length","Accept","Accept-Encoding","User-Agent"]),v.freezeMethods(ie.prototype),v.freezeMethods(ie);const ue={http:ce,xhr:ce},le=e=>{if(v.isString(e)){const t=ue[e];if(!e)throw Error(v.hasOwnProp(e)?`Adapter '${e}' is not available in the build`:`Can not resolve adapter '${e}'`);return t}if(!v.isFunction(e))throw new TypeError("adapter is not a function");return e},fe={"Content-Type":"application/x-www-form-urlencoded"};const he={transitional:J,adapter:function(){let e;return"undefined"!=typeof XMLHttpRequest?e=le("xhr"):"undefined"!=typeof process&&"process"===v.kindOf(process)&&(e=le("http")),e}(),transformRequest:[function(e,t){const n=t.getContentType()||"",r=n.indexOf("application/json")>-1,o=v.isObject(e);o&&v.isHTMLForm(e)&&(e=new FormData(e));if(v.isFormData(e))return r&&r?JSON.stringify($(e)):e;if(v.isArrayBuffer(e)||v.isBuffer(e)||v.isStream(e)||v.isFile(e)||v.isBlob(e))return e;if(v.isArrayBufferView(e))return e.buffer;if(v.isURLSearchParams(e))return t.setContentType("application/x-www-form-urlencoded;charset=utf-8",!1),e.toString();let s;if(o){if(n.indexOf("application/x-www-form-urlencoded")>-1)return function(e,t){return U(e,new K.classes.URLSearchParams,Object.assign({visitor:function(e,t,n,r){return K.isNode&&v.isBuffer(e)?(this.append(t,e.toString("base64")),!1):r.defaultVisitor.apply(this,arguments)}},t))}(e,this.formSerializer).toString();if((s=v.isFileList(e))||n.indexOf("multipart/form-data")>-1){const t=this.env&&this.env.FormData;return U(s?{"files[]":e}:e,t&&new t,this.formSerializer)}}return o||r?(t.setContentType("application/json",!1),function(e,t,n){if(v.isString(e))try{return(t||JSON.parse)(e),v.trim(e)}catch(e){if("SyntaxError"!==e.name)throw e}return(n||JSON.stringify)(e)}(e)):e}],transformResponse:[function(e){const t=this.transitional||he.transitional,n=t&&t.forcedJSONParsing,r="json"===this.responseType;if(e&&v.isString(e)&&(n&&!this.responseType||r)){const n=!(t&&t.silentJSONParsing)&&r;try{return JSON.parse(e)}catch(e){if(n){if("SyntaxError"===e.name)throw x.from(e,x.ERR_BAD_RESPONSE,this,null,this.response);throw e}}}return e}],timeout:0,xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",maxContentLength:-1,maxBodyLength:-1,env:{FormData:K.classes.FormData,Blob:K.classes.Blob},validateStatus:function(e){return e>=200&&e<300},headers:{common:{Accept:"application/json, text/plain, */*"}}};function de(e,t){const n=this||he,r=t||n,o=ie.from(r.headers);let s=r.data;return v.forEach(e,(function(e){s=e.call(n,s,o.normalize(),t?t.status:void 0)})),o.normalize(),s}function pe(e){return!(!e||!e.__CANCEL__)}function me(e){if(e.cancelToken&&e.cancelToken.throwIfRequested(),e.signal&&e.signal.aborted)throw new Y}function ge(e){me(e),e.headers=ie.from(e.headers),e.data=de.call(e,e.transformRequest);return(e.adapter||he.adapter)(e).then((function(t){return me(e),t.data=de.call(e,e.transformResponse,t),t.headers=ie.from(t.headers),t}),(function(t){return pe(t)||(me(e),t&&t.response&&(t.response.data=de.call(e,e.transformResponse,t.response),t.response.headers=ie.from(t.response.headers))),Promise.reject(t)}))}function be(e,t){t=t||{};const n={};function r(e,t){return v.isPlainObject(e)&&v.isPlainObject(t)?v.merge(e,t):v.isPlainObject(t)?v.merge({},t):v.isArray(t)?t.slice():t}function o(n){return v.isUndefined(t[n])?v.isUndefined(e[n])?void 0:r(void 0,e[n]):r(e[n],t[n])}function s(e){if(!v.isUndefined(t[e]))return r(void 0,t[e])}function i(n){return v.isUndefined(t[n])?v.isUndefined(e[n])?void 0:r(void 0,e[n]):r(void 0,t[n])}function a(n){return n in t?r(e[n],t[n]):n in e?r(void 0,e[n]):void 0}const c={url:s,method:s,data:s,baseURL:i,transformRequest:i,transformResponse:i,paramsSerializer:i,timeout:i,timeoutMessage:i,withCredentials:i,adapter:i,responseType:i,xsrfCookieName:i,xsrfHeaderName:i,onUploadProgress:i,onDownloadProgress:i,decompress:i,maxContentLength:i,maxBodyLength:i,beforeRedirect:i,transport:i,httpAgent:i,httpsAgent:i,cancelToken:i,socketPath:i,responseEncoding:i,validateStatus:a};return v.forEach(Object.keys(e).concat(Object.keys(t)),(function(e){const t=c[e]||o,r=t(e);v.isUndefined(r)&&t!==a||(n[e]=r)})),n}v.forEach(["delete","get","head"],(function(e){he.headers[e]={}})),v.forEach(["post","put","patch"],(function(e){he.headers[e]=v.merge(fe)}));const ye={};["object","boolean","number","function","string","symbol"].forEach(((e,t)=>{ye[e]=function(n){return typeof n===e||"a"+(t<1?"n ":" ")+e}}));const Ee={};ye.transitional=function(e,t,n){function r(e,t){return"[Axios v1.1.3] Transitional option '"+e+"'"+t+(n?". "+n:"")}return(n,o,s)=>{if(!1===e)throw new x(r(o," has been removed"+(t?" in "+t:"")),x.ERR_DEPRECATED);return t&&!Ee[o]&&(Ee[o]=!0,console.warn(r(o," has been deprecated since v"+t+" and will be removed in the near future"))),!e||e(n,o,s)}};const we={assertOptions:function(e,t,n){if("object"!=typeof e)throw new x("options must be an object",x.ERR_BAD_OPTION_VALUE);const r=Object.keys(e);let o=r.length;for(;o-- >0;){const s=r[o],i=t[s];if(i){const t=e[s],n=void 0===t||i(t,s,e);if(!0!==n)throw new x("option "+s+" must be "+n,x.ERR_BAD_OPTION_VALUE)}else if(!0!==n)throw new x("Unknown option "+s,x.ERR_BAD_OPTION)}},validators:ye},Oe=we.validators;class Re{constructor(e){this.defaults=e,this.interceptors={request:new M,response:new M}}request(e,t){"string"==typeof e?(t=t||{}).url=e:t=e||{},t=be(this.defaults,t);const{transitional:n,paramsSerializer:r}=t;void 0!==n&&we.assertOptions(n,{silentJSONParsing:Oe.transitional(Oe.boolean),forcedJSONParsing:Oe.transitional(Oe.boolean),clarifyTimeoutError:Oe.transitional(Oe.boolean)},!1),void 0!==r&&we.assertOptions(r,{encode:Oe.function,serialize:Oe.function},!0),t.method=(t.method||this.defaults.method||"get").toLowerCase();const o=t.headers&&v.merge(t.headers.common,t.headers[t.method]);o&&v.forEach(["delete","get","head","post","put","patch","common"],(function(e){delete t.headers[e]})),t.headers=new ie(t.headers,o);const s=[];let i=!0;this.interceptors.request.forEach((function(e){"function"==typeof e.runWhen&&!1===e.runWhen(t)||(i=i&&e.synchronous,s.unshift(e.fulfilled,e.rejected))}));const a=[];let c;this.interceptors.response.forEach((function(e){a.push(e.fulfilled,e.rejected)}));let u,l=0;if(!i){const e=[ge.bind(this),void 0];for(e.unshift.apply(e,s),e.push.apply(e,a),u=e.length,c=Promise.resolve(t);l<u;)c=c.then(e[l++],e[l++]);return c}u=s.length;let f=t;for(l=0;l<u;){const e=s[l++],t=s[l++];try{f=e(f)}catch(e){t.call(this,e);break}}try{c=ge.call(this,f)}catch(e){return Promise.reject(e)}for(l=0,u=a.length;l<u;)c=c.then(a[l++],a[l++]);return c}getUri(e){return I(Q((e=be(this.defaults,e)).baseURL,e.url),e.params,e.paramsSerializer)}}v.forEach(["delete","get","head","options"],(function(e){Re.prototype[e]=function(t,n){return this.request(be(n||{},{method:e,url:t,data:(n||{}).data}))}})),v.forEach(["post","put","patch"],(function(e){function t(t){return function(n,r,o){return this.request(be(o||{},{method:e,headers:t?{"Content-Type":"multipart/form-data"}:{},url:n,data:r}))}}Re.prototype[e]=t(),Re.prototype[e+"Form"]=t(!0)}));class Se{constructor(e){if("function"!=typeof e)throw new TypeError("executor must be a function.");let t;this.promise=new Promise((function(e){t=e}));const n=this;this.promise.then((e=>{if(!n._listeners)return;let t=n._listeners.length;for(;t-- >0;)n._listeners[t](e);n._listeners=null})),this.promise.then=e=>{let t;const r=new Promise((e=>{n.subscribe(e),t=e})).then(e);return r.cancel=function(){n.unsubscribe(t)},r},e((function(e,r,o){n.reason||(n.reason=new Y(e,r,o),t(n.reason))}))}throwIfRequested(){if(this.reason)throw this.reason}subscribe(e){this.reason?e(this.reason):this._listeners?this._listeners.push(e):this._listeners=[e]}unsubscribe(e){if(!this._listeners)return;const t=this._listeners.indexOf(e);-1!==t&&this._listeners.splice(t,1)}static source(){let e;return{token:new Se((function(t){e=t})),cancel:e}}}const Ae=function t(n){const r=new Re(n),o=e(Re.prototype.request,r);return v.extend(o,Re.prototype,r,{allOwnKeys:!0}),v.extend(o,r,null,{allOwnKeys:!0}),o.create=function(e){return t(be(n,e))},o}(he);Ae.Axios=Re,Ae.CanceledError=Y,Ae.CancelToken=Se,Ae.isCancel=pe,Ae.VERSION="1.1.3",Ae.toFormData=U,Ae.AxiosError=x,Ae.Cancel=Ae.CanceledError,Ae.all=function(e){return Promise.all(e)},Ae.spread=function(e){return function(t){return e.apply(null,t)}},Ae.isAxiosError=function(e){return v.isObject(e)&&!0===e.isAxiosError},Ae.formToJSON=e=>$(v.isHTMLForm(e)?new FormData(e):e);export{Ae as default};
+//# sourceMappingURL=axios.min.js.map
diff --git a/node_modules/axios/dist/esm/axios.min.js.map b/node_modules/axios/dist/esm/axios.min.js.map
new file mode 100644
index 0000000..8daf164
--- /dev/null
+++ b/node_modules/axios/dist/esm/axios.min.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"axios.min.js","sources":["../../lib/helpers/bind.js","../../lib/utils.js","../../lib/core/AxiosError.js","../../node_modules/form-data/lib/browser.js","../../lib/helpers/toFormData.js","../../lib/helpers/AxiosURLSearchParams.js","../../lib/helpers/buildURL.js","../../lib/core/InterceptorManager.js","../../lib/defaults/transitional.js","../../lib/platform/browser/classes/URLSearchParams.js","../../lib/platform/browser/classes/FormData.js","../../lib/platform/browser/index.js","../../lib/helpers/formDataToJSON.js","../../lib/helpers/cookies.js","../../lib/core/buildFullPath.js","../../lib/helpers/isAbsoluteURL.js","../../lib/helpers/combineURLs.js","../../lib/helpers/isURLSameOrigin.js","../../lib/cancel/CanceledError.js","../../lib/helpers/parseHeaders.js","../../lib/core/AxiosHeaders.js","../../lib/adapters/xhr.js","../../lib/helpers/speedometer.js","../../lib/core/settle.js","../../lib/helpers/parseProtocol.js","../../lib/adapters/index.js","../../lib/defaults/index.js","../../lib/helpers/toURLEncodedForm.js","../../lib/core/transformData.js","../../lib/cancel/isCancel.js","../../lib/core/dispatchRequest.js","../../lib/core/mergeConfig.js","../../lib/env/data.js","../../lib/helpers/validator.js","../../lib/core/Axios.js","../../lib/cancel/CancelToken.js","../../lib/axios.js","../../lib/helpers/spread.js","../../lib/helpers/isAxiosError.js"],"sourcesContent":["'use strict';\n\nexport default function bind(fn, thisArg) {\n return function wrap() {\n return fn.apply(thisArg, arguments);\n };\n}\n","'use strict';\n\nimport bind from './helpers/bind.js';\n\n// utils is a library of generic helper functions non-specific to axios\n\nconst {toString} = Object.prototype;\nconst {getPrototypeOf} = Object;\n\nconst kindOf = (cache => thing => {\n const str = toString.call(thing);\n return cache[str] || (cache[str] = str.slice(8, -1).toLowerCase());\n})(Object.create(null));\n\nconst kindOfTest = (type) => {\n type = type.toLowerCase();\n return (thing) => kindOf(thing) === type\n}\n\nconst typeOfTest = type => thing => typeof thing === type;\n\n/**\n * Determine if a value is an Array\n *\n * @param {Object} val The value to test\n *\n * @returns {boolean} True if value is an Array, otherwise false\n */\nconst {isArray} = Array;\n\n/**\n * Determine if a value is undefined\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if the value is undefined, otherwise false\n */\nconst isUndefined = typeOfTest('undefined');\n\n/**\n * Determine if a value is a Buffer\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Buffer, otherwise false\n */\nfunction isBuffer(val) {\n return val !== null && !isUndefined(val) && val.constructor !== null && !isUndefined(val.constructor)\n && isFunction(val.constructor.isBuffer) && val.constructor.isBuffer(val);\n}\n\n/**\n * Determine if a value is an ArrayBuffer\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is an ArrayBuffer, otherwise false\n */\nconst isArrayBuffer = kindOfTest('ArrayBuffer');\n\n\n/**\n * Determine if a value is a view on an ArrayBuffer\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a view on an ArrayBuffer, otherwise false\n */\nfunction isArrayBufferView(val) {\n let result;\n if ((typeof ArrayBuffer !== 'undefined') && (ArrayBuffer.isView)) {\n result = ArrayBuffer.isView(val);\n } else {\n result = (val) && (val.buffer) && (isArrayBuffer(val.buffer));\n }\n return result;\n}\n\n/**\n * Determine if a value is a String\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a String, otherwise false\n */\nconst isString = typeOfTest('string');\n\n/**\n * Determine if a value is a Function\n *\n * @param {*} val The value to test\n * @returns {boolean} True if value is a Function, otherwise false\n */\nconst isFunction = typeOfTest('function');\n\n/**\n * Determine if a value is a Number\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Number, otherwise false\n */\nconst isNumber = typeOfTest('number');\n\n/**\n * Determine if a value is an Object\n *\n * @param {*} thing The value to test\n *\n * @returns {boolean} True if value is an Object, otherwise false\n */\nconst isObject = (thing) => thing !== null && typeof thing === 'object';\n\n/**\n * Determine if a value is a Boolean\n *\n * @param {*} thing The value to test\n * @returns {boolean} True if value is a Boolean, otherwise false\n */\nconst isBoolean = thing => thing === true || thing === false;\n\n/**\n * Determine if a value is a plain Object\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a plain Object, otherwise false\n */\nconst isPlainObject = (val) => {\n if (kindOf(val) !== 'object') {\n return false;\n }\n\n const prototype = getPrototypeOf(val);\n return (prototype === null || prototype === Object.prototype || Object.getPrototypeOf(prototype) === null) && !(Symbol.toStringTag in val) && !(Symbol.iterator in val);\n}\n\n/**\n * Determine if a value is a Date\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Date, otherwise false\n */\nconst isDate = kindOfTest('Date');\n\n/**\n * Determine if a value is a File\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a File, otherwise false\n */\nconst isFile = kindOfTest('File');\n\n/**\n * Determine if a value is a Blob\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Blob, otherwise false\n */\nconst isBlob = kindOfTest('Blob');\n\n/**\n * Determine if a value is a FileList\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a File, otherwise false\n */\nconst isFileList = kindOfTest('FileList');\n\n/**\n * Determine if a value is a Stream\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Stream, otherwise false\n */\nconst isStream = (val) => isObject(val) && isFunction(val.pipe);\n\n/**\n * Determine if a value is a FormData\n *\n * @param {*} thing The value to test\n *\n * @returns {boolean} True if value is an FormData, otherwise false\n */\nconst isFormData = (thing) => {\n const pattern = '[object FormData]';\n return thing && (\n (typeof FormData === 'function' && thing instanceof FormData) ||\n toString.call(thing) === pattern ||\n (isFunction(thing.toString) && thing.toString() === pattern)\n );\n}\n\n/**\n * Determine if a value is a URLSearchParams object\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a URLSearchParams object, otherwise false\n */\nconst isURLSearchParams = kindOfTest('URLSearchParams');\n\n/**\n * Trim excess whitespace off the beginning and end of a string\n *\n * @param {String} str The String to trim\n *\n * @returns {String} The String freed of excess whitespace\n */\nconst trim = (str) => str.trim ?\n str.trim() : str.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n\n/**\n * Iterate over an Array or an Object invoking a function for each item.\n *\n * If `obj` is an Array callback will be called passing\n * the value, index, and complete array for each item.\n *\n * If 'obj' is an Object callback will be called passing\n * the value, key, and complete object for each property.\n *\n * @param {Object|Array} obj The object to iterate\n * @param {Function} fn The callback to invoke for each item\n *\n * @param {Boolean} [allOwnKeys = false]\n * @returns {void}\n */\nfunction forEach(obj, fn, {allOwnKeys = false} = {}) {\n // Don't bother if no value provided\n if (obj === null || typeof obj === 'undefined') {\n return;\n }\n\n let i;\n let l;\n\n // Force an array if not already something iterable\n if (typeof obj !== 'object') {\n /*eslint no-param-reassign:0*/\n obj = [obj];\n }\n\n if (isArray(obj)) {\n // Iterate over array values\n for (i = 0, l = obj.length; i < l; i++) {\n fn.call(null, obj[i], i, obj);\n }\n } else {\n // Iterate over object keys\n const keys = allOwnKeys ? Object.getOwnPropertyNames(obj) : Object.keys(obj);\n const len = keys.length;\n let key;\n\n for (i = 0; i < len; i++) {\n key = keys[i];\n fn.call(null, obj[key], key, obj);\n }\n }\n}\n\n/**\n * Accepts varargs expecting each argument to be an object, then\n * immutably merges the properties of each object and returns result.\n *\n * When multiple objects contain the same key the later object in\n * the arguments list will take precedence.\n *\n * Example:\n *\n * ```js\n * var result = merge({foo: 123}, {foo: 456});\n * console.log(result.foo); // outputs 456\n * ```\n *\n * @param {Object} obj1 Object to merge\n *\n * @returns {Object} Result of all merge properties\n */\nfunction merge(/* obj1, obj2, obj3, ... */) {\n const result = {};\n const assignValue = (val, key) => {\n if (isPlainObject(result[key]) && isPlainObject(val)) {\n result[key] = merge(result[key], val);\n } else if (isPlainObject(val)) {\n result[key] = merge({}, val);\n } else if (isArray(val)) {\n result[key] = val.slice();\n } else {\n result[key] = val;\n }\n }\n\n for (let i = 0, l = arguments.length; i < l; i++) {\n arguments[i] && forEach(arguments[i], assignValue);\n }\n return result;\n}\n\n/**\n * Extends object a by mutably adding to it the properties of object b.\n *\n * @param {Object} a The object to be extended\n * @param {Object} b The object to copy properties from\n * @param {Object} thisArg The object to bind function to\n *\n * @param {Boolean} [allOwnKeys]\n * @returns {Object} The resulting value of object a\n */\nconst extend = (a, b, thisArg, {allOwnKeys}= {}) => {\n forEach(b, (val, key) => {\n if (thisArg && isFunction(val)) {\n a[key] = bind(val, thisArg);\n } else {\n a[key] = val;\n }\n }, {allOwnKeys});\n return a;\n}\n\n/**\n * Remove byte order marker. This catches EF BB BF (the UTF-8 BOM)\n *\n * @param {string} content with BOM\n *\n * @returns {string} content value without BOM\n */\nconst stripBOM = (content) => {\n if (content.charCodeAt(0) === 0xFEFF) {\n content = content.slice(1);\n }\n return content;\n}\n\n/**\n * Inherit the prototype methods from one constructor into another\n * @param {function} constructor\n * @param {function} superConstructor\n * @param {object} [props]\n * @param {object} [descriptors]\n *\n * @returns {void}\n */\nconst inherits = (constructor, superConstructor, props, descriptors) => {\n constructor.prototype = Object.create(superConstructor.prototype, descriptors);\n constructor.prototype.constructor = constructor;\n Object.defineProperty(constructor, 'super', {\n value: superConstructor.prototype\n });\n props && Object.assign(constructor.prototype, props);\n}\n\n/**\n * Resolve object with deep prototype chain to a flat object\n * @param {Object} sourceObj source object\n * @param {Object} [destObj]\n * @param {Function|Boolean} [filter]\n * @param {Function} [propFilter]\n *\n * @returns {Object}\n */\nconst toFlatObject = (sourceObj, destObj, filter, propFilter) => {\n let props;\n let i;\n let prop;\n const merged = {};\n\n destObj = destObj || {};\n // eslint-disable-next-line no-eq-null,eqeqeq\n if (sourceObj == null) return destObj;\n\n do {\n props = Object.getOwnPropertyNames(sourceObj);\n i = props.length;\n while (i-- > 0) {\n prop = props[i];\n if ((!propFilter || propFilter(prop, sourceObj, destObj)) && !merged[prop]) {\n destObj[prop] = sourceObj[prop];\n merged[prop] = true;\n }\n }\n sourceObj = filter !== false && getPrototypeOf(sourceObj);\n } while (sourceObj && (!filter || filter(sourceObj, destObj)) && sourceObj !== Object.prototype);\n\n return destObj;\n}\n\n/**\n * Determines whether a string ends with the characters of a specified string\n *\n * @param {String} str\n * @param {String} searchString\n * @param {Number} [position= 0]\n *\n * @returns {boolean}\n */\nconst endsWith = (str, searchString, position) => {\n str = String(str);\n if (position === undefined || position > str.length) {\n position = str.length;\n }\n position -= searchString.length;\n const lastIndex = str.indexOf(searchString, position);\n return lastIndex !== -1 && lastIndex === position;\n}\n\n\n/**\n * Returns new array from array like object or null if failed\n *\n * @param {*} [thing]\n *\n * @returns {?Array}\n */\nconst toArray = (thing) => {\n if (!thing) return null;\n if (isArray(thing)) return thing;\n let i = thing.length;\n if (!isNumber(i)) return null;\n const arr = new Array(i);\n while (i-- > 0) {\n arr[i] = thing[i];\n }\n return arr;\n}\n\n/**\n * Checking if the Uint8Array exists and if it does, it returns a function that checks if the\n * thing passed in is an instance of Uint8Array\n *\n * @param {TypedArray}\n *\n * @returns {Array}\n */\n// eslint-disable-next-line func-names\nconst isTypedArray = (TypedArray => {\n // eslint-disable-next-line func-names\n return thing => {\n return TypedArray && thing instanceof TypedArray;\n };\n})(typeof Uint8Array !== 'undefined' && getPrototypeOf(Uint8Array));\n\n/**\n * For each entry in the object, call the function with the key and value.\n *\n * @param {Object<any, any>} obj - The object to iterate over.\n * @param {Function} fn - The function to call for each entry.\n *\n * @returns {void}\n */\nconst forEachEntry = (obj, fn) => {\n const generator = obj && obj[Symbol.iterator];\n\n const iterator = generator.call(obj);\n\n let result;\n\n while ((result = iterator.next()) && !result.done) {\n const pair = result.value;\n fn.call(obj, pair[0], pair[1]);\n }\n}\n\n/**\n * It takes a regular expression and a string, and returns an array of all the matches\n *\n * @param {string} regExp - The regular expression to match against.\n * @param {string} str - The string to search.\n *\n * @returns {Array<boolean>}\n */\nconst matchAll = (regExp, str) => {\n let matches;\n const arr = [];\n\n while ((matches = regExp.exec(str)) !== null) {\n arr.push(matches);\n }\n\n return arr;\n}\n\n/* Checking if the kindOfTest function returns true when passed an HTMLFormElement. */\nconst isHTMLForm = kindOfTest('HTMLFormElement');\n\nconst toCamelCase = str => {\n return str.toLowerCase().replace(/[_-\\s]([a-z\\d])(\\w*)/g,\n function replacer(m, p1, p2) {\n return p1.toUpperCase() + p2;\n }\n );\n};\n\n/* Creating a function that will check if an object has a property. */\nconst hasOwnProperty = (({hasOwnProperty}) => (obj, prop) => hasOwnProperty.call(obj, prop))(Object.prototype);\n\n/**\n * Determine if a value is a RegExp object\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a RegExp object, otherwise false\n */\nconst isRegExp = kindOfTest('RegExp');\n\nconst reduceDescriptors = (obj, reducer) => {\n const descriptors = Object.getOwnPropertyDescriptors(obj);\n const reducedDescriptors = {};\n\n forEach(descriptors, (descriptor, name) => {\n if (reducer(descriptor, name, obj) !== false) {\n reducedDescriptors[name] = descriptor;\n }\n });\n\n Object.defineProperties(obj, reducedDescriptors);\n}\n\n/**\n * Makes all methods read-only\n * @param {Object} obj\n */\n\nconst freezeMethods = (obj) => {\n reduceDescriptors(obj, (descriptor, name) => {\n const value = obj[name];\n\n if (!isFunction(value)) return;\n\n descriptor.enumerable = false;\n\n if ('writable' in descriptor) {\n descriptor.writable = false;\n return;\n }\n\n if (!descriptor.set) {\n descriptor.set = () => {\n throw Error('Can not read-only method \\'' + name + '\\'');\n };\n }\n });\n}\n\nconst toObjectSet = (arrayOrString, delimiter) => {\n const obj = {};\n\n const define = (arr) => {\n arr.forEach(value => {\n obj[value] = true;\n });\n }\n\n isArray(arrayOrString) ? define(arrayOrString) : define(String(arrayOrString).split(delimiter));\n\n return obj;\n}\n\nconst noop = () => {}\n\nconst toFiniteNumber = (value, defaultValue) => {\n value = +value;\n return Number.isFinite(value) ? value : defaultValue;\n}\n\nexport default {\n isArray,\n isArrayBuffer,\n isBuffer,\n isFormData,\n isArrayBufferView,\n isString,\n isNumber,\n isBoolean,\n isObject,\n isPlainObject,\n isUndefined,\n isDate,\n isFile,\n isBlob,\n isRegExp,\n isFunction,\n isStream,\n isURLSearchParams,\n isTypedArray,\n isFileList,\n forEach,\n merge,\n extend,\n trim,\n stripBOM,\n inherits,\n toFlatObject,\n kindOf,\n kindOfTest,\n endsWith,\n toArray,\n forEachEntry,\n matchAll,\n isHTMLForm,\n hasOwnProperty,\n hasOwnProp: hasOwnProperty, // an alias to avoid ESLint no-prototype-builtins detection\n reduceDescriptors,\n freezeMethods,\n toObjectSet,\n toCamelCase,\n noop,\n toFiniteNumber\n};\n","'use strict';\n\nimport utils from '../utils.js';\n\n/**\n * Create an Error with the specified message, config, error code, request and response.\n *\n * @param {string} message The error message.\n * @param {string} [code] The error code (for example, 'ECONNABORTED').\n * @param {Object} [config] The config.\n * @param {Object} [request] The request.\n * @param {Object} [response] The response.\n *\n * @returns {Error} The created error.\n */\nfunction AxiosError(message, code, config, request, response) {\n Error.call(this);\n\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, this.constructor);\n } else {\n this.stack = (new Error()).stack;\n }\n\n this.message = message;\n this.name = 'AxiosError';\n code && (this.code = code);\n config && (this.config = config);\n request && (this.request = request);\n response && (this.response = response);\n}\n\nutils.inherits(AxiosError, Error, {\n toJSON: function toJSON() {\n return {\n // Standard\n message: this.message,\n name: this.name,\n // Microsoft\n description: this.description,\n number: this.number,\n // Mozilla\n fileName: this.fileName,\n lineNumber: this.lineNumber,\n columnNumber: this.columnNumber,\n stack: this.stack,\n // Axios\n config: this.config,\n code: this.code,\n status: this.response && this.response.status ? this.response.status : null\n };\n }\n});\n\nconst prototype = AxiosError.prototype;\nconst descriptors = {};\n\n[\n 'ERR_BAD_OPTION_VALUE',\n 'ERR_BAD_OPTION',\n 'ECONNABORTED',\n 'ETIMEDOUT',\n 'ERR_NETWORK',\n 'ERR_FR_TOO_MANY_REDIRECTS',\n 'ERR_DEPRECATED',\n 'ERR_BAD_RESPONSE',\n 'ERR_BAD_REQUEST',\n 'ERR_CANCELED',\n 'ERR_NOT_SUPPORT',\n 'ERR_INVALID_URL'\n// eslint-disable-next-line func-names\n].forEach(code => {\n descriptors[code] = {value: code};\n});\n\nObject.defineProperties(AxiosError, descriptors);\nObject.defineProperty(prototype, 'isAxiosError', {value: true});\n\n// eslint-disable-next-line func-names\nAxiosError.from = (error, code, config, request, response, customProps) => {\n const axiosError = Object.create(prototype);\n\n utils.toFlatObject(error, axiosError, function filter(obj) {\n return obj !== Error.prototype;\n }, prop => {\n return prop !== 'isAxiosError';\n });\n\n AxiosError.call(axiosError, error.message, code, config, request, response);\n\n axiosError.cause = error;\n\n axiosError.name = error.name;\n\n customProps && Object.assign(axiosError, customProps);\n\n return axiosError;\n};\n\nexport default AxiosError;\n","/* eslint-env browser */\nmodule.exports = typeof self == 'object' ? self.FormData : window.FormData;\n","'use strict';\n\nimport utils from '../utils.js';\nimport AxiosError from '../core/AxiosError.js';\nimport envFormData from '../env/classes/FormData.js';\n\n/**\n * Determines if the given thing is a array or js object.\n *\n * @param {string} thing - The object or array to be visited.\n *\n * @returns {boolean}\n */\nfunction isVisitable(thing) {\n return utils.isPlainObject(thing) || utils.isArray(thing);\n}\n\n/**\n * It removes the brackets from the end of a string\n *\n * @param {string} key - The key of the parameter.\n *\n * @returns {string} the key without the brackets.\n */\nfunction removeBrackets(key) {\n return utils.endsWith(key, '[]') ? key.slice(0, -2) : key;\n}\n\n/**\n * It takes a path, a key, and a boolean, and returns a string\n *\n * @param {string} path - The path to the current key.\n * @param {string} key - The key of the current object being iterated over.\n * @param {string} dots - If true, the key will be rendered with dots instead of brackets.\n *\n * @returns {string} The path to the current key.\n */\nfunction renderKey(path, key, dots) {\n if (!path) return key;\n return path.concat(key).map(function each(token, i) {\n // eslint-disable-next-line no-param-reassign\n token = removeBrackets(token);\n return !dots && i ? '[' + token + ']' : token;\n }).join(dots ? '.' : '');\n}\n\n/**\n * If the array is an array and none of its elements are visitable, then it's a flat array.\n *\n * @param {Array<any>} arr - The array to check\n *\n * @returns {boolean}\n */\nfunction isFlatArray(arr) {\n return utils.isArray(arr) && !arr.some(isVisitable);\n}\n\nconst predicates = utils.toFlatObject(utils, {}, null, function filter(prop) {\n return /^is[A-Z]/.test(prop);\n});\n\n/**\n * If the thing is a FormData object, return true, otherwise return false.\n *\n * @param {unknown} thing - The thing to check.\n *\n * @returns {boolean}\n */\nfunction isSpecCompliant(thing) {\n return thing && utils.isFunction(thing.append) && thing[Symbol.toStringTag] === 'FormData' && thing[Symbol.iterator];\n}\n\n/**\n * Convert a data object to FormData\n *\n * @param {Object} obj\n * @param {?Object} [formData]\n * @param {?Object} [options]\n * @param {Function} [options.visitor]\n * @param {Boolean} [options.metaTokens = true]\n * @param {Boolean} [options.dots = false]\n * @param {?Boolean} [options.indexes = false]\n *\n * @returns {Object}\n **/\n\n/**\n * It converts an object into a FormData object\n *\n * @param {Object<any, any>} obj - The object to convert to form data.\n * @param {string} formData - The FormData object to append to.\n * @param {Object<string, any>} options\n *\n * @returns\n */\nfunction toFormData(obj, formData, options) {\n if (!utils.isObject(obj)) {\n throw new TypeError('target must be an object');\n }\n\n // eslint-disable-next-line no-param-reassign\n formData = formData || new (envFormData || FormData)();\n\n // eslint-disable-next-line no-param-reassign\n options = utils.toFlatObject(options, {\n metaTokens: true,\n dots: false,\n indexes: false\n }, false, function defined(option, source) {\n // eslint-disable-next-line no-eq-null,eqeqeq\n return !utils.isUndefined(source[option]);\n });\n\n const metaTokens = options.metaTokens;\n // eslint-disable-next-line no-use-before-define\n const visitor = options.visitor || defaultVisitor;\n const dots = options.dots;\n const indexes = options.indexes;\n const _Blob = options.Blob || typeof Blob !== 'undefined' && Blob;\n const useBlob = _Blob && isSpecCompliant(formData);\n\n if (!utils.isFunction(visitor)) {\n throw new TypeError('visitor must be a function');\n }\n\n function convertValue(value) {\n if (value === null) return '';\n\n if (utils.isDate(value)) {\n return value.toISOString();\n }\n\n if (!useBlob && utils.isBlob(value)) {\n throw new AxiosError('Blob is not supported. Use a Buffer instead.');\n }\n\n if (utils.isArrayBuffer(value) || utils.isTypedArray(value)) {\n return useBlob && typeof Blob === 'function' ? new Blob([value]) : Buffer.from(value);\n }\n\n return value;\n }\n\n /**\n * Default visitor.\n *\n * @param {*} value\n * @param {String|Number} key\n * @param {Array<String|Number>} path\n * @this {FormData}\n *\n * @returns {boolean} return true to visit the each prop of the value recursively\n */\n function defaultVisitor(value, key, path) {\n let arr = value;\n\n if (value && !path && typeof value === 'object') {\n if (utils.endsWith(key, '{}')) {\n // eslint-disable-next-line no-param-reassign\n key = metaTokens ? key : key.slice(0, -2);\n // eslint-disable-next-line no-param-reassign\n value = JSON.stringify(value);\n } else if (\n (utils.isArray(value) && isFlatArray(value)) ||\n (utils.isFileList(value) || utils.endsWith(key, '[]') && (arr = utils.toArray(value))\n )) {\n // eslint-disable-next-line no-param-reassign\n key = removeBrackets(key);\n\n arr.forEach(function each(el, index) {\n !(utils.isUndefined(el) || el === null) && formData.append(\n // eslint-disable-next-line no-nested-ternary\n indexes === true ? renderKey([key], index, dots) : (indexes === null ? key : key + '[]'),\n convertValue(el)\n );\n });\n return false;\n }\n }\n\n if (isVisitable(value)) {\n return true;\n }\n\n formData.append(renderKey(path, key, dots), convertValue(value));\n\n return false;\n }\n\n const stack = [];\n\n const exposedHelpers = Object.assign(predicates, {\n defaultVisitor,\n convertValue,\n isVisitable\n });\n\n function build(value, path) {\n if (utils.isUndefined(value)) return;\n\n if (stack.indexOf(value) !== -1) {\n throw Error('Circular reference detected in ' + path.join('.'));\n }\n\n stack.push(value);\n\n utils.forEach(value, function each(el, key) {\n const result = !(utils.isUndefined(el) || el === null) && visitor.call(\n formData, el, utils.isString(key) ? key.trim() : key, path, exposedHelpers\n );\n\n if (result === true) {\n build(el, path ? path.concat(key) : [key]);\n }\n });\n\n stack.pop();\n }\n\n if (!utils.isObject(obj)) {\n throw new TypeError('data must be an object');\n }\n\n build(obj);\n\n return formData;\n}\n\nexport default toFormData;\n","'use strict';\n\nimport toFormData from './toFormData.js';\n\n/**\n * It encodes a string by replacing all characters that are not in the unreserved set with\n * their percent-encoded equivalents\n *\n * @param {string} str - The string to encode.\n *\n * @returns {string} The encoded string.\n */\nfunction encode(str) {\n const charMap = {\n '!': '%21',\n \"'\": '%27',\n '(': '%28',\n ')': '%29',\n '~': '%7E',\n '%20': '+',\n '%00': '\\x00'\n };\n return encodeURIComponent(str).replace(/[!'()~]|%20|%00/g, function replacer(match) {\n return charMap[match];\n });\n}\n\n/**\n * It takes a params object and converts it to a FormData object\n *\n * @param {Object<string, any>} params - The parameters to be converted to a FormData object.\n * @param {Object<string, any>} options - The options object passed to the Axios constructor.\n *\n * @returns {void}\n */\nfunction AxiosURLSearchParams(params, options) {\n this._pairs = [];\n\n params && toFormData(params, this, options);\n}\n\nconst prototype = AxiosURLSearchParams.prototype;\n\nprototype.append = function append(name, value) {\n this._pairs.push([name, value]);\n};\n\nprototype.toString = function toString(encoder) {\n const _encode = encoder ? function(value) {\n return encoder.call(this, value, encode);\n } : encode;\n\n return this._pairs.map(function each(pair) {\n return _encode(pair[0]) + '=' + _encode(pair[1]);\n }, '').join('&');\n};\n\nexport default AxiosURLSearchParams;\n","'use strict';\n\nimport utils from '../utils.js';\nimport AxiosURLSearchParams from '../helpers/AxiosURLSearchParams.js';\n\n/**\n * It replaces all instances of the characters `:`, `$`, `,`, `+`, `[`, and `]` with their\n * URI encoded counterparts\n *\n * @param {string} val The value to be encoded.\n *\n * @returns {string} The encoded value.\n */\nfunction encode(val) {\n return encodeURIComponent(val).\n replace(/%3A/gi, ':').\n replace(/%24/g, '$').\n replace(/%2C/gi, ',').\n replace(/%20/g, '+').\n replace(/%5B/gi, '[').\n replace(/%5D/gi, ']');\n}\n\n/**\n * Build a URL by appending params to the end\n *\n * @param {string} url The base of the url (e.g., http://www.google.com)\n * @param {object} [params] The params to be appended\n * @param {?object} options\n *\n * @returns {string} The formatted url\n */\nexport default function buildURL(url, params, options) {\n /*eslint no-param-reassign:0*/\n if (!params) {\n return url;\n }\n \n const _encode = options && options.encode || encode;\n\n const serializeFn = options && options.serialize;\n\n let serializedParams;\n\n if (serializeFn) {\n serializedParams = serializeFn(params, options);\n } else {\n serializedParams = utils.isURLSearchParams(params) ?\n params.toString() :\n new AxiosURLSearchParams(params, options).toString(_encode);\n }\n\n if (serializedParams) {\n const hashmarkIndex = url.indexOf(\"#\");\n\n if (hashmarkIndex !== -1) {\n url = url.slice(0, hashmarkIndex);\n }\n url += (url.indexOf('?') === -1 ? '?' : '&') + serializedParams;\n }\n\n return url;\n}\n","'use strict';\n\nimport utils from './../utils.js';\n\nclass InterceptorManager {\n constructor() {\n this.handlers = [];\n }\n\n /**\n * Add a new interceptor to the stack\n *\n * @param {Function} fulfilled The function to handle `then` for a `Promise`\n * @param {Function} rejected The function to handle `reject` for a `Promise`\n *\n * @return {Number} An ID used to remove interceptor later\n */\n use(fulfilled, rejected, options) {\n this.handlers.push({\n fulfilled,\n rejected,\n synchronous: options ? options.synchronous : false,\n runWhen: options ? options.runWhen : null\n });\n return this.handlers.length - 1;\n }\n\n /**\n * Remove an interceptor from the stack\n *\n * @param {Number} id The ID that was returned by `use`\n *\n * @returns {Boolean} `true` if the interceptor was removed, `false` otherwise\n */\n eject(id) {\n if (this.handlers[id]) {\n this.handlers[id] = null;\n }\n }\n\n /**\n * Clear all interceptors from the stack\n *\n * @returns {void}\n */\n clear() {\n if (this.handlers) {\n this.handlers = [];\n }\n }\n\n /**\n * Iterate over all the registered interceptors\n *\n * This method is particularly useful for skipping over any\n * interceptors that may have become `null` calling `eject`.\n *\n * @param {Function} fn The function to call for each interceptor\n *\n * @returns {void}\n */\n forEach(fn) {\n utils.forEach(this.handlers, function forEachHandler(h) {\n if (h !== null) {\n fn(h);\n }\n });\n }\n}\n\nexport default InterceptorManager;\n","'use strict';\n\nexport default {\n silentJSONParsing: true,\n forcedJSONParsing: true,\n clarifyTimeoutError: false\n};\n","'use strict';\n\nimport AxiosURLSearchParams from '../../../helpers/AxiosURLSearchParams.js';\nexport default typeof URLSearchParams !== 'undefined' ? URLSearchParams : AxiosURLSearchParams;\n","'use strict';\n\nexport default FormData;\n","import URLSearchParams from './classes/URLSearchParams.js'\nimport FormData from './classes/FormData.js'\n\n/**\n * Determine if we're running in a standard browser environment\n *\n * This allows axios to run in a web worker, and react-native.\n * Both environments support XMLHttpRequest, but not fully standard globals.\n *\n * web workers:\n * typeof window -> undefined\n * typeof document -> undefined\n *\n * react-native:\n * navigator.product -> 'ReactNative'\n * nativescript\n * navigator.product -> 'NativeScript' or 'NS'\n *\n * @returns {boolean}\n */\nconst isStandardBrowserEnv = (() => {\n let product;\n if (typeof navigator !== 'undefined' && (\n (product = navigator.product) === 'ReactNative' ||\n product === 'NativeScript' ||\n product === 'NS')\n ) {\n return false;\n }\n\n return typeof window !== 'undefined' && typeof document !== 'undefined';\n})();\n\nexport default {\n isBrowser: true,\n classes: {\n URLSearchParams,\n FormData,\n Blob\n },\n isStandardBrowserEnv,\n protocols: ['http', 'https', 'file', 'blob', 'url', 'data']\n};\n","'use strict';\n\nimport utils from '../utils.js';\n\n/**\n * It takes a string like `foo[x][y][z]` and returns an array like `['foo', 'x', 'y', 'z']\n *\n * @param {string} name - The name of the property to get.\n *\n * @returns An array of strings.\n */\nfunction parsePropPath(name) {\n // foo[x][y][z]\n // foo.x.y.z\n // foo-x-y-z\n // foo x y z\n return utils.matchAll(/\\w+|\\[(\\w*)]/g, name).map(match => {\n return match[0] === '[]' ? '' : match[1] || match[0];\n });\n}\n\n/**\n * Convert an array to an object.\n *\n * @param {Array<any>} arr - The array to convert to an object.\n *\n * @returns An object with the same keys and values as the array.\n */\nfunction arrayToObject(arr) {\n const obj = {};\n const keys = Object.keys(arr);\n let i;\n const len = keys.length;\n let key;\n for (i = 0; i < len; i++) {\n key = keys[i];\n obj[key] = arr[key];\n }\n return obj;\n}\n\n/**\n * It takes a FormData object and returns a JavaScript object\n *\n * @param {string} formData The FormData object to convert to JSON.\n *\n * @returns {Object<string, any> | null} The converted object.\n */\nfunction formDataToJSON(formData) {\n function buildPath(path, value, target, index) {\n let name = path[index++];\n const isNumericKey = Number.isFinite(+name);\n const isLast = index >= path.length;\n name = !name && utils.isArray(target) ? target.length : name;\n\n if (isLast) {\n if (utils.hasOwnProp(target, name)) {\n target[name] = [target[name], value];\n } else {\n target[name] = value;\n }\n\n return !isNumericKey;\n }\n\n if (!target[name] || !utils.isObject(target[name])) {\n target[name] = [];\n }\n\n const result = buildPath(path, value, target[name], index);\n\n if (result && utils.isArray(target[name])) {\n target[name] = arrayToObject(target[name]);\n }\n\n return !isNumericKey;\n }\n\n if (utils.isFormData(formData) && utils.isFunction(formData.entries)) {\n const obj = {};\n\n utils.forEachEntry(formData, (name, value) => {\n buildPath(parsePropPath(name), value, obj, 0);\n });\n\n return obj;\n }\n\n return null;\n}\n\nexport default formDataToJSON;\n","'use strict';\n\nimport utils from './../utils.js';\nimport platform from '../platform/index.js';\n\nexport default platform.isStandardBrowserEnv ?\n\n// Standard browser envs support document.cookie\n (function standardBrowserEnv() {\n return {\n write: function write(name, value, expires, path, domain, secure) {\n const cookie = [];\n cookie.push(name + '=' + encodeURIComponent(value));\n\n if (utils.isNumber(expires)) {\n cookie.push('expires=' + new Date(expires).toGMTString());\n }\n\n if (utils.isString(path)) {\n cookie.push('path=' + path);\n }\n\n if (utils.isString(domain)) {\n cookie.push('domain=' + domain);\n }\n\n if (secure === true) {\n cookie.push('secure');\n }\n\n document.cookie = cookie.join('; ');\n },\n\n read: function read(name) {\n const match = document.cookie.match(new RegExp('(^|;\\\\s*)(' + name + ')=([^;]*)'));\n return (match ? decodeURIComponent(match[3]) : null);\n },\n\n remove: function remove(name) {\n this.write(name, '', Date.now() - 86400000);\n }\n };\n })() :\n\n// Non standard browser env (web workers, react-native) lack needed support.\n (function nonStandardBrowserEnv() {\n return {\n write: function write() {},\n read: function read() { return null; },\n remove: function remove() {}\n };\n })();\n","'use strict';\n\nimport isAbsoluteURL from '../helpers/isAbsoluteURL.js';\nimport combineURLs from '../helpers/combineURLs.js';\n\n/**\n * Creates a new URL by combining the baseURL with the requestedURL,\n * only when the requestedURL is not already an absolute URL.\n * If the requestURL is absolute, this function returns the requestedURL untouched.\n *\n * @param {string} baseURL The base URL\n * @param {string} requestedURL Absolute or relative URL to combine\n *\n * @returns {string} The combined full path\n */\nexport default function buildFullPath(baseURL, requestedURL) {\n if (baseURL && !isAbsoluteURL(requestedURL)) {\n return combineURLs(baseURL, requestedURL);\n }\n return requestedURL;\n}\n","'use strict';\n\n/**\n * Determines whether the specified URL is absolute\n *\n * @param {string} url The URL to test\n *\n * @returns {boolean} True if the specified URL is absolute, otherwise false\n */\nexport default function isAbsoluteURL(url) {\n // A URL is considered absolute if it begins with \"<scheme>://\" or \"//\" (protocol-relative URL).\n // RFC 3986 defines scheme name as a sequence of characters beginning with a letter and followed\n // by any combination of letters, digits, plus, period, or hyphen.\n return /^([a-z][a-z\\d+\\-.]*:)?\\/\\//i.test(url);\n}\n","'use strict';\n\n/**\n * Creates a new URL by combining the specified URLs\n *\n * @param {string} baseURL The base URL\n * @param {string} relativeURL The relative URL\n *\n * @returns {string} The combined URL\n */\nexport default function combineURLs(baseURL, relativeURL) {\n return relativeURL\n ? baseURL.replace(/\\/+$/, '') + '/' + relativeURL.replace(/^\\/+/, '')\n : baseURL;\n}\n","'use strict';\n\nimport utils from './../utils.js';\nimport platform from '../platform/index.js';\n\nexport default platform.isStandardBrowserEnv ?\n\n// Standard browser envs have full support of the APIs needed to test\n// whether the request URL is of the same origin as current location.\n (function standardBrowserEnv() {\n const msie = /(msie|trident)/i.test(navigator.userAgent);\n const urlParsingNode = document.createElement('a');\n let originURL;\n\n /**\n * Parse a URL to discover it's components\n *\n * @param {String} url The URL to be parsed\n * @returns {Object}\n */\n function resolveURL(url) {\n let href = url;\n\n if (msie) {\n // IE needs attribute set twice to normalize properties\n urlParsingNode.setAttribute('href', href);\n href = urlParsingNode.href;\n }\n\n urlParsingNode.setAttribute('href', href);\n\n // urlParsingNode provides the UrlUtils interface - http://url.spec.whatwg.org/#urlutils\n return {\n href: urlParsingNode.href,\n protocol: urlParsingNode.protocol ? urlParsingNode.protocol.replace(/:$/, '') : '',\n host: urlParsingNode.host,\n search: urlParsingNode.search ? urlParsingNode.search.replace(/^\\?/, '') : '',\n hash: urlParsingNode.hash ? urlParsingNode.hash.replace(/^#/, '') : '',\n hostname: urlParsingNode.hostname,\n port: urlParsingNode.port,\n pathname: (urlParsingNode.pathname.charAt(0) === '/') ?\n urlParsingNode.pathname :\n '/' + urlParsingNode.pathname\n };\n }\n\n originURL = resolveURL(window.location.href);\n\n /**\n * Determine if a URL shares the same origin as the current location\n *\n * @param {String} requestURL The URL to test\n * @returns {boolean} True if URL shares the same origin, otherwise false\n */\n return function isURLSameOrigin(requestURL) {\n const parsed = (utils.isString(requestURL)) ? resolveURL(requestURL) : requestURL;\n return (parsed.protocol === originURL.protocol &&\n parsed.host === originURL.host);\n };\n })() :\n\n // Non standard browser envs (web workers, react-native) lack needed support.\n (function nonStandardBrowserEnv() {\n return function isURLSameOrigin() {\n return true;\n };\n })();\n","'use strict';\n\nimport AxiosError from '../core/AxiosError.js';\nimport utils from '../utils.js';\n\n/**\n * A `CanceledError` is an object that is thrown when an operation is canceled.\n *\n * @param {string=} message The message.\n * @param {Object=} config The config.\n * @param {Object=} request The request.\n *\n * @returns {CanceledError} The created error.\n */\nfunction CanceledError(message, config, request) {\n // eslint-disable-next-line no-eq-null,eqeqeq\n AxiosError.call(this, message == null ? 'canceled' : message, AxiosError.ERR_CANCELED, config, request);\n this.name = 'CanceledError';\n}\n\nutils.inherits(CanceledError, AxiosError, {\n __CANCEL__: true\n});\n\nexport default CanceledError;\n","'use strict';\n\nimport utils from './../utils.js';\n\n// RawAxiosHeaders whose duplicates are ignored by node\n// c.f. https://nodejs.org/api/http.html#http_message_headers\nconst ignoreDuplicateOf = utils.toObjectSet([\n 'age', 'authorization', 'content-length', 'content-type', 'etag',\n 'expires', 'from', 'host', 'if-modified-since', 'if-unmodified-since',\n 'last-modified', 'location', 'max-forwards', 'proxy-authorization',\n 'referer', 'retry-after', 'user-agent'\n]);\n\n/**\n * Parse headers into an object\n *\n * ```\n * Date: Wed, 27 Aug 2014 08:58:49 GMT\n * Content-Type: application/json\n * Connection: keep-alive\n * Transfer-Encoding: chunked\n * ```\n *\n * @param {String} rawHeaders Headers needing to be parsed\n *\n * @returns {Object} Headers parsed into an object\n */\nexport default rawHeaders => {\n const parsed = {};\n let key;\n let val;\n let i;\n\n rawHeaders && rawHeaders.split('\\n').forEach(function parser(line) {\n i = line.indexOf(':');\n key = line.substring(0, i).trim().toLowerCase();\n val = line.substring(i + 1).trim();\n\n if (!key || (parsed[key] && ignoreDuplicateOf[key])) {\n return;\n }\n\n if (key === 'set-cookie') {\n if (parsed[key]) {\n parsed[key].push(val);\n } else {\n parsed[key] = [val];\n }\n } else {\n parsed[key] = parsed[key] ? parsed[key] + ', ' + val : val;\n }\n });\n\n return parsed;\n};\n","'use strict';\n\nimport utils from '../utils.js';\nimport parseHeaders from '../helpers/parseHeaders.js';\n\nconst $internals = Symbol('internals');\nconst $defaults = Symbol('defaults');\n\nfunction normalizeHeader(header) {\n return header && String(header).trim().toLowerCase();\n}\n\nfunction normalizeValue(value) {\n if (value === false || value == null) {\n return value;\n }\n\n return utils.isArray(value) ? value.map(normalizeValue) : String(value);\n}\n\nfunction parseTokens(str) {\n const tokens = Object.create(null);\n const tokensRE = /([^\\s,;=]+)\\s*(?:=\\s*([^,;]+))?/g;\n let match;\n\n while ((match = tokensRE.exec(str))) {\n tokens[match[1]] = match[2];\n }\n\n return tokens;\n}\n\nfunction matchHeaderValue(context, value, header, filter) {\n if (utils.isFunction(filter)) {\n return filter.call(this, value, header);\n }\n\n if (!utils.isString(value)) return;\n\n if (utils.isString(filter)) {\n return value.indexOf(filter) !== -1;\n }\n\n if (utils.isRegExp(filter)) {\n return filter.test(value);\n }\n}\n\nfunction formatHeader(header) {\n return header.trim()\n .toLowerCase().replace(/([a-z\\d])(\\w*)/g, (w, char, str) => {\n return char.toUpperCase() + str;\n });\n}\n\nfunction buildAccessors(obj, header) {\n const accessorName = utils.toCamelCase(' ' + header);\n\n ['get', 'set', 'has'].forEach(methodName => {\n Object.defineProperty(obj, methodName + accessorName, {\n value: function(arg1, arg2, arg3) {\n return this[methodName].call(this, header, arg1, arg2, arg3);\n },\n configurable: true\n });\n });\n}\n\nfunction findKey(obj, key) {\n key = key.toLowerCase();\n const keys = Object.keys(obj);\n let i = keys.length;\n let _key;\n while (i-- > 0) {\n _key = keys[i];\n if (key === _key.toLowerCase()) {\n return _key;\n }\n }\n return null;\n}\n\nfunction AxiosHeaders(headers, defaults) {\n headers && this.set(headers);\n this[$defaults] = defaults || null;\n}\n\nObject.assign(AxiosHeaders.prototype, {\n set: function(header, valueOrRewrite, rewrite) {\n const self = this;\n\n function setHeader(_value, _header, _rewrite) {\n const lHeader = normalizeHeader(_header);\n\n if (!lHeader) {\n throw new Error('header name must be a non-empty string');\n }\n\n const key = findKey(self, lHeader);\n\n if (key && _rewrite !== true && (self[key] === false || _rewrite === false)) {\n return;\n }\n\n self[key || _header] = normalizeValue(_value);\n }\n\n if (utils.isPlainObject(header)) {\n utils.forEach(header, (_value, _header) => {\n setHeader(_value, _header, valueOrRewrite);\n });\n } else {\n setHeader(valueOrRewrite, header, rewrite);\n }\n\n return this;\n },\n\n get: function(header, parser) {\n header = normalizeHeader(header);\n\n if (!header) return undefined;\n\n const key = findKey(this, header);\n\n if (key) {\n const value = this[key];\n\n if (!parser) {\n return value;\n }\n\n if (parser === true) {\n return parseTokens(value);\n }\n\n if (utils.isFunction(parser)) {\n return parser.call(this, value, key);\n }\n\n if (utils.isRegExp(parser)) {\n return parser.exec(value);\n }\n\n throw new TypeError('parser must be boolean|regexp|function');\n }\n },\n\n has: function(header, matcher) {\n header = normalizeHeader(header);\n\n if (header) {\n const key = findKey(this, header);\n\n return !!(key && (!matcher || matchHeaderValue(this, this[key], key, matcher)));\n }\n\n return false;\n },\n\n delete: function(header, matcher) {\n const self = this;\n let deleted = false;\n\n function deleteHeader(_header) {\n _header = normalizeHeader(_header);\n\n if (_header) {\n const key = findKey(self, _header);\n\n if (key && (!matcher || matchHeaderValue(self, self[key], key, matcher))) {\n delete self[key];\n\n deleted = true;\n }\n }\n }\n\n if (utils.isArray(header)) {\n header.forEach(deleteHeader);\n } else {\n deleteHeader(header);\n }\n\n return deleted;\n },\n\n clear: function() {\n return Object.keys(this).forEach(this.delete.bind(this));\n },\n\n normalize: function(format) {\n const self = this;\n const headers = {};\n\n utils.forEach(this, (value, header) => {\n const key = findKey(headers, header);\n\n if (key) {\n self[key] = normalizeValue(value);\n delete self[header];\n return;\n }\n\n const normalized = format ? formatHeader(header) : String(header).trim();\n\n if (normalized !== header) {\n delete self[header];\n }\n\n self[normalized] = normalizeValue(value);\n\n headers[normalized] = true;\n });\n\n return this;\n },\n\n toJSON: function(asStrings) {\n const obj = Object.create(null);\n\n utils.forEach(Object.assign({}, this[$defaults] || null, this),\n (value, header) => {\n if (value == null || value === false) return;\n obj[header] = asStrings && utils.isArray(value) ? value.join(', ') : value;\n });\n\n return obj;\n }\n});\n\nObject.assign(AxiosHeaders, {\n from: function(thing) {\n if (utils.isString(thing)) {\n return new this(parseHeaders(thing));\n }\n return thing instanceof this ? thing : new this(thing);\n },\n\n accessor: function(header) {\n const internals = this[$internals] = (this[$internals] = {\n accessors: {}\n });\n\n const accessors = internals.accessors;\n const prototype = this.prototype;\n\n function defineAccessor(_header) {\n const lHeader = normalizeHeader(_header);\n\n if (!accessors[lHeader]) {\n buildAccessors(prototype, _header);\n accessors[lHeader] = true;\n }\n }\n\n utils.isArray(header) ? header.forEach(defineAccessor) : defineAccessor(header);\n\n return this;\n }\n});\n\nAxiosHeaders.accessor(['Content-Type', 'Content-Length', 'Accept', 'Accept-Encoding', 'User-Agent']);\n\nutils.freezeMethods(AxiosHeaders.prototype);\nutils.freezeMethods(AxiosHeaders);\n\nexport default AxiosHeaders;\n","'use strict';\n\nimport utils from './../utils.js';\nimport settle from './../core/settle.js';\nimport cookies from './../helpers/cookies.js';\nimport buildURL from './../helpers/buildURL.js';\nimport buildFullPath from '../core/buildFullPath.js';\nimport isURLSameOrigin from './../helpers/isURLSameOrigin.js';\nimport transitionalDefaults from '../defaults/transitional.js';\nimport AxiosError from '../core/AxiosError.js';\nimport CanceledError from '../cancel/CanceledError.js';\nimport parseProtocol from '../helpers/parseProtocol.js';\nimport platform from '../platform/index.js';\nimport AxiosHeaders from '../core/AxiosHeaders.js';\nimport speedometer from '../helpers/speedometer.js';\n\nfunction progressEventReducer(listener, isDownloadStream) {\n let bytesNotified = 0;\n const _speedometer = speedometer(50, 250);\n\n return e => {\n const loaded = e.loaded;\n const total = e.lengthComputable ? e.total : undefined;\n const progressBytes = loaded - bytesNotified;\n const rate = _speedometer(progressBytes);\n const inRange = loaded <= total;\n\n bytesNotified = loaded;\n\n const data = {\n loaded,\n total,\n progress: total ? (loaded / total) : undefined,\n bytes: progressBytes,\n rate: rate ? rate : undefined,\n estimated: rate && total && inRange ? (total - loaded) / rate : undefined\n };\n\n data[isDownloadStream ? 'download' : 'upload'] = true;\n\n listener(data);\n };\n}\n\nexport default function xhrAdapter(config) {\n return new Promise(function dispatchXhrRequest(resolve, reject) {\n let requestData = config.data;\n const requestHeaders = AxiosHeaders.from(config.headers).normalize();\n const responseType = config.responseType;\n let onCanceled;\n function done() {\n if (config.cancelToken) {\n config.cancelToken.unsubscribe(onCanceled);\n }\n\n if (config.signal) {\n config.signal.removeEventListener('abort', onCanceled);\n }\n }\n\n if (utils.isFormData(requestData) && platform.isStandardBrowserEnv) {\n requestHeaders.setContentType(false); // Let the browser set it\n }\n\n let request = new XMLHttpRequest();\n\n // HTTP basic authentication\n if (config.auth) {\n const username = config.auth.username || '';\n const password = config.auth.password ? unescape(encodeURIComponent(config.auth.password)) : '';\n requestHeaders.set('Authorization', 'Basic ' + btoa(username + ':' + password));\n }\n\n const fullPath = buildFullPath(config.baseURL, config.url);\n\n request.open(config.method.toUpperCase(), buildURL(fullPath, config.params, config.paramsSerializer), true);\n\n // Set the request timeout in MS\n request.timeout = config.timeout;\n\n function onloadend() {\n if (!request) {\n return;\n }\n // Prepare the response\n const responseHeaders = AxiosHeaders.from(\n 'getAllResponseHeaders' in request && request.getAllResponseHeaders()\n );\n const responseData = !responseType || responseType === 'text' || responseType === 'json' ?\n request.responseText : request.response;\n const response = {\n data: responseData,\n status: request.status,\n statusText: request.statusText,\n headers: responseHeaders,\n config,\n request\n };\n\n settle(function _resolve(value) {\n resolve(value);\n done();\n }, function _reject(err) {\n reject(err);\n done();\n }, response);\n\n // Clean up request\n request = null;\n }\n\n if ('onloadend' in request) {\n // Use onloadend if available\n request.onloadend = onloadend;\n } else {\n // Listen for ready state to emulate onloadend\n request.onreadystatechange = function handleLoad() {\n if (!request || request.readyState !== 4) {\n return;\n }\n\n // The request errored out and we didn't get a response, this will be\n // handled by onerror instead\n // With one exception: request that using file: protocol, most browsers\n // will return status as 0 even though it's a successful request\n if (request.status === 0 && !(request.responseURL && request.responseURL.indexOf('file:') === 0)) {\n return;\n }\n // readystate handler is calling before onerror or ontimeout handlers,\n // so we should call onloadend on the next 'tick'\n setTimeout(onloadend);\n };\n }\n\n // Handle browser request cancellation (as opposed to a manual cancellation)\n request.onabort = function handleAbort() {\n if (!request) {\n return;\n }\n\n reject(new AxiosError('Request aborted', AxiosError.ECONNABORTED, config, request));\n\n // Clean up request\n request = null;\n };\n\n // Handle low level network errors\n request.onerror = function handleError() {\n // Real errors are hidden from us by the browser\n // onerror should only fire if it's a network error\n reject(new AxiosError('Network Error', AxiosError.ERR_NETWORK, config, request));\n\n // Clean up request\n request = null;\n };\n\n // Handle timeout\n request.ontimeout = function handleTimeout() {\n let timeoutErrorMessage = config.timeout ? 'timeout of ' + config.timeout + 'ms exceeded' : 'timeout exceeded';\n const transitional = config.transitional || transitionalDefaults;\n if (config.timeoutErrorMessage) {\n timeoutErrorMessage = config.timeoutErrorMessage;\n }\n reject(new AxiosError(\n timeoutErrorMessage,\n transitional.clarifyTimeoutError ? AxiosError.ETIMEDOUT : AxiosError.ECONNABORTED,\n config,\n request));\n\n // Clean up request\n request = null;\n };\n\n // Add xsrf header\n // This is only done if running in a standard browser environment.\n // Specifically not if we're in a web worker, or react-native.\n if (platform.isStandardBrowserEnv) {\n // Add xsrf header\n const xsrfValue = (config.withCredentials || isURLSameOrigin(fullPath))\n && config.xsrfCookieName && cookies.read(config.xsrfCookieName);\n\n if (xsrfValue) {\n requestHeaders.set(config.xsrfHeaderName, xsrfValue);\n }\n }\n\n // Remove Content-Type if data is undefined\n requestData === undefined && requestHeaders.setContentType(null);\n\n // Add headers to the request\n if ('setRequestHeader' in request) {\n utils.forEach(requestHeaders.toJSON(), function setRequestHeader(val, key) {\n request.setRequestHeader(key, val);\n });\n }\n\n // Add withCredentials to request if needed\n if (!utils.isUndefined(config.withCredentials)) {\n request.withCredentials = !!config.withCredentials;\n }\n\n // Add responseType to request if needed\n if (responseType && responseType !== 'json') {\n request.responseType = config.responseType;\n }\n\n // Handle progress if needed\n if (typeof config.onDownloadProgress === 'function') {\n request.addEventListener('progress', progressEventReducer(config.onDownloadProgress, true));\n }\n\n // Not all browsers support upload events\n if (typeof config.onUploadProgress === 'function' && request.upload) {\n request.upload.addEventListener('progress', progressEventReducer(config.onUploadProgress));\n }\n\n if (config.cancelToken || config.signal) {\n // Handle cancellation\n // eslint-disable-next-line func-names\n onCanceled = cancel => {\n if (!request) {\n return;\n }\n reject(!cancel || cancel.type ? new CanceledError(null, config, request) : cancel);\n request.abort();\n request = null;\n };\n\n config.cancelToken && config.cancelToken.subscribe(onCanceled);\n if (config.signal) {\n config.signal.aborted ? onCanceled() : config.signal.addEventListener('abort', onCanceled);\n }\n }\n\n const protocol = parseProtocol(fullPath);\n\n if (protocol && platform.protocols.indexOf(protocol) === -1) {\n reject(new AxiosError('Unsupported protocol ' + protocol + ':', AxiosError.ERR_BAD_REQUEST, config));\n return;\n }\n\n\n // Send the request\n request.send(requestData || null);\n });\n}\n","'use strict';\n\n/**\n * Calculate data maxRate\n * @param {Number} [samplesCount= 10]\n * @param {Number} [min= 1000]\n * @returns {Function}\n */\nfunction speedometer(samplesCount, min) {\n samplesCount = samplesCount || 10;\n const bytes = new Array(samplesCount);\n const timestamps = new Array(samplesCount);\n let head = 0;\n let tail = 0;\n let firstSampleTS;\n\n min = min !== undefined ? min : 1000;\n\n return function push(chunkLength) {\n const now = Date.now();\n\n const startedAt = timestamps[tail];\n\n if (!firstSampleTS) {\n firstSampleTS = now;\n }\n\n bytes[head] = chunkLength;\n timestamps[head] = now;\n\n let i = tail;\n let bytesCount = 0;\n\n while (i !== head) {\n bytesCount += bytes[i++];\n i = i % samplesCount;\n }\n\n head = (head + 1) % samplesCount;\n\n if (head === tail) {\n tail = (tail + 1) % samplesCount;\n }\n\n if (now - firstSampleTS < min) {\n return;\n }\n\n const passed = startedAt && now - startedAt;\n\n return passed ? Math.round(bytesCount * 1000 / passed) : undefined;\n };\n}\n\nexport default speedometer;\n","'use strict';\n\nimport AxiosError from './AxiosError.js';\n\n/**\n * Resolve or reject a Promise based on response status.\n *\n * @param {Function} resolve A function that resolves the promise.\n * @param {Function} reject A function that rejects the promise.\n * @param {object} response The response.\n *\n * @returns {object} The response.\n */\nexport default function settle(resolve, reject, response) {\n const validateStatus = response.config.validateStatus;\n if (!response.status || !validateStatus || validateStatus(response.status)) {\n resolve(response);\n } else {\n reject(new AxiosError(\n 'Request failed with status code ' + response.status,\n [AxiosError.ERR_BAD_REQUEST, AxiosError.ERR_BAD_RESPONSE][Math.floor(response.status / 100) - 4],\n response.config,\n response.request,\n response\n ));\n }\n}\n","'use strict';\n\nexport default function parseProtocol(url) {\n const match = /^([-+\\w]{1,25})(:?\\/\\/|:)/.exec(url);\n return match && match[1] || '';\n}\n","import utils from '../utils.js';\nimport httpAdapter from './http.js';\nimport xhrAdapter from './xhr.js';\n\nconst adapters = {\n http: httpAdapter,\n xhr: xhrAdapter\n}\n\nexport default {\n getAdapter: (nameOrAdapter) => {\n if(utils.isString(nameOrAdapter)){\n const adapter = adapters[nameOrAdapter];\n\n if (!nameOrAdapter) {\n throw Error(\n utils.hasOwnProp(nameOrAdapter) ?\n `Adapter '${nameOrAdapter}' is not available in the build` :\n `Can not resolve adapter '${nameOrAdapter}'`\n );\n }\n\n return adapter\n }\n\n if (!utils.isFunction(nameOrAdapter)) {\n throw new TypeError('adapter is not a function');\n }\n\n return nameOrAdapter;\n },\n adapters\n}\n","'use strict';\n\nimport utils from '../utils.js';\nimport AxiosError from '../core/AxiosError.js';\nimport transitionalDefaults from './transitional.js';\nimport toFormData from '../helpers/toFormData.js';\nimport toURLEncodedForm from '../helpers/toURLEncodedForm.js';\nimport platform from '../platform/index.js';\nimport formDataToJSON from '../helpers/formDataToJSON.js';\nimport adapters from '../adapters/index.js';\n\nconst DEFAULT_CONTENT_TYPE = {\n 'Content-Type': 'application/x-www-form-urlencoded'\n};\n\n/**\n * If the browser has an XMLHttpRequest object, use the XHR adapter, otherwise use the HTTP\n * adapter\n *\n * @returns {Function}\n */\nfunction getDefaultAdapter() {\n let adapter;\n if (typeof XMLHttpRequest !== 'undefined') {\n // For browsers use XHR adapter\n adapter = adapters.getAdapter('xhr');\n } else if (typeof process !== 'undefined' && utils.kindOf(process) === 'process') {\n // For node use HTTP adapter\n adapter = adapters.getAdapter('http');\n }\n return adapter;\n}\n\n/**\n * It takes a string, tries to parse it, and if it fails, it returns the stringified version\n * of the input\n *\n * @param {any} rawValue - The value to be stringified.\n * @param {Function} parser - A function that parses a string into a JavaScript object.\n * @param {Function} encoder - A function that takes a value and returns a string.\n *\n * @returns {string} A stringified version of the rawValue.\n */\nfunction stringifySafely(rawValue, parser, encoder) {\n if (utils.isString(rawValue)) {\n try {\n (parser || JSON.parse)(rawValue);\n return utils.trim(rawValue);\n } catch (e) {\n if (e.name !== 'SyntaxError') {\n throw e;\n }\n }\n }\n\n return (encoder || JSON.stringify)(rawValue);\n}\n\nconst defaults = {\n\n transitional: transitionalDefaults,\n\n adapter: getDefaultAdapter(),\n\n transformRequest: [function transformRequest(data, headers) {\n const contentType = headers.getContentType() || '';\n const hasJSONContentType = contentType.indexOf('application/json') > -1;\n const isObjectPayload = utils.isObject(data);\n\n if (isObjectPayload && utils.isHTMLForm(data)) {\n data = new FormData(data);\n }\n\n const isFormData = utils.isFormData(data);\n\n if (isFormData) {\n if (!hasJSONContentType) {\n return data;\n }\n return hasJSONContentType ? JSON.stringify(formDataToJSON(data)) : data;\n }\n\n if (utils.isArrayBuffer(data) ||\n utils.isBuffer(data) ||\n utils.isStream(data) ||\n utils.isFile(data) ||\n utils.isBlob(data)\n ) {\n return data;\n }\n if (utils.isArrayBufferView(data)) {\n return data.buffer;\n }\n if (utils.isURLSearchParams(data)) {\n headers.setContentType('application/x-www-form-urlencoded;charset=utf-8', false);\n return data.toString();\n }\n\n let isFileList;\n\n if (isObjectPayload) {\n if (contentType.indexOf('application/x-www-form-urlencoded') > -1) {\n return toURLEncodedForm(data, this.formSerializer).toString();\n }\n\n if ((isFileList = utils.isFileList(data)) || contentType.indexOf('multipart/form-data') > -1) {\n const _FormData = this.env && this.env.FormData;\n\n return toFormData(\n isFileList ? {'files[]': data} : data,\n _FormData && new _FormData(),\n this.formSerializer\n );\n }\n }\n\n if (isObjectPayload || hasJSONContentType ) {\n headers.setContentType('application/json', false);\n return stringifySafely(data);\n }\n\n return data;\n }],\n\n transformResponse: [function transformResponse(data) {\n const transitional = this.transitional || defaults.transitional;\n const forcedJSONParsing = transitional && transitional.forcedJSONParsing;\n const JSONRequested = this.responseType === 'json';\n\n if (data && utils.isString(data) && ((forcedJSONParsing && !this.responseType) || JSONRequested)) {\n const silentJSONParsing = transitional && transitional.silentJSONParsing;\n const strictJSONParsing = !silentJSONParsing && JSONRequested;\n\n try {\n return JSON.parse(data);\n } catch (e) {\n if (strictJSONParsing) {\n if (e.name === 'SyntaxError') {\n throw AxiosError.from(e, AxiosError.ERR_BAD_RESPONSE, this, null, this.response);\n }\n throw e;\n }\n }\n }\n\n return data;\n }],\n\n /**\n * A timeout in milliseconds to abort a request. If set to 0 (default) a\n * timeout is not created.\n */\n timeout: 0,\n\n xsrfCookieName: 'XSRF-TOKEN',\n xsrfHeaderName: 'X-XSRF-TOKEN',\n\n maxContentLength: -1,\n maxBodyLength: -1,\n\n env: {\n FormData: platform.classes.FormData,\n Blob: platform.classes.Blob\n },\n\n validateStatus: function validateStatus(status) {\n return status >= 200 && status < 300;\n },\n\n headers: {\n common: {\n 'Accept': 'application/json, text/plain, */*'\n }\n }\n};\n\nutils.forEach(['delete', 'get', 'head'], function forEachMethodNoData(method) {\n defaults.headers[method] = {};\n});\n\nutils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {\n defaults.headers[method] = utils.merge(DEFAULT_CONTENT_TYPE);\n});\n\nexport default defaults;\n","'use strict';\n\nimport utils from '../utils.js';\nimport toFormData from './toFormData.js';\nimport platform from '../platform/index.js';\n\nexport default function toURLEncodedForm(data, options) {\n return toFormData(data, new platform.classes.URLSearchParams(), Object.assign({\n visitor: function(value, key, path, helpers) {\n if (platform.isNode && utils.isBuffer(value)) {\n this.append(key, value.toString('base64'));\n return false;\n }\n\n return helpers.defaultVisitor.apply(this, arguments);\n }\n }, options));\n}\n","'use strict';\n\nimport utils from './../utils.js';\nimport defaults from '../defaults/index.js';\nimport AxiosHeaders from '../core/AxiosHeaders.js';\n\n/**\n * Transform the data for a request or a response\n *\n * @param {Array|Function} fns A single function or Array of functions\n * @param {?Object} response The response object\n *\n * @returns {*} The resulting transformed data\n */\nexport default function transformData(fns, response) {\n const config = this || defaults;\n const context = response || config;\n const headers = AxiosHeaders.from(context.headers);\n let data = context.data;\n\n utils.forEach(fns, function transform(fn) {\n data = fn.call(config, data, headers.normalize(), response ? response.status : undefined);\n });\n\n headers.normalize();\n\n return data;\n}\n","'use strict';\n\nexport default function isCancel(value) {\n return !!(value && value.__CANCEL__);\n}\n","'use strict';\n\nimport transformData from './transformData.js';\nimport isCancel from '../cancel/isCancel.js';\nimport defaults from '../defaults/index.js';\nimport CanceledError from '../cancel/CanceledError.js';\nimport AxiosHeaders from '../core/AxiosHeaders.js';\n\n/**\n * Throws a `CanceledError` if cancellation has been requested.\n *\n * @param {Object} config The config that is to be used for the request\n *\n * @returns {void}\n */\nfunction throwIfCancellationRequested(config) {\n if (config.cancelToken) {\n config.cancelToken.throwIfRequested();\n }\n\n if (config.signal && config.signal.aborted) {\n throw new CanceledError();\n }\n}\n\n/**\n * Dispatch a request to the server using the configured adapter.\n *\n * @param {object} config The config that is to be used for the request\n *\n * @returns {Promise} The Promise to be fulfilled\n */\nexport default function dispatchRequest(config) {\n throwIfCancellationRequested(config);\n\n config.headers = AxiosHeaders.from(config.headers);\n\n // Transform request data\n config.data = transformData.call(\n config,\n config.transformRequest\n );\n\n const adapter = config.adapter || defaults.adapter;\n\n return adapter(config).then(function onAdapterResolution(response) {\n throwIfCancellationRequested(config);\n\n // Transform response data\n response.data = transformData.call(\n config,\n config.transformResponse,\n response\n );\n\n response.headers = AxiosHeaders.from(response.headers);\n\n return response;\n }, function onAdapterRejection(reason) {\n if (!isCancel(reason)) {\n throwIfCancellationRequested(config);\n\n // Transform response data\n if (reason && reason.response) {\n reason.response.data = transformData.call(\n config,\n config.transformResponse,\n reason.response\n );\n reason.response.headers = AxiosHeaders.from(reason.response.headers);\n }\n }\n\n return Promise.reject(reason);\n });\n}\n","'use strict';\n\nimport utils from '../utils.js';\n\n/**\n * Config-specific merge-function which creates a new config-object\n * by merging two configuration objects together.\n *\n * @param {Object} config1\n * @param {Object} config2\n *\n * @returns {Object} New object resulting from merging config2 to config1\n */\nexport default function mergeConfig(config1, config2) {\n // eslint-disable-next-line no-param-reassign\n config2 = config2 || {};\n const config = {};\n\n function getMergedValue(target, source) {\n if (utils.isPlainObject(target) && utils.isPlainObject(source)) {\n return utils.merge(target, source);\n } else if (utils.isPlainObject(source)) {\n return utils.merge({}, source);\n } else if (utils.isArray(source)) {\n return source.slice();\n }\n return source;\n }\n\n // eslint-disable-next-line consistent-return\n function mergeDeepProperties(prop) {\n if (!utils.isUndefined(config2[prop])) {\n return getMergedValue(config1[prop], config2[prop]);\n } else if (!utils.isUndefined(config1[prop])) {\n return getMergedValue(undefined, config1[prop]);\n }\n }\n\n // eslint-disable-next-line consistent-return\n function valueFromConfig2(prop) {\n if (!utils.isUndefined(config2[prop])) {\n return getMergedValue(undefined, config2[prop]);\n }\n }\n\n // eslint-disable-next-line consistent-return\n function defaultToConfig2(prop) {\n if (!utils.isUndefined(config2[prop])) {\n return getMergedValue(undefined, config2[prop]);\n } else if (!utils.isUndefined(config1[prop])) {\n return getMergedValue(undefined, config1[prop]);\n }\n }\n\n // eslint-disable-next-line consistent-return\n function mergeDirectKeys(prop) {\n if (prop in config2) {\n return getMergedValue(config1[prop], config2[prop]);\n } else if (prop in config1) {\n return getMergedValue(undefined, config1[prop]);\n }\n }\n\n const mergeMap = {\n 'url': valueFromConfig2,\n 'method': valueFromConfig2,\n 'data': valueFromConfig2,\n 'baseURL': defaultToConfig2,\n 'transformRequest': defaultToConfig2,\n 'transformResponse': defaultToConfig2,\n 'paramsSerializer': defaultToConfig2,\n 'timeout': defaultToConfig2,\n 'timeoutMessage': defaultToConfig2,\n 'withCredentials': defaultToConfig2,\n 'adapter': defaultToConfig2,\n 'responseType': defaultToConfig2,\n 'xsrfCookieName': defaultToConfig2,\n 'xsrfHeaderName': defaultToConfig2,\n 'onUploadProgress': defaultToConfig2,\n 'onDownloadProgress': defaultToConfig2,\n 'decompress': defaultToConfig2,\n 'maxContentLength': defaultToConfig2,\n 'maxBodyLength': defaultToConfig2,\n 'beforeRedirect': defaultToConfig2,\n 'transport': defaultToConfig2,\n 'httpAgent': defaultToConfig2,\n 'httpsAgent': defaultToConfig2,\n 'cancelToken': defaultToConfig2,\n 'socketPath': defaultToConfig2,\n 'responseEncoding': defaultToConfig2,\n 'validateStatus': mergeDirectKeys\n };\n\n utils.forEach(Object.keys(config1).concat(Object.keys(config2)), function computeConfigValue(prop) {\n const merge = mergeMap[prop] || mergeDeepProperties;\n const configValue = merge(prop);\n (utils.isUndefined(configValue) && merge !== mergeDirectKeys) || (config[prop] = configValue);\n });\n\n return config;\n}\n","export const VERSION = \"1.1.3\";","'use strict';\n\nimport {VERSION} from '../env/data.js';\nimport AxiosError from '../core/AxiosError.js';\n\nconst validators = {};\n\n// eslint-disable-next-line func-names\n['object', 'boolean', 'number', 'function', 'string', 'symbol'].forEach((type, i) => {\n validators[type] = function validator(thing) {\n return typeof thing === type || 'a' + (i < 1 ? 'n ' : ' ') + type;\n };\n});\n\nconst deprecatedWarnings = {};\n\n/**\n * Transitional option validator\n *\n * @param {function|boolean?} validator - set to false if the transitional option has been removed\n * @param {string?} version - deprecated version / removed since version\n * @param {string?} message - some message with additional info\n *\n * @returns {function}\n */\nvalidators.transitional = function transitional(validator, version, message) {\n function formatMessage(opt, desc) {\n return '[Axios v' + VERSION + '] Transitional option \\'' + opt + '\\'' + desc + (message ? '. ' + message : '');\n }\n\n // eslint-disable-next-line func-names\n return (value, opt, opts) => {\n if (validator === false) {\n throw new AxiosError(\n formatMessage(opt, ' has been removed' + (version ? ' in ' + version : '')),\n AxiosError.ERR_DEPRECATED\n );\n }\n\n if (version && !deprecatedWarnings[opt]) {\n deprecatedWarnings[opt] = true;\n // eslint-disable-next-line no-console\n console.warn(\n formatMessage(\n opt,\n ' has been deprecated since v' + version + ' and will be removed in the near future'\n )\n );\n }\n\n return validator ? validator(value, opt, opts) : true;\n };\n};\n\n/**\n * Assert object's properties type\n *\n * @param {object} options\n * @param {object} schema\n * @param {boolean?} allowUnknown\n *\n * @returns {object}\n */\n\nfunction assertOptions(options, schema, allowUnknown) {\n if (typeof options !== 'object') {\n throw new AxiosError('options must be an object', AxiosError.ERR_BAD_OPTION_VALUE);\n }\n const keys = Object.keys(options);\n let i = keys.length;\n while (i-- > 0) {\n const opt = keys[i];\n const validator = schema[opt];\n if (validator) {\n const value = options[opt];\n const result = value === undefined || validator(value, opt, options);\n if (result !== true) {\n throw new AxiosError('option ' + opt + ' must be ' + result, AxiosError.ERR_BAD_OPTION_VALUE);\n }\n continue;\n }\n if (allowUnknown !== true) {\n throw new AxiosError('Unknown option ' + opt, AxiosError.ERR_BAD_OPTION);\n }\n }\n}\n\nexport default {\n assertOptions,\n validators\n};\n","'use strict';\n\nimport utils from './../utils.js';\nimport buildURL from '../helpers/buildURL.js';\nimport InterceptorManager from './InterceptorManager.js';\nimport dispatchRequest from './dispatchRequest.js';\nimport mergeConfig from './mergeConfig.js';\nimport buildFullPath from './buildFullPath.js';\nimport validator from '../helpers/validator.js';\nimport AxiosHeaders from './AxiosHeaders.js';\n\nconst validators = validator.validators;\n\n/**\n * Create a new instance of Axios\n *\n * @param {Object} instanceConfig The default config for the instance\n *\n * @return {Axios} A new instance of Axios\n */\nclass Axios {\n constructor(instanceConfig) {\n this.defaults = instanceConfig;\n this.interceptors = {\n request: new InterceptorManager(),\n response: new InterceptorManager()\n };\n }\n\n /**\n * Dispatch a request\n *\n * @param {String|Object} configOrUrl The config specific for this request (merged with this.defaults)\n * @param {?Object} config\n *\n * @returns {Promise} The Promise to be fulfilled\n */\n request(configOrUrl, config) {\n /*eslint no-param-reassign:0*/\n // Allow for axios('example/url'[, config]) a la fetch API\n if (typeof configOrUrl === 'string') {\n config = config || {};\n config.url = configOrUrl;\n } else {\n config = configOrUrl || {};\n }\n\n config = mergeConfig(this.defaults, config);\n\n const {transitional, paramsSerializer} = config;\n\n if (transitional !== undefined) {\n validator.assertOptions(transitional, {\n silentJSONParsing: validators.transitional(validators.boolean),\n forcedJSONParsing: validators.transitional(validators.boolean),\n clarifyTimeoutError: validators.transitional(validators.boolean)\n }, false);\n }\n\n if (paramsSerializer !== undefined) {\n validator.assertOptions(paramsSerializer, {\n encode: validators.function,\n serialize: validators.function\n }, true);\n }\n\n // Set config.method\n config.method = (config.method || this.defaults.method || 'get').toLowerCase();\n\n // Flatten headers\n const defaultHeaders = config.headers && utils.merge(\n config.headers.common,\n config.headers[config.method]\n );\n\n defaultHeaders && utils.forEach(\n ['delete', 'get', 'head', 'post', 'put', 'patch', 'common'],\n function cleanHeaderConfig(method) {\n delete config.headers[method];\n }\n );\n\n config.headers = new AxiosHeaders(config.headers, defaultHeaders);\n\n // filter out skipped interceptors\n const requestInterceptorChain = [];\n let synchronousRequestInterceptors = true;\n this.interceptors.request.forEach(function unshiftRequestInterceptors(interceptor) {\n if (typeof interceptor.runWhen === 'function' && interceptor.runWhen(config) === false) {\n return;\n }\n\n synchronousRequestInterceptors = synchronousRequestInterceptors && interceptor.synchronous;\n\n requestInterceptorChain.unshift(interceptor.fulfilled, interceptor.rejected);\n });\n\n const responseInterceptorChain = [];\n this.interceptors.response.forEach(function pushResponseInterceptors(interceptor) {\n responseInterceptorChain.push(interceptor.fulfilled, interceptor.rejected);\n });\n\n let promise;\n let i = 0;\n let len;\n\n if (!synchronousRequestInterceptors) {\n const chain = [dispatchRequest.bind(this), undefined];\n chain.unshift.apply(chain, requestInterceptorChain);\n chain.push.apply(chain, responseInterceptorChain);\n len = chain.length;\n\n promise = Promise.resolve(config);\n\n while (i < len) {\n promise = promise.then(chain[i++], chain[i++]);\n }\n\n return promise;\n }\n\n len = requestInterceptorChain.length;\n\n let newConfig = config;\n\n i = 0;\n\n while (i < len) {\n const onFulfilled = requestInterceptorChain[i++];\n const onRejected = requestInterceptorChain[i++];\n try {\n newConfig = onFulfilled(newConfig);\n } catch (error) {\n onRejected.call(this, error);\n break;\n }\n }\n\n try {\n promise = dispatchRequest.call(this, newConfig);\n } catch (error) {\n return Promise.reject(error);\n }\n\n i = 0;\n len = responseInterceptorChain.length;\n\n while (i < len) {\n promise = promise.then(responseInterceptorChain[i++], responseInterceptorChain[i++]);\n }\n\n return promise;\n }\n\n getUri(config) {\n config = mergeConfig(this.defaults, config);\n const fullPath = buildFullPath(config.baseURL, config.url);\n return buildURL(fullPath, config.params, config.paramsSerializer);\n }\n}\n\n// Provide aliases for supported request methods\nutils.forEach(['delete', 'get', 'head', 'options'], function forEachMethodNoData(method) {\n /*eslint func-names:0*/\n Axios.prototype[method] = function(url, config) {\n return this.request(mergeConfig(config || {}, {\n method,\n url,\n data: (config || {}).data\n }));\n };\n});\n\nutils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {\n /*eslint func-names:0*/\n\n function generateHTTPMethod(isForm) {\n return function httpMethod(url, data, config) {\n return this.request(mergeConfig(config || {}, {\n method,\n headers: isForm ? {\n 'Content-Type': 'multipart/form-data'\n } : {},\n url,\n data\n }));\n };\n }\n\n Axios.prototype[method] = generateHTTPMethod();\n\n Axios.prototype[method + 'Form'] = generateHTTPMethod(true);\n});\n\nexport default Axios;\n","'use strict';\n\nimport CanceledError from './CanceledError.js';\n\n/**\n * A `CancelToken` is an object that can be used to request cancellation of an operation.\n *\n * @param {Function} executor The executor function.\n *\n * @returns {CancelToken}\n */\nclass CancelToken {\n constructor(executor) {\n if (typeof executor !== 'function') {\n throw new TypeError('executor must be a function.');\n }\n\n let resolvePromise;\n\n this.promise = new Promise(function promiseExecutor(resolve) {\n resolvePromise = resolve;\n });\n\n const token = this;\n\n // eslint-disable-next-line func-names\n this.promise.then(cancel => {\n if (!token._listeners) return;\n\n let i = token._listeners.length;\n\n while (i-- > 0) {\n token._listeners[i](cancel);\n }\n token._listeners = null;\n });\n\n // eslint-disable-next-line func-names\n this.promise.then = onfulfilled => {\n let _resolve;\n // eslint-disable-next-line func-names\n const promise = new Promise(resolve => {\n token.subscribe(resolve);\n _resolve = resolve;\n }).then(onfulfilled);\n\n promise.cancel = function reject() {\n token.unsubscribe(_resolve);\n };\n\n return promise;\n };\n\n executor(function cancel(message, config, request) {\n if (token.reason) {\n // Cancellation has already been requested\n return;\n }\n\n token.reason = new CanceledError(message, config, request);\n resolvePromise(token.reason);\n });\n }\n\n /**\n * Throws a `CanceledError` if cancellation has been requested.\n */\n throwIfRequested() {\n if (this.reason) {\n throw this.reason;\n }\n }\n\n /**\n * Subscribe to the cancel signal\n */\n\n subscribe(listener) {\n if (this.reason) {\n listener(this.reason);\n return;\n }\n\n if (this._listeners) {\n this._listeners.push(listener);\n } else {\n this._listeners = [listener];\n }\n }\n\n /**\n * Unsubscribe from the cancel signal\n */\n\n unsubscribe(listener) {\n if (!this._listeners) {\n return;\n }\n const index = this._listeners.indexOf(listener);\n if (index !== -1) {\n this._listeners.splice(index, 1);\n }\n }\n\n /**\n * Returns an object that contains a new `CancelToken` and a function that, when called,\n * cancels the `CancelToken`.\n */\n static source() {\n let cancel;\n const token = new CancelToken(function executor(c) {\n cancel = c;\n });\n return {\n token,\n cancel\n };\n }\n}\n\nexport default CancelToken;\n","'use strict';\n\nimport utils from './utils.js';\nimport bind from './helpers/bind.js';\nimport Axios from './core/Axios.js';\nimport mergeConfig from './core/mergeConfig.js';\nimport defaults from './defaults/index.js';\nimport formDataToJSON from './helpers/formDataToJSON.js';\nimport CanceledError from './cancel/CanceledError.js';\nimport CancelToken from './cancel/CancelToken.js';\nimport isCancel from './cancel/isCancel.js';\nimport {VERSION} from './env/data.js';\nimport toFormData from './helpers/toFormData.js';\nimport AxiosError from './core/AxiosError.js';\nimport spread from './helpers/spread.js';\nimport isAxiosError from './helpers/isAxiosError.js';\n\n/**\n * Create an instance of Axios\n *\n * @param {Object} defaultConfig The default config for the instance\n *\n * @returns {Axios} A new instance of Axios\n */\nfunction createInstance(defaultConfig) {\n const context = new Axios(defaultConfig);\n const instance = bind(Axios.prototype.request, context);\n\n // Copy axios.prototype to instance\n utils.extend(instance, Axios.prototype, context, {allOwnKeys: true});\n\n // Copy context to instance\n utils.extend(instance, context, null, {allOwnKeys: true});\n\n // Factory for creating new instances\n instance.create = function create(instanceConfig) {\n return createInstance(mergeConfig(defaultConfig, instanceConfig));\n };\n\n return instance;\n}\n\n// Create the default instance to be exported\nconst axios = createInstance(defaults);\n\n// Expose Axios class to allow class inheritance\naxios.Axios = Axios;\n\n// Expose Cancel & CancelToken\naxios.CanceledError = CanceledError;\naxios.CancelToken = CancelToken;\naxios.isCancel = isCancel;\naxios.VERSION = VERSION;\naxios.toFormData = toFormData;\n\n// Expose AxiosError class\naxios.AxiosError = AxiosError;\n\n// alias for CanceledError for backward compatibility\naxios.Cancel = axios.CanceledError;\n\n// Expose all/spread\naxios.all = function all(promises) {\n return Promise.all(promises);\n};\n\naxios.spread = spread;\n\n// Expose isAxiosError\naxios.isAxiosError = isAxiosError;\n\naxios.formToJSON = thing => {\n return formDataToJSON(utils.isHTMLForm(thing) ? new FormData(thing) : thing);\n};\n\nexport default axios\n","'use strict';\n\n/**\n * Syntactic sugar for invoking a function and expanding an array for arguments.\n *\n * Common use case would be to use `Function.prototype.apply`.\n *\n * ```js\n * function f(x, y, z) {}\n * var args = [1, 2, 3];\n * f.apply(null, args);\n * ```\n *\n * With `spread` this example can be re-written.\n *\n * ```js\n * spread(function(x, y, z) {})([1, 2, 3]);\n * ```\n *\n * @param {Function} callback\n *\n * @returns {Function}\n */\nexport default function spread(callback) {\n return function wrap(arr) {\n return callback.apply(null, arr);\n };\n}\n","'use strict';\n\nimport utils from './../utils.js';\n\n/**\n * Determines whether the payload is an error thrown by Axios\n *\n * @param {*} payload The value to test\n *\n * @returns {boolean} True if the payload is an error thrown by Axios, otherwise false\n */\nexport default function isAxiosError(payload) {\n return utils.isObject(payload) && (payload.isAxiosError === true);\n}\n"],"names":["bind","fn","thisArg","apply","arguments","toString","Object","prototype","getPrototypeOf","kindOf","cache","create","thing","str","call","slice","toLowerCase","kindOfTest","type","typeOfTest","isArray","Array","isUndefined","isArrayBuffer","isString","isFunction","isNumber","isObject","isPlainObject","val","Symbol","toStringTag","iterator","isDate","isFile","isBlob","isFileList","isURLSearchParams","forEach","obj","allOwnKeys","i","l","length","keys","getOwnPropertyNames","len","key","isTypedArray","TypedArray","Uint8Array","isHTMLForm","hasOwnProperty","prop","isRegExp","reduceDescriptors","reducer","descriptors","getOwnPropertyDescriptors","reducedDescriptors","descriptor","name","defineProperties","utils","isBuffer","constructor","isFormData","pattern","FormData","isArrayBufferView","result","ArrayBuffer","isView","buffer","isBoolean","isStream","pipe","merge","assignValue","extend","a","b","trim","replace","stripBOM","content","charCodeAt","inherits","superConstructor","props","defineProperty","value","assign","toFlatObject","sourceObj","destObj","filter","propFilter","merged","endsWith","searchString","position","String","undefined","lastIndex","indexOf","toArray","arr","forEachEntry","next","done","pair","matchAll","regExp","matches","exec","push","hasOwnProp","freezeMethods","enumerable","writable","set","Error","toObjectSet","arrayOrString","delimiter","define","split","toCamelCase","m","p1","p2","toUpperCase","noop","toFiniteNumber","defaultValue","Number","isFinite","AxiosError","message","code","config","request","response","this","captureStackTrace","stack","toJSON","description","number","fileName","lineNumber","columnNumber","status","from","error","customProps","axiosError","cause","browser","self","window","isVisitable","removeBrackets","renderKey","path","dots","concat","map","token","join","predicates","test","toFormData","formData","options","TypeError","envFormData","metaTokens","indexes","option","source","visitor","defaultVisitor","useBlob","Blob","append","convertValue","toISOString","Buffer","JSON","stringify","some","isFlatArray","el","index","exposedHelpers","build","pop","encode","charMap","encodeURIComponent","match","AxiosURLSearchParams","params","_pairs","buildURL","url","_encode","serializeFn","serialize","serializedParams","hashmarkIndex","encoder","InterceptorManager","handlers","use","fulfilled","rejected","synchronous","runWhen","eject","id","clear","h","transitionalDefaults","silentJSONParsing","forcedJSONParsing","clarifyTimeoutError","URLSearchParams$1","URLSearchParams","FormData$1","isStandardBrowserEnv","product","navigator","document","platform","isBrowser","classes","protocols","formDataToJSON","buildPath","target","isNumericKey","isLast","arrayToObject","entries","parsePropPath","cookies","write","expires","domain","secure","cookie","Date","toGMTString","read","RegExp","decodeURIComponent","remove","now","buildFullPath","baseURL","requestedURL","relativeURL","combineURLs","isURLSameOrigin","msie","userAgent","urlParsingNode","createElement","originURL","resolveURL","href","setAttribute","protocol","host","search","hash","hostname","port","pathname","charAt","location","requestURL","parsed","CanceledError","ERR_CANCELED","__CANCEL__","ignoreDuplicateOf","$internals","$defaults","normalizeHeader","header","normalizeValue","matchHeaderValue","context","findKey","_key","AxiosHeaders","headers","defaults","progressEventReducer","listener","isDownloadStream","bytesNotified","_speedometer","samplesCount","min","bytes","timestamps","firstSampleTS","head","tail","chunkLength","startedAt","bytesCount","passed","Math","round","speedometer","e","loaded","total","lengthComputable","progressBytes","rate","data","progress","estimated","xhrAdapter","Promise","resolve","reject","requestData","requestHeaders","normalize","responseType","onCanceled","cancelToken","unsubscribe","signal","removeEventListener","setContentType","XMLHttpRequest","auth","username","password","unescape","btoa","fullPath","onloadend","responseHeaders","getAllResponseHeaders","validateStatus","ERR_BAD_REQUEST","ERR_BAD_RESPONSE","floor","settle","err","responseText","statusText","open","method","paramsSerializer","timeout","onreadystatechange","readyState","responseURL","setTimeout","onabort","ECONNABORTED","onerror","ERR_NETWORK","ontimeout","timeoutErrorMessage","transitional","ETIMEDOUT","xsrfValue","withCredentials","xsrfCookieName","xsrfHeaderName","setRequestHeader","onDownloadProgress","addEventListener","onUploadProgress","upload","cancel","abort","subscribe","aborted","parseProtocol","send","valueOrRewrite","rewrite","setHeader","_value","_header","_rewrite","lHeader","get","parser","tokens","tokensRE","parseTokens","has","matcher","delete","deleted","deleteHeader","format","normalized","w","char","formatHeader","asStrings","rawHeaders","line","substring","parseHeaders","accessor","accessors","defineAccessor","accessorName","methodName","arg1","arg2","arg3","configurable","buildAccessors","adapters","http","httpAdapter","xhr","adapters$1","nameOrAdapter","adapter","DEFAULT_CONTENT_TYPE","process","getDefaultAdapter","transformRequest","contentType","getContentType","hasJSONContentType","isObjectPayload","helpers","isNode","toURLEncodedForm","formSerializer","_FormData","env","rawValue","parse","stringifySafely","transformResponse","JSONRequested","strictJSONParsing","maxContentLength","maxBodyLength","common","Accept","transformData","fns","isCancel","throwIfCancellationRequested","throwIfRequested","dispatchRequest","then","reason","mergeConfig","config1","config2","getMergedValue","mergeDeepProperties","valueFromConfig2","defaultToConfig2","mergeDirectKeys","mergeMap","timeoutMessage","decompress","beforeRedirect","transport","httpAgent","httpsAgent","socketPath","responseEncoding","configValue","validators","deprecatedWarnings","validator","version","formatMessage","opt","desc","opts","ERR_DEPRECATED","console","warn","assertOptions","schema","allowUnknown","ERR_BAD_OPTION_VALUE","ERR_BAD_OPTION","Axios","instanceConfig","interceptors","configOrUrl","boolean","function","defaultHeaders","requestInterceptorChain","synchronousRequestInterceptors","interceptor","unshift","responseInterceptorChain","promise","chain","newConfig","onFulfilled","onRejected","getUri","generateHTTPMethod","isForm","CancelToken","executor","resolvePromise","_listeners","onfulfilled","_resolve","splice","static","c","axios","createInstance","defaultConfig","instance","VERSION","Cancel","all","promises","spread","callback","isAxiosError","payload","formToJSON"],"mappings":"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"} \ No newline at end of file
diff --git a/node_modules/axios/dist/node/axios.cjs b/node_modules/axios/dist/node/axios.cjs
new file mode 100644
index 0000000..4c641b7
--- /dev/null
+++ b/node_modules/axios/dist/node/axios.cjs
@@ -0,0 +1,3764 @@
+// Axios v1.1.3 Copyright (c) 2022 Matt Zabriskie and contributors
+'use strict';
+
+const FormData$1 = require('form-data');
+const url = require('url');
+const proxyFromEnv = require('proxy-from-env');
+const http = require('http');
+const https = require('https');
+const followRedirects = require('follow-redirects');
+const zlib = require('zlib');
+const stream = require('stream');
+const EventEmitter = require('events');
+
+function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
+
+const FormData__default = /*#__PURE__*/_interopDefaultLegacy(FormData$1);
+const url__default = /*#__PURE__*/_interopDefaultLegacy(url);
+const http__default = /*#__PURE__*/_interopDefaultLegacy(http);
+const https__default = /*#__PURE__*/_interopDefaultLegacy(https);
+const followRedirects__default = /*#__PURE__*/_interopDefaultLegacy(followRedirects);
+const zlib__default = /*#__PURE__*/_interopDefaultLegacy(zlib);
+const stream__default = /*#__PURE__*/_interopDefaultLegacy(stream);
+const EventEmitter__default = /*#__PURE__*/_interopDefaultLegacy(EventEmitter);
+
+function bind(fn, thisArg) {
+ return function wrap() {
+ return fn.apply(thisArg, arguments);
+ };
+}
+
+// utils is a library of generic helper functions non-specific to axios
+
+const {toString} = Object.prototype;
+const {getPrototypeOf} = Object;
+
+const kindOf = (cache => thing => {
+ const str = toString.call(thing);
+ return cache[str] || (cache[str] = str.slice(8, -1).toLowerCase());
+})(Object.create(null));
+
+const kindOfTest = (type) => {
+ type = type.toLowerCase();
+ return (thing) => kindOf(thing) === type
+};
+
+const typeOfTest = type => thing => typeof thing === type;
+
+/**
+ * Determine if a value is an Array
+ *
+ * @param {Object} val The value to test
+ *
+ * @returns {boolean} True if value is an Array, otherwise false
+ */
+const {isArray} = Array;
+
+/**
+ * Determine if a value is undefined
+ *
+ * @param {*} val The value to test
+ *
+ * @returns {boolean} True if the value is undefined, otherwise false
+ */
+const isUndefined = typeOfTest('undefined');
+
+/**
+ * Determine if a value is a Buffer
+ *
+ * @param {*} val The value to test
+ *
+ * @returns {boolean} True if value is a Buffer, otherwise false
+ */
+function isBuffer(val) {
+ return val !== null && !isUndefined(val) && val.constructor !== null && !isUndefined(val.constructor)
+ && isFunction(val.constructor.isBuffer) && val.constructor.isBuffer(val);
+}
+
+/**
+ * Determine if a value is an ArrayBuffer
+ *
+ * @param {*} val The value to test
+ *
+ * @returns {boolean} True if value is an ArrayBuffer, otherwise false
+ */
+const isArrayBuffer = kindOfTest('ArrayBuffer');
+
+
+/**
+ * Determine if a value is a view on an ArrayBuffer
+ *
+ * @param {*} val The value to test
+ *
+ * @returns {boolean} True if value is a view on an ArrayBuffer, otherwise false
+ */
+function isArrayBufferView(val) {
+ let result;
+ if ((typeof ArrayBuffer !== 'undefined') && (ArrayBuffer.isView)) {
+ result = ArrayBuffer.isView(val);
+ } else {
+ result = (val) && (val.buffer) && (isArrayBuffer(val.buffer));
+ }
+ return result;
+}
+
+/**
+ * Determine if a value is a String
+ *
+ * @param {*} val The value to test
+ *
+ * @returns {boolean} True if value is a String, otherwise false
+ */
+const isString = typeOfTest('string');
+
+/**
+ * Determine if a value is a Function
+ *
+ * @param {*} val The value to test
+ * @returns {boolean} True if value is a Function, otherwise false
+ */
+const isFunction = typeOfTest('function');
+
+/**
+ * Determine if a value is a Number
+ *
+ * @param {*} val The value to test
+ *
+ * @returns {boolean} True if value is a Number, otherwise false
+ */
+const isNumber = typeOfTest('number');
+
+/**
+ * Determine if a value is an Object
+ *
+ * @param {*} thing The value to test
+ *
+ * @returns {boolean} True if value is an Object, otherwise false
+ */
+const isObject = (thing) => thing !== null && typeof thing === 'object';
+
+/**
+ * Determine if a value is a Boolean
+ *
+ * @param {*} thing The value to test
+ * @returns {boolean} True if value is a Boolean, otherwise false
+ */
+const isBoolean = thing => thing === true || thing === false;
+
+/**
+ * Determine if a value is a plain Object
+ *
+ * @param {*} val The value to test
+ *
+ * @returns {boolean} True if value is a plain Object, otherwise false
+ */
+const isPlainObject = (val) => {
+ if (kindOf(val) !== 'object') {
+ return false;
+ }
+
+ const prototype = getPrototypeOf(val);
+ return (prototype === null || prototype === Object.prototype || Object.getPrototypeOf(prototype) === null) && !(Symbol.toStringTag in val) && !(Symbol.iterator in val);
+};
+
+/**
+ * Determine if a value is a Date
+ *
+ * @param {*} val The value to test
+ *
+ * @returns {boolean} True if value is a Date, otherwise false
+ */
+const isDate = kindOfTest('Date');
+
+/**
+ * Determine if a value is a File
+ *
+ * @param {*} val The value to test
+ *
+ * @returns {boolean} True if value is a File, otherwise false
+ */
+const isFile = kindOfTest('File');
+
+/**
+ * Determine if a value is a Blob
+ *
+ * @param {*} val The value to test
+ *
+ * @returns {boolean} True if value is a Blob, otherwise false
+ */
+const isBlob = kindOfTest('Blob');
+
+/**
+ * Determine if a value is a FileList
+ *
+ * @param {*} val The value to test
+ *
+ * @returns {boolean} True if value is a File, otherwise false
+ */
+const isFileList = kindOfTest('FileList');
+
+/**
+ * Determine if a value is a Stream
+ *
+ * @param {*} val The value to test
+ *
+ * @returns {boolean} True if value is a Stream, otherwise false
+ */
+const isStream = (val) => isObject(val) && isFunction(val.pipe);
+
+/**
+ * Determine if a value is a FormData
+ *
+ * @param {*} thing The value to test
+ *
+ * @returns {boolean} True if value is an FormData, otherwise false
+ */
+const isFormData = (thing) => {
+ const pattern = '[object FormData]';
+ return thing && (
+ (typeof FormData === 'function' && thing instanceof FormData) ||
+ toString.call(thing) === pattern ||
+ (isFunction(thing.toString) && thing.toString() === pattern)
+ );
+};
+
+/**
+ * Determine if a value is a URLSearchParams object
+ *
+ * @param {*} val The value to test
+ *
+ * @returns {boolean} True if value is a URLSearchParams object, otherwise false
+ */
+const isURLSearchParams = kindOfTest('URLSearchParams');
+
+/**
+ * Trim excess whitespace off the beginning and end of a string
+ *
+ * @param {String} str The String to trim
+ *
+ * @returns {String} The String freed of excess whitespace
+ */
+const trim = (str) => str.trim ?
+ str.trim() : str.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, '');
+
+/**
+ * Iterate over an Array or an Object invoking a function for each item.
+ *
+ * If `obj` is an Array callback will be called passing
+ * the value, index, and complete array for each item.
+ *
+ * If 'obj' is an Object callback will be called passing
+ * the value, key, and complete object for each property.
+ *
+ * @param {Object|Array} obj The object to iterate
+ * @param {Function} fn The callback to invoke for each item
+ *
+ * @param {Boolean} [allOwnKeys = false]
+ * @returns {void}
+ */
+function forEach(obj, fn, {allOwnKeys = false} = {}) {
+ // Don't bother if no value provided
+ if (obj === null || typeof obj === 'undefined') {
+ return;
+ }
+
+ let i;
+ let l;
+
+ // Force an array if not already something iterable
+ if (typeof obj !== 'object') {
+ /*eslint no-param-reassign:0*/
+ obj = [obj];
+ }
+
+ if (isArray(obj)) {
+ // Iterate over array values
+ for (i = 0, l = obj.length; i < l; i++) {
+ fn.call(null, obj[i], i, obj);
+ }
+ } else {
+ // Iterate over object keys
+ const keys = allOwnKeys ? Object.getOwnPropertyNames(obj) : Object.keys(obj);
+ const len = keys.length;
+ let key;
+
+ for (i = 0; i < len; i++) {
+ key = keys[i];
+ fn.call(null, obj[key], key, obj);
+ }
+ }
+}
+
+/**
+ * Accepts varargs expecting each argument to be an object, then
+ * immutably merges the properties of each object and returns result.
+ *
+ * When multiple objects contain the same key the later object in
+ * the arguments list will take precedence.
+ *
+ * Example:
+ *
+ * ```js
+ * var result = merge({foo: 123}, {foo: 456});
+ * console.log(result.foo); // outputs 456
+ * ```
+ *
+ * @param {Object} obj1 Object to merge
+ *
+ * @returns {Object} Result of all merge properties
+ */
+function merge(/* obj1, obj2, obj3, ... */) {
+ const result = {};
+ const assignValue = (val, key) => {
+ if (isPlainObject(result[key]) && isPlainObject(val)) {
+ result[key] = merge(result[key], val);
+ } else if (isPlainObject(val)) {
+ result[key] = merge({}, val);
+ } else if (isArray(val)) {
+ result[key] = val.slice();
+ } else {
+ result[key] = val;
+ }
+ };
+
+ for (let i = 0, l = arguments.length; i < l; i++) {
+ arguments[i] && forEach(arguments[i], assignValue);
+ }
+ return result;
+}
+
+/**
+ * Extends object a by mutably adding to it the properties of object b.
+ *
+ * @param {Object} a The object to be extended
+ * @param {Object} b The object to copy properties from
+ * @param {Object} thisArg The object to bind function to
+ *
+ * @param {Boolean} [allOwnKeys]
+ * @returns {Object} The resulting value of object a
+ */
+const extend = (a, b, thisArg, {allOwnKeys}= {}) => {
+ forEach(b, (val, key) => {
+ if (thisArg && isFunction(val)) {
+ a[key] = bind(val, thisArg);
+ } else {
+ a[key] = val;
+ }
+ }, {allOwnKeys});
+ return a;
+};
+
+/**
+ * Remove byte order marker. This catches EF BB BF (the UTF-8 BOM)
+ *
+ * @param {string} content with BOM
+ *
+ * @returns {string} content value without BOM
+ */
+const stripBOM = (content) => {
+ if (content.charCodeAt(0) === 0xFEFF) {
+ content = content.slice(1);
+ }
+ return content;
+};
+
+/**
+ * Inherit the prototype methods from one constructor into another
+ * @param {function} constructor
+ * @param {function} superConstructor
+ * @param {object} [props]
+ * @param {object} [descriptors]
+ *
+ * @returns {void}
+ */
+const inherits = (constructor, superConstructor, props, descriptors) => {
+ constructor.prototype = Object.create(superConstructor.prototype, descriptors);
+ constructor.prototype.constructor = constructor;
+ Object.defineProperty(constructor, 'super', {
+ value: superConstructor.prototype
+ });
+ props && Object.assign(constructor.prototype, props);
+};
+
+/**
+ * Resolve object with deep prototype chain to a flat object
+ * @param {Object} sourceObj source object
+ * @param {Object} [destObj]
+ * @param {Function|Boolean} [filter]
+ * @param {Function} [propFilter]
+ *
+ * @returns {Object}
+ */
+const toFlatObject = (sourceObj, destObj, filter, propFilter) => {
+ let props;
+ let i;
+ let prop;
+ const merged = {};
+
+ destObj = destObj || {};
+ // eslint-disable-next-line no-eq-null,eqeqeq
+ if (sourceObj == null) return destObj;
+
+ do {
+ props = Object.getOwnPropertyNames(sourceObj);
+ i = props.length;
+ while (i-- > 0) {
+ prop = props[i];
+ if ((!propFilter || propFilter(prop, sourceObj, destObj)) && !merged[prop]) {
+ destObj[prop] = sourceObj[prop];
+ merged[prop] = true;
+ }
+ }
+ sourceObj = filter !== false && getPrototypeOf(sourceObj);
+ } while (sourceObj && (!filter || filter(sourceObj, destObj)) && sourceObj !== Object.prototype);
+
+ return destObj;
+};
+
+/**
+ * Determines whether a string ends with the characters of a specified string
+ *
+ * @param {String} str
+ * @param {String} searchString
+ * @param {Number} [position= 0]
+ *
+ * @returns {boolean}
+ */
+const endsWith = (str, searchString, position) => {
+ str = String(str);
+ if (position === undefined || position > str.length) {
+ position = str.length;
+ }
+ position -= searchString.length;
+ const lastIndex = str.indexOf(searchString, position);
+ return lastIndex !== -1 && lastIndex === position;
+};
+
+
+/**
+ * Returns new array from array like object or null if failed
+ *
+ * @param {*} [thing]
+ *
+ * @returns {?Array}
+ */
+const toArray = (thing) => {
+ if (!thing) return null;
+ if (isArray(thing)) return thing;
+ let i = thing.length;
+ if (!isNumber(i)) return null;
+ const arr = new Array(i);
+ while (i-- > 0) {
+ arr[i] = thing[i];
+ }
+ return arr;
+};
+
+/**
+ * Checking if the Uint8Array exists and if it does, it returns a function that checks if the
+ * thing passed in is an instance of Uint8Array
+ *
+ * @param {TypedArray}
+ *
+ * @returns {Array}
+ */
+// eslint-disable-next-line func-names
+const isTypedArray = (TypedArray => {
+ // eslint-disable-next-line func-names
+ return thing => {
+ return TypedArray && thing instanceof TypedArray;
+ };
+})(typeof Uint8Array !== 'undefined' && getPrototypeOf(Uint8Array));
+
+/**
+ * For each entry in the object, call the function with the key and value.
+ *
+ * @param {Object<any, any>} obj - The object to iterate over.
+ * @param {Function} fn - The function to call for each entry.
+ *
+ * @returns {void}
+ */
+const forEachEntry = (obj, fn) => {
+ const generator = obj && obj[Symbol.iterator];
+
+ const iterator = generator.call(obj);
+
+ let result;
+
+ while ((result = iterator.next()) && !result.done) {
+ const pair = result.value;
+ fn.call(obj, pair[0], pair[1]);
+ }
+};
+
+/**
+ * It takes a regular expression and a string, and returns an array of all the matches
+ *
+ * @param {string} regExp - The regular expression to match against.
+ * @param {string} str - The string to search.
+ *
+ * @returns {Array<boolean>}
+ */
+const matchAll = (regExp, str) => {
+ let matches;
+ const arr = [];
+
+ while ((matches = regExp.exec(str)) !== null) {
+ arr.push(matches);
+ }
+
+ return arr;
+};
+
+/* Checking if the kindOfTest function returns true when passed an HTMLFormElement. */
+const isHTMLForm = kindOfTest('HTMLFormElement');
+
+const toCamelCase = str => {
+ return str.toLowerCase().replace(/[_-\s]([a-z\d])(\w*)/g,
+ function replacer(m, p1, p2) {
+ return p1.toUpperCase() + p2;
+ }
+ );
+};
+
+/* Creating a function that will check if an object has a property. */
+const hasOwnProperty = (({hasOwnProperty}) => (obj, prop) => hasOwnProperty.call(obj, prop))(Object.prototype);
+
+/**
+ * Determine if a value is a RegExp object
+ *
+ * @param {*} val The value to test
+ *
+ * @returns {boolean} True if value is a RegExp object, otherwise false
+ */
+const isRegExp = kindOfTest('RegExp');
+
+const reduceDescriptors = (obj, reducer) => {
+ const descriptors = Object.getOwnPropertyDescriptors(obj);
+ const reducedDescriptors = {};
+
+ forEach(descriptors, (descriptor, name) => {
+ if (reducer(descriptor, name, obj) !== false) {
+ reducedDescriptors[name] = descriptor;
+ }
+ });
+
+ Object.defineProperties(obj, reducedDescriptors);
+};
+
+/**
+ * Makes all methods read-only
+ * @param {Object} obj
+ */
+
+const freezeMethods = (obj) => {
+ reduceDescriptors(obj, (descriptor, name) => {
+ const value = obj[name];
+
+ if (!isFunction(value)) return;
+
+ descriptor.enumerable = false;
+
+ if ('writable' in descriptor) {
+ descriptor.writable = false;
+ return;
+ }
+
+ if (!descriptor.set) {
+ descriptor.set = () => {
+ throw Error('Can not read-only method \'' + name + '\'');
+ };
+ }
+ });
+};
+
+const toObjectSet = (arrayOrString, delimiter) => {
+ const obj = {};
+
+ const define = (arr) => {
+ arr.forEach(value => {
+ obj[value] = true;
+ });
+ };
+
+ isArray(arrayOrString) ? define(arrayOrString) : define(String(arrayOrString).split(delimiter));
+
+ return obj;
+};
+
+const noop = () => {};
+
+const toFiniteNumber = (value, defaultValue) => {
+ value = +value;
+ return Number.isFinite(value) ? value : defaultValue;
+};
+
+const utils = {
+ isArray,
+ isArrayBuffer,
+ isBuffer,
+ isFormData,
+ isArrayBufferView,
+ isString,
+ isNumber,
+ isBoolean,
+ isObject,
+ isPlainObject,
+ isUndefined,
+ isDate,
+ isFile,
+ isBlob,
+ isRegExp,
+ isFunction,
+ isStream,
+ isURLSearchParams,
+ isTypedArray,
+ isFileList,
+ forEach,
+ merge,
+ extend,
+ trim,
+ stripBOM,
+ inherits,
+ toFlatObject,
+ kindOf,
+ kindOfTest,
+ endsWith,
+ toArray,
+ forEachEntry,
+ matchAll,
+ isHTMLForm,
+ hasOwnProperty,
+ hasOwnProp: hasOwnProperty, // an alias to avoid ESLint no-prototype-builtins detection
+ reduceDescriptors,
+ freezeMethods,
+ toObjectSet,
+ toCamelCase,
+ noop,
+ toFiniteNumber
+};
+
+/**
+ * Create an Error with the specified message, config, error code, request and response.
+ *
+ * @param {string} message The error message.
+ * @param {string} [code] The error code (for example, 'ECONNABORTED').
+ * @param {Object} [config] The config.
+ * @param {Object} [request] The request.
+ * @param {Object} [response] The response.
+ *
+ * @returns {Error} The created error.
+ */
+function AxiosError(message, code, config, request, response) {
+ Error.call(this);
+
+ if (Error.captureStackTrace) {
+ Error.captureStackTrace(this, this.constructor);
+ } else {
+ this.stack = (new Error()).stack;
+ }
+
+ this.message = message;
+ this.name = 'AxiosError';
+ code && (this.code = code);
+ config && (this.config = config);
+ request && (this.request = request);
+ response && (this.response = response);
+}
+
+utils.inherits(AxiosError, Error, {
+ toJSON: function toJSON() {
+ return {
+ // Standard
+ message: this.message,
+ name: this.name,
+ // Microsoft
+ description: this.description,
+ number: this.number,
+ // Mozilla
+ fileName: this.fileName,
+ lineNumber: this.lineNumber,
+ columnNumber: this.columnNumber,
+ stack: this.stack,
+ // Axios
+ config: this.config,
+ code: this.code,
+ status: this.response && this.response.status ? this.response.status : null
+ };
+ }
+});
+
+const prototype$1 = AxiosError.prototype;
+const descriptors = {};
+
+[
+ 'ERR_BAD_OPTION_VALUE',
+ 'ERR_BAD_OPTION',
+ 'ECONNABORTED',
+ 'ETIMEDOUT',
+ 'ERR_NETWORK',
+ 'ERR_FR_TOO_MANY_REDIRECTS',
+ 'ERR_DEPRECATED',
+ 'ERR_BAD_RESPONSE',
+ 'ERR_BAD_REQUEST',
+ 'ERR_CANCELED',
+ 'ERR_NOT_SUPPORT',
+ 'ERR_INVALID_URL'
+// eslint-disable-next-line func-names
+].forEach(code => {
+ descriptors[code] = {value: code};
+});
+
+Object.defineProperties(AxiosError, descriptors);
+Object.defineProperty(prototype$1, 'isAxiosError', {value: true});
+
+// eslint-disable-next-line func-names
+AxiosError.from = (error, code, config, request, response, customProps) => {
+ const axiosError = Object.create(prototype$1);
+
+ utils.toFlatObject(error, axiosError, function filter(obj) {
+ return obj !== Error.prototype;
+ }, prop => {
+ return prop !== 'isAxiosError';
+ });
+
+ AxiosError.call(axiosError, error.message, code, config, request, response);
+
+ axiosError.cause = error;
+
+ axiosError.name = error.name;
+
+ customProps && Object.assign(axiosError, customProps);
+
+ return axiosError;
+};
+
+/**
+ * Determines if the given thing is a array or js object.
+ *
+ * @param {string} thing - The object or array to be visited.
+ *
+ * @returns {boolean}
+ */
+function isVisitable(thing) {
+ return utils.isPlainObject(thing) || utils.isArray(thing);
+}
+
+/**
+ * It removes the brackets from the end of a string
+ *
+ * @param {string} key - The key of the parameter.
+ *
+ * @returns {string} the key without the brackets.
+ */
+function removeBrackets(key) {
+ return utils.endsWith(key, '[]') ? key.slice(0, -2) : key;
+}
+
+/**
+ * It takes a path, a key, and a boolean, and returns a string
+ *
+ * @param {string} path - The path to the current key.
+ * @param {string} key - The key of the current object being iterated over.
+ * @param {string} dots - If true, the key will be rendered with dots instead of brackets.
+ *
+ * @returns {string} The path to the current key.
+ */
+function renderKey(path, key, dots) {
+ if (!path) return key;
+ return path.concat(key).map(function each(token, i) {
+ // eslint-disable-next-line no-param-reassign
+ token = removeBrackets(token);
+ return !dots && i ? '[' + token + ']' : token;
+ }).join(dots ? '.' : '');
+}
+
+/**
+ * If the array is an array and none of its elements are visitable, then it's a flat array.
+ *
+ * @param {Array<any>} arr - The array to check
+ *
+ * @returns {boolean}
+ */
+function isFlatArray(arr) {
+ return utils.isArray(arr) && !arr.some(isVisitable);
+}
+
+const predicates = utils.toFlatObject(utils, {}, null, function filter(prop) {
+ return /^is[A-Z]/.test(prop);
+});
+
+/**
+ * If the thing is a FormData object, return true, otherwise return false.
+ *
+ * @param {unknown} thing - The thing to check.
+ *
+ * @returns {boolean}
+ */
+function isSpecCompliant(thing) {
+ return thing && utils.isFunction(thing.append) && thing[Symbol.toStringTag] === 'FormData' && thing[Symbol.iterator];
+}
+
+/**
+ * Convert a data object to FormData
+ *
+ * @param {Object} obj
+ * @param {?Object} [formData]
+ * @param {?Object} [options]
+ * @param {Function} [options.visitor]
+ * @param {Boolean} [options.metaTokens = true]
+ * @param {Boolean} [options.dots = false]
+ * @param {?Boolean} [options.indexes = false]
+ *
+ * @returns {Object}
+ **/
+
+/**
+ * It converts an object into a FormData object
+ *
+ * @param {Object<any, any>} obj - The object to convert to form data.
+ * @param {string} formData - The FormData object to append to.
+ * @param {Object<string, any>} options
+ *
+ * @returns
+ */
+function toFormData(obj, formData, options) {
+ if (!utils.isObject(obj)) {
+ throw new TypeError('target must be an object');
+ }
+
+ // eslint-disable-next-line no-param-reassign
+ formData = formData || new (FormData__default["default"] || FormData)();
+
+ // eslint-disable-next-line no-param-reassign
+ options = utils.toFlatObject(options, {
+ metaTokens: true,
+ dots: false,
+ indexes: false
+ }, false, function defined(option, source) {
+ // eslint-disable-next-line no-eq-null,eqeqeq
+ return !utils.isUndefined(source[option]);
+ });
+
+ const metaTokens = options.metaTokens;
+ // eslint-disable-next-line no-use-before-define
+ const visitor = options.visitor || defaultVisitor;
+ const dots = options.dots;
+ const indexes = options.indexes;
+ const _Blob = options.Blob || typeof Blob !== 'undefined' && Blob;
+ const useBlob = _Blob && isSpecCompliant(formData);
+
+ if (!utils.isFunction(visitor)) {
+ throw new TypeError('visitor must be a function');
+ }
+
+ function convertValue(value) {
+ if (value === null) return '';
+
+ if (utils.isDate(value)) {
+ return value.toISOString();
+ }
+
+ if (!useBlob && utils.isBlob(value)) {
+ throw new AxiosError('Blob is not supported. Use a Buffer instead.');
+ }
+
+ if (utils.isArrayBuffer(value) || utils.isTypedArray(value)) {
+ return useBlob && typeof Blob === 'function' ? new Blob([value]) : Buffer.from(value);
+ }
+
+ return value;
+ }
+
+ /**
+ * Default visitor.
+ *
+ * @param {*} value
+ * @param {String|Number} key
+ * @param {Array<String|Number>} path
+ * @this {FormData}
+ *
+ * @returns {boolean} return true to visit the each prop of the value recursively
+ */
+ function defaultVisitor(value, key, path) {
+ let arr = value;
+
+ if (value && !path && typeof value === 'object') {
+ if (utils.endsWith(key, '{}')) {
+ // eslint-disable-next-line no-param-reassign
+ key = metaTokens ? key : key.slice(0, -2);
+ // eslint-disable-next-line no-param-reassign
+ value = JSON.stringify(value);
+ } else if (
+ (utils.isArray(value) && isFlatArray(value)) ||
+ (utils.isFileList(value) || utils.endsWith(key, '[]') && (arr = utils.toArray(value))
+ )) {
+ // eslint-disable-next-line no-param-reassign
+ key = removeBrackets(key);
+
+ arr.forEach(function each(el, index) {
+ !(utils.isUndefined(el) || el === null) && formData.append(
+ // eslint-disable-next-line no-nested-ternary
+ indexes === true ? renderKey([key], index, dots) : (indexes === null ? key : key + '[]'),
+ convertValue(el)
+ );
+ });
+ return false;
+ }
+ }
+
+ if (isVisitable(value)) {
+ return true;
+ }
+
+ formData.append(renderKey(path, key, dots), convertValue(value));
+
+ return false;
+ }
+
+ const stack = [];
+
+ const exposedHelpers = Object.assign(predicates, {
+ defaultVisitor,
+ convertValue,
+ isVisitable
+ });
+
+ function build(value, path) {
+ if (utils.isUndefined(value)) return;
+
+ if (stack.indexOf(value) !== -1) {
+ throw Error('Circular reference detected in ' + path.join('.'));
+ }
+
+ stack.push(value);
+
+ utils.forEach(value, function each(el, key) {
+ const result = !(utils.isUndefined(el) || el === null) && visitor.call(
+ formData, el, utils.isString(key) ? key.trim() : key, path, exposedHelpers
+ );
+
+ if (result === true) {
+ build(el, path ? path.concat(key) : [key]);
+ }
+ });
+
+ stack.pop();
+ }
+
+ if (!utils.isObject(obj)) {
+ throw new TypeError('data must be an object');
+ }
+
+ build(obj);
+
+ return formData;
+}
+
+/**
+ * It encodes a string by replacing all characters that are not in the unreserved set with
+ * their percent-encoded equivalents
+ *
+ * @param {string} str - The string to encode.
+ *
+ * @returns {string} The encoded string.
+ */
+function encode$1(str) {
+ const charMap = {
+ '!': '%21',
+ "'": '%27',
+ '(': '%28',
+ ')': '%29',
+ '~': '%7E',
+ '%20': '+',
+ '%00': '\x00'
+ };
+ return encodeURIComponent(str).replace(/[!'()~]|%20|%00/g, function replacer(match) {
+ return charMap[match];
+ });
+}
+
+/**
+ * It takes a params object and converts it to a FormData object
+ *
+ * @param {Object<string, any>} params - The parameters to be converted to a FormData object.
+ * @param {Object<string, any>} options - The options object passed to the Axios constructor.
+ *
+ * @returns {void}
+ */
+function AxiosURLSearchParams(params, options) {
+ this._pairs = [];
+
+ params && toFormData(params, this, options);
+}
+
+const prototype = AxiosURLSearchParams.prototype;
+
+prototype.append = function append(name, value) {
+ this._pairs.push([name, value]);
+};
+
+prototype.toString = function toString(encoder) {
+ const _encode = encoder ? function(value) {
+ return encoder.call(this, value, encode$1);
+ } : encode$1;
+
+ return this._pairs.map(function each(pair) {
+ return _encode(pair[0]) + '=' + _encode(pair[1]);
+ }, '').join('&');
+};
+
+/**
+ * It replaces all instances of the characters `:`, `$`, `,`, `+`, `[`, and `]` with their
+ * URI encoded counterparts
+ *
+ * @param {string} val The value to be encoded.
+ *
+ * @returns {string} The encoded value.
+ */
+function encode(val) {
+ return encodeURIComponent(val).
+ replace(/%3A/gi, ':').
+ replace(/%24/g, '$').
+ replace(/%2C/gi, ',').
+ replace(/%20/g, '+').
+ replace(/%5B/gi, '[').
+ replace(/%5D/gi, ']');
+}
+
+/**
+ * Build a URL by appending params to the end
+ *
+ * @param {string} url The base of the url (e.g., http://www.google.com)
+ * @param {object} [params] The params to be appended
+ * @param {?object} options
+ *
+ * @returns {string} The formatted url
+ */
+function buildURL(url, params, options) {
+ /*eslint no-param-reassign:0*/
+ if (!params) {
+ return url;
+ }
+
+ const _encode = options && options.encode || encode;
+
+ const serializeFn = options && options.serialize;
+
+ let serializedParams;
+
+ if (serializeFn) {
+ serializedParams = serializeFn(params, options);
+ } else {
+ serializedParams = utils.isURLSearchParams(params) ?
+ params.toString() :
+ new AxiosURLSearchParams(params, options).toString(_encode);
+ }
+
+ if (serializedParams) {
+ const hashmarkIndex = url.indexOf("#");
+
+ if (hashmarkIndex !== -1) {
+ url = url.slice(0, hashmarkIndex);
+ }
+ url += (url.indexOf('?') === -1 ? '?' : '&') + serializedParams;
+ }
+
+ return url;
+}
+
+class InterceptorManager {
+ constructor() {
+ this.handlers = [];
+ }
+
+ /**
+ * Add a new interceptor to the stack
+ *
+ * @param {Function} fulfilled The function to handle `then` for a `Promise`
+ * @param {Function} rejected The function to handle `reject` for a `Promise`
+ *
+ * @return {Number} An ID used to remove interceptor later
+ */
+ use(fulfilled, rejected, options) {
+ this.handlers.push({
+ fulfilled,
+ rejected,
+ synchronous: options ? options.synchronous : false,
+ runWhen: options ? options.runWhen : null
+ });
+ return this.handlers.length - 1;
+ }
+
+ /**
+ * Remove an interceptor from the stack
+ *
+ * @param {Number} id The ID that was returned by `use`
+ *
+ * @returns {Boolean} `true` if the interceptor was removed, `false` otherwise
+ */
+ eject(id) {
+ if (this.handlers[id]) {
+ this.handlers[id] = null;
+ }
+ }
+
+ /**
+ * Clear all interceptors from the stack
+ *
+ * @returns {void}
+ */
+ clear() {
+ if (this.handlers) {
+ this.handlers = [];
+ }
+ }
+
+ /**
+ * Iterate over all the registered interceptors
+ *
+ * This method is particularly useful for skipping over any
+ * interceptors that may have become `null` calling `eject`.
+ *
+ * @param {Function} fn The function to call for each interceptor
+ *
+ * @returns {void}
+ */
+ forEach(fn) {
+ utils.forEach(this.handlers, function forEachHandler(h) {
+ if (h !== null) {
+ fn(h);
+ }
+ });
+ }
+}
+
+const transitionalDefaults = {
+ silentJSONParsing: true,
+ forcedJSONParsing: true,
+ clarifyTimeoutError: false
+};
+
+const URLSearchParams = url__default["default"].URLSearchParams;
+
+const platform = {
+ isNode: true,
+ classes: {
+ URLSearchParams,
+ FormData: FormData__default["default"],
+ Blob: typeof Blob !== 'undefined' && Blob || null
+ },
+ protocols: [ 'http', 'https', 'file', 'data' ]
+};
+
+function toURLEncodedForm(data, options) {
+ return toFormData(data, new platform.classes.URLSearchParams(), Object.assign({
+ visitor: function(value, key, path, helpers) {
+ if (utils.isBuffer(value)) {
+ this.append(key, value.toString('base64'));
+ return false;
+ }
+
+ return helpers.defaultVisitor.apply(this, arguments);
+ }
+ }, options));
+}
+
+/**
+ * It takes a string like `foo[x][y][z]` and returns an array like `['foo', 'x', 'y', 'z']
+ *
+ * @param {string} name - The name of the property to get.
+ *
+ * @returns An array of strings.
+ */
+function parsePropPath(name) {
+ // foo[x][y][z]
+ // foo.x.y.z
+ // foo-x-y-z
+ // foo x y z
+ return utils.matchAll(/\w+|\[(\w*)]/g, name).map(match => {
+ return match[0] === '[]' ? '' : match[1] || match[0];
+ });
+}
+
+/**
+ * Convert an array to an object.
+ *
+ * @param {Array<any>} arr - The array to convert to an object.
+ *
+ * @returns An object with the same keys and values as the array.
+ */
+function arrayToObject(arr) {
+ const obj = {};
+ const keys = Object.keys(arr);
+ let i;
+ const len = keys.length;
+ let key;
+ for (i = 0; i < len; i++) {
+ key = keys[i];
+ obj[key] = arr[key];
+ }
+ return obj;
+}
+
+/**
+ * It takes a FormData object and returns a JavaScript object
+ *
+ * @param {string} formData The FormData object to convert to JSON.
+ *
+ * @returns {Object<string, any> | null} The converted object.
+ */
+function formDataToJSON(formData) {
+ function buildPath(path, value, target, index) {
+ let name = path[index++];
+ const isNumericKey = Number.isFinite(+name);
+ const isLast = index >= path.length;
+ name = !name && utils.isArray(target) ? target.length : name;
+
+ if (isLast) {
+ if (utils.hasOwnProp(target, name)) {
+ target[name] = [target[name], value];
+ } else {
+ target[name] = value;
+ }
+
+ return !isNumericKey;
+ }
+
+ if (!target[name] || !utils.isObject(target[name])) {
+ target[name] = [];
+ }
+
+ const result = buildPath(path, value, target[name], index);
+
+ if (result && utils.isArray(target[name])) {
+ target[name] = arrayToObject(target[name]);
+ }
+
+ return !isNumericKey;
+ }
+
+ if (utils.isFormData(formData) && utils.isFunction(formData.entries)) {
+ const obj = {};
+
+ utils.forEachEntry(formData, (name, value) => {
+ buildPath(parsePropPath(name), value, obj, 0);
+ });
+
+ return obj;
+ }
+
+ return null;
+}
+
+/**
+ * Resolve or reject a Promise based on response status.
+ *
+ * @param {Function} resolve A function that resolves the promise.
+ * @param {Function} reject A function that rejects the promise.
+ * @param {object} response The response.
+ *
+ * @returns {object} The response.
+ */
+function settle(resolve, reject, response) {
+ const validateStatus = response.config.validateStatus;
+ if (!response.status || !validateStatus || validateStatus(response.status)) {
+ resolve(response);
+ } else {
+ reject(new AxiosError(
+ 'Request failed with status code ' + response.status,
+ [AxiosError.ERR_BAD_REQUEST, AxiosError.ERR_BAD_RESPONSE][Math.floor(response.status / 100) - 4],
+ response.config,
+ response.request,
+ response
+ ));
+ }
+}
+
+/**
+ * Determines whether the specified URL is absolute
+ *
+ * @param {string} url The URL to test
+ *
+ * @returns {boolean} True if the specified URL is absolute, otherwise false
+ */
+function isAbsoluteURL(url) {
+ // A URL is considered absolute if it begins with "<scheme>://" or "//" (protocol-relative URL).
+ // RFC 3986 defines scheme name as a sequence of characters beginning with a letter and followed
+ // by any combination of letters, digits, plus, period, or hyphen.
+ return /^([a-z][a-z\d+\-.]*:)?\/\//i.test(url);
+}
+
+/**
+ * Creates a new URL by combining the specified URLs
+ *
+ * @param {string} baseURL The base URL
+ * @param {string} relativeURL The relative URL
+ *
+ * @returns {string} The combined URL
+ */
+function combineURLs(baseURL, relativeURL) {
+ return relativeURL
+ ? baseURL.replace(/\/+$/, '') + '/' + relativeURL.replace(/^\/+/, '')
+ : baseURL;
+}
+
+/**
+ * Creates a new URL by combining the baseURL with the requestedURL,
+ * only when the requestedURL is not already an absolute URL.
+ * If the requestURL is absolute, this function returns the requestedURL untouched.
+ *
+ * @param {string} baseURL The base URL
+ * @param {string} requestedURL Absolute or relative URL to combine
+ *
+ * @returns {string} The combined full path
+ */
+function buildFullPath(baseURL, requestedURL) {
+ if (baseURL && !isAbsoluteURL(requestedURL)) {
+ return combineURLs(baseURL, requestedURL);
+ }
+ return requestedURL;
+}
+
+const VERSION = "1.1.3";
+
+/**
+ * A `CanceledError` is an object that is thrown when an operation is canceled.
+ *
+ * @param {string=} message The message.
+ * @param {Object=} config The config.
+ * @param {Object=} request The request.
+ *
+ * @returns {CanceledError} The created error.
+ */
+function CanceledError(message, config, request) {
+ // eslint-disable-next-line no-eq-null,eqeqeq
+ AxiosError.call(this, message == null ? 'canceled' : message, AxiosError.ERR_CANCELED, config, request);
+ this.name = 'CanceledError';
+}
+
+utils.inherits(CanceledError, AxiosError, {
+ __CANCEL__: true
+});
+
+function parseProtocol(url) {
+ const match = /^([-+\w]{1,25})(:?\/\/|:)/.exec(url);
+ return match && match[1] || '';
+}
+
+const DATA_URL_PATTERN = /^(?:([^;]+);)?(?:[^;]+;)?(base64|),([\s\S]*)$/;
+
+/**
+ * Parse data uri to a Buffer or Blob
+ *
+ * @param {String} uri
+ * @param {?Boolean} asBlob
+ * @param {?Object} options
+ * @param {?Function} options.Blob
+ *
+ * @returns {Buffer|Blob}
+ */
+function fromDataURI(uri, asBlob, options) {
+ const _Blob = options && options.Blob || platform.classes.Blob;
+ const protocol = parseProtocol(uri);
+
+ if (asBlob === undefined && _Blob) {
+ asBlob = true;
+ }
+
+ if (protocol === 'data') {
+ uri = protocol.length ? uri.slice(protocol.length + 1) : uri;
+
+ const match = DATA_URL_PATTERN.exec(uri);
+
+ if (!match) {
+ throw new AxiosError('Invalid URL', AxiosError.ERR_INVALID_URL);
+ }
+
+ const mime = match[1];
+ const isBase64 = match[2];
+ const body = match[3];
+ const buffer = Buffer.from(decodeURIComponent(body), isBase64 ? 'base64' : 'utf8');
+
+ if (asBlob) {
+ if (!_Blob) {
+ throw new AxiosError('Blob is not supported', AxiosError.ERR_NOT_SUPPORT);
+ }
+
+ return new _Blob([buffer], {type: mime});
+ }
+
+ return buffer;
+ }
+
+ throw new AxiosError('Unsupported protocol ' + protocol, AxiosError.ERR_NOT_SUPPORT);
+}
+
+// RawAxiosHeaders whose duplicates are ignored by node
+// c.f. https://nodejs.org/api/http.html#http_message_headers
+const ignoreDuplicateOf = utils.toObjectSet([
+ 'age', 'authorization', 'content-length', 'content-type', 'etag',
+ 'expires', 'from', 'host', 'if-modified-since', 'if-unmodified-since',
+ 'last-modified', 'location', 'max-forwards', 'proxy-authorization',
+ 'referer', 'retry-after', 'user-agent'
+]);
+
+/**
+ * Parse headers into an object
+ *
+ * ```
+ * Date: Wed, 27 Aug 2014 08:58:49 GMT
+ * Content-Type: application/json
+ * Connection: keep-alive
+ * Transfer-Encoding: chunked
+ * ```
+ *
+ * @param {String} rawHeaders Headers needing to be parsed
+ *
+ * @returns {Object} Headers parsed into an object
+ */
+const parseHeaders = rawHeaders => {
+ const parsed = {};
+ let key;
+ let val;
+ let i;
+
+ rawHeaders && rawHeaders.split('\n').forEach(function parser(line) {
+ i = line.indexOf(':');
+ key = line.substring(0, i).trim().toLowerCase();
+ val = line.substring(i + 1).trim();
+
+ if (!key || (parsed[key] && ignoreDuplicateOf[key])) {
+ return;
+ }
+
+ if (key === 'set-cookie') {
+ if (parsed[key]) {
+ parsed[key].push(val);
+ } else {
+ parsed[key] = [val];
+ }
+ } else {
+ parsed[key] = parsed[key] ? parsed[key] + ', ' + val : val;
+ }
+ });
+
+ return parsed;
+};
+
+const $internals = Symbol('internals');
+const $defaults = Symbol('defaults');
+
+function normalizeHeader(header) {
+ return header && String(header).trim().toLowerCase();
+}
+
+function normalizeValue(value) {
+ if (value === false || value == null) {
+ return value;
+ }
+
+ return utils.isArray(value) ? value.map(normalizeValue) : String(value);
+}
+
+function parseTokens(str) {
+ const tokens = Object.create(null);
+ const tokensRE = /([^\s,;=]+)\s*(?:=\s*([^,;]+))?/g;
+ let match;
+
+ while ((match = tokensRE.exec(str))) {
+ tokens[match[1]] = match[2];
+ }
+
+ return tokens;
+}
+
+function matchHeaderValue(context, value, header, filter) {
+ if (utils.isFunction(filter)) {
+ return filter.call(this, value, header);
+ }
+
+ if (!utils.isString(value)) return;
+
+ if (utils.isString(filter)) {
+ return value.indexOf(filter) !== -1;
+ }
+
+ if (utils.isRegExp(filter)) {
+ return filter.test(value);
+ }
+}
+
+function formatHeader(header) {
+ return header.trim()
+ .toLowerCase().replace(/([a-z\d])(\w*)/g, (w, char, str) => {
+ return char.toUpperCase() + str;
+ });
+}
+
+function buildAccessors(obj, header) {
+ const accessorName = utils.toCamelCase(' ' + header);
+
+ ['get', 'set', 'has'].forEach(methodName => {
+ Object.defineProperty(obj, methodName + accessorName, {
+ value: function(arg1, arg2, arg3) {
+ return this[methodName].call(this, header, arg1, arg2, arg3);
+ },
+ configurable: true
+ });
+ });
+}
+
+function findKey(obj, key) {
+ key = key.toLowerCase();
+ const keys = Object.keys(obj);
+ let i = keys.length;
+ let _key;
+ while (i-- > 0) {
+ _key = keys[i];
+ if (key === _key.toLowerCase()) {
+ return _key;
+ }
+ }
+ return null;
+}
+
+function AxiosHeaders(headers, defaults) {
+ headers && this.set(headers);
+ this[$defaults] = defaults || null;
+}
+
+Object.assign(AxiosHeaders.prototype, {
+ set: function(header, valueOrRewrite, rewrite) {
+ const self = this;
+
+ function setHeader(_value, _header, _rewrite) {
+ const lHeader = normalizeHeader(_header);
+
+ if (!lHeader) {
+ throw new Error('header name must be a non-empty string');
+ }
+
+ const key = findKey(self, lHeader);
+
+ if (key && _rewrite !== true && (self[key] === false || _rewrite === false)) {
+ return;
+ }
+
+ self[key || _header] = normalizeValue(_value);
+ }
+
+ if (utils.isPlainObject(header)) {
+ utils.forEach(header, (_value, _header) => {
+ setHeader(_value, _header, valueOrRewrite);
+ });
+ } else {
+ setHeader(valueOrRewrite, header, rewrite);
+ }
+
+ return this;
+ },
+
+ get: function(header, parser) {
+ header = normalizeHeader(header);
+
+ if (!header) return undefined;
+
+ const key = findKey(this, header);
+
+ if (key) {
+ const value = this[key];
+
+ if (!parser) {
+ return value;
+ }
+
+ if (parser === true) {
+ return parseTokens(value);
+ }
+
+ if (utils.isFunction(parser)) {
+ return parser.call(this, value, key);
+ }
+
+ if (utils.isRegExp(parser)) {
+ return parser.exec(value);
+ }
+
+ throw new TypeError('parser must be boolean|regexp|function');
+ }
+ },
+
+ has: function(header, matcher) {
+ header = normalizeHeader(header);
+
+ if (header) {
+ const key = findKey(this, header);
+
+ return !!(key && (!matcher || matchHeaderValue(this, this[key], key, matcher)));
+ }
+
+ return false;
+ },
+
+ delete: function(header, matcher) {
+ const self = this;
+ let deleted = false;
+
+ function deleteHeader(_header) {
+ _header = normalizeHeader(_header);
+
+ if (_header) {
+ const key = findKey(self, _header);
+
+ if (key && (!matcher || matchHeaderValue(self, self[key], key, matcher))) {
+ delete self[key];
+
+ deleted = true;
+ }
+ }
+ }
+
+ if (utils.isArray(header)) {
+ header.forEach(deleteHeader);
+ } else {
+ deleteHeader(header);
+ }
+
+ return deleted;
+ },
+
+ clear: function() {
+ return Object.keys(this).forEach(this.delete.bind(this));
+ },
+
+ normalize: function(format) {
+ const self = this;
+ const headers = {};
+
+ utils.forEach(this, (value, header) => {
+ const key = findKey(headers, header);
+
+ if (key) {
+ self[key] = normalizeValue(value);
+ delete self[header];
+ return;
+ }
+
+ const normalized = format ? formatHeader(header) : String(header).trim();
+
+ if (normalized !== header) {
+ delete self[header];
+ }
+
+ self[normalized] = normalizeValue(value);
+
+ headers[normalized] = true;
+ });
+
+ return this;
+ },
+
+ toJSON: function(asStrings) {
+ const obj = Object.create(null);
+
+ utils.forEach(Object.assign({}, this[$defaults] || null, this),
+ (value, header) => {
+ if (value == null || value === false) return;
+ obj[header] = asStrings && utils.isArray(value) ? value.join(', ') : value;
+ });
+
+ return obj;
+ }
+});
+
+Object.assign(AxiosHeaders, {
+ from: function(thing) {
+ if (utils.isString(thing)) {
+ return new this(parseHeaders(thing));
+ }
+ return thing instanceof this ? thing : new this(thing);
+ },
+
+ accessor: function(header) {
+ const internals = this[$internals] = (this[$internals] = {
+ accessors: {}
+ });
+
+ const accessors = internals.accessors;
+ const prototype = this.prototype;
+
+ function defineAccessor(_header) {
+ const lHeader = normalizeHeader(_header);
+
+ if (!accessors[lHeader]) {
+ buildAccessors(prototype, _header);
+ accessors[lHeader] = true;
+ }
+ }
+
+ utils.isArray(header) ? header.forEach(defineAccessor) : defineAccessor(header);
+
+ return this;
+ }
+});
+
+AxiosHeaders.accessor(['Content-Type', 'Content-Length', 'Accept', 'Accept-Encoding', 'User-Agent']);
+
+utils.freezeMethods(AxiosHeaders.prototype);
+utils.freezeMethods(AxiosHeaders);
+
+/**
+ * Throttle decorator
+ * @param {Function} fn
+ * @param {Number} freq
+ * @return {Function}
+ */
+function throttle(fn, freq) {
+ let timestamp = 0;
+ const threshold = 1000 / freq;
+ let timer = null;
+ return function throttled(force, args) {
+ const now = Date.now();
+ if (force || now - timestamp > threshold) {
+ if (timer) {
+ clearTimeout(timer);
+ timer = null;
+ }
+ timestamp = now;
+ return fn.apply(null, args);
+ }
+ if (!timer) {
+ timer = setTimeout(() => {
+ timer = null;
+ timestamp = Date.now();
+ return fn.apply(null, args);
+ }, threshold - (now - timestamp));
+ }
+ };
+}
+
+/**
+ * Calculate data maxRate
+ * @param {Number} [samplesCount= 10]
+ * @param {Number} [min= 1000]
+ * @returns {Function}
+ */
+function speedometer(samplesCount, min) {
+ samplesCount = samplesCount || 10;
+ const bytes = new Array(samplesCount);
+ const timestamps = new Array(samplesCount);
+ let head = 0;
+ let tail = 0;
+ let firstSampleTS;
+
+ min = min !== undefined ? min : 1000;
+
+ return function push(chunkLength) {
+ const now = Date.now();
+
+ const startedAt = timestamps[tail];
+
+ if (!firstSampleTS) {
+ firstSampleTS = now;
+ }
+
+ bytes[head] = chunkLength;
+ timestamps[head] = now;
+
+ let i = tail;
+ let bytesCount = 0;
+
+ while (i !== head) {
+ bytesCount += bytes[i++];
+ i = i % samplesCount;
+ }
+
+ head = (head + 1) % samplesCount;
+
+ if (head === tail) {
+ tail = (tail + 1) % samplesCount;
+ }
+
+ if (now - firstSampleTS < min) {
+ return;
+ }
+
+ const passed = startedAt && now - startedAt;
+
+ return passed ? Math.round(bytesCount * 1000 / passed) : undefined;
+ };
+}
+
+const kInternals = Symbol('internals');
+
+class AxiosTransformStream extends stream__default["default"].Transform{
+ constructor(options) {
+ options = utils.toFlatObject(options, {
+ maxRate: 0,
+ chunkSize: 64 * 1024,
+ minChunkSize: 100,
+ timeWindow: 500,
+ ticksRate: 2,
+ samplesCount: 15
+ }, null, (prop, source) => {
+ return !utils.isUndefined(source[prop]);
+ });
+
+ super({
+ readableHighWaterMark: options.chunkSize
+ });
+
+ const self = this;
+
+ const internals = this[kInternals] = {
+ length: options.length,
+ timeWindow: options.timeWindow,
+ ticksRate: options.ticksRate,
+ chunkSize: options.chunkSize,
+ maxRate: options.maxRate,
+ minChunkSize: options.minChunkSize,
+ bytesSeen: 0,
+ isCaptured: false,
+ notifiedBytesLoaded: 0,
+ ts: Date.now(),
+ bytes: 0,
+ onReadCallback: null
+ };
+
+ const _speedometer = speedometer(internals.ticksRate * options.samplesCount, internals.timeWindow);
+
+ this.on('newListener', event => {
+ if (event === 'progress') {
+ if (!internals.isCaptured) {
+ internals.isCaptured = true;
+ }
+ }
+ });
+
+ let bytesNotified = 0;
+
+ internals.updateProgress = throttle(function throttledHandler() {
+ const totalBytes = internals.length;
+ const bytesTransferred = internals.bytesSeen;
+ const progressBytes = bytesTransferred - bytesNotified;
+ if (!progressBytes || self.destroyed) return;
+
+ const rate = _speedometer(progressBytes);
+
+ bytesNotified = bytesTransferred;
+
+ process.nextTick(() => {
+ self.emit('progress', {
+ 'loaded': bytesTransferred,
+ 'total': totalBytes,
+ 'progress': totalBytes ? (bytesTransferred / totalBytes) : undefined,
+ 'bytes': progressBytes,
+ 'rate': rate ? rate : undefined,
+ 'estimated': rate && totalBytes && bytesTransferred <= totalBytes ?
+ (totalBytes - bytesTransferred) / rate : undefined
+ });
+ });
+ }, internals.ticksRate);
+
+ const onFinish = () => {
+ internals.updateProgress(true);
+ };
+
+ this.once('end', onFinish);
+ this.once('error', onFinish);
+ }
+
+ _read(size) {
+ const internals = this[kInternals];
+
+ if (internals.onReadCallback) {
+ internals.onReadCallback();
+ }
+
+ return super._read(size);
+ }
+
+ _transform(chunk, encoding, callback) {
+ const self = this;
+ const internals = this[kInternals];
+ const maxRate = internals.maxRate;
+
+ const readableHighWaterMark = this.readableHighWaterMark;
+
+ const timeWindow = internals.timeWindow;
+
+ const divider = 1000 / timeWindow;
+ const bytesThreshold = (maxRate / divider);
+ const minChunkSize = internals.minChunkSize !== false ? Math.max(internals.minChunkSize, bytesThreshold * 0.01) : 0;
+
+ function pushChunk(_chunk, _callback) {
+ const bytes = Buffer.byteLength(_chunk);
+ internals.bytesSeen += bytes;
+ internals.bytes += bytes;
+
+ if (internals.isCaptured) {
+ internals.updateProgress();
+ }
+
+ if (self.push(_chunk)) {
+ process.nextTick(_callback);
+ } else {
+ internals.onReadCallback = () => {
+ internals.onReadCallback = null;
+ process.nextTick(_callback);
+ };
+ }
+ }
+
+ const transformChunk = (_chunk, _callback) => {
+ const chunkSize = Buffer.byteLength(_chunk);
+ let chunkRemainder = null;
+ let maxChunkSize = readableHighWaterMark;
+ let bytesLeft;
+ let passed = 0;
+
+ if (maxRate) {
+ const now = Date.now();
+
+ if (!internals.ts || (passed = (now - internals.ts)) >= timeWindow) {
+ internals.ts = now;
+ bytesLeft = bytesThreshold - internals.bytes;
+ internals.bytes = bytesLeft < 0 ? -bytesLeft : 0;
+ passed = 0;
+ }
+
+ bytesLeft = bytesThreshold - internals.bytes;
+ }
+
+ if (maxRate) {
+ if (bytesLeft <= 0) {
+ // next time window
+ return setTimeout(() => {
+ _callback(null, _chunk);
+ }, timeWindow - passed);
+ }
+
+ if (bytesLeft < maxChunkSize) {
+ maxChunkSize = bytesLeft;
+ }
+ }
+
+ if (maxChunkSize && chunkSize > maxChunkSize && (chunkSize - maxChunkSize) > minChunkSize) {
+ chunkRemainder = _chunk.subarray(maxChunkSize);
+ _chunk = _chunk.subarray(0, maxChunkSize);
+ }
+
+ pushChunk(_chunk, chunkRemainder ? () => {
+ process.nextTick(_callback, null, chunkRemainder);
+ } : _callback);
+ };
+
+ transformChunk(chunk, function transformNextChunk(err, _chunk) {
+ if (err) {
+ return callback(err);
+ }
+
+ if (_chunk) {
+ transformChunk(_chunk, transformNextChunk);
+ } else {
+ callback(null);
+ }
+ });
+ }
+
+ setLength(length) {
+ this[kInternals].length = +length;
+ return this;
+ }
+}
+
+const isBrotliSupported = utils.isFunction(zlib__default["default"].createBrotliDecompress);
+
+const {http: httpFollow, https: httpsFollow} = followRedirects__default["default"];
+
+const isHttps = /https:?/;
+
+const supportedProtocols = platform.protocols.map(protocol => {
+ return protocol + ':';
+});
+
+/**
+ * If the proxy or config beforeRedirects functions are defined, call them with the options
+ * object.
+ *
+ * @param {Object<string, any>} options - The options object that was passed to the request.
+ *
+ * @returns {Object<string, any>}
+ */
+function dispatchBeforeRedirect(options) {
+ if (options.beforeRedirects.proxy) {
+ options.beforeRedirects.proxy(options);
+ }
+ if (options.beforeRedirects.config) {
+ options.beforeRedirects.config(options);
+ }
+}
+
+/**
+ * If the proxy or config afterRedirects functions are defined, call them with the options
+ *
+ * @param {http.ClientRequestArgs} options
+ * @param {AxiosProxyConfig} configProxy configuration from Axios options object
+ * @param {string} location
+ *
+ * @returns {http.ClientRequestArgs}
+ */
+function setProxy(options, configProxy, location) {
+ let proxy = configProxy;
+ if (!proxy && proxy !== false) {
+ const proxyUrl = proxyFromEnv.getProxyForUrl(location);
+ if (proxyUrl) {
+ proxy = new URL(proxyUrl);
+ }
+ }
+ if (proxy) {
+ // Basic proxy authorization
+ if (proxy.username) {
+ proxy.auth = (proxy.username || '') + ':' + (proxy.password || '');
+ }
+
+ if (proxy.auth) {
+ // Support proxy auth object form
+ if (proxy.auth.username || proxy.auth.password) {
+ proxy.auth = (proxy.auth.username || '') + ':' + (proxy.auth.password || '');
+ }
+ const base64 = Buffer
+ .from(proxy.auth, 'utf8')
+ .toString('base64');
+ options.headers['Proxy-Authorization'] = 'Basic ' + base64;
+ }
+
+ options.headers.host = options.hostname + (options.port ? ':' + options.port : '');
+ const proxyHost = proxy.hostname || proxy.host;
+ options.hostname = proxyHost;
+ // Replace 'host' since options is not a URL object
+ options.host = proxyHost;
+ options.port = proxy.port;
+ options.path = location;
+ if (proxy.protocol) {
+ options.protocol = proxy.protocol.includes(':') ? proxy.protocol : `${proxy.protocol}:`;
+ }
+ }
+
+ options.beforeRedirects.proxy = function beforeRedirect(redirectOptions) {
+ // Configure proxy for redirected request, passing the original config proxy to apply
+ // the exact same logic as if the redirected request was performed by axios directly.
+ setProxy(redirectOptions, configProxy, redirectOptions.href);
+ };
+}
+
+/*eslint consistent-return:0*/
+function httpAdapter(config) {
+ return new Promise(function dispatchHttpRequest(resolvePromise, rejectPromise) {
+ let data = config.data;
+ const responseType = config.responseType;
+ const responseEncoding = config.responseEncoding;
+ const method = config.method.toUpperCase();
+ let isFinished;
+ let isDone;
+ let rejected = false;
+ let req;
+
+ // temporary internal emitter until the AxiosRequest class will be implemented
+ const emitter = new EventEmitter__default["default"]();
+
+ function onFinished() {
+ if (isFinished) return;
+ isFinished = true;
+
+ if (config.cancelToken) {
+ config.cancelToken.unsubscribe(abort);
+ }
+
+ if (config.signal) {
+ config.signal.removeEventListener('abort', abort);
+ }
+
+ emitter.removeAllListeners();
+ }
+
+ function done(value, isRejected) {
+ if (isDone) return;
+
+ isDone = true;
+
+ if (isRejected) {
+ rejected = true;
+ onFinished();
+ }
+
+ isRejected ? rejectPromise(value) : resolvePromise(value);
+ }
+
+ const resolve = function resolve(value) {
+ done(value);
+ };
+
+ const reject = function reject(value) {
+ done(value, true);
+ };
+
+ function abort(reason) {
+ emitter.emit('abort', !reason || reason.type ? new CanceledError(null, config, req) : reason);
+ }
+
+ emitter.once('abort', reject);
+
+ if (config.cancelToken || config.signal) {
+ config.cancelToken && config.cancelToken.subscribe(abort);
+ if (config.signal) {
+ config.signal.aborted ? abort() : config.signal.addEventListener('abort', abort);
+ }
+ }
+
+ // Parse url
+ const fullPath = buildFullPath(config.baseURL, config.url);
+ const parsed = new URL(fullPath);
+ const protocol = parsed.protocol || supportedProtocols[0];
+
+ if (protocol === 'data:') {
+ let convertedData;
+
+ if (method !== 'GET') {
+ return settle(resolve, reject, {
+ status: 405,
+ statusText: 'method not allowed',
+ headers: {},
+ config
+ });
+ }
+
+ try {
+ convertedData = fromDataURI(config.url, responseType === 'blob', {
+ Blob: config.env && config.env.Blob
+ });
+ } catch (err) {
+ throw AxiosError.from(err, AxiosError.ERR_BAD_REQUEST, config);
+ }
+
+ if (responseType === 'text') {
+ convertedData = convertedData.toString(responseEncoding);
+
+ if (!responseEncoding || responseEncoding === 'utf8') {
+ data = utils.stripBOM(convertedData);
+ }
+ } else if (responseType === 'stream') {
+ convertedData = stream__default["default"].Readable.from(convertedData);
+ }
+
+ return settle(resolve, reject, {
+ data: convertedData,
+ status: 200,
+ statusText: 'OK',
+ headers: {},
+ config
+ });
+ }
+
+ if (supportedProtocols.indexOf(protocol) === -1) {
+ return reject(new AxiosError(
+ 'Unsupported protocol ' + protocol,
+ AxiosError.ERR_BAD_REQUEST,
+ config
+ ));
+ }
+
+ const headers = AxiosHeaders.from(config.headers).normalize();
+
+ // Set User-Agent (required by some servers)
+ // See https://github.com/axios/axios/issues/69
+ // User-Agent is specified; handle case where no UA header is desired
+ // Only set header if it hasn't been set in config
+ headers.set('User-Agent', 'axios/' + VERSION, false);
+
+ const onDownloadProgress = config.onDownloadProgress;
+ const onUploadProgress = config.onUploadProgress;
+ const maxRate = config.maxRate;
+ let maxUploadRate = undefined;
+ let maxDownloadRate = undefined;
+
+ // support for https://www.npmjs.com/package/form-data api
+ if (utils.isFormData(data) && utils.isFunction(data.getHeaders)) {
+ headers.set(data.getHeaders());
+ } else if (data && !utils.isStream(data)) {
+ if (Buffer.isBuffer(data)) ; else if (utils.isArrayBuffer(data)) {
+ data = Buffer.from(new Uint8Array(data));
+ } else if (utils.isString(data)) {
+ data = Buffer.from(data, 'utf-8');
+ } else {
+ return reject(new AxiosError(
+ 'Data after transformation must be a string, an ArrayBuffer, a Buffer, or a Stream',
+ AxiosError.ERR_BAD_REQUEST,
+ config
+ ));
+ }
+
+ // Add Content-Length header if data exists
+ headers.set('Content-Length', data.length, false);
+
+ if (config.maxBodyLength > -1 && data.length > config.maxBodyLength) {
+ return reject(new AxiosError(
+ 'Request body larger than maxBodyLength limit',
+ AxiosError.ERR_BAD_REQUEST,
+ config
+ ));
+ }
+ }
+
+ const contentLength = +headers.getContentLength();
+
+ if (utils.isArray(maxRate)) {
+ maxUploadRate = maxRate[0];
+ maxDownloadRate = maxRate[1];
+ } else {
+ maxUploadRate = maxDownloadRate = maxRate;
+ }
+
+ if (data && (onUploadProgress || maxUploadRate)) {
+ if (!utils.isStream(data)) {
+ data = stream__default["default"].Readable.from(data, {objectMode: false});
+ }
+
+ data = stream__default["default"].pipeline([data, new AxiosTransformStream({
+ length: utils.toFiniteNumber(contentLength),
+ maxRate: utils.toFiniteNumber(maxUploadRate)
+ })], utils.noop);
+
+ onUploadProgress && data.on('progress', progress => {
+ onUploadProgress(Object.assign(progress, {
+ upload: true
+ }));
+ });
+ }
+
+ // HTTP basic authentication
+ let auth = undefined;
+ if (config.auth) {
+ const username = config.auth.username || '';
+ const password = config.auth.password || '';
+ auth = username + ':' + password;
+ }
+
+ if (!auth && parsed.username) {
+ const urlUsername = parsed.username;
+ const urlPassword = parsed.password;
+ auth = urlUsername + ':' + urlPassword;
+ }
+
+ auth && headers.delete('authorization');
+
+ let path;
+
+ try {
+ path = buildURL(
+ parsed.pathname + parsed.search,
+ config.params,
+ config.paramsSerializer
+ ).replace(/^\?/, '');
+ } catch (err) {
+ const customErr = new Error(err.message);
+ customErr.config = config;
+ customErr.url = config.url;
+ customErr.exists = true;
+ return reject(customErr);
+ }
+
+ headers.set('Accept-Encoding', 'gzip, deflate, br', false);
+
+ const options = {
+ path,
+ method: method,
+ headers: headers.toJSON(),
+ agents: { http: config.httpAgent, https: config.httpsAgent },
+ auth,
+ protocol,
+ beforeRedirect: dispatchBeforeRedirect,
+ beforeRedirects: {}
+ };
+
+ if (config.socketPath) {
+ options.socketPath = config.socketPath;
+ } else {
+ options.hostname = parsed.hostname;
+ options.port = parsed.port;
+ setProxy(options, config.proxy, protocol + '//' + parsed.hostname + (parsed.port ? ':' + parsed.port : '') + options.path);
+ }
+
+ let transport;
+ const isHttpsRequest = isHttps.test(options.protocol);
+ options.agent = isHttpsRequest ? config.httpsAgent : config.httpAgent;
+ if (config.transport) {
+ transport = config.transport;
+ } else if (config.maxRedirects === 0) {
+ transport = isHttpsRequest ? https__default["default"] : http__default["default"];
+ } else {
+ if (config.maxRedirects) {
+ options.maxRedirects = config.maxRedirects;
+ }
+ if (config.beforeRedirect) {
+ options.beforeRedirects.config = config.beforeRedirect;
+ }
+ transport = isHttpsRequest ? httpsFollow : httpFollow;
+ }
+
+ if (config.maxBodyLength > -1) {
+ options.maxBodyLength = config.maxBodyLength;
+ } else {
+ // follow-redirects does not skip comparison, so it should always succeed for axios -1 unlimited
+ options.maxBodyLength = Infinity;
+ }
+
+ if (config.insecureHTTPParser) {
+ options.insecureHTTPParser = config.insecureHTTPParser;
+ }
+
+ // Create the request
+ req = transport.request(options, function handleResponse(res) {
+ if (req.destroyed) return;
+
+ const streams = [res];
+
+ // uncompress the response body transparently if required
+ let responseStream = res;
+
+ // return the last request in case of redirects
+ const lastRequest = res.req || req;
+
+ // if decompress disabled we should not decompress
+ if (config.decompress !== false) {
+ // if no content, but headers still say that it is encoded,
+ // remove the header not confuse downstream operations
+ if (data && data.length === 0 && res.headers['content-encoding']) {
+ delete res.headers['content-encoding'];
+ }
+
+ switch (res.headers['content-encoding']) {
+ /*eslint default-case:0*/
+ case 'gzip':
+ case 'compress':
+ case 'deflate':
+ // add the unzipper to the body stream processing pipeline
+ streams.push(zlib__default["default"].createUnzip());
+
+ // remove the content-encoding in order to not confuse downstream operations
+ delete res.headers['content-encoding'];
+ break;
+ case 'br':
+ if (isBrotliSupported) {
+ streams.push(zlib__default["default"].createBrotliDecompress());
+ delete res.headers['content-encoding'];
+ }
+ }
+ }
+
+ if (onDownloadProgress) {
+ const responseLength = +res.headers['content-length'];
+
+ const transformStream = new AxiosTransformStream({
+ length: utils.toFiniteNumber(responseLength),
+ maxRate: utils.toFiniteNumber(maxDownloadRate)
+ });
+
+ onDownloadProgress && transformStream.on('progress', progress => {
+ onDownloadProgress(Object.assign(progress, {
+ download: true
+ }));
+ });
+
+ streams.push(transformStream);
+ }
+
+ responseStream = streams.length > 1 ? stream__default["default"].pipeline(streams, utils.noop) : streams[0];
+
+ const offListeners = stream__default["default"].finished(responseStream, () => {
+ offListeners();
+ onFinished();
+ });
+
+ const response = {
+ status: res.statusCode,
+ statusText: res.statusMessage,
+ headers: new AxiosHeaders(res.headers),
+ config,
+ request: lastRequest
+ };
+
+ if (responseType === 'stream') {
+ response.data = responseStream;
+ settle(resolve, reject, response);
+ } else {
+ const responseBuffer = [];
+ let totalResponseBytes = 0;
+
+ responseStream.on('data', function handleStreamData(chunk) {
+ responseBuffer.push(chunk);
+ totalResponseBytes += chunk.length;
+
+ // make sure the content length is not over the maxContentLength if specified
+ if (config.maxContentLength > -1 && totalResponseBytes > config.maxContentLength) {
+ // stream.destroy() emit aborted event before calling reject() on Node.js v16
+ rejected = true;
+ responseStream.destroy();
+ reject(new AxiosError('maxContentLength size of ' + config.maxContentLength + ' exceeded',
+ AxiosError.ERR_BAD_RESPONSE, config, lastRequest));
+ }
+ });
+
+ responseStream.on('aborted', function handlerStreamAborted() {
+ if (rejected) {
+ return;
+ }
+
+ const err = new AxiosError(
+ 'maxContentLength size of ' + config.maxContentLength + ' exceeded',
+ AxiosError.ERR_BAD_RESPONSE,
+ config,
+ lastRequest
+ );
+ responseStream.destroy(err);
+ reject(err);
+ });
+
+ responseStream.on('error', function handleStreamError(err) {
+ if (req.destroyed) return;
+ reject(AxiosError.from(err, null, config, lastRequest));
+ });
+
+ responseStream.on('end', function handleStreamEnd() {
+ try {
+ let responseData = responseBuffer.length === 1 ? responseBuffer[0] : Buffer.concat(responseBuffer);
+ if (responseType !== 'arraybuffer') {
+ responseData = responseData.toString(responseEncoding);
+ if (!responseEncoding || responseEncoding === 'utf8') {
+ responseData = utils.stripBOM(responseData);
+ }
+ }
+ response.data = responseData;
+ } catch (err) {
+ reject(AxiosError.from(err, null, config, response.request, response));
+ }
+ settle(resolve, reject, response);
+ });
+ }
+
+ emitter.once('abort', err => {
+ if (!responseStream.destroyed) {
+ responseStream.emit('error', err);
+ responseStream.destroy();
+ }
+ });
+ });
+
+ emitter.once('abort', err => {
+ reject(err);
+ req.destroy(err);
+ });
+
+ // Handle errors
+ req.on('error', function handleRequestError(err) {
+ // @todo remove
+ // if (req.aborted && err.code !== AxiosError.ERR_FR_TOO_MANY_REDIRECTS) return;
+ reject(AxiosError.from(err, null, config, req));
+ });
+
+ // set tcp keep alive to prevent drop connection by peer
+ req.on('socket', function handleRequestSocket(socket) {
+ // default interval of sending ack packet is 1 minute
+ socket.setKeepAlive(true, 1000 * 60);
+ });
+
+ // Handle request timeout
+ if (config.timeout) {
+ // This is forcing a int timeout to avoid problems if the `req` interface doesn't handle other types.
+ const timeout = parseInt(config.timeout, 10);
+
+ if (isNaN(timeout)) {
+ reject(new AxiosError(
+ 'error trying to parse `config.timeout` to int',
+ AxiosError.ERR_BAD_OPTION_VALUE,
+ config,
+ req
+ ));
+
+ return;
+ }
+
+ // Sometime, the response will be very slow, and does not respond, the connect event will be block by event loop system.
+ // And timer callback will be fired, and abort() will be invoked before connection, then get "socket hang up" and code ECONNRESET.
+ // At this time, if we have a large number of request, nodejs will hang up some socket on background. and the number will up and up.
+ // And then these socket which be hang up will devouring CPU little by little.
+ // ClientRequest.setTimeout will be fired on the specify milliseconds, and can make sure that abort() will be fired after connect.
+ req.setTimeout(timeout, function handleRequestTimeout() {
+ if (isDone) return;
+ let timeoutErrorMessage = config.timeout ? 'timeout of ' + config.timeout + 'ms exceeded' : 'timeout exceeded';
+ const transitional = config.transitional || transitionalDefaults;
+ if (config.timeoutErrorMessage) {
+ timeoutErrorMessage = config.timeoutErrorMessage;
+ }
+ reject(new AxiosError(
+ timeoutErrorMessage,
+ transitional.clarifyTimeoutError ? AxiosError.ETIMEDOUT : AxiosError.ECONNABORTED,
+ config,
+ req
+ ));
+ abort();
+ });
+ }
+
+
+ // Send the request
+ if (utils.isStream(data)) {
+ let ended = false;
+ let errored = false;
+
+ data.on('end', () => {
+ ended = true;
+ });
+
+ data.once('error', err => {
+ errored = true;
+ req.destroy(err);
+ });
+
+ data.on('close', () => {
+ if (!ended && !errored) {
+ abort(new CanceledError('Request stream has been aborted', config, req));
+ }
+ });
+
+ data.pipe(req);
+ } else {
+ req.end(data);
+ }
+ });
+}
+
+const cookies = platform.isStandardBrowserEnv ?
+
+// Standard browser envs support document.cookie
+ (function standardBrowserEnv() {
+ return {
+ write: function write(name, value, expires, path, domain, secure) {
+ const cookie = [];
+ cookie.push(name + '=' + encodeURIComponent(value));
+
+ if (utils.isNumber(expires)) {
+ cookie.push('expires=' + new Date(expires).toGMTString());
+ }
+
+ if (utils.isString(path)) {
+ cookie.push('path=' + path);
+ }
+
+ if (utils.isString(domain)) {
+ cookie.push('domain=' + domain);
+ }
+
+ if (secure === true) {
+ cookie.push('secure');
+ }
+
+ document.cookie = cookie.join('; ');
+ },
+
+ read: function read(name) {
+ const match = document.cookie.match(new RegExp('(^|;\\s*)(' + name + ')=([^;]*)'));
+ return (match ? decodeURIComponent(match[3]) : null);
+ },
+
+ remove: function remove(name) {
+ this.write(name, '', Date.now() - 86400000);
+ }
+ };
+ })() :
+
+// Non standard browser env (web workers, react-native) lack needed support.
+ (function nonStandardBrowserEnv() {
+ return {
+ write: function write() {},
+ read: function read() { return null; },
+ remove: function remove() {}
+ };
+ })();
+
+const isURLSameOrigin = platform.isStandardBrowserEnv ?
+
+// Standard browser envs have full support of the APIs needed to test
+// whether the request URL is of the same origin as current location.
+ (function standardBrowserEnv() {
+ const msie = /(msie|trident)/i.test(navigator.userAgent);
+ const urlParsingNode = document.createElement('a');
+ let originURL;
+
+ /**
+ * Parse a URL to discover it's components
+ *
+ * @param {String} url The URL to be parsed
+ * @returns {Object}
+ */
+ function resolveURL(url) {
+ let href = url;
+
+ if (msie) {
+ // IE needs attribute set twice to normalize properties
+ urlParsingNode.setAttribute('href', href);
+ href = urlParsingNode.href;
+ }
+
+ urlParsingNode.setAttribute('href', href);
+
+ // urlParsingNode provides the UrlUtils interface - http://url.spec.whatwg.org/#urlutils
+ return {
+ href: urlParsingNode.href,
+ protocol: urlParsingNode.protocol ? urlParsingNode.protocol.replace(/:$/, '') : '',
+ host: urlParsingNode.host,
+ search: urlParsingNode.search ? urlParsingNode.search.replace(/^\?/, '') : '',
+ hash: urlParsingNode.hash ? urlParsingNode.hash.replace(/^#/, '') : '',
+ hostname: urlParsingNode.hostname,
+ port: urlParsingNode.port,
+ pathname: (urlParsingNode.pathname.charAt(0) === '/') ?
+ urlParsingNode.pathname :
+ '/' + urlParsingNode.pathname
+ };
+ }
+
+ originURL = resolveURL(window.location.href);
+
+ /**
+ * Determine if a URL shares the same origin as the current location
+ *
+ * @param {String} requestURL The URL to test
+ * @returns {boolean} True if URL shares the same origin, otherwise false
+ */
+ return function isURLSameOrigin(requestURL) {
+ const parsed = (utils.isString(requestURL)) ? resolveURL(requestURL) : requestURL;
+ return (parsed.protocol === originURL.protocol &&
+ parsed.host === originURL.host);
+ };
+ })() :
+
+ // Non standard browser envs (web workers, react-native) lack needed support.
+ (function nonStandardBrowserEnv() {
+ return function isURLSameOrigin() {
+ return true;
+ };
+ })();
+
+function progressEventReducer(listener, isDownloadStream) {
+ let bytesNotified = 0;
+ const _speedometer = speedometer(50, 250);
+
+ return e => {
+ const loaded = e.loaded;
+ const total = e.lengthComputable ? e.total : undefined;
+ const progressBytes = loaded - bytesNotified;
+ const rate = _speedometer(progressBytes);
+ const inRange = loaded <= total;
+
+ bytesNotified = loaded;
+
+ const data = {
+ loaded,
+ total,
+ progress: total ? (loaded / total) : undefined,
+ bytes: progressBytes,
+ rate: rate ? rate : undefined,
+ estimated: rate && total && inRange ? (total - loaded) / rate : undefined
+ };
+
+ data[isDownloadStream ? 'download' : 'upload'] = true;
+
+ listener(data);
+ };
+}
+
+function xhrAdapter(config) {
+ return new Promise(function dispatchXhrRequest(resolve, reject) {
+ let requestData = config.data;
+ const requestHeaders = AxiosHeaders.from(config.headers).normalize();
+ const responseType = config.responseType;
+ let onCanceled;
+ function done() {
+ if (config.cancelToken) {
+ config.cancelToken.unsubscribe(onCanceled);
+ }
+
+ if (config.signal) {
+ config.signal.removeEventListener('abort', onCanceled);
+ }
+ }
+
+ if (utils.isFormData(requestData) && platform.isStandardBrowserEnv) {
+ requestHeaders.setContentType(false); // Let the browser set it
+ }
+
+ let request = new XMLHttpRequest();
+
+ // HTTP basic authentication
+ if (config.auth) {
+ const username = config.auth.username || '';
+ const password = config.auth.password ? unescape(encodeURIComponent(config.auth.password)) : '';
+ requestHeaders.set('Authorization', 'Basic ' + btoa(username + ':' + password));
+ }
+
+ const fullPath = buildFullPath(config.baseURL, config.url);
+
+ request.open(config.method.toUpperCase(), buildURL(fullPath, config.params, config.paramsSerializer), true);
+
+ // Set the request timeout in MS
+ request.timeout = config.timeout;
+
+ function onloadend() {
+ if (!request) {
+ return;
+ }
+ // Prepare the response
+ const responseHeaders = AxiosHeaders.from(
+ 'getAllResponseHeaders' in request && request.getAllResponseHeaders()
+ );
+ const responseData = !responseType || responseType === 'text' || responseType === 'json' ?
+ request.responseText : request.response;
+ const response = {
+ data: responseData,
+ status: request.status,
+ statusText: request.statusText,
+ headers: responseHeaders,
+ config,
+ request
+ };
+
+ settle(function _resolve(value) {
+ resolve(value);
+ done();
+ }, function _reject(err) {
+ reject(err);
+ done();
+ }, response);
+
+ // Clean up request
+ request = null;
+ }
+
+ if ('onloadend' in request) {
+ // Use onloadend if available
+ request.onloadend = onloadend;
+ } else {
+ // Listen for ready state to emulate onloadend
+ request.onreadystatechange = function handleLoad() {
+ if (!request || request.readyState !== 4) {
+ return;
+ }
+
+ // The request errored out and we didn't get a response, this will be
+ // handled by onerror instead
+ // With one exception: request that using file: protocol, most browsers
+ // will return status as 0 even though it's a successful request
+ if (request.status === 0 && !(request.responseURL && request.responseURL.indexOf('file:') === 0)) {
+ return;
+ }
+ // readystate handler is calling before onerror or ontimeout handlers,
+ // so we should call onloadend on the next 'tick'
+ setTimeout(onloadend);
+ };
+ }
+
+ // Handle browser request cancellation (as opposed to a manual cancellation)
+ request.onabort = function handleAbort() {
+ if (!request) {
+ return;
+ }
+
+ reject(new AxiosError('Request aborted', AxiosError.ECONNABORTED, config, request));
+
+ // Clean up request
+ request = null;
+ };
+
+ // Handle low level network errors
+ request.onerror = function handleError() {
+ // Real errors are hidden from us by the browser
+ // onerror should only fire if it's a network error
+ reject(new AxiosError('Network Error', AxiosError.ERR_NETWORK, config, request));
+
+ // Clean up request
+ request = null;
+ };
+
+ // Handle timeout
+ request.ontimeout = function handleTimeout() {
+ let timeoutErrorMessage = config.timeout ? 'timeout of ' + config.timeout + 'ms exceeded' : 'timeout exceeded';
+ const transitional = config.transitional || transitionalDefaults;
+ if (config.timeoutErrorMessage) {
+ timeoutErrorMessage = config.timeoutErrorMessage;
+ }
+ reject(new AxiosError(
+ timeoutErrorMessage,
+ transitional.clarifyTimeoutError ? AxiosError.ETIMEDOUT : AxiosError.ECONNABORTED,
+ config,
+ request));
+
+ // Clean up request
+ request = null;
+ };
+
+ // Add xsrf header
+ // This is only done if running in a standard browser environment.
+ // Specifically not if we're in a web worker, or react-native.
+ if (platform.isStandardBrowserEnv) {
+ // Add xsrf header
+ const xsrfValue = (config.withCredentials || isURLSameOrigin(fullPath))
+ && config.xsrfCookieName && cookies.read(config.xsrfCookieName);
+
+ if (xsrfValue) {
+ requestHeaders.set(config.xsrfHeaderName, xsrfValue);
+ }
+ }
+
+ // Remove Content-Type if data is undefined
+ requestData === undefined && requestHeaders.setContentType(null);
+
+ // Add headers to the request
+ if ('setRequestHeader' in request) {
+ utils.forEach(requestHeaders.toJSON(), function setRequestHeader(val, key) {
+ request.setRequestHeader(key, val);
+ });
+ }
+
+ // Add withCredentials to request if needed
+ if (!utils.isUndefined(config.withCredentials)) {
+ request.withCredentials = !!config.withCredentials;
+ }
+
+ // Add responseType to request if needed
+ if (responseType && responseType !== 'json') {
+ request.responseType = config.responseType;
+ }
+
+ // Handle progress if needed
+ if (typeof config.onDownloadProgress === 'function') {
+ request.addEventListener('progress', progressEventReducer(config.onDownloadProgress, true));
+ }
+
+ // Not all browsers support upload events
+ if (typeof config.onUploadProgress === 'function' && request.upload) {
+ request.upload.addEventListener('progress', progressEventReducer(config.onUploadProgress));
+ }
+
+ if (config.cancelToken || config.signal) {
+ // Handle cancellation
+ // eslint-disable-next-line func-names
+ onCanceled = cancel => {
+ if (!request) {
+ return;
+ }
+ reject(!cancel || cancel.type ? new CanceledError(null, config, request) : cancel);
+ request.abort();
+ request = null;
+ };
+
+ config.cancelToken && config.cancelToken.subscribe(onCanceled);
+ if (config.signal) {
+ config.signal.aborted ? onCanceled() : config.signal.addEventListener('abort', onCanceled);
+ }
+ }
+
+ const protocol = parseProtocol(fullPath);
+
+ if (protocol && platform.protocols.indexOf(protocol) === -1) {
+ reject(new AxiosError('Unsupported protocol ' + protocol + ':', AxiosError.ERR_BAD_REQUEST, config));
+ return;
+ }
+
+
+ // Send the request
+ request.send(requestData || null);
+ });
+}
+
+const adapters = {
+ http: httpAdapter,
+ xhr: xhrAdapter
+};
+
+const adapters$1 = {
+ getAdapter: (nameOrAdapter) => {
+ if(utils.isString(nameOrAdapter)){
+ const adapter = adapters[nameOrAdapter];
+
+ if (!nameOrAdapter) {
+ throw Error(
+ utils.hasOwnProp(nameOrAdapter) ?
+ `Adapter '${nameOrAdapter}' is not available in the build` :
+ `Can not resolve adapter '${nameOrAdapter}'`
+ );
+ }
+
+ return adapter
+ }
+
+ if (!utils.isFunction(nameOrAdapter)) {
+ throw new TypeError('adapter is not a function');
+ }
+
+ return nameOrAdapter;
+ },
+ adapters
+};
+
+const DEFAULT_CONTENT_TYPE = {
+ 'Content-Type': 'application/x-www-form-urlencoded'
+};
+
+/**
+ * If the browser has an XMLHttpRequest object, use the XHR adapter, otherwise use the HTTP
+ * adapter
+ *
+ * @returns {Function}
+ */
+function getDefaultAdapter() {
+ let adapter;
+ if (typeof XMLHttpRequest !== 'undefined') {
+ // For browsers use XHR adapter
+ adapter = adapters$1.getAdapter('xhr');
+ } else if (typeof process !== 'undefined' && utils.kindOf(process) === 'process') {
+ // For node use HTTP adapter
+ adapter = adapters$1.getAdapter('http');
+ }
+ return adapter;
+}
+
+/**
+ * It takes a string, tries to parse it, and if it fails, it returns the stringified version
+ * of the input
+ *
+ * @param {any} rawValue - The value to be stringified.
+ * @param {Function} parser - A function that parses a string into a JavaScript object.
+ * @param {Function} encoder - A function that takes a value and returns a string.
+ *
+ * @returns {string} A stringified version of the rawValue.
+ */
+function stringifySafely(rawValue, parser, encoder) {
+ if (utils.isString(rawValue)) {
+ try {
+ (parser || JSON.parse)(rawValue);
+ return utils.trim(rawValue);
+ } catch (e) {
+ if (e.name !== 'SyntaxError') {
+ throw e;
+ }
+ }
+ }
+
+ return (encoder || JSON.stringify)(rawValue);
+}
+
+const defaults = {
+
+ transitional: transitionalDefaults,
+
+ adapter: getDefaultAdapter(),
+
+ transformRequest: [function transformRequest(data, headers) {
+ const contentType = headers.getContentType() || '';
+ const hasJSONContentType = contentType.indexOf('application/json') > -1;
+ const isObjectPayload = utils.isObject(data);
+
+ if (isObjectPayload && utils.isHTMLForm(data)) {
+ data = new FormData(data);
+ }
+
+ const isFormData = utils.isFormData(data);
+
+ if (isFormData) {
+ if (!hasJSONContentType) {
+ return data;
+ }
+ return hasJSONContentType ? JSON.stringify(formDataToJSON(data)) : data;
+ }
+
+ if (utils.isArrayBuffer(data) ||
+ utils.isBuffer(data) ||
+ utils.isStream(data) ||
+ utils.isFile(data) ||
+ utils.isBlob(data)
+ ) {
+ return data;
+ }
+ if (utils.isArrayBufferView(data)) {
+ return data.buffer;
+ }
+ if (utils.isURLSearchParams(data)) {
+ headers.setContentType('application/x-www-form-urlencoded;charset=utf-8', false);
+ return data.toString();
+ }
+
+ let isFileList;
+
+ if (isObjectPayload) {
+ if (contentType.indexOf('application/x-www-form-urlencoded') > -1) {
+ return toURLEncodedForm(data, this.formSerializer).toString();
+ }
+
+ if ((isFileList = utils.isFileList(data)) || contentType.indexOf('multipart/form-data') > -1) {
+ const _FormData = this.env && this.env.FormData;
+
+ return toFormData(
+ isFileList ? {'files[]': data} : data,
+ _FormData && new _FormData(),
+ this.formSerializer
+ );
+ }
+ }
+
+ if (isObjectPayload || hasJSONContentType ) {
+ headers.setContentType('application/json', false);
+ return stringifySafely(data);
+ }
+
+ return data;
+ }],
+
+ transformResponse: [function transformResponse(data) {
+ const transitional = this.transitional || defaults.transitional;
+ const forcedJSONParsing = transitional && transitional.forcedJSONParsing;
+ const JSONRequested = this.responseType === 'json';
+
+ if (data && utils.isString(data) && ((forcedJSONParsing && !this.responseType) || JSONRequested)) {
+ const silentJSONParsing = transitional && transitional.silentJSONParsing;
+ const strictJSONParsing = !silentJSONParsing && JSONRequested;
+
+ try {
+ return JSON.parse(data);
+ } catch (e) {
+ if (strictJSONParsing) {
+ if (e.name === 'SyntaxError') {
+ throw AxiosError.from(e, AxiosError.ERR_BAD_RESPONSE, this, null, this.response);
+ }
+ throw e;
+ }
+ }
+ }
+
+ return data;
+ }],
+
+ /**
+ * A timeout in milliseconds to abort a request. If set to 0 (default) a
+ * timeout is not created.
+ */
+ timeout: 0,
+
+ xsrfCookieName: 'XSRF-TOKEN',
+ xsrfHeaderName: 'X-XSRF-TOKEN',
+
+ maxContentLength: -1,
+ maxBodyLength: -1,
+
+ env: {
+ FormData: platform.classes.FormData,
+ Blob: platform.classes.Blob
+ },
+
+ validateStatus: function validateStatus(status) {
+ return status >= 200 && status < 300;
+ },
+
+ headers: {
+ common: {
+ 'Accept': 'application/json, text/plain, */*'
+ }
+ }
+};
+
+utils.forEach(['delete', 'get', 'head'], function forEachMethodNoData(method) {
+ defaults.headers[method] = {};
+});
+
+utils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {
+ defaults.headers[method] = utils.merge(DEFAULT_CONTENT_TYPE);
+});
+
+/**
+ * Transform the data for a request or a response
+ *
+ * @param {Array|Function} fns A single function or Array of functions
+ * @param {?Object} response The response object
+ *
+ * @returns {*} The resulting transformed data
+ */
+function transformData(fns, response) {
+ const config = this || defaults;
+ const context = response || config;
+ const headers = AxiosHeaders.from(context.headers);
+ let data = context.data;
+
+ utils.forEach(fns, function transform(fn) {
+ data = fn.call(config, data, headers.normalize(), response ? response.status : undefined);
+ });
+
+ headers.normalize();
+
+ return data;
+}
+
+function isCancel(value) {
+ return !!(value && value.__CANCEL__);
+}
+
+/**
+ * Throws a `CanceledError` if cancellation has been requested.
+ *
+ * @param {Object} config The config that is to be used for the request
+ *
+ * @returns {void}
+ */
+function throwIfCancellationRequested(config) {
+ if (config.cancelToken) {
+ config.cancelToken.throwIfRequested();
+ }
+
+ if (config.signal && config.signal.aborted) {
+ throw new CanceledError();
+ }
+}
+
+/**
+ * Dispatch a request to the server using the configured adapter.
+ *
+ * @param {object} config The config that is to be used for the request
+ *
+ * @returns {Promise} The Promise to be fulfilled
+ */
+function dispatchRequest(config) {
+ throwIfCancellationRequested(config);
+
+ config.headers = AxiosHeaders.from(config.headers);
+
+ // Transform request data
+ config.data = transformData.call(
+ config,
+ config.transformRequest
+ );
+
+ const adapter = config.adapter || defaults.adapter;
+
+ return adapter(config).then(function onAdapterResolution(response) {
+ throwIfCancellationRequested(config);
+
+ // Transform response data
+ response.data = transformData.call(
+ config,
+ config.transformResponse,
+ response
+ );
+
+ response.headers = AxiosHeaders.from(response.headers);
+
+ return response;
+ }, function onAdapterRejection(reason) {
+ if (!isCancel(reason)) {
+ throwIfCancellationRequested(config);
+
+ // Transform response data
+ if (reason && reason.response) {
+ reason.response.data = transformData.call(
+ config,
+ config.transformResponse,
+ reason.response
+ );
+ reason.response.headers = AxiosHeaders.from(reason.response.headers);
+ }
+ }
+
+ return Promise.reject(reason);
+ });
+}
+
+/**
+ * Config-specific merge-function which creates a new config-object
+ * by merging two configuration objects together.
+ *
+ * @param {Object} config1
+ * @param {Object} config2
+ *
+ * @returns {Object} New object resulting from merging config2 to config1
+ */
+function mergeConfig(config1, config2) {
+ // eslint-disable-next-line no-param-reassign
+ config2 = config2 || {};
+ const config = {};
+
+ function getMergedValue(target, source) {
+ if (utils.isPlainObject(target) && utils.isPlainObject(source)) {
+ return utils.merge(target, source);
+ } else if (utils.isPlainObject(source)) {
+ return utils.merge({}, source);
+ } else if (utils.isArray(source)) {
+ return source.slice();
+ }
+ return source;
+ }
+
+ // eslint-disable-next-line consistent-return
+ function mergeDeepProperties(prop) {
+ if (!utils.isUndefined(config2[prop])) {
+ return getMergedValue(config1[prop], config2[prop]);
+ } else if (!utils.isUndefined(config1[prop])) {
+ return getMergedValue(undefined, config1[prop]);
+ }
+ }
+
+ // eslint-disable-next-line consistent-return
+ function valueFromConfig2(prop) {
+ if (!utils.isUndefined(config2[prop])) {
+ return getMergedValue(undefined, config2[prop]);
+ }
+ }
+
+ // eslint-disable-next-line consistent-return
+ function defaultToConfig2(prop) {
+ if (!utils.isUndefined(config2[prop])) {
+ return getMergedValue(undefined, config2[prop]);
+ } else if (!utils.isUndefined(config1[prop])) {
+ return getMergedValue(undefined, config1[prop]);
+ }
+ }
+
+ // eslint-disable-next-line consistent-return
+ function mergeDirectKeys(prop) {
+ if (prop in config2) {
+ return getMergedValue(config1[prop], config2[prop]);
+ } else if (prop in config1) {
+ return getMergedValue(undefined, config1[prop]);
+ }
+ }
+
+ const mergeMap = {
+ 'url': valueFromConfig2,
+ 'method': valueFromConfig2,
+ 'data': valueFromConfig2,
+ 'baseURL': defaultToConfig2,
+ 'transformRequest': defaultToConfig2,
+ 'transformResponse': defaultToConfig2,
+ 'paramsSerializer': defaultToConfig2,
+ 'timeout': defaultToConfig2,
+ 'timeoutMessage': defaultToConfig2,
+ 'withCredentials': defaultToConfig2,
+ 'adapter': defaultToConfig2,
+ 'responseType': defaultToConfig2,
+ 'xsrfCookieName': defaultToConfig2,
+ 'xsrfHeaderName': defaultToConfig2,
+ 'onUploadProgress': defaultToConfig2,
+ 'onDownloadProgress': defaultToConfig2,
+ 'decompress': defaultToConfig2,
+ 'maxContentLength': defaultToConfig2,
+ 'maxBodyLength': defaultToConfig2,
+ 'beforeRedirect': defaultToConfig2,
+ 'transport': defaultToConfig2,
+ 'httpAgent': defaultToConfig2,
+ 'httpsAgent': defaultToConfig2,
+ 'cancelToken': defaultToConfig2,
+ 'socketPath': defaultToConfig2,
+ 'responseEncoding': defaultToConfig2,
+ 'validateStatus': mergeDirectKeys
+ };
+
+ utils.forEach(Object.keys(config1).concat(Object.keys(config2)), function computeConfigValue(prop) {
+ const merge = mergeMap[prop] || mergeDeepProperties;
+ const configValue = merge(prop);
+ (utils.isUndefined(configValue) && merge !== mergeDirectKeys) || (config[prop] = configValue);
+ });
+
+ return config;
+}
+
+const validators$1 = {};
+
+// eslint-disable-next-line func-names
+['object', 'boolean', 'number', 'function', 'string', 'symbol'].forEach((type, i) => {
+ validators$1[type] = function validator(thing) {
+ return typeof thing === type || 'a' + (i < 1 ? 'n ' : ' ') + type;
+ };
+});
+
+const deprecatedWarnings = {};
+
+/**
+ * Transitional option validator
+ *
+ * @param {function|boolean?} validator - set to false if the transitional option has been removed
+ * @param {string?} version - deprecated version / removed since version
+ * @param {string?} message - some message with additional info
+ *
+ * @returns {function}
+ */
+validators$1.transitional = function transitional(validator, version, message) {
+ function formatMessage(opt, desc) {
+ return '[Axios v' + VERSION + '] Transitional option \'' + opt + '\'' + desc + (message ? '. ' + message : '');
+ }
+
+ // eslint-disable-next-line func-names
+ return (value, opt, opts) => {
+ if (validator === false) {
+ throw new AxiosError(
+ formatMessage(opt, ' has been removed' + (version ? ' in ' + version : '')),
+ AxiosError.ERR_DEPRECATED
+ );
+ }
+
+ if (version && !deprecatedWarnings[opt]) {
+ deprecatedWarnings[opt] = true;
+ // eslint-disable-next-line no-console
+ console.warn(
+ formatMessage(
+ opt,
+ ' has been deprecated since v' + version + ' and will be removed in the near future'
+ )
+ );
+ }
+
+ return validator ? validator(value, opt, opts) : true;
+ };
+};
+
+/**
+ * Assert object's properties type
+ *
+ * @param {object} options
+ * @param {object} schema
+ * @param {boolean?} allowUnknown
+ *
+ * @returns {object}
+ */
+
+function assertOptions(options, schema, allowUnknown) {
+ if (typeof options !== 'object') {
+ throw new AxiosError('options must be an object', AxiosError.ERR_BAD_OPTION_VALUE);
+ }
+ const keys = Object.keys(options);
+ let i = keys.length;
+ while (i-- > 0) {
+ const opt = keys[i];
+ const validator = schema[opt];
+ if (validator) {
+ const value = options[opt];
+ const result = value === undefined || validator(value, opt, options);
+ if (result !== true) {
+ throw new AxiosError('option ' + opt + ' must be ' + result, AxiosError.ERR_BAD_OPTION_VALUE);
+ }
+ continue;
+ }
+ if (allowUnknown !== true) {
+ throw new AxiosError('Unknown option ' + opt, AxiosError.ERR_BAD_OPTION);
+ }
+ }
+}
+
+const validator = {
+ assertOptions,
+ validators: validators$1
+};
+
+const validators = validator.validators;
+
+/**
+ * Create a new instance of Axios
+ *
+ * @param {Object} instanceConfig The default config for the instance
+ *
+ * @return {Axios} A new instance of Axios
+ */
+class Axios {
+ constructor(instanceConfig) {
+ this.defaults = instanceConfig;
+ this.interceptors = {
+ request: new InterceptorManager(),
+ response: new InterceptorManager()
+ };
+ }
+
+ /**
+ * Dispatch a request
+ *
+ * @param {String|Object} configOrUrl The config specific for this request (merged with this.defaults)
+ * @param {?Object} config
+ *
+ * @returns {Promise} The Promise to be fulfilled
+ */
+ request(configOrUrl, config) {
+ /*eslint no-param-reassign:0*/
+ // Allow for axios('example/url'[, config]) a la fetch API
+ if (typeof configOrUrl === 'string') {
+ config = config || {};
+ config.url = configOrUrl;
+ } else {
+ config = configOrUrl || {};
+ }
+
+ config = mergeConfig(this.defaults, config);
+
+ const {transitional, paramsSerializer} = config;
+
+ if (transitional !== undefined) {
+ validator.assertOptions(transitional, {
+ silentJSONParsing: validators.transitional(validators.boolean),
+ forcedJSONParsing: validators.transitional(validators.boolean),
+ clarifyTimeoutError: validators.transitional(validators.boolean)
+ }, false);
+ }
+
+ if (paramsSerializer !== undefined) {
+ validator.assertOptions(paramsSerializer, {
+ encode: validators.function,
+ serialize: validators.function
+ }, true);
+ }
+
+ // Set config.method
+ config.method = (config.method || this.defaults.method || 'get').toLowerCase();
+
+ // Flatten headers
+ const defaultHeaders = config.headers && utils.merge(
+ config.headers.common,
+ config.headers[config.method]
+ );
+
+ defaultHeaders && utils.forEach(
+ ['delete', 'get', 'head', 'post', 'put', 'patch', 'common'],
+ function cleanHeaderConfig(method) {
+ delete config.headers[method];
+ }
+ );
+
+ config.headers = new AxiosHeaders(config.headers, defaultHeaders);
+
+ // filter out skipped interceptors
+ const requestInterceptorChain = [];
+ let synchronousRequestInterceptors = true;
+ this.interceptors.request.forEach(function unshiftRequestInterceptors(interceptor) {
+ if (typeof interceptor.runWhen === 'function' && interceptor.runWhen(config) === false) {
+ return;
+ }
+
+ synchronousRequestInterceptors = synchronousRequestInterceptors && interceptor.synchronous;
+
+ requestInterceptorChain.unshift(interceptor.fulfilled, interceptor.rejected);
+ });
+
+ const responseInterceptorChain = [];
+ this.interceptors.response.forEach(function pushResponseInterceptors(interceptor) {
+ responseInterceptorChain.push(interceptor.fulfilled, interceptor.rejected);
+ });
+
+ let promise;
+ let i = 0;
+ let len;
+
+ if (!synchronousRequestInterceptors) {
+ const chain = [dispatchRequest.bind(this), undefined];
+ chain.unshift.apply(chain, requestInterceptorChain);
+ chain.push.apply(chain, responseInterceptorChain);
+ len = chain.length;
+
+ promise = Promise.resolve(config);
+
+ while (i < len) {
+ promise = promise.then(chain[i++], chain[i++]);
+ }
+
+ return promise;
+ }
+
+ len = requestInterceptorChain.length;
+
+ let newConfig = config;
+
+ i = 0;
+
+ while (i < len) {
+ const onFulfilled = requestInterceptorChain[i++];
+ const onRejected = requestInterceptorChain[i++];
+ try {
+ newConfig = onFulfilled(newConfig);
+ } catch (error) {
+ onRejected.call(this, error);
+ break;
+ }
+ }
+
+ try {
+ promise = dispatchRequest.call(this, newConfig);
+ } catch (error) {
+ return Promise.reject(error);
+ }
+
+ i = 0;
+ len = responseInterceptorChain.length;
+
+ while (i < len) {
+ promise = promise.then(responseInterceptorChain[i++], responseInterceptorChain[i++]);
+ }
+
+ return promise;
+ }
+
+ getUri(config) {
+ config = mergeConfig(this.defaults, config);
+ const fullPath = buildFullPath(config.baseURL, config.url);
+ return buildURL(fullPath, config.params, config.paramsSerializer);
+ }
+}
+
+// Provide aliases for supported request methods
+utils.forEach(['delete', 'get', 'head', 'options'], function forEachMethodNoData(method) {
+ /*eslint func-names:0*/
+ Axios.prototype[method] = function(url, config) {
+ return this.request(mergeConfig(config || {}, {
+ method,
+ url,
+ data: (config || {}).data
+ }));
+ };
+});
+
+utils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {
+ /*eslint func-names:0*/
+
+ function generateHTTPMethod(isForm) {
+ return function httpMethod(url, data, config) {
+ return this.request(mergeConfig(config || {}, {
+ method,
+ headers: isForm ? {
+ 'Content-Type': 'multipart/form-data'
+ } : {},
+ url,
+ data
+ }));
+ };
+ }
+
+ Axios.prototype[method] = generateHTTPMethod();
+
+ Axios.prototype[method + 'Form'] = generateHTTPMethod(true);
+});
+
+/**
+ * A `CancelToken` is an object that can be used to request cancellation of an operation.
+ *
+ * @param {Function} executor The executor function.
+ *
+ * @returns {CancelToken}
+ */
+class CancelToken {
+ constructor(executor) {
+ if (typeof executor !== 'function') {
+ throw new TypeError('executor must be a function.');
+ }
+
+ let resolvePromise;
+
+ this.promise = new Promise(function promiseExecutor(resolve) {
+ resolvePromise = resolve;
+ });
+
+ const token = this;
+
+ // eslint-disable-next-line func-names
+ this.promise.then(cancel => {
+ if (!token._listeners) return;
+
+ let i = token._listeners.length;
+
+ while (i-- > 0) {
+ token._listeners[i](cancel);
+ }
+ token._listeners = null;
+ });
+
+ // eslint-disable-next-line func-names
+ this.promise.then = onfulfilled => {
+ let _resolve;
+ // eslint-disable-next-line func-names
+ const promise = new Promise(resolve => {
+ token.subscribe(resolve);
+ _resolve = resolve;
+ }).then(onfulfilled);
+
+ promise.cancel = function reject() {
+ token.unsubscribe(_resolve);
+ };
+
+ return promise;
+ };
+
+ executor(function cancel(message, config, request) {
+ if (token.reason) {
+ // Cancellation has already been requested
+ return;
+ }
+
+ token.reason = new CanceledError(message, config, request);
+ resolvePromise(token.reason);
+ });
+ }
+
+ /**
+ * Throws a `CanceledError` if cancellation has been requested.
+ */
+ throwIfRequested() {
+ if (this.reason) {
+ throw this.reason;
+ }
+ }
+
+ /**
+ * Subscribe to the cancel signal
+ */
+
+ subscribe(listener) {
+ if (this.reason) {
+ listener(this.reason);
+ return;
+ }
+
+ if (this._listeners) {
+ this._listeners.push(listener);
+ } else {
+ this._listeners = [listener];
+ }
+ }
+
+ /**
+ * Unsubscribe from the cancel signal
+ */
+
+ unsubscribe(listener) {
+ if (!this._listeners) {
+ return;
+ }
+ const index = this._listeners.indexOf(listener);
+ if (index !== -1) {
+ this._listeners.splice(index, 1);
+ }
+ }
+
+ /**
+ * Returns an object that contains a new `CancelToken` and a function that, when called,
+ * cancels the `CancelToken`.
+ */
+ static source() {
+ let cancel;
+ const token = new CancelToken(function executor(c) {
+ cancel = c;
+ });
+ return {
+ token,
+ cancel
+ };
+ }
+}
+
+/**
+ * Syntactic sugar for invoking a function and expanding an array for arguments.
+ *
+ * Common use case would be to use `Function.prototype.apply`.
+ *
+ * ```js
+ * function f(x, y, z) {}
+ * var args = [1, 2, 3];
+ * f.apply(null, args);
+ * ```
+ *
+ * With `spread` this example can be re-written.
+ *
+ * ```js
+ * spread(function(x, y, z) {})([1, 2, 3]);
+ * ```
+ *
+ * @param {Function} callback
+ *
+ * @returns {Function}
+ */
+function spread(callback) {
+ return function wrap(arr) {
+ return callback.apply(null, arr);
+ };
+}
+
+/**
+ * Determines whether the payload is an error thrown by Axios
+ *
+ * @param {*} payload The value to test
+ *
+ * @returns {boolean} True if the payload is an error thrown by Axios, otherwise false
+ */
+function isAxiosError(payload) {
+ return utils.isObject(payload) && (payload.isAxiosError === true);
+}
+
+/**
+ * Create an instance of Axios
+ *
+ * @param {Object} defaultConfig The default config for the instance
+ *
+ * @returns {Axios} A new instance of Axios
+ */
+function createInstance(defaultConfig) {
+ const context = new Axios(defaultConfig);
+ const instance = bind(Axios.prototype.request, context);
+
+ // Copy axios.prototype to instance
+ utils.extend(instance, Axios.prototype, context, {allOwnKeys: true});
+
+ // Copy context to instance
+ utils.extend(instance, context, null, {allOwnKeys: true});
+
+ // Factory for creating new instances
+ instance.create = function create(instanceConfig) {
+ return createInstance(mergeConfig(defaultConfig, instanceConfig));
+ };
+
+ return instance;
+}
+
+// Create the default instance to be exported
+const axios = createInstance(defaults);
+
+// Expose Axios class to allow class inheritance
+axios.Axios = Axios;
+
+// Expose Cancel & CancelToken
+axios.CanceledError = CanceledError;
+axios.CancelToken = CancelToken;
+axios.isCancel = isCancel;
+axios.VERSION = VERSION;
+axios.toFormData = toFormData;
+
+// Expose AxiosError class
+axios.AxiosError = AxiosError;
+
+// alias for CanceledError for backward compatibility
+axios.Cancel = axios.CanceledError;
+
+// Expose all/spread
+axios.all = function all(promises) {
+ return Promise.all(promises);
+};
+
+axios.spread = spread;
+
+// Expose isAxiosError
+axios.isAxiosError = isAxiosError;
+
+axios.formToJSON = thing => {
+ return formDataToJSON(utils.isHTMLForm(thing) ? new FormData(thing) : thing);
+};
+
+module.exports = axios;
+//# sourceMappingURL=axios.cjs.map
diff --git a/node_modules/axios/dist/node/axios.cjs.map b/node_modules/axios/dist/node/axios.cjs.map
new file mode 100644
index 0000000..00311a4
--- /dev/null
+++ b/node_modules/axios/dist/node/axios.cjs.map
@@ -0,0 +1 @@
+{"version":3,"file":"axios.cjs","sources":["../../lib/helpers/bind.js","../../lib/utils.js","../../lib/core/AxiosError.js","../../lib/helpers/toFormData.js","../../lib/helpers/AxiosURLSearchParams.js","../../lib/helpers/buildURL.js","../../lib/core/InterceptorManager.js","../../lib/defaults/transitional.js","../../lib/platform/node/classes/URLSearchParams.js","../../lib/platform/node/index.js","../../lib/helpers/toURLEncodedForm.js","../../lib/helpers/formDataToJSON.js","../../lib/core/settle.js","../../lib/helpers/isAbsoluteURL.js","../../lib/helpers/combineURLs.js","../../lib/core/buildFullPath.js","../../lib/env/data.js","../../lib/cancel/CanceledError.js","../../lib/helpers/parseProtocol.js","../../lib/helpers/fromDataURI.js","../../lib/helpers/parseHeaders.js","../../lib/core/AxiosHeaders.js","../../lib/helpers/throttle.js","../../lib/helpers/speedometer.js","../../lib/helpers/AxiosTransformStream.js","../../lib/adapters/http.js","../../lib/helpers/cookies.js","../../lib/helpers/isURLSameOrigin.js","../../lib/adapters/xhr.js","../../lib/adapters/index.js","../../lib/defaults/index.js","../../lib/core/transformData.js","../../lib/cancel/isCancel.js","../../lib/core/dispatchRequest.js","../../lib/core/mergeConfig.js","../../lib/helpers/validator.js","../../lib/core/Axios.js","../../lib/cancel/CancelToken.js","../../lib/helpers/spread.js","../../lib/helpers/isAxiosError.js","../../lib/axios.js"],"sourcesContent":["'use strict';\n\nexport default function bind(fn, thisArg) {\n return function wrap() {\n return fn.apply(thisArg, arguments);\n };\n}\n","'use strict';\n\nimport bind from './helpers/bind.js';\n\n// utils is a library of generic helper functions non-specific to axios\n\nconst {toString} = Object.prototype;\nconst {getPrototypeOf} = Object;\n\nconst kindOf = (cache => thing => {\n const str = toString.call(thing);\n return cache[str] || (cache[str] = str.slice(8, -1).toLowerCase());\n})(Object.create(null));\n\nconst kindOfTest = (type) => {\n type = type.toLowerCase();\n return (thing) => kindOf(thing) === type\n}\n\nconst typeOfTest = type => thing => typeof thing === type;\n\n/**\n * Determine if a value is an Array\n *\n * @param {Object} val The value to test\n *\n * @returns {boolean} True if value is an Array, otherwise false\n */\nconst {isArray} = Array;\n\n/**\n * Determine if a value is undefined\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if the value is undefined, otherwise false\n */\nconst isUndefined = typeOfTest('undefined');\n\n/**\n * Determine if a value is a Buffer\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Buffer, otherwise false\n */\nfunction isBuffer(val) {\n return val !== null && !isUndefined(val) && val.constructor !== null && !isUndefined(val.constructor)\n && isFunction(val.constructor.isBuffer) && val.constructor.isBuffer(val);\n}\n\n/**\n * Determine if a value is an ArrayBuffer\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is an ArrayBuffer, otherwise false\n */\nconst isArrayBuffer = kindOfTest('ArrayBuffer');\n\n\n/**\n * Determine if a value is a view on an ArrayBuffer\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a view on an ArrayBuffer, otherwise false\n */\nfunction isArrayBufferView(val) {\n let result;\n if ((typeof ArrayBuffer !== 'undefined') && (ArrayBuffer.isView)) {\n result = ArrayBuffer.isView(val);\n } else {\n result = (val) && (val.buffer) && (isArrayBuffer(val.buffer));\n }\n return result;\n}\n\n/**\n * Determine if a value is a String\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a String, otherwise false\n */\nconst isString = typeOfTest('string');\n\n/**\n * Determine if a value is a Function\n *\n * @param {*} val The value to test\n * @returns {boolean} True if value is a Function, otherwise false\n */\nconst isFunction = typeOfTest('function');\n\n/**\n * Determine if a value is a Number\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Number, otherwise false\n */\nconst isNumber = typeOfTest('number');\n\n/**\n * Determine if a value is an Object\n *\n * @param {*} thing The value to test\n *\n * @returns {boolean} True if value is an Object, otherwise false\n */\nconst isObject = (thing) => thing !== null && typeof thing === 'object';\n\n/**\n * Determine if a value is a Boolean\n *\n * @param {*} thing The value to test\n * @returns {boolean} True if value is a Boolean, otherwise false\n */\nconst isBoolean = thing => thing === true || thing === false;\n\n/**\n * Determine if a value is a plain Object\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a plain Object, otherwise false\n */\nconst isPlainObject = (val) => {\n if (kindOf(val) !== 'object') {\n return false;\n }\n\n const prototype = getPrototypeOf(val);\n return (prototype === null || prototype === Object.prototype || Object.getPrototypeOf(prototype) === null) && !(Symbol.toStringTag in val) && !(Symbol.iterator in val);\n}\n\n/**\n * Determine if a value is a Date\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Date, otherwise false\n */\nconst isDate = kindOfTest('Date');\n\n/**\n * Determine if a value is a File\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a File, otherwise false\n */\nconst isFile = kindOfTest('File');\n\n/**\n * Determine if a value is a Blob\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Blob, otherwise false\n */\nconst isBlob = kindOfTest('Blob');\n\n/**\n * Determine if a value is a FileList\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a File, otherwise false\n */\nconst isFileList = kindOfTest('FileList');\n\n/**\n * Determine if a value is a Stream\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Stream, otherwise false\n */\nconst isStream = (val) => isObject(val) && isFunction(val.pipe);\n\n/**\n * Determine if a value is a FormData\n *\n * @param {*} thing The value to test\n *\n * @returns {boolean} True if value is an FormData, otherwise false\n */\nconst isFormData = (thing) => {\n const pattern = '[object FormData]';\n return thing && (\n (typeof FormData === 'function' && thing instanceof FormData) ||\n toString.call(thing) === pattern ||\n (isFunction(thing.toString) && thing.toString() === pattern)\n );\n}\n\n/**\n * Determine if a value is a URLSearchParams object\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a URLSearchParams object, otherwise false\n */\nconst isURLSearchParams = kindOfTest('URLSearchParams');\n\n/**\n * Trim excess whitespace off the beginning and end of a string\n *\n * @param {String} str The String to trim\n *\n * @returns {String} The String freed of excess whitespace\n */\nconst trim = (str) => str.trim ?\n str.trim() : str.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n\n/**\n * Iterate over an Array or an Object invoking a function for each item.\n *\n * If `obj` is an Array callback will be called passing\n * the value, index, and complete array for each item.\n *\n * If 'obj' is an Object callback will be called passing\n * the value, key, and complete object for each property.\n *\n * @param {Object|Array} obj The object to iterate\n * @param {Function} fn The callback to invoke for each item\n *\n * @param {Boolean} [allOwnKeys = false]\n * @returns {void}\n */\nfunction forEach(obj, fn, {allOwnKeys = false} = {}) {\n // Don't bother if no value provided\n if (obj === null || typeof obj === 'undefined') {\n return;\n }\n\n let i;\n let l;\n\n // Force an array if not already something iterable\n if (typeof obj !== 'object') {\n /*eslint no-param-reassign:0*/\n obj = [obj];\n }\n\n if (isArray(obj)) {\n // Iterate over array values\n for (i = 0, l = obj.length; i < l; i++) {\n fn.call(null, obj[i], i, obj);\n }\n } else {\n // Iterate over object keys\n const keys = allOwnKeys ? Object.getOwnPropertyNames(obj) : Object.keys(obj);\n const len = keys.length;\n let key;\n\n for (i = 0; i < len; i++) {\n key = keys[i];\n fn.call(null, obj[key], key, obj);\n }\n }\n}\n\n/**\n * Accepts varargs expecting each argument to be an object, then\n * immutably merges the properties of each object and returns result.\n *\n * When multiple objects contain the same key the later object in\n * the arguments list will take precedence.\n *\n * Example:\n *\n * ```js\n * var result = merge({foo: 123}, {foo: 456});\n * console.log(result.foo); // outputs 456\n * ```\n *\n * @param {Object} obj1 Object to merge\n *\n * @returns {Object} Result of all merge properties\n */\nfunction merge(/* obj1, obj2, obj3, ... */) {\n const result = {};\n const assignValue = (val, key) => {\n if (isPlainObject(result[key]) && isPlainObject(val)) {\n result[key] = merge(result[key], val);\n } else if (isPlainObject(val)) {\n result[key] = merge({}, val);\n } else if (isArray(val)) {\n result[key] = val.slice();\n } else {\n result[key] = val;\n }\n }\n\n for (let i = 0, l = arguments.length; i < l; i++) {\n arguments[i] && forEach(arguments[i], assignValue);\n }\n return result;\n}\n\n/**\n * Extends object a by mutably adding to it the properties of object b.\n *\n * @param {Object} a The object to be extended\n * @param {Object} b The object to copy properties from\n * @param {Object} thisArg The object to bind function to\n *\n * @param {Boolean} [allOwnKeys]\n * @returns {Object} The resulting value of object a\n */\nconst extend = (a, b, thisArg, {allOwnKeys}= {}) => {\n forEach(b, (val, key) => {\n if (thisArg && isFunction(val)) {\n a[key] = bind(val, thisArg);\n } else {\n a[key] = val;\n }\n }, {allOwnKeys});\n return a;\n}\n\n/**\n * Remove byte order marker. This catches EF BB BF (the UTF-8 BOM)\n *\n * @param {string} content with BOM\n *\n * @returns {string} content value without BOM\n */\nconst stripBOM = (content) => {\n if (content.charCodeAt(0) === 0xFEFF) {\n content = content.slice(1);\n }\n return content;\n}\n\n/**\n * Inherit the prototype methods from one constructor into another\n * @param {function} constructor\n * @param {function} superConstructor\n * @param {object} [props]\n * @param {object} [descriptors]\n *\n * @returns {void}\n */\nconst inherits = (constructor, superConstructor, props, descriptors) => {\n constructor.prototype = Object.create(superConstructor.prototype, descriptors);\n constructor.prototype.constructor = constructor;\n Object.defineProperty(constructor, 'super', {\n value: superConstructor.prototype\n });\n props && Object.assign(constructor.prototype, props);\n}\n\n/**\n * Resolve object with deep prototype chain to a flat object\n * @param {Object} sourceObj source object\n * @param {Object} [destObj]\n * @param {Function|Boolean} [filter]\n * @param {Function} [propFilter]\n *\n * @returns {Object}\n */\nconst toFlatObject = (sourceObj, destObj, filter, propFilter) => {\n let props;\n let i;\n let prop;\n const merged = {};\n\n destObj = destObj || {};\n // eslint-disable-next-line no-eq-null,eqeqeq\n if (sourceObj == null) return destObj;\n\n do {\n props = Object.getOwnPropertyNames(sourceObj);\n i = props.length;\n while (i-- > 0) {\n prop = props[i];\n if ((!propFilter || propFilter(prop, sourceObj, destObj)) && !merged[prop]) {\n destObj[prop] = sourceObj[prop];\n merged[prop] = true;\n }\n }\n sourceObj = filter !== false && getPrototypeOf(sourceObj);\n } while (sourceObj && (!filter || filter(sourceObj, destObj)) && sourceObj !== Object.prototype);\n\n return destObj;\n}\n\n/**\n * Determines whether a string ends with the characters of a specified string\n *\n * @param {String} str\n * @param {String} searchString\n * @param {Number} [position= 0]\n *\n * @returns {boolean}\n */\nconst endsWith = (str, searchString, position) => {\n str = String(str);\n if (position === undefined || position > str.length) {\n position = str.length;\n }\n position -= searchString.length;\n const lastIndex = str.indexOf(searchString, position);\n return lastIndex !== -1 && lastIndex === position;\n}\n\n\n/**\n * Returns new array from array like object or null if failed\n *\n * @param {*} [thing]\n *\n * @returns {?Array}\n */\nconst toArray = (thing) => {\n if (!thing) return null;\n if (isArray(thing)) return thing;\n let i = thing.length;\n if (!isNumber(i)) return null;\n const arr = new Array(i);\n while (i-- > 0) {\n arr[i] = thing[i];\n }\n return arr;\n}\n\n/**\n * Checking if the Uint8Array exists and if it does, it returns a function that checks if the\n * thing passed in is an instance of Uint8Array\n *\n * @param {TypedArray}\n *\n * @returns {Array}\n */\n// eslint-disable-next-line func-names\nconst isTypedArray = (TypedArray => {\n // eslint-disable-next-line func-names\n return thing => {\n return TypedArray && thing instanceof TypedArray;\n };\n})(typeof Uint8Array !== 'undefined' && getPrototypeOf(Uint8Array));\n\n/**\n * For each entry in the object, call the function with the key and value.\n *\n * @param {Object<any, any>} obj - The object to iterate over.\n * @param {Function} fn - The function to call for each entry.\n *\n * @returns {void}\n */\nconst forEachEntry = (obj, fn) => {\n const generator = obj && obj[Symbol.iterator];\n\n const iterator = generator.call(obj);\n\n let result;\n\n while ((result = iterator.next()) && !result.done) {\n const pair = result.value;\n fn.call(obj, pair[0], pair[1]);\n }\n}\n\n/**\n * It takes a regular expression and a string, and returns an array of all the matches\n *\n * @param {string} regExp - The regular expression to match against.\n * @param {string} str - The string to search.\n *\n * @returns {Array<boolean>}\n */\nconst matchAll = (regExp, str) => {\n let matches;\n const arr = [];\n\n while ((matches = regExp.exec(str)) !== null) {\n arr.push(matches);\n }\n\n return arr;\n}\n\n/* Checking if the kindOfTest function returns true when passed an HTMLFormElement. */\nconst isHTMLForm = kindOfTest('HTMLFormElement');\n\nconst toCamelCase = str => {\n return str.toLowerCase().replace(/[_-\\s]([a-z\\d])(\\w*)/g,\n function replacer(m, p1, p2) {\n return p1.toUpperCase() + p2;\n }\n );\n};\n\n/* Creating a function that will check if an object has a property. */\nconst hasOwnProperty = (({hasOwnProperty}) => (obj, prop) => hasOwnProperty.call(obj, prop))(Object.prototype);\n\n/**\n * Determine if a value is a RegExp object\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a RegExp object, otherwise false\n */\nconst isRegExp = kindOfTest('RegExp');\n\nconst reduceDescriptors = (obj, reducer) => {\n const descriptors = Object.getOwnPropertyDescriptors(obj);\n const reducedDescriptors = {};\n\n forEach(descriptors, (descriptor, name) => {\n if (reducer(descriptor, name, obj) !== false) {\n reducedDescriptors[name] = descriptor;\n }\n });\n\n Object.defineProperties(obj, reducedDescriptors);\n}\n\n/**\n * Makes all methods read-only\n * @param {Object} obj\n */\n\nconst freezeMethods = (obj) => {\n reduceDescriptors(obj, (descriptor, name) => {\n const value = obj[name];\n\n if (!isFunction(value)) return;\n\n descriptor.enumerable = false;\n\n if ('writable' in descriptor) {\n descriptor.writable = false;\n return;\n }\n\n if (!descriptor.set) {\n descriptor.set = () => {\n throw Error('Can not read-only method \\'' + name + '\\'');\n };\n }\n });\n}\n\nconst toObjectSet = (arrayOrString, delimiter) => {\n const obj = {};\n\n const define = (arr) => {\n arr.forEach(value => {\n obj[value] = true;\n });\n }\n\n isArray(arrayOrString) ? define(arrayOrString) : define(String(arrayOrString).split(delimiter));\n\n return obj;\n}\n\nconst noop = () => {}\n\nconst toFiniteNumber = (value, defaultValue) => {\n value = +value;\n return Number.isFinite(value) ? value : defaultValue;\n}\n\nexport default {\n isArray,\n isArrayBuffer,\n isBuffer,\n isFormData,\n isArrayBufferView,\n isString,\n isNumber,\n isBoolean,\n isObject,\n isPlainObject,\n isUndefined,\n isDate,\n isFile,\n isBlob,\n isRegExp,\n isFunction,\n isStream,\n isURLSearchParams,\n isTypedArray,\n isFileList,\n forEach,\n merge,\n extend,\n trim,\n stripBOM,\n inherits,\n toFlatObject,\n kindOf,\n kindOfTest,\n endsWith,\n toArray,\n forEachEntry,\n matchAll,\n isHTMLForm,\n hasOwnProperty,\n hasOwnProp: hasOwnProperty, // an alias to avoid ESLint no-prototype-builtins detection\n reduceDescriptors,\n freezeMethods,\n toObjectSet,\n toCamelCase,\n noop,\n toFiniteNumber\n};\n","'use strict';\n\nimport utils from '../utils.js';\n\n/**\n * Create an Error with the specified message, config, error code, request and response.\n *\n * @param {string} message The error message.\n * @param {string} [code] The error code (for example, 'ECONNABORTED').\n * @param {Object} [config] The config.\n * @param {Object} [request] The request.\n * @param {Object} [response] The response.\n *\n * @returns {Error} The created error.\n */\nfunction AxiosError(message, code, config, request, response) {\n Error.call(this);\n\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, this.constructor);\n } else {\n this.stack = (new Error()).stack;\n }\n\n this.message = message;\n this.name = 'AxiosError';\n code && (this.code = code);\n config && (this.config = config);\n request && (this.request = request);\n response && (this.response = response);\n}\n\nutils.inherits(AxiosError, Error, {\n toJSON: function toJSON() {\n return {\n // Standard\n message: this.message,\n name: this.name,\n // Microsoft\n description: this.description,\n number: this.number,\n // Mozilla\n fileName: this.fileName,\n lineNumber: this.lineNumber,\n columnNumber: this.columnNumber,\n stack: this.stack,\n // Axios\n config: this.config,\n code: this.code,\n status: this.response && this.response.status ? this.response.status : null\n };\n }\n});\n\nconst prototype = AxiosError.prototype;\nconst descriptors = {};\n\n[\n 'ERR_BAD_OPTION_VALUE',\n 'ERR_BAD_OPTION',\n 'ECONNABORTED',\n 'ETIMEDOUT',\n 'ERR_NETWORK',\n 'ERR_FR_TOO_MANY_REDIRECTS',\n 'ERR_DEPRECATED',\n 'ERR_BAD_RESPONSE',\n 'ERR_BAD_REQUEST',\n 'ERR_CANCELED',\n 'ERR_NOT_SUPPORT',\n 'ERR_INVALID_URL'\n// eslint-disable-next-line func-names\n].forEach(code => {\n descriptors[code] = {value: code};\n});\n\nObject.defineProperties(AxiosError, descriptors);\nObject.defineProperty(prototype, 'isAxiosError', {value: true});\n\n// eslint-disable-next-line func-names\nAxiosError.from = (error, code, config, request, response, customProps) => {\n const axiosError = Object.create(prototype);\n\n utils.toFlatObject(error, axiosError, function filter(obj) {\n return obj !== Error.prototype;\n }, prop => {\n return prop !== 'isAxiosError';\n });\n\n AxiosError.call(axiosError, error.message, code, config, request, response);\n\n axiosError.cause = error;\n\n axiosError.name = error.name;\n\n customProps && Object.assign(axiosError, customProps);\n\n return axiosError;\n};\n\nexport default AxiosError;\n","'use strict';\n\nimport utils from '../utils.js';\nimport AxiosError from '../core/AxiosError.js';\nimport envFormData from '../env/classes/FormData.js';\n\n/**\n * Determines if the given thing is a array or js object.\n *\n * @param {string} thing - The object or array to be visited.\n *\n * @returns {boolean}\n */\nfunction isVisitable(thing) {\n return utils.isPlainObject(thing) || utils.isArray(thing);\n}\n\n/**\n * It removes the brackets from the end of a string\n *\n * @param {string} key - The key of the parameter.\n *\n * @returns {string} the key without the brackets.\n */\nfunction removeBrackets(key) {\n return utils.endsWith(key, '[]') ? key.slice(0, -2) : key;\n}\n\n/**\n * It takes a path, a key, and a boolean, and returns a string\n *\n * @param {string} path - The path to the current key.\n * @param {string} key - The key of the current object being iterated over.\n * @param {string} dots - If true, the key will be rendered with dots instead of brackets.\n *\n * @returns {string} The path to the current key.\n */\nfunction renderKey(path, key, dots) {\n if (!path) return key;\n return path.concat(key).map(function each(token, i) {\n // eslint-disable-next-line no-param-reassign\n token = removeBrackets(token);\n return !dots && i ? '[' + token + ']' : token;\n }).join(dots ? '.' : '');\n}\n\n/**\n * If the array is an array and none of its elements are visitable, then it's a flat array.\n *\n * @param {Array<any>} arr - The array to check\n *\n * @returns {boolean}\n */\nfunction isFlatArray(arr) {\n return utils.isArray(arr) && !arr.some(isVisitable);\n}\n\nconst predicates = utils.toFlatObject(utils, {}, null, function filter(prop) {\n return /^is[A-Z]/.test(prop);\n});\n\n/**\n * If the thing is a FormData object, return true, otherwise return false.\n *\n * @param {unknown} thing - The thing to check.\n *\n * @returns {boolean}\n */\nfunction isSpecCompliant(thing) {\n return thing && utils.isFunction(thing.append) && thing[Symbol.toStringTag] === 'FormData' && thing[Symbol.iterator];\n}\n\n/**\n * Convert a data object to FormData\n *\n * @param {Object} obj\n * @param {?Object} [formData]\n * @param {?Object} [options]\n * @param {Function} [options.visitor]\n * @param {Boolean} [options.metaTokens = true]\n * @param {Boolean} [options.dots = false]\n * @param {?Boolean} [options.indexes = false]\n *\n * @returns {Object}\n **/\n\n/**\n * It converts an object into a FormData object\n *\n * @param {Object<any, any>} obj - The object to convert to form data.\n * @param {string} formData - The FormData object to append to.\n * @param {Object<string, any>} options\n *\n * @returns\n */\nfunction toFormData(obj, formData, options) {\n if (!utils.isObject(obj)) {\n throw new TypeError('target must be an object');\n }\n\n // eslint-disable-next-line no-param-reassign\n formData = formData || new (envFormData || FormData)();\n\n // eslint-disable-next-line no-param-reassign\n options = utils.toFlatObject(options, {\n metaTokens: true,\n dots: false,\n indexes: false\n }, false, function defined(option, source) {\n // eslint-disable-next-line no-eq-null,eqeqeq\n return !utils.isUndefined(source[option]);\n });\n\n const metaTokens = options.metaTokens;\n // eslint-disable-next-line no-use-before-define\n const visitor = options.visitor || defaultVisitor;\n const dots = options.dots;\n const indexes = options.indexes;\n const _Blob = options.Blob || typeof Blob !== 'undefined' && Blob;\n const useBlob = _Blob && isSpecCompliant(formData);\n\n if (!utils.isFunction(visitor)) {\n throw new TypeError('visitor must be a function');\n }\n\n function convertValue(value) {\n if (value === null) return '';\n\n if (utils.isDate(value)) {\n return value.toISOString();\n }\n\n if (!useBlob && utils.isBlob(value)) {\n throw new AxiosError('Blob is not supported. Use a Buffer instead.');\n }\n\n if (utils.isArrayBuffer(value) || utils.isTypedArray(value)) {\n return useBlob && typeof Blob === 'function' ? new Blob([value]) : Buffer.from(value);\n }\n\n return value;\n }\n\n /**\n * Default visitor.\n *\n * @param {*} value\n * @param {String|Number} key\n * @param {Array<String|Number>} path\n * @this {FormData}\n *\n * @returns {boolean} return true to visit the each prop of the value recursively\n */\n function defaultVisitor(value, key, path) {\n let arr = value;\n\n if (value && !path && typeof value === 'object') {\n if (utils.endsWith(key, '{}')) {\n // eslint-disable-next-line no-param-reassign\n key = metaTokens ? key : key.slice(0, -2);\n // eslint-disable-next-line no-param-reassign\n value = JSON.stringify(value);\n } else if (\n (utils.isArray(value) && isFlatArray(value)) ||\n (utils.isFileList(value) || utils.endsWith(key, '[]') && (arr = utils.toArray(value))\n )) {\n // eslint-disable-next-line no-param-reassign\n key = removeBrackets(key);\n\n arr.forEach(function each(el, index) {\n !(utils.isUndefined(el) || el === null) && formData.append(\n // eslint-disable-next-line no-nested-ternary\n indexes === true ? renderKey([key], index, dots) : (indexes === null ? key : key + '[]'),\n convertValue(el)\n );\n });\n return false;\n }\n }\n\n if (isVisitable(value)) {\n return true;\n }\n\n formData.append(renderKey(path, key, dots), convertValue(value));\n\n return false;\n }\n\n const stack = [];\n\n const exposedHelpers = Object.assign(predicates, {\n defaultVisitor,\n convertValue,\n isVisitable\n });\n\n function build(value, path) {\n if (utils.isUndefined(value)) return;\n\n if (stack.indexOf(value) !== -1) {\n throw Error('Circular reference detected in ' + path.join('.'));\n }\n\n stack.push(value);\n\n utils.forEach(value, function each(el, key) {\n const result = !(utils.isUndefined(el) || el === null) && visitor.call(\n formData, el, utils.isString(key) ? key.trim() : key, path, exposedHelpers\n );\n\n if (result === true) {\n build(el, path ? path.concat(key) : [key]);\n }\n });\n\n stack.pop();\n }\n\n if (!utils.isObject(obj)) {\n throw new TypeError('data must be an object');\n }\n\n build(obj);\n\n return formData;\n}\n\nexport default toFormData;\n","'use strict';\n\nimport toFormData from './toFormData.js';\n\n/**\n * It encodes a string by replacing all characters that are not in the unreserved set with\n * their percent-encoded equivalents\n *\n * @param {string} str - The string to encode.\n *\n * @returns {string} The encoded string.\n */\nfunction encode(str) {\n const charMap = {\n '!': '%21',\n \"'\": '%27',\n '(': '%28',\n ')': '%29',\n '~': '%7E',\n '%20': '+',\n '%00': '\\x00'\n };\n return encodeURIComponent(str).replace(/[!'()~]|%20|%00/g, function replacer(match) {\n return charMap[match];\n });\n}\n\n/**\n * It takes a params object and converts it to a FormData object\n *\n * @param {Object<string, any>} params - The parameters to be converted to a FormData object.\n * @param {Object<string, any>} options - The options object passed to the Axios constructor.\n *\n * @returns {void}\n */\nfunction AxiosURLSearchParams(params, options) {\n this._pairs = [];\n\n params && toFormData(params, this, options);\n}\n\nconst prototype = AxiosURLSearchParams.prototype;\n\nprototype.append = function append(name, value) {\n this._pairs.push([name, value]);\n};\n\nprototype.toString = function toString(encoder) {\n const _encode = encoder ? function(value) {\n return encoder.call(this, value, encode);\n } : encode;\n\n return this._pairs.map(function each(pair) {\n return _encode(pair[0]) + '=' + _encode(pair[1]);\n }, '').join('&');\n};\n\nexport default AxiosURLSearchParams;\n","'use strict';\n\nimport utils from '../utils.js';\nimport AxiosURLSearchParams from '../helpers/AxiosURLSearchParams.js';\n\n/**\n * It replaces all instances of the characters `:`, `$`, `,`, `+`, `[`, and `]` with their\n * URI encoded counterparts\n *\n * @param {string} val The value to be encoded.\n *\n * @returns {string} The encoded value.\n */\nfunction encode(val) {\n return encodeURIComponent(val).\n replace(/%3A/gi, ':').\n replace(/%24/g, '$').\n replace(/%2C/gi, ',').\n replace(/%20/g, '+').\n replace(/%5B/gi, '[').\n replace(/%5D/gi, ']');\n}\n\n/**\n * Build a URL by appending params to the end\n *\n * @param {string} url The base of the url (e.g., http://www.google.com)\n * @param {object} [params] The params to be appended\n * @param {?object} options\n *\n * @returns {string} The formatted url\n */\nexport default function buildURL(url, params, options) {\n /*eslint no-param-reassign:0*/\n if (!params) {\n return url;\n }\n \n const _encode = options && options.encode || encode;\n\n const serializeFn = options && options.serialize;\n\n let serializedParams;\n\n if (serializeFn) {\n serializedParams = serializeFn(params, options);\n } else {\n serializedParams = utils.isURLSearchParams(params) ?\n params.toString() :\n new AxiosURLSearchParams(params, options).toString(_encode);\n }\n\n if (serializedParams) {\n const hashmarkIndex = url.indexOf(\"#\");\n\n if (hashmarkIndex !== -1) {\n url = url.slice(0, hashmarkIndex);\n }\n url += (url.indexOf('?') === -1 ? '?' : '&') + serializedParams;\n }\n\n return url;\n}\n","'use strict';\n\nimport utils from './../utils.js';\n\nclass InterceptorManager {\n constructor() {\n this.handlers = [];\n }\n\n /**\n * Add a new interceptor to the stack\n *\n * @param {Function} fulfilled The function to handle `then` for a `Promise`\n * @param {Function} rejected The function to handle `reject` for a `Promise`\n *\n * @return {Number} An ID used to remove interceptor later\n */\n use(fulfilled, rejected, options) {\n this.handlers.push({\n fulfilled,\n rejected,\n synchronous: options ? options.synchronous : false,\n runWhen: options ? options.runWhen : null\n });\n return this.handlers.length - 1;\n }\n\n /**\n * Remove an interceptor from the stack\n *\n * @param {Number} id The ID that was returned by `use`\n *\n * @returns {Boolean} `true` if the interceptor was removed, `false` otherwise\n */\n eject(id) {\n if (this.handlers[id]) {\n this.handlers[id] = null;\n }\n }\n\n /**\n * Clear all interceptors from the stack\n *\n * @returns {void}\n */\n clear() {\n if (this.handlers) {\n this.handlers = [];\n }\n }\n\n /**\n * Iterate over all the registered interceptors\n *\n * This method is particularly useful for skipping over any\n * interceptors that may have become `null` calling `eject`.\n *\n * @param {Function} fn The function to call for each interceptor\n *\n * @returns {void}\n */\n forEach(fn) {\n utils.forEach(this.handlers, function forEachHandler(h) {\n if (h !== null) {\n fn(h);\n }\n });\n }\n}\n\nexport default InterceptorManager;\n","'use strict';\n\nexport default {\n silentJSONParsing: true,\n forcedJSONParsing: true,\n clarifyTimeoutError: false\n};\n","'use strict';\n\nimport url from 'url';\nexport default url.URLSearchParams;\n","import URLSearchParams from './classes/URLSearchParams.js'\nimport FormData from './classes/FormData.js'\n\nexport default {\n isNode: true,\n classes: {\n URLSearchParams,\n FormData,\n Blob: typeof Blob !== 'undefined' && Blob || null\n },\n protocols: [ 'http', 'https', 'file', 'data' ]\n};\n","'use strict';\n\nimport utils from '../utils.js';\nimport toFormData from './toFormData.js';\nimport platform from '../platform/index.js';\n\nexport default function toURLEncodedForm(data, options) {\n return toFormData(data, new platform.classes.URLSearchParams(), Object.assign({\n visitor: function(value, key, path, helpers) {\n if (platform.isNode && utils.isBuffer(value)) {\n this.append(key, value.toString('base64'));\n return false;\n }\n\n return helpers.defaultVisitor.apply(this, arguments);\n }\n }, options));\n}\n","'use strict';\n\nimport utils from '../utils.js';\n\n/**\n * It takes a string like `foo[x][y][z]` and returns an array like `['foo', 'x', 'y', 'z']\n *\n * @param {string} name - The name of the property to get.\n *\n * @returns An array of strings.\n */\nfunction parsePropPath(name) {\n // foo[x][y][z]\n // foo.x.y.z\n // foo-x-y-z\n // foo x y z\n return utils.matchAll(/\\w+|\\[(\\w*)]/g, name).map(match => {\n return match[0] === '[]' ? '' : match[1] || match[0];\n });\n}\n\n/**\n * Convert an array to an object.\n *\n * @param {Array<any>} arr - The array to convert to an object.\n *\n * @returns An object with the same keys and values as the array.\n */\nfunction arrayToObject(arr) {\n const obj = {};\n const keys = Object.keys(arr);\n let i;\n const len = keys.length;\n let key;\n for (i = 0; i < len; i++) {\n key = keys[i];\n obj[key] = arr[key];\n }\n return obj;\n}\n\n/**\n * It takes a FormData object and returns a JavaScript object\n *\n * @param {string} formData The FormData object to convert to JSON.\n *\n * @returns {Object<string, any> | null} The converted object.\n */\nfunction formDataToJSON(formData) {\n function buildPath(path, value, target, index) {\n let name = path[index++];\n const isNumericKey = Number.isFinite(+name);\n const isLast = index >= path.length;\n name = !name && utils.isArray(target) ? target.length : name;\n\n if (isLast) {\n if (utils.hasOwnProp(target, name)) {\n target[name] = [target[name], value];\n } else {\n target[name] = value;\n }\n\n return !isNumericKey;\n }\n\n if (!target[name] || !utils.isObject(target[name])) {\n target[name] = [];\n }\n\n const result = buildPath(path, value, target[name], index);\n\n if (result && utils.isArray(target[name])) {\n target[name] = arrayToObject(target[name]);\n }\n\n return !isNumericKey;\n }\n\n if (utils.isFormData(formData) && utils.isFunction(formData.entries)) {\n const obj = {};\n\n utils.forEachEntry(formData, (name, value) => {\n buildPath(parsePropPath(name), value, obj, 0);\n });\n\n return obj;\n }\n\n return null;\n}\n\nexport default formDataToJSON;\n","'use strict';\n\nimport AxiosError from './AxiosError.js';\n\n/**\n * Resolve or reject a Promise based on response status.\n *\n * @param {Function} resolve A function that resolves the promise.\n * @param {Function} reject A function that rejects the promise.\n * @param {object} response The response.\n *\n * @returns {object} The response.\n */\nexport default function settle(resolve, reject, response) {\n const validateStatus = response.config.validateStatus;\n if (!response.status || !validateStatus || validateStatus(response.status)) {\n resolve(response);\n } else {\n reject(new AxiosError(\n 'Request failed with status code ' + response.status,\n [AxiosError.ERR_BAD_REQUEST, AxiosError.ERR_BAD_RESPONSE][Math.floor(response.status / 100) - 4],\n response.config,\n response.request,\n response\n ));\n }\n}\n","'use strict';\n\n/**\n * Determines whether the specified URL is absolute\n *\n * @param {string} url The URL to test\n *\n * @returns {boolean} True if the specified URL is absolute, otherwise false\n */\nexport default function isAbsoluteURL(url) {\n // A URL is considered absolute if it begins with \"<scheme>://\" or \"//\" (protocol-relative URL).\n // RFC 3986 defines scheme name as a sequence of characters beginning with a letter and followed\n // by any combination of letters, digits, plus, period, or hyphen.\n return /^([a-z][a-z\\d+\\-.]*:)?\\/\\//i.test(url);\n}\n","'use strict';\n\n/**\n * Creates a new URL by combining the specified URLs\n *\n * @param {string} baseURL The base URL\n * @param {string} relativeURL The relative URL\n *\n * @returns {string} The combined URL\n */\nexport default function combineURLs(baseURL, relativeURL) {\n return relativeURL\n ? baseURL.replace(/\\/+$/, '') + '/' + relativeURL.replace(/^\\/+/, '')\n : baseURL;\n}\n","'use strict';\n\nimport isAbsoluteURL from '../helpers/isAbsoluteURL.js';\nimport combineURLs from '../helpers/combineURLs.js';\n\n/**\n * Creates a new URL by combining the baseURL with the requestedURL,\n * only when the requestedURL is not already an absolute URL.\n * If the requestURL is absolute, this function returns the requestedURL untouched.\n *\n * @param {string} baseURL The base URL\n * @param {string} requestedURL Absolute or relative URL to combine\n *\n * @returns {string} The combined full path\n */\nexport default function buildFullPath(baseURL, requestedURL) {\n if (baseURL && !isAbsoluteURL(requestedURL)) {\n return combineURLs(baseURL, requestedURL);\n }\n return requestedURL;\n}\n","export const VERSION = \"1.1.3\";","'use strict';\n\nimport AxiosError from '../core/AxiosError.js';\nimport utils from '../utils.js';\n\n/**\n * A `CanceledError` is an object that is thrown when an operation is canceled.\n *\n * @param {string=} message The message.\n * @param {Object=} config The config.\n * @param {Object=} request The request.\n *\n * @returns {CanceledError} The created error.\n */\nfunction CanceledError(message, config, request) {\n // eslint-disable-next-line no-eq-null,eqeqeq\n AxiosError.call(this, message == null ? 'canceled' : message, AxiosError.ERR_CANCELED, config, request);\n this.name = 'CanceledError';\n}\n\nutils.inherits(CanceledError, AxiosError, {\n __CANCEL__: true\n});\n\nexport default CanceledError;\n","'use strict';\n\nexport default function parseProtocol(url) {\n const match = /^([-+\\w]{1,25})(:?\\/\\/|:)/.exec(url);\n return match && match[1] || '';\n}\n","'use strict';\n\nimport AxiosError from '../core/AxiosError.js';\nimport parseProtocol from './parseProtocol.js';\nimport platform from '../platform/index.js';\n\nconst DATA_URL_PATTERN = /^(?:([^;]+);)?(?:[^;]+;)?(base64|),([\\s\\S]*)$/;\n\n/**\n * Parse data uri to a Buffer or Blob\n *\n * @param {String} uri\n * @param {?Boolean} asBlob\n * @param {?Object} options\n * @param {?Function} options.Blob\n *\n * @returns {Buffer|Blob}\n */\nexport default function fromDataURI(uri, asBlob, options) {\n const _Blob = options && options.Blob || platform.classes.Blob;\n const protocol = parseProtocol(uri);\n\n if (asBlob === undefined && _Blob) {\n asBlob = true;\n }\n\n if (protocol === 'data') {\n uri = protocol.length ? uri.slice(protocol.length + 1) : uri;\n\n const match = DATA_URL_PATTERN.exec(uri);\n\n if (!match) {\n throw new AxiosError('Invalid URL', AxiosError.ERR_INVALID_URL);\n }\n\n const mime = match[1];\n const isBase64 = match[2];\n const body = match[3];\n const buffer = Buffer.from(decodeURIComponent(body), isBase64 ? 'base64' : 'utf8');\n\n if (asBlob) {\n if (!_Blob) {\n throw new AxiosError('Blob is not supported', AxiosError.ERR_NOT_SUPPORT);\n }\n\n return new _Blob([buffer], {type: mime});\n }\n\n return buffer;\n }\n\n throw new AxiosError('Unsupported protocol ' + protocol, AxiosError.ERR_NOT_SUPPORT);\n}\n","'use strict';\n\nimport utils from './../utils.js';\n\n// RawAxiosHeaders whose duplicates are ignored by node\n// c.f. https://nodejs.org/api/http.html#http_message_headers\nconst ignoreDuplicateOf = utils.toObjectSet([\n 'age', 'authorization', 'content-length', 'content-type', 'etag',\n 'expires', 'from', 'host', 'if-modified-since', 'if-unmodified-since',\n 'last-modified', 'location', 'max-forwards', 'proxy-authorization',\n 'referer', 'retry-after', 'user-agent'\n]);\n\n/**\n * Parse headers into an object\n *\n * ```\n * Date: Wed, 27 Aug 2014 08:58:49 GMT\n * Content-Type: application/json\n * Connection: keep-alive\n * Transfer-Encoding: chunked\n * ```\n *\n * @param {String} rawHeaders Headers needing to be parsed\n *\n * @returns {Object} Headers parsed into an object\n */\nexport default rawHeaders => {\n const parsed = {};\n let key;\n let val;\n let i;\n\n rawHeaders && rawHeaders.split('\\n').forEach(function parser(line) {\n i = line.indexOf(':');\n key = line.substring(0, i).trim().toLowerCase();\n val = line.substring(i + 1).trim();\n\n if (!key || (parsed[key] && ignoreDuplicateOf[key])) {\n return;\n }\n\n if (key === 'set-cookie') {\n if (parsed[key]) {\n parsed[key].push(val);\n } else {\n parsed[key] = [val];\n }\n } else {\n parsed[key] = parsed[key] ? parsed[key] + ', ' + val : val;\n }\n });\n\n return parsed;\n};\n","'use strict';\n\nimport utils from '../utils.js';\nimport parseHeaders from '../helpers/parseHeaders.js';\n\nconst $internals = Symbol('internals');\nconst $defaults = Symbol('defaults');\n\nfunction normalizeHeader(header) {\n return header && String(header).trim().toLowerCase();\n}\n\nfunction normalizeValue(value) {\n if (value === false || value == null) {\n return value;\n }\n\n return utils.isArray(value) ? value.map(normalizeValue) : String(value);\n}\n\nfunction parseTokens(str) {\n const tokens = Object.create(null);\n const tokensRE = /([^\\s,;=]+)\\s*(?:=\\s*([^,;]+))?/g;\n let match;\n\n while ((match = tokensRE.exec(str))) {\n tokens[match[1]] = match[2];\n }\n\n return tokens;\n}\n\nfunction matchHeaderValue(context, value, header, filter) {\n if (utils.isFunction(filter)) {\n return filter.call(this, value, header);\n }\n\n if (!utils.isString(value)) return;\n\n if (utils.isString(filter)) {\n return value.indexOf(filter) !== -1;\n }\n\n if (utils.isRegExp(filter)) {\n return filter.test(value);\n }\n}\n\nfunction formatHeader(header) {\n return header.trim()\n .toLowerCase().replace(/([a-z\\d])(\\w*)/g, (w, char, str) => {\n return char.toUpperCase() + str;\n });\n}\n\nfunction buildAccessors(obj, header) {\n const accessorName = utils.toCamelCase(' ' + header);\n\n ['get', 'set', 'has'].forEach(methodName => {\n Object.defineProperty(obj, methodName + accessorName, {\n value: function(arg1, arg2, arg3) {\n return this[methodName].call(this, header, arg1, arg2, arg3);\n },\n configurable: true\n });\n });\n}\n\nfunction findKey(obj, key) {\n key = key.toLowerCase();\n const keys = Object.keys(obj);\n let i = keys.length;\n let _key;\n while (i-- > 0) {\n _key = keys[i];\n if (key === _key.toLowerCase()) {\n return _key;\n }\n }\n return null;\n}\n\nfunction AxiosHeaders(headers, defaults) {\n headers && this.set(headers);\n this[$defaults] = defaults || null;\n}\n\nObject.assign(AxiosHeaders.prototype, {\n set: function(header, valueOrRewrite, rewrite) {\n const self = this;\n\n function setHeader(_value, _header, _rewrite) {\n const lHeader = normalizeHeader(_header);\n\n if (!lHeader) {\n throw new Error('header name must be a non-empty string');\n }\n\n const key = findKey(self, lHeader);\n\n if (key && _rewrite !== true && (self[key] === false || _rewrite === false)) {\n return;\n }\n\n self[key || _header] = normalizeValue(_value);\n }\n\n if (utils.isPlainObject(header)) {\n utils.forEach(header, (_value, _header) => {\n setHeader(_value, _header, valueOrRewrite);\n });\n } else {\n setHeader(valueOrRewrite, header, rewrite);\n }\n\n return this;\n },\n\n get: function(header, parser) {\n header = normalizeHeader(header);\n\n if (!header) return undefined;\n\n const key = findKey(this, header);\n\n if (key) {\n const value = this[key];\n\n if (!parser) {\n return value;\n }\n\n if (parser === true) {\n return parseTokens(value);\n }\n\n if (utils.isFunction(parser)) {\n return parser.call(this, value, key);\n }\n\n if (utils.isRegExp(parser)) {\n return parser.exec(value);\n }\n\n throw new TypeError('parser must be boolean|regexp|function');\n }\n },\n\n has: function(header, matcher) {\n header = normalizeHeader(header);\n\n if (header) {\n const key = findKey(this, header);\n\n return !!(key && (!matcher || matchHeaderValue(this, this[key], key, matcher)));\n }\n\n return false;\n },\n\n delete: function(header, matcher) {\n const self = this;\n let deleted = false;\n\n function deleteHeader(_header) {\n _header = normalizeHeader(_header);\n\n if (_header) {\n const key = findKey(self, _header);\n\n if (key && (!matcher || matchHeaderValue(self, self[key], key, matcher))) {\n delete self[key];\n\n deleted = true;\n }\n }\n }\n\n if (utils.isArray(header)) {\n header.forEach(deleteHeader);\n } else {\n deleteHeader(header);\n }\n\n return deleted;\n },\n\n clear: function() {\n return Object.keys(this).forEach(this.delete.bind(this));\n },\n\n normalize: function(format) {\n const self = this;\n const headers = {};\n\n utils.forEach(this, (value, header) => {\n const key = findKey(headers, header);\n\n if (key) {\n self[key] = normalizeValue(value);\n delete self[header];\n return;\n }\n\n const normalized = format ? formatHeader(header) : String(header).trim();\n\n if (normalized !== header) {\n delete self[header];\n }\n\n self[normalized] = normalizeValue(value);\n\n headers[normalized] = true;\n });\n\n return this;\n },\n\n toJSON: function(asStrings) {\n const obj = Object.create(null);\n\n utils.forEach(Object.assign({}, this[$defaults] || null, this),\n (value, header) => {\n if (value == null || value === false) return;\n obj[header] = asStrings && utils.isArray(value) ? value.join(', ') : value;\n });\n\n return obj;\n }\n});\n\nObject.assign(AxiosHeaders, {\n from: function(thing) {\n if (utils.isString(thing)) {\n return new this(parseHeaders(thing));\n }\n return thing instanceof this ? thing : new this(thing);\n },\n\n accessor: function(header) {\n const internals = this[$internals] = (this[$internals] = {\n accessors: {}\n });\n\n const accessors = internals.accessors;\n const prototype = this.prototype;\n\n function defineAccessor(_header) {\n const lHeader = normalizeHeader(_header);\n\n if (!accessors[lHeader]) {\n buildAccessors(prototype, _header);\n accessors[lHeader] = true;\n }\n }\n\n utils.isArray(header) ? header.forEach(defineAccessor) : defineAccessor(header);\n\n return this;\n }\n});\n\nAxiosHeaders.accessor(['Content-Type', 'Content-Length', 'Accept', 'Accept-Encoding', 'User-Agent']);\n\nutils.freezeMethods(AxiosHeaders.prototype);\nutils.freezeMethods(AxiosHeaders);\n\nexport default AxiosHeaders;\n","'use strict';\n\n/**\n * Throttle decorator\n * @param {Function} fn\n * @param {Number} freq\n * @return {Function}\n */\nfunction throttle(fn, freq) {\n let timestamp = 0;\n const threshold = 1000 / freq;\n let timer = null;\n return function throttled(force, args) {\n const now = Date.now();\n if (force || now - timestamp > threshold) {\n if (timer) {\n clearTimeout(timer);\n timer = null;\n }\n timestamp = now;\n return fn.apply(null, args);\n }\n if (!timer) {\n timer = setTimeout(() => {\n timer = null;\n timestamp = Date.now();\n return fn.apply(null, args);\n }, threshold - (now - timestamp));\n }\n };\n}\n\nexport default throttle;\n","'use strict';\n\n/**\n * Calculate data maxRate\n * @param {Number} [samplesCount= 10]\n * @param {Number} [min= 1000]\n * @returns {Function}\n */\nfunction speedometer(samplesCount, min) {\n samplesCount = samplesCount || 10;\n const bytes = new Array(samplesCount);\n const timestamps = new Array(samplesCount);\n let head = 0;\n let tail = 0;\n let firstSampleTS;\n\n min = min !== undefined ? min : 1000;\n\n return function push(chunkLength) {\n const now = Date.now();\n\n const startedAt = timestamps[tail];\n\n if (!firstSampleTS) {\n firstSampleTS = now;\n }\n\n bytes[head] = chunkLength;\n timestamps[head] = now;\n\n let i = tail;\n let bytesCount = 0;\n\n while (i !== head) {\n bytesCount += bytes[i++];\n i = i % samplesCount;\n }\n\n head = (head + 1) % samplesCount;\n\n if (head === tail) {\n tail = (tail + 1) % samplesCount;\n }\n\n if (now - firstSampleTS < min) {\n return;\n }\n\n const passed = startedAt && now - startedAt;\n\n return passed ? Math.round(bytesCount * 1000 / passed) : undefined;\n };\n}\n\nexport default speedometer;\n","'use strict';\n\nimport stream from 'stream';\nimport utils from '../utils.js';\nimport throttle from './throttle.js';\nimport speedometer from './speedometer.js';\n\nconst kInternals = Symbol('internals');\n\nclass AxiosTransformStream extends stream.Transform{\n constructor(options) {\n options = utils.toFlatObject(options, {\n maxRate: 0,\n chunkSize: 64 * 1024,\n minChunkSize: 100,\n timeWindow: 500,\n ticksRate: 2,\n samplesCount: 15\n }, null, (prop, source) => {\n return !utils.isUndefined(source[prop]);\n });\n\n super({\n readableHighWaterMark: options.chunkSize\n });\n\n const self = this;\n\n const internals = this[kInternals] = {\n length: options.length,\n timeWindow: options.timeWindow,\n ticksRate: options.ticksRate,\n chunkSize: options.chunkSize,\n maxRate: options.maxRate,\n minChunkSize: options.minChunkSize,\n bytesSeen: 0,\n isCaptured: false,\n notifiedBytesLoaded: 0,\n ts: Date.now(),\n bytes: 0,\n onReadCallback: null\n };\n\n const _speedometer = speedometer(internals.ticksRate * options.samplesCount, internals.timeWindow);\n\n this.on('newListener', event => {\n if (event === 'progress') {\n if (!internals.isCaptured) {\n internals.isCaptured = true;\n }\n }\n });\n\n let bytesNotified = 0;\n\n internals.updateProgress = throttle(function throttledHandler() {\n const totalBytes = internals.length;\n const bytesTransferred = internals.bytesSeen;\n const progressBytes = bytesTransferred - bytesNotified;\n if (!progressBytes || self.destroyed) return;\n\n const rate = _speedometer(progressBytes);\n\n bytesNotified = bytesTransferred;\n\n process.nextTick(() => {\n self.emit('progress', {\n 'loaded': bytesTransferred,\n 'total': totalBytes,\n 'progress': totalBytes ? (bytesTransferred / totalBytes) : undefined,\n 'bytes': progressBytes,\n 'rate': rate ? rate : undefined,\n 'estimated': rate && totalBytes && bytesTransferred <= totalBytes ?\n (totalBytes - bytesTransferred) / rate : undefined\n });\n });\n }, internals.ticksRate);\n\n const onFinish = () => {\n internals.updateProgress(true);\n };\n\n this.once('end', onFinish);\n this.once('error', onFinish);\n }\n\n _read(size) {\n const internals = this[kInternals];\n\n if (internals.onReadCallback) {\n internals.onReadCallback();\n }\n\n return super._read(size);\n }\n\n _transform(chunk, encoding, callback) {\n const self = this;\n const internals = this[kInternals];\n const maxRate = internals.maxRate;\n\n const readableHighWaterMark = this.readableHighWaterMark;\n\n const timeWindow = internals.timeWindow;\n\n const divider = 1000 / timeWindow;\n const bytesThreshold = (maxRate / divider);\n const minChunkSize = internals.minChunkSize !== false ? Math.max(internals.minChunkSize, bytesThreshold * 0.01) : 0;\n\n function pushChunk(_chunk, _callback) {\n const bytes = Buffer.byteLength(_chunk);\n internals.bytesSeen += bytes;\n internals.bytes += bytes;\n\n if (internals.isCaptured) {\n internals.updateProgress();\n }\n\n if (self.push(_chunk)) {\n process.nextTick(_callback);\n } else {\n internals.onReadCallback = () => {\n internals.onReadCallback = null;\n process.nextTick(_callback);\n };\n }\n }\n\n const transformChunk = (_chunk, _callback) => {\n const chunkSize = Buffer.byteLength(_chunk);\n let chunkRemainder = null;\n let maxChunkSize = readableHighWaterMark;\n let bytesLeft;\n let passed = 0;\n\n if (maxRate) {\n const now = Date.now();\n\n if (!internals.ts || (passed = (now - internals.ts)) >= timeWindow) {\n internals.ts = now;\n bytesLeft = bytesThreshold - internals.bytes;\n internals.bytes = bytesLeft < 0 ? -bytesLeft : 0;\n passed = 0;\n }\n\n bytesLeft = bytesThreshold - internals.bytes;\n }\n\n if (maxRate) {\n if (bytesLeft <= 0) {\n // next time window\n return setTimeout(() => {\n _callback(null, _chunk);\n }, timeWindow - passed);\n }\n\n if (bytesLeft < maxChunkSize) {\n maxChunkSize = bytesLeft;\n }\n }\n\n if (maxChunkSize && chunkSize > maxChunkSize && (chunkSize - maxChunkSize) > minChunkSize) {\n chunkRemainder = _chunk.subarray(maxChunkSize);\n _chunk = _chunk.subarray(0, maxChunkSize);\n }\n\n pushChunk(_chunk, chunkRemainder ? () => {\n process.nextTick(_callback, null, chunkRemainder);\n } : _callback);\n };\n\n transformChunk(chunk, function transformNextChunk(err, _chunk) {\n if (err) {\n return callback(err);\n }\n\n if (_chunk) {\n transformChunk(_chunk, transformNextChunk);\n } else {\n callback(null);\n }\n });\n }\n\n setLength(length) {\n this[kInternals].length = +length;\n return this;\n }\n}\n\nexport default AxiosTransformStream;\n","'use strict';\n\nimport utils from './../utils.js';\nimport settle from './../core/settle.js';\nimport buildFullPath from '../core/buildFullPath.js';\nimport buildURL from './../helpers/buildURL.js';\nimport {getProxyForUrl} from 'proxy-from-env';\nimport http from 'http';\nimport https from 'https';\nimport followRedirects from 'follow-redirects';\nimport zlib from 'zlib';\nimport {VERSION} from '../env/data.js';\nimport transitionalDefaults from '../defaults/transitional.js';\nimport AxiosError from '../core/AxiosError.js';\nimport CanceledError from '../cancel/CanceledError.js';\nimport platform from '../platform/index.js';\nimport fromDataURI from '../helpers/fromDataURI.js';\nimport stream from 'stream';\nimport AxiosHeaders from '../core/AxiosHeaders.js';\nimport AxiosTransformStream from '../helpers/AxiosTransformStream.js';\nimport EventEmitter from 'events';\n\nconst isBrotliSupported = utils.isFunction(zlib.createBrotliDecompress);\n\nconst {http: httpFollow, https: httpsFollow} = followRedirects;\n\nconst isHttps = /https:?/;\n\nconst supportedProtocols = platform.protocols.map(protocol => {\n return protocol + ':';\n});\n\n/**\n * If the proxy or config beforeRedirects functions are defined, call them with the options\n * object.\n *\n * @param {Object<string, any>} options - The options object that was passed to the request.\n *\n * @returns {Object<string, any>}\n */\nfunction dispatchBeforeRedirect(options) {\n if (options.beforeRedirects.proxy) {\n options.beforeRedirects.proxy(options);\n }\n if (options.beforeRedirects.config) {\n options.beforeRedirects.config(options);\n }\n}\n\n/**\n * If the proxy or config afterRedirects functions are defined, call them with the options\n *\n * @param {http.ClientRequestArgs} options\n * @param {AxiosProxyConfig} configProxy configuration from Axios options object\n * @param {string} location\n *\n * @returns {http.ClientRequestArgs}\n */\nfunction setProxy(options, configProxy, location) {\n let proxy = configProxy;\n if (!proxy && proxy !== false) {\n const proxyUrl = getProxyForUrl(location);\n if (proxyUrl) {\n proxy = new URL(proxyUrl);\n }\n }\n if (proxy) {\n // Basic proxy authorization\n if (proxy.username) {\n proxy.auth = (proxy.username || '') + ':' + (proxy.password || '');\n }\n\n if (proxy.auth) {\n // Support proxy auth object form\n if (proxy.auth.username || proxy.auth.password) {\n proxy.auth = (proxy.auth.username || '') + ':' + (proxy.auth.password || '');\n }\n const base64 = Buffer\n .from(proxy.auth, 'utf8')\n .toString('base64');\n options.headers['Proxy-Authorization'] = 'Basic ' + base64;\n }\n\n options.headers.host = options.hostname + (options.port ? ':' + options.port : '');\n const proxyHost = proxy.hostname || proxy.host;\n options.hostname = proxyHost;\n // Replace 'host' since options is not a URL object\n options.host = proxyHost;\n options.port = proxy.port;\n options.path = location;\n if (proxy.protocol) {\n options.protocol = proxy.protocol.includes(':') ? proxy.protocol : `${proxy.protocol}:`;\n }\n }\n\n options.beforeRedirects.proxy = function beforeRedirect(redirectOptions) {\n // Configure proxy for redirected request, passing the original config proxy to apply\n // the exact same logic as if the redirected request was performed by axios directly.\n setProxy(redirectOptions, configProxy, redirectOptions.href);\n };\n}\n\n/*eslint consistent-return:0*/\nexport default function httpAdapter(config) {\n return new Promise(function dispatchHttpRequest(resolvePromise, rejectPromise) {\n let data = config.data;\n const responseType = config.responseType;\n const responseEncoding = config.responseEncoding;\n const method = config.method.toUpperCase();\n let isFinished;\n let isDone;\n let rejected = false;\n let req;\n\n // temporary internal emitter until the AxiosRequest class will be implemented\n const emitter = new EventEmitter();\n\n function onFinished() {\n if (isFinished) return;\n isFinished = true;\n\n if (config.cancelToken) {\n config.cancelToken.unsubscribe(abort);\n }\n\n if (config.signal) {\n config.signal.removeEventListener('abort', abort);\n }\n\n emitter.removeAllListeners();\n }\n\n function done(value, isRejected) {\n if (isDone) return;\n\n isDone = true;\n\n if (isRejected) {\n rejected = true;\n onFinished();\n }\n\n isRejected ? rejectPromise(value) : resolvePromise(value);\n }\n\n const resolve = function resolve(value) {\n done(value);\n };\n\n const reject = function reject(value) {\n done(value, true);\n };\n\n function abort(reason) {\n emitter.emit('abort', !reason || reason.type ? new CanceledError(null, config, req) : reason);\n }\n\n emitter.once('abort', reject);\n\n if (config.cancelToken || config.signal) {\n config.cancelToken && config.cancelToken.subscribe(abort);\n if (config.signal) {\n config.signal.aborted ? abort() : config.signal.addEventListener('abort', abort);\n }\n }\n\n // Parse url\n const fullPath = buildFullPath(config.baseURL, config.url);\n const parsed = new URL(fullPath);\n const protocol = parsed.protocol || supportedProtocols[0];\n\n if (protocol === 'data:') {\n let convertedData;\n\n if (method !== 'GET') {\n return settle(resolve, reject, {\n status: 405,\n statusText: 'method not allowed',\n headers: {},\n config\n });\n }\n\n try {\n convertedData = fromDataURI(config.url, responseType === 'blob', {\n Blob: config.env && config.env.Blob\n });\n } catch (err) {\n throw AxiosError.from(err, AxiosError.ERR_BAD_REQUEST, config);\n }\n\n if (responseType === 'text') {\n convertedData = convertedData.toString(responseEncoding);\n\n if (!responseEncoding || responseEncoding === 'utf8') {\n data = utils.stripBOM(convertedData);\n }\n } else if (responseType === 'stream') {\n convertedData = stream.Readable.from(convertedData);\n }\n\n return settle(resolve, reject, {\n data: convertedData,\n status: 200,\n statusText: 'OK',\n headers: {},\n config\n });\n }\n\n if (supportedProtocols.indexOf(protocol) === -1) {\n return reject(new AxiosError(\n 'Unsupported protocol ' + protocol,\n AxiosError.ERR_BAD_REQUEST,\n config\n ));\n }\n\n const headers = AxiosHeaders.from(config.headers).normalize();\n\n // Set User-Agent (required by some servers)\n // See https://github.com/axios/axios/issues/69\n // User-Agent is specified; handle case where no UA header is desired\n // Only set header if it hasn't been set in config\n headers.set('User-Agent', 'axios/' + VERSION, false);\n\n const onDownloadProgress = config.onDownloadProgress;\n const onUploadProgress = config.onUploadProgress;\n const maxRate = config.maxRate;\n let maxUploadRate = undefined;\n let maxDownloadRate = undefined;\n\n // support for https://www.npmjs.com/package/form-data api\n if (utils.isFormData(data) && utils.isFunction(data.getHeaders)) {\n headers.set(data.getHeaders());\n } else if (data && !utils.isStream(data)) {\n if (Buffer.isBuffer(data)) {\n // Nothing to do...\n } else if (utils.isArrayBuffer(data)) {\n data = Buffer.from(new Uint8Array(data));\n } else if (utils.isString(data)) {\n data = Buffer.from(data, 'utf-8');\n } else {\n return reject(new AxiosError(\n 'Data after transformation must be a string, an ArrayBuffer, a Buffer, or a Stream',\n AxiosError.ERR_BAD_REQUEST,\n config\n ));\n }\n\n // Add Content-Length header if data exists\n headers.set('Content-Length', data.length, false);\n\n if (config.maxBodyLength > -1 && data.length > config.maxBodyLength) {\n return reject(new AxiosError(\n 'Request body larger than maxBodyLength limit',\n AxiosError.ERR_BAD_REQUEST,\n config\n ));\n }\n }\n\n const contentLength = +headers.getContentLength();\n\n if (utils.isArray(maxRate)) {\n maxUploadRate = maxRate[0];\n maxDownloadRate = maxRate[1];\n } else {\n maxUploadRate = maxDownloadRate = maxRate;\n }\n\n if (data && (onUploadProgress || maxUploadRate)) {\n if (!utils.isStream(data)) {\n data = stream.Readable.from(data, {objectMode: false});\n }\n\n data = stream.pipeline([data, new AxiosTransformStream({\n length: utils.toFiniteNumber(contentLength),\n maxRate: utils.toFiniteNumber(maxUploadRate)\n })], utils.noop);\n\n onUploadProgress && data.on('progress', progress => {\n onUploadProgress(Object.assign(progress, {\n upload: true\n }));\n });\n }\n\n // HTTP basic authentication\n let auth = undefined;\n if (config.auth) {\n const username = config.auth.username || '';\n const password = config.auth.password || '';\n auth = username + ':' + password;\n }\n\n if (!auth && parsed.username) {\n const urlUsername = parsed.username;\n const urlPassword = parsed.password;\n auth = urlUsername + ':' + urlPassword;\n }\n\n auth && headers.delete('authorization');\n\n let path;\n\n try {\n path = buildURL(\n parsed.pathname + parsed.search,\n config.params,\n config.paramsSerializer\n ).replace(/^\\?/, '');\n } catch (err) {\n const customErr = new Error(err.message);\n customErr.config = config;\n customErr.url = config.url;\n customErr.exists = true;\n return reject(customErr);\n }\n\n headers.set('Accept-Encoding', 'gzip, deflate, br', false);\n\n const options = {\n path,\n method: method,\n headers: headers.toJSON(),\n agents: { http: config.httpAgent, https: config.httpsAgent },\n auth,\n protocol,\n beforeRedirect: dispatchBeforeRedirect,\n beforeRedirects: {}\n };\n\n if (config.socketPath) {\n options.socketPath = config.socketPath;\n } else {\n options.hostname = parsed.hostname;\n options.port = parsed.port;\n setProxy(options, config.proxy, protocol + '//' + parsed.hostname + (parsed.port ? ':' + parsed.port : '') + options.path);\n }\n\n let transport;\n const isHttpsRequest = isHttps.test(options.protocol);\n options.agent = isHttpsRequest ? config.httpsAgent : config.httpAgent;\n if (config.transport) {\n transport = config.transport;\n } else if (config.maxRedirects === 0) {\n transport = isHttpsRequest ? https : http;\n } else {\n if (config.maxRedirects) {\n options.maxRedirects = config.maxRedirects;\n }\n if (config.beforeRedirect) {\n options.beforeRedirects.config = config.beforeRedirect;\n }\n transport = isHttpsRequest ? httpsFollow : httpFollow;\n }\n\n if (config.maxBodyLength > -1) {\n options.maxBodyLength = config.maxBodyLength;\n } else {\n // follow-redirects does not skip comparison, so it should always succeed for axios -1 unlimited\n options.maxBodyLength = Infinity;\n }\n\n if (config.insecureHTTPParser) {\n options.insecureHTTPParser = config.insecureHTTPParser;\n }\n\n // Create the request\n req = transport.request(options, function handleResponse(res) {\n if (req.destroyed) return;\n\n const streams = [res];\n\n // uncompress the response body transparently if required\n let responseStream = res;\n\n // return the last request in case of redirects\n const lastRequest = res.req || req;\n\n // if decompress disabled we should not decompress\n if (config.decompress !== false) {\n // if no content, but headers still say that it is encoded,\n // remove the header not confuse downstream operations\n if (data && data.length === 0 && res.headers['content-encoding']) {\n delete res.headers['content-encoding'];\n }\n\n switch (res.headers['content-encoding']) {\n /*eslint default-case:0*/\n case 'gzip':\n case 'compress':\n case 'deflate':\n // add the unzipper to the body stream processing pipeline\n streams.push(zlib.createUnzip());\n\n // remove the content-encoding in order to not confuse downstream operations\n delete res.headers['content-encoding'];\n break;\n case 'br':\n if (isBrotliSupported) {\n streams.push(zlib.createBrotliDecompress());\n delete res.headers['content-encoding'];\n }\n }\n }\n\n if (onDownloadProgress) {\n const responseLength = +res.headers['content-length'];\n\n const transformStream = new AxiosTransformStream({\n length: utils.toFiniteNumber(responseLength),\n maxRate: utils.toFiniteNumber(maxDownloadRate)\n });\n\n onDownloadProgress && transformStream.on('progress', progress => {\n onDownloadProgress(Object.assign(progress, {\n download: true\n }));\n });\n\n streams.push(transformStream);\n }\n\n responseStream = streams.length > 1 ? stream.pipeline(streams, utils.noop) : streams[0];\n\n const offListeners = stream.finished(responseStream, () => {\n offListeners();\n onFinished();\n });\n\n const response = {\n status: res.statusCode,\n statusText: res.statusMessage,\n headers: new AxiosHeaders(res.headers),\n config,\n request: lastRequest\n };\n\n if (responseType === 'stream') {\n response.data = responseStream;\n settle(resolve, reject, response);\n } else {\n const responseBuffer = [];\n let totalResponseBytes = 0;\n\n responseStream.on('data', function handleStreamData(chunk) {\n responseBuffer.push(chunk);\n totalResponseBytes += chunk.length;\n\n // make sure the content length is not over the maxContentLength if specified\n if (config.maxContentLength > -1 && totalResponseBytes > config.maxContentLength) {\n // stream.destroy() emit aborted event before calling reject() on Node.js v16\n rejected = true;\n responseStream.destroy();\n reject(new AxiosError('maxContentLength size of ' + config.maxContentLength + ' exceeded',\n AxiosError.ERR_BAD_RESPONSE, config, lastRequest));\n }\n });\n\n responseStream.on('aborted', function handlerStreamAborted() {\n if (rejected) {\n return;\n }\n\n const err = new AxiosError(\n 'maxContentLength size of ' + config.maxContentLength + ' exceeded',\n AxiosError.ERR_BAD_RESPONSE,\n config,\n lastRequest\n );\n responseStream.destroy(err);\n reject(err);\n });\n\n responseStream.on('error', function handleStreamError(err) {\n if (req.destroyed) return;\n reject(AxiosError.from(err, null, config, lastRequest));\n });\n\n responseStream.on('end', function handleStreamEnd() {\n try {\n let responseData = responseBuffer.length === 1 ? responseBuffer[0] : Buffer.concat(responseBuffer);\n if (responseType !== 'arraybuffer') {\n responseData = responseData.toString(responseEncoding);\n if (!responseEncoding || responseEncoding === 'utf8') {\n responseData = utils.stripBOM(responseData);\n }\n }\n response.data = responseData;\n } catch (err) {\n reject(AxiosError.from(err, null, config, response.request, response));\n }\n settle(resolve, reject, response);\n });\n }\n\n emitter.once('abort', err => {\n if (!responseStream.destroyed) {\n responseStream.emit('error', err);\n responseStream.destroy();\n }\n });\n });\n\n emitter.once('abort', err => {\n reject(err);\n req.destroy(err);\n });\n\n // Handle errors\n req.on('error', function handleRequestError(err) {\n // @todo remove\n // if (req.aborted && err.code !== AxiosError.ERR_FR_TOO_MANY_REDIRECTS) return;\n reject(AxiosError.from(err, null, config, req));\n });\n\n // set tcp keep alive to prevent drop connection by peer\n req.on('socket', function handleRequestSocket(socket) {\n // default interval of sending ack packet is 1 minute\n socket.setKeepAlive(true, 1000 * 60);\n });\n\n // Handle request timeout\n if (config.timeout) {\n // This is forcing a int timeout to avoid problems if the `req` interface doesn't handle other types.\n const timeout = parseInt(config.timeout, 10);\n\n if (isNaN(timeout)) {\n reject(new AxiosError(\n 'error trying to parse `config.timeout` to int',\n AxiosError.ERR_BAD_OPTION_VALUE,\n config,\n req\n ));\n\n return;\n }\n\n // Sometime, the response will be very slow, and does not respond, the connect event will be block by event loop system.\n // And timer callback will be fired, and abort() will be invoked before connection, then get \"socket hang up\" and code ECONNRESET.\n // At this time, if we have a large number of request, nodejs will hang up some socket on background. and the number will up and up.\n // And then these socket which be hang up will devouring CPU little by little.\n // ClientRequest.setTimeout will be fired on the specify milliseconds, and can make sure that abort() will be fired after connect.\n req.setTimeout(timeout, function handleRequestTimeout() {\n if (isDone) return;\n let timeoutErrorMessage = config.timeout ? 'timeout of ' + config.timeout + 'ms exceeded' : 'timeout exceeded';\n const transitional = config.transitional || transitionalDefaults;\n if (config.timeoutErrorMessage) {\n timeoutErrorMessage = config.timeoutErrorMessage;\n }\n reject(new AxiosError(\n timeoutErrorMessage,\n transitional.clarifyTimeoutError ? AxiosError.ETIMEDOUT : AxiosError.ECONNABORTED,\n config,\n req\n ));\n abort();\n });\n }\n\n\n // Send the request\n if (utils.isStream(data)) {\n let ended = false;\n let errored = false;\n\n data.on('end', () => {\n ended = true;\n });\n\n data.once('error', err => {\n errored = true;\n req.destroy(err);\n });\n\n data.on('close', () => {\n if (!ended && !errored) {\n abort(new CanceledError('Request stream has been aborted', config, req));\n }\n });\n\n data.pipe(req);\n } else {\n req.end(data);\n }\n });\n}\n\nexport const __setProxy = setProxy;","'use strict';\n\nimport utils from './../utils.js';\nimport platform from '../platform/index.js';\n\nexport default platform.isStandardBrowserEnv ?\n\n// Standard browser envs support document.cookie\n (function standardBrowserEnv() {\n return {\n write: function write(name, value, expires, path, domain, secure) {\n const cookie = [];\n cookie.push(name + '=' + encodeURIComponent(value));\n\n if (utils.isNumber(expires)) {\n cookie.push('expires=' + new Date(expires).toGMTString());\n }\n\n if (utils.isString(path)) {\n cookie.push('path=' + path);\n }\n\n if (utils.isString(domain)) {\n cookie.push('domain=' + domain);\n }\n\n if (secure === true) {\n cookie.push('secure');\n }\n\n document.cookie = cookie.join('; ');\n },\n\n read: function read(name) {\n const match = document.cookie.match(new RegExp('(^|;\\\\s*)(' + name + ')=([^;]*)'));\n return (match ? decodeURIComponent(match[3]) : null);\n },\n\n remove: function remove(name) {\n this.write(name, '', Date.now() - 86400000);\n }\n };\n })() :\n\n// Non standard browser env (web workers, react-native) lack needed support.\n (function nonStandardBrowserEnv() {\n return {\n write: function write() {},\n read: function read() { return null; },\n remove: function remove() {}\n };\n })();\n","'use strict';\n\nimport utils from './../utils.js';\nimport platform from '../platform/index.js';\n\nexport default platform.isStandardBrowserEnv ?\n\n// Standard browser envs have full support of the APIs needed to test\n// whether the request URL is of the same origin as current location.\n (function standardBrowserEnv() {\n const msie = /(msie|trident)/i.test(navigator.userAgent);\n const urlParsingNode = document.createElement('a');\n let originURL;\n\n /**\n * Parse a URL to discover it's components\n *\n * @param {String} url The URL to be parsed\n * @returns {Object}\n */\n function resolveURL(url) {\n let href = url;\n\n if (msie) {\n // IE needs attribute set twice to normalize properties\n urlParsingNode.setAttribute('href', href);\n href = urlParsingNode.href;\n }\n\n urlParsingNode.setAttribute('href', href);\n\n // urlParsingNode provides the UrlUtils interface - http://url.spec.whatwg.org/#urlutils\n return {\n href: urlParsingNode.href,\n protocol: urlParsingNode.protocol ? urlParsingNode.protocol.replace(/:$/, '') : '',\n host: urlParsingNode.host,\n search: urlParsingNode.search ? urlParsingNode.search.replace(/^\\?/, '') : '',\n hash: urlParsingNode.hash ? urlParsingNode.hash.replace(/^#/, '') : '',\n hostname: urlParsingNode.hostname,\n port: urlParsingNode.port,\n pathname: (urlParsingNode.pathname.charAt(0) === '/') ?\n urlParsingNode.pathname :\n '/' + urlParsingNode.pathname\n };\n }\n\n originURL = resolveURL(window.location.href);\n\n /**\n * Determine if a URL shares the same origin as the current location\n *\n * @param {String} requestURL The URL to test\n * @returns {boolean} True if URL shares the same origin, otherwise false\n */\n return function isURLSameOrigin(requestURL) {\n const parsed = (utils.isString(requestURL)) ? resolveURL(requestURL) : requestURL;\n return (parsed.protocol === originURL.protocol &&\n parsed.host === originURL.host);\n };\n })() :\n\n // Non standard browser envs (web workers, react-native) lack needed support.\n (function nonStandardBrowserEnv() {\n return function isURLSameOrigin() {\n return true;\n };\n })();\n","'use strict';\n\nimport utils from './../utils.js';\nimport settle from './../core/settle.js';\nimport cookies from './../helpers/cookies.js';\nimport buildURL from './../helpers/buildURL.js';\nimport buildFullPath from '../core/buildFullPath.js';\nimport isURLSameOrigin from './../helpers/isURLSameOrigin.js';\nimport transitionalDefaults from '../defaults/transitional.js';\nimport AxiosError from '../core/AxiosError.js';\nimport CanceledError from '../cancel/CanceledError.js';\nimport parseProtocol from '../helpers/parseProtocol.js';\nimport platform from '../platform/index.js';\nimport AxiosHeaders from '../core/AxiosHeaders.js';\nimport speedometer from '../helpers/speedometer.js';\n\nfunction progressEventReducer(listener, isDownloadStream) {\n let bytesNotified = 0;\n const _speedometer = speedometer(50, 250);\n\n return e => {\n const loaded = e.loaded;\n const total = e.lengthComputable ? e.total : undefined;\n const progressBytes = loaded - bytesNotified;\n const rate = _speedometer(progressBytes);\n const inRange = loaded <= total;\n\n bytesNotified = loaded;\n\n const data = {\n loaded,\n total,\n progress: total ? (loaded / total) : undefined,\n bytes: progressBytes,\n rate: rate ? rate : undefined,\n estimated: rate && total && inRange ? (total - loaded) / rate : undefined\n };\n\n data[isDownloadStream ? 'download' : 'upload'] = true;\n\n listener(data);\n };\n}\n\nexport default function xhrAdapter(config) {\n return new Promise(function dispatchXhrRequest(resolve, reject) {\n let requestData = config.data;\n const requestHeaders = AxiosHeaders.from(config.headers).normalize();\n const responseType = config.responseType;\n let onCanceled;\n function done() {\n if (config.cancelToken) {\n config.cancelToken.unsubscribe(onCanceled);\n }\n\n if (config.signal) {\n config.signal.removeEventListener('abort', onCanceled);\n }\n }\n\n if (utils.isFormData(requestData) && platform.isStandardBrowserEnv) {\n requestHeaders.setContentType(false); // Let the browser set it\n }\n\n let request = new XMLHttpRequest();\n\n // HTTP basic authentication\n if (config.auth) {\n const username = config.auth.username || '';\n const password = config.auth.password ? unescape(encodeURIComponent(config.auth.password)) : '';\n requestHeaders.set('Authorization', 'Basic ' + btoa(username + ':' + password));\n }\n\n const fullPath = buildFullPath(config.baseURL, config.url);\n\n request.open(config.method.toUpperCase(), buildURL(fullPath, config.params, config.paramsSerializer), true);\n\n // Set the request timeout in MS\n request.timeout = config.timeout;\n\n function onloadend() {\n if (!request) {\n return;\n }\n // Prepare the response\n const responseHeaders = AxiosHeaders.from(\n 'getAllResponseHeaders' in request && request.getAllResponseHeaders()\n );\n const responseData = !responseType || responseType === 'text' || responseType === 'json' ?\n request.responseText : request.response;\n const response = {\n data: responseData,\n status: request.status,\n statusText: request.statusText,\n headers: responseHeaders,\n config,\n request\n };\n\n settle(function _resolve(value) {\n resolve(value);\n done();\n }, function _reject(err) {\n reject(err);\n done();\n }, response);\n\n // Clean up request\n request = null;\n }\n\n if ('onloadend' in request) {\n // Use onloadend if available\n request.onloadend = onloadend;\n } else {\n // Listen for ready state to emulate onloadend\n request.onreadystatechange = function handleLoad() {\n if (!request || request.readyState !== 4) {\n return;\n }\n\n // The request errored out and we didn't get a response, this will be\n // handled by onerror instead\n // With one exception: request that using file: protocol, most browsers\n // will return status as 0 even though it's a successful request\n if (request.status === 0 && !(request.responseURL && request.responseURL.indexOf('file:') === 0)) {\n return;\n }\n // readystate handler is calling before onerror or ontimeout handlers,\n // so we should call onloadend on the next 'tick'\n setTimeout(onloadend);\n };\n }\n\n // Handle browser request cancellation (as opposed to a manual cancellation)\n request.onabort = function handleAbort() {\n if (!request) {\n return;\n }\n\n reject(new AxiosError('Request aborted', AxiosError.ECONNABORTED, config, request));\n\n // Clean up request\n request = null;\n };\n\n // Handle low level network errors\n request.onerror = function handleError() {\n // Real errors are hidden from us by the browser\n // onerror should only fire if it's a network error\n reject(new AxiosError('Network Error', AxiosError.ERR_NETWORK, config, request));\n\n // Clean up request\n request = null;\n };\n\n // Handle timeout\n request.ontimeout = function handleTimeout() {\n let timeoutErrorMessage = config.timeout ? 'timeout of ' + config.timeout + 'ms exceeded' : 'timeout exceeded';\n const transitional = config.transitional || transitionalDefaults;\n if (config.timeoutErrorMessage) {\n timeoutErrorMessage = config.timeoutErrorMessage;\n }\n reject(new AxiosError(\n timeoutErrorMessage,\n transitional.clarifyTimeoutError ? AxiosError.ETIMEDOUT : AxiosError.ECONNABORTED,\n config,\n request));\n\n // Clean up request\n request = null;\n };\n\n // Add xsrf header\n // This is only done if running in a standard browser environment.\n // Specifically not if we're in a web worker, or react-native.\n if (platform.isStandardBrowserEnv) {\n // Add xsrf header\n const xsrfValue = (config.withCredentials || isURLSameOrigin(fullPath))\n && config.xsrfCookieName && cookies.read(config.xsrfCookieName);\n\n if (xsrfValue) {\n requestHeaders.set(config.xsrfHeaderName, xsrfValue);\n }\n }\n\n // Remove Content-Type if data is undefined\n requestData === undefined && requestHeaders.setContentType(null);\n\n // Add headers to the request\n if ('setRequestHeader' in request) {\n utils.forEach(requestHeaders.toJSON(), function setRequestHeader(val, key) {\n request.setRequestHeader(key, val);\n });\n }\n\n // Add withCredentials to request if needed\n if (!utils.isUndefined(config.withCredentials)) {\n request.withCredentials = !!config.withCredentials;\n }\n\n // Add responseType to request if needed\n if (responseType && responseType !== 'json') {\n request.responseType = config.responseType;\n }\n\n // Handle progress if needed\n if (typeof config.onDownloadProgress === 'function') {\n request.addEventListener('progress', progressEventReducer(config.onDownloadProgress, true));\n }\n\n // Not all browsers support upload events\n if (typeof config.onUploadProgress === 'function' && request.upload) {\n request.upload.addEventListener('progress', progressEventReducer(config.onUploadProgress));\n }\n\n if (config.cancelToken || config.signal) {\n // Handle cancellation\n // eslint-disable-next-line func-names\n onCanceled = cancel => {\n if (!request) {\n return;\n }\n reject(!cancel || cancel.type ? new CanceledError(null, config, request) : cancel);\n request.abort();\n request = null;\n };\n\n config.cancelToken && config.cancelToken.subscribe(onCanceled);\n if (config.signal) {\n config.signal.aborted ? onCanceled() : config.signal.addEventListener('abort', onCanceled);\n }\n }\n\n const protocol = parseProtocol(fullPath);\n\n if (protocol && platform.protocols.indexOf(protocol) === -1) {\n reject(new AxiosError('Unsupported protocol ' + protocol + ':', AxiosError.ERR_BAD_REQUEST, config));\n return;\n }\n\n\n // Send the request\n request.send(requestData || null);\n });\n}\n","import utils from '../utils.js';\nimport httpAdapter from './http.js';\nimport xhrAdapter from './xhr.js';\n\nconst adapters = {\n http: httpAdapter,\n xhr: xhrAdapter\n}\n\nexport default {\n getAdapter: (nameOrAdapter) => {\n if(utils.isString(nameOrAdapter)){\n const adapter = adapters[nameOrAdapter];\n\n if (!nameOrAdapter) {\n throw Error(\n utils.hasOwnProp(nameOrAdapter) ?\n `Adapter '${nameOrAdapter}' is not available in the build` :\n `Can not resolve adapter '${nameOrAdapter}'`\n );\n }\n\n return adapter\n }\n\n if (!utils.isFunction(nameOrAdapter)) {\n throw new TypeError('adapter is not a function');\n }\n\n return nameOrAdapter;\n },\n adapters\n}\n","'use strict';\n\nimport utils from '../utils.js';\nimport AxiosError from '../core/AxiosError.js';\nimport transitionalDefaults from './transitional.js';\nimport toFormData from '../helpers/toFormData.js';\nimport toURLEncodedForm from '../helpers/toURLEncodedForm.js';\nimport platform from '../platform/index.js';\nimport formDataToJSON from '../helpers/formDataToJSON.js';\nimport adapters from '../adapters/index.js';\n\nconst DEFAULT_CONTENT_TYPE = {\n 'Content-Type': 'application/x-www-form-urlencoded'\n};\n\n/**\n * If the browser has an XMLHttpRequest object, use the XHR adapter, otherwise use the HTTP\n * adapter\n *\n * @returns {Function}\n */\nfunction getDefaultAdapter() {\n let adapter;\n if (typeof XMLHttpRequest !== 'undefined') {\n // For browsers use XHR adapter\n adapter = adapters.getAdapter('xhr');\n } else if (typeof process !== 'undefined' && utils.kindOf(process) === 'process') {\n // For node use HTTP adapter\n adapter = adapters.getAdapter('http');\n }\n return adapter;\n}\n\n/**\n * It takes a string, tries to parse it, and if it fails, it returns the stringified version\n * of the input\n *\n * @param {any} rawValue - The value to be stringified.\n * @param {Function} parser - A function that parses a string into a JavaScript object.\n * @param {Function} encoder - A function that takes a value and returns a string.\n *\n * @returns {string} A stringified version of the rawValue.\n */\nfunction stringifySafely(rawValue, parser, encoder) {\n if (utils.isString(rawValue)) {\n try {\n (parser || JSON.parse)(rawValue);\n return utils.trim(rawValue);\n } catch (e) {\n if (e.name !== 'SyntaxError') {\n throw e;\n }\n }\n }\n\n return (encoder || JSON.stringify)(rawValue);\n}\n\nconst defaults = {\n\n transitional: transitionalDefaults,\n\n adapter: getDefaultAdapter(),\n\n transformRequest: [function transformRequest(data, headers) {\n const contentType = headers.getContentType() || '';\n const hasJSONContentType = contentType.indexOf('application/json') > -1;\n const isObjectPayload = utils.isObject(data);\n\n if (isObjectPayload && utils.isHTMLForm(data)) {\n data = new FormData(data);\n }\n\n const isFormData = utils.isFormData(data);\n\n if (isFormData) {\n if (!hasJSONContentType) {\n return data;\n }\n return hasJSONContentType ? JSON.stringify(formDataToJSON(data)) : data;\n }\n\n if (utils.isArrayBuffer(data) ||\n utils.isBuffer(data) ||\n utils.isStream(data) ||\n utils.isFile(data) ||\n utils.isBlob(data)\n ) {\n return data;\n }\n if (utils.isArrayBufferView(data)) {\n return data.buffer;\n }\n if (utils.isURLSearchParams(data)) {\n headers.setContentType('application/x-www-form-urlencoded;charset=utf-8', false);\n return data.toString();\n }\n\n let isFileList;\n\n if (isObjectPayload) {\n if (contentType.indexOf('application/x-www-form-urlencoded') > -1) {\n return toURLEncodedForm(data, this.formSerializer).toString();\n }\n\n if ((isFileList = utils.isFileList(data)) || contentType.indexOf('multipart/form-data') > -1) {\n const _FormData = this.env && this.env.FormData;\n\n return toFormData(\n isFileList ? {'files[]': data} : data,\n _FormData && new _FormData(),\n this.formSerializer\n );\n }\n }\n\n if (isObjectPayload || hasJSONContentType ) {\n headers.setContentType('application/json', false);\n return stringifySafely(data);\n }\n\n return data;\n }],\n\n transformResponse: [function transformResponse(data) {\n const transitional = this.transitional || defaults.transitional;\n const forcedJSONParsing = transitional && transitional.forcedJSONParsing;\n const JSONRequested = this.responseType === 'json';\n\n if (data && utils.isString(data) && ((forcedJSONParsing && !this.responseType) || JSONRequested)) {\n const silentJSONParsing = transitional && transitional.silentJSONParsing;\n const strictJSONParsing = !silentJSONParsing && JSONRequested;\n\n try {\n return JSON.parse(data);\n } catch (e) {\n if (strictJSONParsing) {\n if (e.name === 'SyntaxError') {\n throw AxiosError.from(e, AxiosError.ERR_BAD_RESPONSE, this, null, this.response);\n }\n throw e;\n }\n }\n }\n\n return data;\n }],\n\n /**\n * A timeout in milliseconds to abort a request. If set to 0 (default) a\n * timeout is not created.\n */\n timeout: 0,\n\n xsrfCookieName: 'XSRF-TOKEN',\n xsrfHeaderName: 'X-XSRF-TOKEN',\n\n maxContentLength: -1,\n maxBodyLength: -1,\n\n env: {\n FormData: platform.classes.FormData,\n Blob: platform.classes.Blob\n },\n\n validateStatus: function validateStatus(status) {\n return status >= 200 && status < 300;\n },\n\n headers: {\n common: {\n 'Accept': 'application/json, text/plain, */*'\n }\n }\n};\n\nutils.forEach(['delete', 'get', 'head'], function forEachMethodNoData(method) {\n defaults.headers[method] = {};\n});\n\nutils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {\n defaults.headers[method] = utils.merge(DEFAULT_CONTENT_TYPE);\n});\n\nexport default defaults;\n","'use strict';\n\nimport utils from './../utils.js';\nimport defaults from '../defaults/index.js';\nimport AxiosHeaders from '../core/AxiosHeaders.js';\n\n/**\n * Transform the data for a request or a response\n *\n * @param {Array|Function} fns A single function or Array of functions\n * @param {?Object} response The response object\n *\n * @returns {*} The resulting transformed data\n */\nexport default function transformData(fns, response) {\n const config = this || defaults;\n const context = response || config;\n const headers = AxiosHeaders.from(context.headers);\n let data = context.data;\n\n utils.forEach(fns, function transform(fn) {\n data = fn.call(config, data, headers.normalize(), response ? response.status : undefined);\n });\n\n headers.normalize();\n\n return data;\n}\n","'use strict';\n\nexport default function isCancel(value) {\n return !!(value && value.__CANCEL__);\n}\n","'use strict';\n\nimport transformData from './transformData.js';\nimport isCancel from '../cancel/isCancel.js';\nimport defaults from '../defaults/index.js';\nimport CanceledError from '../cancel/CanceledError.js';\nimport AxiosHeaders from '../core/AxiosHeaders.js';\n\n/**\n * Throws a `CanceledError` if cancellation has been requested.\n *\n * @param {Object} config The config that is to be used for the request\n *\n * @returns {void}\n */\nfunction throwIfCancellationRequested(config) {\n if (config.cancelToken) {\n config.cancelToken.throwIfRequested();\n }\n\n if (config.signal && config.signal.aborted) {\n throw new CanceledError();\n }\n}\n\n/**\n * Dispatch a request to the server using the configured adapter.\n *\n * @param {object} config The config that is to be used for the request\n *\n * @returns {Promise} The Promise to be fulfilled\n */\nexport default function dispatchRequest(config) {\n throwIfCancellationRequested(config);\n\n config.headers = AxiosHeaders.from(config.headers);\n\n // Transform request data\n config.data = transformData.call(\n config,\n config.transformRequest\n );\n\n const adapter = config.adapter || defaults.adapter;\n\n return adapter(config).then(function onAdapterResolution(response) {\n throwIfCancellationRequested(config);\n\n // Transform response data\n response.data = transformData.call(\n config,\n config.transformResponse,\n response\n );\n\n response.headers = AxiosHeaders.from(response.headers);\n\n return response;\n }, function onAdapterRejection(reason) {\n if (!isCancel(reason)) {\n throwIfCancellationRequested(config);\n\n // Transform response data\n if (reason && reason.response) {\n reason.response.data = transformData.call(\n config,\n config.transformResponse,\n reason.response\n );\n reason.response.headers = AxiosHeaders.from(reason.response.headers);\n }\n }\n\n return Promise.reject(reason);\n });\n}\n","'use strict';\n\nimport utils from '../utils.js';\n\n/**\n * Config-specific merge-function which creates a new config-object\n * by merging two configuration objects together.\n *\n * @param {Object} config1\n * @param {Object} config2\n *\n * @returns {Object} New object resulting from merging config2 to config1\n */\nexport default function mergeConfig(config1, config2) {\n // eslint-disable-next-line no-param-reassign\n config2 = config2 || {};\n const config = {};\n\n function getMergedValue(target, source) {\n if (utils.isPlainObject(target) && utils.isPlainObject(source)) {\n return utils.merge(target, source);\n } else if (utils.isPlainObject(source)) {\n return utils.merge({}, source);\n } else if (utils.isArray(source)) {\n return source.slice();\n }\n return source;\n }\n\n // eslint-disable-next-line consistent-return\n function mergeDeepProperties(prop) {\n if (!utils.isUndefined(config2[prop])) {\n return getMergedValue(config1[prop], config2[prop]);\n } else if (!utils.isUndefined(config1[prop])) {\n return getMergedValue(undefined, config1[prop]);\n }\n }\n\n // eslint-disable-next-line consistent-return\n function valueFromConfig2(prop) {\n if (!utils.isUndefined(config2[prop])) {\n return getMergedValue(undefined, config2[prop]);\n }\n }\n\n // eslint-disable-next-line consistent-return\n function defaultToConfig2(prop) {\n if (!utils.isUndefined(config2[prop])) {\n return getMergedValue(undefined, config2[prop]);\n } else if (!utils.isUndefined(config1[prop])) {\n return getMergedValue(undefined, config1[prop]);\n }\n }\n\n // eslint-disable-next-line consistent-return\n function mergeDirectKeys(prop) {\n if (prop in config2) {\n return getMergedValue(config1[prop], config2[prop]);\n } else if (prop in config1) {\n return getMergedValue(undefined, config1[prop]);\n }\n }\n\n const mergeMap = {\n 'url': valueFromConfig2,\n 'method': valueFromConfig2,\n 'data': valueFromConfig2,\n 'baseURL': defaultToConfig2,\n 'transformRequest': defaultToConfig2,\n 'transformResponse': defaultToConfig2,\n 'paramsSerializer': defaultToConfig2,\n 'timeout': defaultToConfig2,\n 'timeoutMessage': defaultToConfig2,\n 'withCredentials': defaultToConfig2,\n 'adapter': defaultToConfig2,\n 'responseType': defaultToConfig2,\n 'xsrfCookieName': defaultToConfig2,\n 'xsrfHeaderName': defaultToConfig2,\n 'onUploadProgress': defaultToConfig2,\n 'onDownloadProgress': defaultToConfig2,\n 'decompress': defaultToConfig2,\n 'maxContentLength': defaultToConfig2,\n 'maxBodyLength': defaultToConfig2,\n 'beforeRedirect': defaultToConfig2,\n 'transport': defaultToConfig2,\n 'httpAgent': defaultToConfig2,\n 'httpsAgent': defaultToConfig2,\n 'cancelToken': defaultToConfig2,\n 'socketPath': defaultToConfig2,\n 'responseEncoding': defaultToConfig2,\n 'validateStatus': mergeDirectKeys\n };\n\n utils.forEach(Object.keys(config1).concat(Object.keys(config2)), function computeConfigValue(prop) {\n const merge = mergeMap[prop] || mergeDeepProperties;\n const configValue = merge(prop);\n (utils.isUndefined(configValue) && merge !== mergeDirectKeys) || (config[prop] = configValue);\n });\n\n return config;\n}\n","'use strict';\n\nimport {VERSION} from '../env/data.js';\nimport AxiosError from '../core/AxiosError.js';\n\nconst validators = {};\n\n// eslint-disable-next-line func-names\n['object', 'boolean', 'number', 'function', 'string', 'symbol'].forEach((type, i) => {\n validators[type] = function validator(thing) {\n return typeof thing === type || 'a' + (i < 1 ? 'n ' : ' ') + type;\n };\n});\n\nconst deprecatedWarnings = {};\n\n/**\n * Transitional option validator\n *\n * @param {function|boolean?} validator - set to false if the transitional option has been removed\n * @param {string?} version - deprecated version / removed since version\n * @param {string?} message - some message with additional info\n *\n * @returns {function}\n */\nvalidators.transitional = function transitional(validator, version, message) {\n function formatMessage(opt, desc) {\n return '[Axios v' + VERSION + '] Transitional option \\'' + opt + '\\'' + desc + (message ? '. ' + message : '');\n }\n\n // eslint-disable-next-line func-names\n return (value, opt, opts) => {\n if (validator === false) {\n throw new AxiosError(\n formatMessage(opt, ' has been removed' + (version ? ' in ' + version : '')),\n AxiosError.ERR_DEPRECATED\n );\n }\n\n if (version && !deprecatedWarnings[opt]) {\n deprecatedWarnings[opt] = true;\n // eslint-disable-next-line no-console\n console.warn(\n formatMessage(\n opt,\n ' has been deprecated since v' + version + ' and will be removed in the near future'\n )\n );\n }\n\n return validator ? validator(value, opt, opts) : true;\n };\n};\n\n/**\n * Assert object's properties type\n *\n * @param {object} options\n * @param {object} schema\n * @param {boolean?} allowUnknown\n *\n * @returns {object}\n */\n\nfunction assertOptions(options, schema, allowUnknown) {\n if (typeof options !== 'object') {\n throw new AxiosError('options must be an object', AxiosError.ERR_BAD_OPTION_VALUE);\n }\n const keys = Object.keys(options);\n let i = keys.length;\n while (i-- > 0) {\n const opt = keys[i];\n const validator = schema[opt];\n if (validator) {\n const value = options[opt];\n const result = value === undefined || validator(value, opt, options);\n if (result !== true) {\n throw new AxiosError('option ' + opt + ' must be ' + result, AxiosError.ERR_BAD_OPTION_VALUE);\n }\n continue;\n }\n if (allowUnknown !== true) {\n throw new AxiosError('Unknown option ' + opt, AxiosError.ERR_BAD_OPTION);\n }\n }\n}\n\nexport default {\n assertOptions,\n validators\n};\n","'use strict';\n\nimport utils from './../utils.js';\nimport buildURL from '../helpers/buildURL.js';\nimport InterceptorManager from './InterceptorManager.js';\nimport dispatchRequest from './dispatchRequest.js';\nimport mergeConfig from './mergeConfig.js';\nimport buildFullPath from './buildFullPath.js';\nimport validator from '../helpers/validator.js';\nimport AxiosHeaders from './AxiosHeaders.js';\n\nconst validators = validator.validators;\n\n/**\n * Create a new instance of Axios\n *\n * @param {Object} instanceConfig The default config for the instance\n *\n * @return {Axios} A new instance of Axios\n */\nclass Axios {\n constructor(instanceConfig) {\n this.defaults = instanceConfig;\n this.interceptors = {\n request: new InterceptorManager(),\n response: new InterceptorManager()\n };\n }\n\n /**\n * Dispatch a request\n *\n * @param {String|Object} configOrUrl The config specific for this request (merged with this.defaults)\n * @param {?Object} config\n *\n * @returns {Promise} The Promise to be fulfilled\n */\n request(configOrUrl, config) {\n /*eslint no-param-reassign:0*/\n // Allow for axios('example/url'[, config]) a la fetch API\n if (typeof configOrUrl === 'string') {\n config = config || {};\n config.url = configOrUrl;\n } else {\n config = configOrUrl || {};\n }\n\n config = mergeConfig(this.defaults, config);\n\n const {transitional, paramsSerializer} = config;\n\n if (transitional !== undefined) {\n validator.assertOptions(transitional, {\n silentJSONParsing: validators.transitional(validators.boolean),\n forcedJSONParsing: validators.transitional(validators.boolean),\n clarifyTimeoutError: validators.transitional(validators.boolean)\n }, false);\n }\n\n if (paramsSerializer !== undefined) {\n validator.assertOptions(paramsSerializer, {\n encode: validators.function,\n serialize: validators.function\n }, true);\n }\n\n // Set config.method\n config.method = (config.method || this.defaults.method || 'get').toLowerCase();\n\n // Flatten headers\n const defaultHeaders = config.headers && utils.merge(\n config.headers.common,\n config.headers[config.method]\n );\n\n defaultHeaders && utils.forEach(\n ['delete', 'get', 'head', 'post', 'put', 'patch', 'common'],\n function cleanHeaderConfig(method) {\n delete config.headers[method];\n }\n );\n\n config.headers = new AxiosHeaders(config.headers, defaultHeaders);\n\n // filter out skipped interceptors\n const requestInterceptorChain = [];\n let synchronousRequestInterceptors = true;\n this.interceptors.request.forEach(function unshiftRequestInterceptors(interceptor) {\n if (typeof interceptor.runWhen === 'function' && interceptor.runWhen(config) === false) {\n return;\n }\n\n synchronousRequestInterceptors = synchronousRequestInterceptors && interceptor.synchronous;\n\n requestInterceptorChain.unshift(interceptor.fulfilled, interceptor.rejected);\n });\n\n const responseInterceptorChain = [];\n this.interceptors.response.forEach(function pushResponseInterceptors(interceptor) {\n responseInterceptorChain.push(interceptor.fulfilled, interceptor.rejected);\n });\n\n let promise;\n let i = 0;\n let len;\n\n if (!synchronousRequestInterceptors) {\n const chain = [dispatchRequest.bind(this), undefined];\n chain.unshift.apply(chain, requestInterceptorChain);\n chain.push.apply(chain, responseInterceptorChain);\n len = chain.length;\n\n promise = Promise.resolve(config);\n\n while (i < len) {\n promise = promise.then(chain[i++], chain[i++]);\n }\n\n return promise;\n }\n\n len = requestInterceptorChain.length;\n\n let newConfig = config;\n\n i = 0;\n\n while (i < len) {\n const onFulfilled = requestInterceptorChain[i++];\n const onRejected = requestInterceptorChain[i++];\n try {\n newConfig = onFulfilled(newConfig);\n } catch (error) {\n onRejected.call(this, error);\n break;\n }\n }\n\n try {\n promise = dispatchRequest.call(this, newConfig);\n } catch (error) {\n return Promise.reject(error);\n }\n\n i = 0;\n len = responseInterceptorChain.length;\n\n while (i < len) {\n promise = promise.then(responseInterceptorChain[i++], responseInterceptorChain[i++]);\n }\n\n return promise;\n }\n\n getUri(config) {\n config = mergeConfig(this.defaults, config);\n const fullPath = buildFullPath(config.baseURL, config.url);\n return buildURL(fullPath, config.params, config.paramsSerializer);\n }\n}\n\n// Provide aliases for supported request methods\nutils.forEach(['delete', 'get', 'head', 'options'], function forEachMethodNoData(method) {\n /*eslint func-names:0*/\n Axios.prototype[method] = function(url, config) {\n return this.request(mergeConfig(config || {}, {\n method,\n url,\n data: (config || {}).data\n }));\n };\n});\n\nutils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {\n /*eslint func-names:0*/\n\n function generateHTTPMethod(isForm) {\n return function httpMethod(url, data, config) {\n return this.request(mergeConfig(config || {}, {\n method,\n headers: isForm ? {\n 'Content-Type': 'multipart/form-data'\n } : {},\n url,\n data\n }));\n };\n }\n\n Axios.prototype[method] = generateHTTPMethod();\n\n Axios.prototype[method + 'Form'] = generateHTTPMethod(true);\n});\n\nexport default Axios;\n","'use strict';\n\nimport CanceledError from './CanceledError.js';\n\n/**\n * A `CancelToken` is an object that can be used to request cancellation of an operation.\n *\n * @param {Function} executor The executor function.\n *\n * @returns {CancelToken}\n */\nclass CancelToken {\n constructor(executor) {\n if (typeof executor !== 'function') {\n throw new TypeError('executor must be a function.');\n }\n\n let resolvePromise;\n\n this.promise = new Promise(function promiseExecutor(resolve) {\n resolvePromise = resolve;\n });\n\n const token = this;\n\n // eslint-disable-next-line func-names\n this.promise.then(cancel => {\n if (!token._listeners) return;\n\n let i = token._listeners.length;\n\n while (i-- > 0) {\n token._listeners[i](cancel);\n }\n token._listeners = null;\n });\n\n // eslint-disable-next-line func-names\n this.promise.then = onfulfilled => {\n let _resolve;\n // eslint-disable-next-line func-names\n const promise = new Promise(resolve => {\n token.subscribe(resolve);\n _resolve = resolve;\n }).then(onfulfilled);\n\n promise.cancel = function reject() {\n token.unsubscribe(_resolve);\n };\n\n return promise;\n };\n\n executor(function cancel(message, config, request) {\n if (token.reason) {\n // Cancellation has already been requested\n return;\n }\n\n token.reason = new CanceledError(message, config, request);\n resolvePromise(token.reason);\n });\n }\n\n /**\n * Throws a `CanceledError` if cancellation has been requested.\n */\n throwIfRequested() {\n if (this.reason) {\n throw this.reason;\n }\n }\n\n /**\n * Subscribe to the cancel signal\n */\n\n subscribe(listener) {\n if (this.reason) {\n listener(this.reason);\n return;\n }\n\n if (this._listeners) {\n this._listeners.push(listener);\n } else {\n this._listeners = [listener];\n }\n }\n\n /**\n * Unsubscribe from the cancel signal\n */\n\n unsubscribe(listener) {\n if (!this._listeners) {\n return;\n }\n const index = this._listeners.indexOf(listener);\n if (index !== -1) {\n this._listeners.splice(index, 1);\n }\n }\n\n /**\n * Returns an object that contains a new `CancelToken` and a function that, when called,\n * cancels the `CancelToken`.\n */\n static source() {\n let cancel;\n const token = new CancelToken(function executor(c) {\n cancel = c;\n });\n return {\n token,\n cancel\n };\n }\n}\n\nexport default CancelToken;\n","'use strict';\n\n/**\n * Syntactic sugar for invoking a function and expanding an array for arguments.\n *\n * Common use case would be to use `Function.prototype.apply`.\n *\n * ```js\n * function f(x, y, z) {}\n * var args = [1, 2, 3];\n * f.apply(null, args);\n * ```\n *\n * With `spread` this example can be re-written.\n *\n * ```js\n * spread(function(x, y, z) {})([1, 2, 3]);\n * ```\n *\n * @param {Function} callback\n *\n * @returns {Function}\n */\nexport default function spread(callback) {\n return function wrap(arr) {\n return callback.apply(null, arr);\n };\n}\n","'use strict';\n\nimport utils from './../utils.js';\n\n/**\n * Determines whether the payload is an error thrown by Axios\n *\n * @param {*} payload The value to test\n *\n * @returns {boolean} True if the payload is an error thrown by Axios, otherwise false\n */\nexport default function isAxiosError(payload) {\n return utils.isObject(payload) && (payload.isAxiosError === true);\n}\n","'use strict';\n\nimport utils from './utils.js';\nimport bind from './helpers/bind.js';\nimport Axios from './core/Axios.js';\nimport mergeConfig from './core/mergeConfig.js';\nimport defaults from './defaults/index.js';\nimport formDataToJSON from './helpers/formDataToJSON.js';\nimport CanceledError from './cancel/CanceledError.js';\nimport CancelToken from './cancel/CancelToken.js';\nimport isCancel from './cancel/isCancel.js';\nimport {VERSION} from './env/data.js';\nimport toFormData from './helpers/toFormData.js';\nimport AxiosError from './core/AxiosError.js';\nimport spread from './helpers/spread.js';\nimport isAxiosError from './helpers/isAxiosError.js';\n\n/**\n * Create an instance of Axios\n *\n * @param {Object} defaultConfig The default config for the instance\n *\n * @returns {Axios} A new instance of Axios\n */\nfunction createInstance(defaultConfig) {\n const context = new Axios(defaultConfig);\n const instance = bind(Axios.prototype.request, context);\n\n // Copy axios.prototype to instance\n utils.extend(instance, Axios.prototype, context, {allOwnKeys: true});\n\n // Copy context to instance\n utils.extend(instance, context, null, {allOwnKeys: true});\n\n // Factory for creating new instances\n instance.create = function create(instanceConfig) {\n return createInstance(mergeConfig(defaultConfig, instanceConfig));\n };\n\n return instance;\n}\n\n// Create the default instance to be exported\nconst axios = createInstance(defaults);\n\n// Expose Axios class to allow class inheritance\naxios.Axios = Axios;\n\n// Expose Cancel & CancelToken\naxios.CanceledError = CanceledError;\naxios.CancelToken = CancelToken;\naxios.isCancel = isCancel;\naxios.VERSION = VERSION;\naxios.toFormData = toFormData;\n\n// Expose AxiosError class\naxios.AxiosError = AxiosError;\n\n// alias for CanceledError for backward compatibility\naxios.Cancel = axios.CanceledError;\n\n// Expose all/spread\naxios.all = function all(promises) {\n return Promise.all(promises);\n};\n\naxios.spread = spread;\n\n// Expose isAxiosError\naxios.isAxiosError = isAxiosError;\n\naxios.formToJSON = thing => {\n return formDataToJSON(utils.isHTMLForm(thing) ? new FormData(thing) : thing);\n};\n\nexport default axios\n"],"names":["prototype","envFormData","encode","url","FormData","stream","zlib","followRedirects","getProxyForUrl","EventEmitter","https","http","adapters","validators"],"mappings":"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"} \ No newline at end of file
diff --git a/node_modules/axios/gulpfile.js b/node_modules/axios/gulpfile.js
new file mode 100644
index 0000000..7d35343
--- /dev/null
+++ b/node_modules/axios/gulpfile.js
@@ -0,0 +1,88 @@
+import gulp from 'gulp';
+import fs from 'fs-extra';
+import axios from './index.js';
+
+gulp.task('default', async function(){
+ console.log('hello!');
+});
+
+const clear = gulp.task('clear', async function() {
+ await fs.emptyDir('./dist/')
+});
+
+const bower = gulp.task('bower', async function () {
+ const npm = JSON.parse(await fs.readFile('package.json'));
+ const bower = JSON.parse(await fs.readFile('bower.json'));
+
+ const fields = [
+ 'name',
+ 'description',
+ 'version',
+ 'homepage',
+ 'license',
+ 'keywords'
+ ];
+
+ for (let i = 0, l = fields.length; i < l; i++) {
+ const field = fields[i];
+ bower[field] = npm[field];
+ }
+
+ await fs.writeFile('bower.json', JSON.stringify(bower, null, 2));
+});
+
+async function getContributors(user, repo, maxCount = 1) {
+ const contributors = (await axios.get(
+ `https://api.github.com/repos/${encodeURIComponent(user)}/${encodeURIComponent(repo)}/contributors`,
+ { params: { per_page: maxCount } }
+ )).data;
+
+ return Promise.all(contributors.map(async (contributor)=> {
+ return {...contributor, ...(await axios.get(
+ `https://api.github.com/users/${encodeURIComponent(contributor.login)}`
+ )).data};
+ }))
+}
+
+const packageJSON = gulp.task('package', async function () {
+ const CONTRIBUTION_THRESHOLD = 3;
+
+ const npm = JSON.parse(await fs.readFile('package.json'));
+
+ try {
+ const contributors = await getContributors('axios', 'axios', 15);
+
+ npm.contributors = contributors
+ .filter(
+ ({type, contributions}) => type.toLowerCase() === 'user' && contributions >= CONTRIBUTION_THRESHOLD
+ )
+ .map(({login, name, url}) => `${name || login} (https://github.com/${login})`);
+
+ await fs.writeFile('package.json', JSON.stringify(npm, null, 2));
+ } catch (err) {
+ if (axios.isAxiosError(err) && err.response && err.response.status === 403) {
+ throw Error(`GitHub API Error: ${err.response.data && err.response.data.message}`);
+ }
+ throw err;
+ }
+});
+
+const env = gulp.task('env', async function () {
+ var npm = JSON.parse(await fs.readFile('package.json'));
+
+ await fs.writeFile('./lib/env/data.js', Object.entries({
+ VERSION: npm.version
+ }).map(([key, value]) => {
+ return `export const ${key} = ${JSON.stringify(value)};`
+ }).join('\n'));
+});
+
+const version = gulp.series('bower', 'env', 'package');
+
+export {
+ bower,
+ env,
+ clear,
+ version,
+ packageJSON
+}
diff --git a/node_modules/axios/index.d.ts b/node_modules/axios/index.d.ts
new file mode 100644
index 0000000..abc4d93
--- /dev/null
+++ b/node_modules/axios/index.d.ts
@@ -0,0 +1,483 @@
+// TypeScript Version: 4.1
+type AxiosHeaderValue = AxiosHeaders | string | string[] | number | boolean | null;
+type RawAxiosHeaders = Record<string, AxiosHeaderValue>;
+
+type MethodsHeaders = {
+ [Key in Method as Lowercase<Key>]: AxiosHeaders;
+};
+
+interface CommonHeaders {
+ common: AxiosHeaders;
+}
+
+type AxiosHeaderMatcher = (this: AxiosHeaders, value: string, name: string, headers: RawAxiosHeaders) => boolean;
+
+type AxiosHeaderSetter = (value: AxiosHeaderValue, rewrite?: boolean | AxiosHeaderMatcher) => AxiosHeaders;
+
+type AxiosHeaderGetter = ((parser?: RegExp) => RegExpExecArray | null) |
+ ((matcher?: AxiosHeaderMatcher) => AxiosHeaderValue);
+
+type AxiosHeaderTester = (matcher?: AxiosHeaderMatcher) => boolean;
+
+export class AxiosHeaders {
+ constructor(
+ headers?: RawAxiosHeaders | AxiosHeaders,
+ defaultHeaders?: RawAxiosHeaders | AxiosHeaders
+ );
+
+ set(headerName?: string, value?: AxiosHeaderValue, rewrite?: boolean | AxiosHeaderMatcher): AxiosHeaders;
+ set(headers?: RawAxiosHeaders | AxiosHeaders, rewrite?: boolean): AxiosHeaders;
+
+ get(headerName: string, parser: RegExp): RegExpExecArray | null;
+ get(headerName: string, matcher?: true | AxiosHeaderMatcher): AxiosHeaderValue;
+
+ has(header: string, matcher?: true | AxiosHeaderMatcher): boolean;
+
+ delete(header: string | string[], matcher?: AxiosHeaderMatcher): boolean;
+
+ clear(): boolean;
+
+ normalize(format: boolean): AxiosHeaders;
+
+ toJSON(asStrings?: boolean): RawAxiosHeaders;
+
+ static from(thing?: AxiosHeaders | RawAxiosHeaders | string): AxiosHeaders;
+
+ static accessor(header: string | string[]): AxiosHeaders;
+
+ setContentType: AxiosHeaderSetter;
+ getContentType: AxiosHeaderGetter;
+ hasContentType: AxiosHeaderTester;
+
+ setContentLength: AxiosHeaderSetter;
+ getContentLength: AxiosHeaderGetter;
+ hasContentLength: AxiosHeaderTester;
+
+ setAccept: AxiosHeaderSetter;
+ getAccept: AxiosHeaderGetter;
+ hasAccept: AxiosHeaderTester;
+
+ setUserAgent: AxiosHeaderSetter;
+ getUserAgent: AxiosHeaderGetter;
+ hasUserAgent: AxiosHeaderTester;
+
+ setContentEncoding: AxiosHeaderSetter;
+ getContentEncoding: AxiosHeaderGetter;
+ hasContentEncoding: AxiosHeaderTester;
+}
+
+export type RawAxiosRequestHeaders = Partial<RawAxiosHeaders & MethodsHeaders & CommonHeaders>;
+
+export type AxiosRequestHeaders = Partial<RawAxiosHeaders & MethodsHeaders & CommonHeaders> & AxiosHeaders;
+
+export type RawAxiosResponseHeaders = Partial<Record<string, string> & {
+ "set-cookie"?: string[]
+}>;
+
+export type AxiosResponseHeaders = RawAxiosResponseHeaders & AxiosHeaders;
+
+export interface AxiosRequestTransformer {
+ (this: AxiosRequestConfig, data: any, headers: AxiosRequestHeaders): any;
+}
+
+export interface AxiosResponseTransformer {
+ (this: AxiosRequestConfig, data: any, headers: AxiosResponseHeaders, status?: number): any;
+}
+
+export interface AxiosAdapter {
+ (config: AxiosRequestConfig): AxiosPromise;
+}
+
+export interface AxiosBasicCredentials {
+ username: string;
+ password: string;
+}
+
+export interface AxiosProxyConfig {
+ host: string;
+ port: number;
+ auth?: {
+ username: string;
+ password: string;
+ };
+ protocol?: string;
+}
+
+export enum HttpStatusCode {
+ Continue = 100,
+ SwitchingProtocols = 101,
+ Processing = 102,
+ EarlyHints = 103,
+ Ok = 200,
+ Created = 201,
+ Accepted = 202,
+ NonAuthoritativeInformation = 203,
+ NoContent = 204,
+ ResetContent = 205,
+ PartialContent = 206,
+ MultiStatus = 207,
+ AlreadyReported = 208,
+ ImUsed = 226,
+ MultipleChoices = 300,
+ MovedPermanently = 301,
+ Found = 302,
+ SeeOther = 303,
+ NotModified = 304,
+ UseProxy = 305,
+ Unused = 306,
+ TemporaryRedirect = 307,
+ PermanentRedirect = 308,
+ BadRequest = 400,
+ Unauthorized = 401,
+ PaymentRequired = 402,
+ Forbidden = 403,
+ NotFound = 404,
+ MethodNotAllowed = 405,
+ NotAcceptable = 406,
+ ProxyAuthenticationRequired = 407,
+ RequestTimeout = 408,
+ Conflict = 409,
+ Gone = 410,
+ LengthRequired = 411,
+ PreconditionFailed = 412,
+ PayloadTooLarge = 413,
+ UriTooLong = 414,
+ UnsupportedMediaType = 415,
+ RangeNotSatisfiable = 416,
+ ExpectationFailed = 417,
+ ImATeapot = 418,
+ MisdirectedRequest = 421,
+ UnprocessableEntity = 422,
+ Locked = 423,
+ FailedDependency = 424,
+ TooEarly = 425,
+ UpgradeRequired = 426,
+ PreconditionRequired = 428,
+ TooManyRequests = 429,
+ RequestHeaderFieldsTooLarge = 431,
+ UnavailableForLegalReasons = 451,
+ InternalServerError = 500,
+ NotImplemented = 501,
+ BadGateway = 502,
+ ServiceUnavailable = 503,
+ GatewayTimeout = 504,
+ HttpVersionNotSupported = 505,
+ VariantAlsoNegotiates = 506,
+ InsufficientStorage = 507,
+ LoopDetected = 508,
+ NotExtended = 510,
+ NetworkAuthenticationRequired = 511,
+}
+
+export type Method =
+ | 'get' | 'GET'
+ | 'delete' | 'DELETE'
+ | 'head' | 'HEAD'
+ | 'options' | 'OPTIONS'
+ | 'post' | 'POST'
+ | 'put' | 'PUT'
+ | 'patch' | 'PATCH'
+ | 'purge' | 'PURGE'
+ | 'link' | 'LINK'
+ | 'unlink' | 'UNLINK';
+
+export type ResponseType =
+ | 'arraybuffer'
+ | 'blob'
+ | 'document'
+ | 'json'
+ | 'text'
+ | 'stream';
+
+export type responseEncoding =
+ | 'ascii' | 'ASCII'
+ | 'ansi' | 'ANSI'
+ | 'binary' | 'BINARY'
+ | 'base64' | 'BASE64'
+ | 'base64url' | 'BASE64URL'
+ | 'hex' | 'HEX'
+ | 'latin1' | 'LATIN1'
+ | 'ucs-2' | 'UCS-2'
+ | 'ucs2' | 'UCS2'
+ | 'utf-8' | 'UTF-8'
+ | 'utf8' | 'UTF8'
+ | 'utf16le' | 'UTF16LE';
+
+export interface TransitionalOptions {
+ silentJSONParsing?: boolean;
+ forcedJSONParsing?: boolean;
+ clarifyTimeoutError?: boolean;
+}
+
+export interface GenericAbortSignal {
+ readonly aborted: boolean;
+ onabort?: ((...args: any) => any) | null;
+ addEventListener?: (...args: any) => any;
+ removeEventListener?: (...args: any) => any;
+}
+
+export interface FormDataVisitorHelpers {
+ defaultVisitor: SerializerVisitor;
+ convertValue: (value: any) => any;
+ isVisitable: (value: any) => boolean;
+}
+
+export interface SerializerVisitor {
+ (
+ this: GenericFormData,
+ value: any,
+ key: string | number,
+ path: null | Array<string | number>,
+ helpers: FormDataVisitorHelpers
+ ): boolean;
+}
+
+export interface SerializerOptions {
+ visitor?: SerializerVisitor;
+ dots?: boolean;
+ metaTokens?: boolean;
+ indexes?: boolean | null;
+}
+
+// tslint:disable-next-line
+export interface FormSerializerOptions extends SerializerOptions {
+}
+
+export interface ParamEncoder {
+ (value: any, defaultEncoder: (value: any) => any): any;
+}
+
+export interface CustomParamsSerializer {
+ (params: Record<string, any>, options?: ParamsSerializerOptions): string;
+}
+
+export interface ParamsSerializerOptions extends SerializerOptions {
+ encode?: ParamEncoder;
+ serialize?: CustomParamsSerializer;
+}
+
+type MaxUploadRate = number;
+
+type MaxDownloadRate = number;
+
+export interface AxiosProgressEvent {
+ loaded: number;
+ total?: number;
+ progress?: number;
+ bytes: number;
+ rate?: number;
+ estimated?: number;
+ upload?: boolean;
+ download?: boolean;
+}
+
+type Milliseconds = number;
+
+export interface AxiosRequestConfig<D = any> {
+ url?: string;
+ method?: Method | string;
+ baseURL?: string;
+ transformRequest?: AxiosRequestTransformer | AxiosRequestTransformer[];
+ transformResponse?: AxiosResponseTransformer | AxiosResponseTransformer[];
+ headers?: RawAxiosRequestHeaders;
+ params?: any;
+ paramsSerializer?: ParamsSerializerOptions;
+ data?: D;
+ timeout?: Milliseconds;
+ timeoutErrorMessage?: string;
+ withCredentials?: boolean;
+ adapter?: AxiosAdapter;
+ auth?: AxiosBasicCredentials;
+ responseType?: ResponseType;
+ responseEncoding?: responseEncoding | string;
+ xsrfCookieName?: string;
+ xsrfHeaderName?: string;
+ onUploadProgress?: (progressEvent: AxiosProgressEvent) => void;
+ onDownloadProgress?: (progressEvent: AxiosProgressEvent) => void;
+ maxContentLength?: number;
+ validateStatus?: ((status: number) => boolean) | null;
+ maxBodyLength?: number;
+ maxRedirects?: number;
+ maxRate?: number | [MaxUploadRate, MaxDownloadRate];
+ beforeRedirect?: (options: Record<string, any>, responseDetails: {headers: Record<string, string>}) => void;
+ socketPath?: string | null;
+ httpAgent?: any;
+ httpsAgent?: any;
+ proxy?: AxiosProxyConfig | false;
+ cancelToken?: CancelToken;
+ decompress?: boolean;
+ transitional?: TransitionalOptions;
+ signal?: GenericAbortSignal;
+ insecureHTTPParser?: boolean;
+ env?: {
+ FormData?: new (...args: any[]) => object;
+ };
+ formSerializer?: FormSerializerOptions;
+}
+
+export interface HeadersDefaults {
+ common: RawAxiosRequestHeaders;
+ delete: RawAxiosRequestHeaders;
+ get: RawAxiosRequestHeaders;
+ head: RawAxiosRequestHeaders;
+ post: RawAxiosRequestHeaders;
+ put: RawAxiosRequestHeaders;
+ patch: RawAxiosRequestHeaders;
+ options?: RawAxiosRequestHeaders;
+ purge?: RawAxiosRequestHeaders;
+ link?: RawAxiosRequestHeaders;
+ unlink?: RawAxiosRequestHeaders;
+}
+
+export interface AxiosDefaults<D = any> extends Omit<AxiosRequestConfig<D>, 'headers'> {
+ headers: HeadersDefaults;
+}
+
+export interface CreateAxiosDefaults<D = any> extends Omit<AxiosRequestConfig<D>, 'headers'> {
+ headers?: RawAxiosRequestHeaders | Partial<HeadersDefaults>;
+}
+
+export interface AxiosResponse<T = any, D = any> {
+ data: T;
+ status: number;
+ statusText: string;
+ headers: RawAxiosResponseHeaders | AxiosResponseHeaders;
+ config: AxiosRequestConfig<D>;
+ request?: any;
+}
+
+export class AxiosError<T = unknown, D = any> extends Error {
+ constructor(
+ message?: string,
+ code?: string,
+ config?: AxiosRequestConfig<D>,
+ request?: any,
+ response?: AxiosResponse<T, D>
+ );
+
+ config?: AxiosRequestConfig<D>;
+ code?: string;
+ request?: any;
+ response?: AxiosResponse<T, D>;
+ isAxiosError: boolean;
+ status?: number;
+ toJSON: () => object;
+ cause?: Error;
+ static readonly ERR_FR_TOO_MANY_REDIRECTS = "ERR_FR_TOO_MANY_REDIRECTS";
+ static readonly ERR_BAD_OPTION_VALUE = "ERR_BAD_OPTION_VALUE";
+ static readonly ERR_BAD_OPTION = "ERR_BAD_OPTION";
+ static readonly ERR_NETWORK = "ERR_NETWORK";
+ static readonly ERR_DEPRECATED = "ERR_DEPRECATED";
+ static readonly ERR_BAD_RESPONSE = "ERR_BAD_RESPONSE";
+ static readonly ERR_BAD_REQUEST = "ERR_BAD_REQUEST";
+ static readonly ERR_NOT_SUPPORT = "ERR_NOT_SUPPORT";
+ static readonly ERR_INVALID_URL = "ERR_INVALID_URL";
+ static readonly ERR_CANCELED = "ERR_CANCELED";
+ static readonly ECONNABORTED = "ECONNABORTED";
+ static readonly ETIMEDOUT = "ETIMEDOUT";
+}
+
+export class CanceledError<T> extends AxiosError<T> {
+}
+
+export type AxiosPromise<T = any> = Promise<AxiosResponse<T>>;
+
+export interface CancelStatic {
+ new (message?: string): Cancel;
+}
+
+export interface Cancel {
+ message: string | undefined;
+}
+
+export interface Canceler {
+ (message?: string, config?: AxiosRequestConfig, request?: any): void;
+}
+
+export interface CancelTokenStatic {
+ new (executor: (cancel: Canceler) => void): CancelToken;
+ source(): CancelTokenSource;
+}
+
+export interface CancelToken {
+ promise: Promise<Cancel>;
+ reason?: Cancel;
+ throwIfRequested(): void;
+}
+
+export interface CancelTokenSource {
+ token: CancelToken;
+ cancel: Canceler;
+}
+
+export interface AxiosInterceptorOptions {
+ synchronous?: boolean;
+ runWhen?: (config: AxiosRequestConfig) => boolean;
+}
+
+export interface AxiosInterceptorManager<V> {
+ use(onFulfilled?: (value: V) => V | Promise<V>, onRejected?: (error: any) => any, options?: AxiosInterceptorOptions): number;
+ eject(id: number): void;
+ clear(): void;
+}
+
+export class Axios {
+ constructor(config?: AxiosRequestConfig);
+ defaults: AxiosDefaults;
+ interceptors: {
+ request: AxiosInterceptorManager<AxiosRequestConfig>;
+ response: AxiosInterceptorManager<AxiosResponse>;
+ };
+ getUri(config?: AxiosRequestConfig): string;
+ request<T = any, R = AxiosResponse<T>, D = any>(config: AxiosRequestConfig<D>): Promise<R>;
+ get<T = any, R = AxiosResponse<T>, D = any>(url: string, config?: AxiosRequestConfig<D>): Promise<R>;
+ delete<T = any, R = AxiosResponse<T>, D = any>(url: string, config?: AxiosRequestConfig<D>): Promise<R>;
+ head<T = any, R = AxiosResponse<T>, D = any>(url: string, config?: AxiosRequestConfig<D>): Promise<R>;
+ options<T = any, R = AxiosResponse<T>, D = any>(url: string, config?: AxiosRequestConfig<D>): Promise<R>;
+ post<T = any, R = AxiosResponse<T>, D = any>(url: string, data?: D, config?: AxiosRequestConfig<D>): Promise<R>;
+ put<T = any, R = AxiosResponse<T>, D = any>(url: string, data?: D, config?: AxiosRequestConfig<D>): Promise<R>;
+ patch<T = any, R = AxiosResponse<T>, D = any>(url: string, data?: D, config?: AxiosRequestConfig<D>): Promise<R>;
+ postForm<T = any, R = AxiosResponse<T>, D = any>(url: string, data?: D, config?: AxiosRequestConfig<D>): Promise<R>;
+ putForm<T = any, R = AxiosResponse<T>, D = any>(url: string, data?: D, config?: AxiosRequestConfig<D>): Promise<R>;
+ patchForm<T = any, R = AxiosResponse<T>, D = any>(url: string, data?: D, config?: AxiosRequestConfig<D>): Promise<R>;
+}
+
+export interface AxiosInstance extends Axios {
+ <T = any, R = AxiosResponse<T>, D = any>(config: AxiosRequestConfig<D>): Promise<R>;
+ <T = any, R = AxiosResponse<T>, D = any>(url: string, config?: AxiosRequestConfig<D>): Promise<R>;
+
+ defaults: Omit<AxiosDefaults, 'headers'> & {
+ headers: HeadersDefaults & {
+ [key: string]: AxiosHeaderValue
+ }
+ };
+}
+
+export interface GenericFormData {
+ append(name: string, value: any, options?: any): any;
+}
+
+export interface GenericHTMLFormElement {
+ name: string;
+ method: string;
+ submit(): void;
+}
+
+export interface AxiosStatic extends AxiosInstance {
+ create(config?: CreateAxiosDefaults): AxiosInstance;
+ Cancel: CancelStatic;
+ CancelToken: CancelTokenStatic;
+ Axios: typeof Axios;
+ AxiosError: typeof AxiosError;
+ readonly VERSION: string;
+ isCancel(value: any): value is Cancel;
+ all<T>(values: Array<T | Promise<T>>): Promise<T[]>;
+ spread<T, R>(callback: (...args: T[]) => R): (array: T[]) => R;
+ isAxiosError<T = any, D = any>(payload: any): payload is AxiosError<T, D>;
+ toFormData(sourceObj: object, targetFormData?: GenericFormData, options?: FormSerializerOptions): GenericFormData;
+ formToJSON(form: GenericFormData|GenericHTMLFormElement): object;
+}
+
+declare const axios: AxiosStatic;
+
+export default axios;
diff --git a/node_modules/axios/index.js b/node_modules/axios/index.js
new file mode 100644
index 0000000..b5369d7
--- /dev/null
+++ b/node_modules/axios/index.js
@@ -0,0 +1,32 @@
+import axios from './lib/axios.js';
+
+// Keep top-level export same with static properties
+// so that it can keep same with es module or cjs
+const {
+ Axios,
+ AxiosError,
+ CanceledError,
+ isCancel,
+ CancelToken,
+ VERSION,
+ all,
+ Cancel,
+ isAxiosError,
+ spread,
+ toFormData
+} = axios;
+
+export default axios;
+export {
+ Axios,
+ AxiosError,
+ CanceledError,
+ isCancel,
+ CancelToken,
+ VERSION,
+ all,
+ Cancel,
+ isAxiosError,
+ spread,
+ toFormData
+}
diff --git a/node_modules/axios/karma.conf.cjs b/node_modules/axios/karma.conf.cjs
new file mode 100644
index 0000000..fca512f
--- /dev/null
+++ b/node_modules/axios/karma.conf.cjs
@@ -0,0 +1,250 @@
+/* eslint-disable no-console */
+/* eslint-disable no-unused-vars */
+/* eslint-disable func-names */
+// Karma configuration
+// Generated on Fri Aug 15 2014 23:11:13 GMT-0500 (CDT)
+
+'use strict';
+
+var resolve = require('@rollup/plugin-node-resolve').default;
+var commonjs = require('@rollup/plugin-commonjs');
+
+function createCustomLauncher(browser, version, platform) {
+ return {
+ base: 'SauceLabs',
+ browserName: browser,
+ version: version,
+ platform: platform
+ };
+}
+
+module.exports = function(config) {
+ var customLaunchers = {};
+ var browsers = process.env.Browsers && process.env.Browsers.split(',');
+ var sauceLabs;
+
+ if (process.env.SAUCE_USERNAME || process.env.SAUCE_ACCESS_KEY) {
+ customLaunchers = {};
+
+ var runAll = true;
+ var options = [
+ 'SAUCE_CHROME',
+ 'SAUCE_FIREFOX',
+ 'SAUCE_SAFARI',
+ 'SAUCE_OPERA',
+ 'SAUCE_IE',
+ 'SAUCE_EDGE',
+ 'SAUCE_IOS',
+ 'SAUCE_ANDROID'
+ ];
+
+ options.forEach(function(opt) {
+ if (process.env[opt]) {
+ runAll = false;
+ }
+ });
+
+ // Chrome
+ if (runAll || process.env.SAUCE_CHROME) {
+ customLaunchers.SL_Chrome = createCustomLauncher('chrome');
+ // customLaunchers.SL_ChromeDev = createCustomLauncher('chrome', 'dev');
+ // customLaunchers.SL_ChromeBeta = createCustomLauncher('chrome', 'beta');
+ }
+
+ // Firefox
+ if (runAll || process.env.SAUCE_FIREFOX) {
+ //customLaunchers.SL_Firefox = createCustomLauncher('firefox');
+ // customLaunchers.SL_FirefoxDev = createCustomLauncher('firefox', 'dev');
+ // customLaunchers.SL_FirefoxBeta = createCustomLauncher('firefox', 'beta');
+ }
+
+ // Safari
+ if (runAll || process.env.SAUCE_SAFARI) {
+ // customLaunchers.SL_Safari7 = createCustomLauncher('safari', 7);
+ // customLaunchers.SL_Safari8 = createCustomLauncher('safari', 8);
+ customLaunchers.SL_Safari9 = createCustomLauncher(
+ 'safari',
+ 9.0,
+ 'OS X 10.11'
+ );
+ customLaunchers.SL_Safari10 = createCustomLauncher(
+ 'safari',
+ '10.1',
+ 'macOS 10.12'
+ );
+ customLaunchers.SL_Safari11 = createCustomLauncher(
+ 'safari',
+ '11.1',
+ 'macOS 10.13'
+ );
+ }
+
+ // Opera
+ if (runAll || process.env.SAUCE_OPERA) {
+ // TODO The available versions of Opera are too old and lack basic APIs
+ // customLaunchers.SL_Opera11 = createCustomLauncher('opera', 11, 'Windows XP');
+ // customLaunchers.SL_Opera12 = createCustomLauncher('opera', 12, 'Windows 7');
+ }
+
+ // IE
+ if (runAll || process.env.SAUCE_IE) {
+ customLaunchers.SL_IE11 = createCustomLauncher('internet explorer', 11, 'Windows 8.1');
+ }
+
+ // Edge
+ if (runAll || process.env.SAUCE_EDGE) {
+ customLaunchers.SL_Edge = createCustomLauncher('microsoftedge', null, 'Windows 10');
+ }
+
+ // IOS
+ if (runAll || process.env.SAUCE_IOS) {
+ // TODO IOS7 capture always timesout
+ // customLaunchers.SL_IOS7 = createCustomLauncher('iphone', '7.1', 'OS X 10.10');
+ // TODO Mobile browsers are causing failures, possibly from too many concurrent VMs
+ // customLaunchers.SL_IOS8 = createCustomLauncher('iphone', '8.4', 'OS X 10.10');
+ // customLaunchers.SL_IOS9 = createCustomLauncher('iphone', '9.2', 'OS X 10.10');
+ }
+
+ // Android
+ if (runAll || process.env.SAUCE_ANDROID) {
+ // TODO Mobile browsers are causing failures, possibly from too many concurrent VMs
+ // customLaunchers.SL_Android4 = createCustomLauncher('android', '4.4', 'Linux');
+ // customLaunchers.SL_Android5 = createCustomLauncher('android', '5.1', 'Linux');
+ }
+
+ browsers = Object.keys(customLaunchers);
+
+ sauceLabs = {
+ recordScreenshots: false,
+ connectOptions: {
+ // port: 5757,
+ logfile: 'sauce_connect.log'
+ },
+ public: 'public'
+ };
+ } else if (process.env.TRAVIS_PULL_REQUEST && process.env.TRAVIS_PULL_REQUEST !== 'false') {
+ console.log(
+ 'Cannot run on Sauce Labs as encrypted environment variables are not available to PRs. ' +
+ 'Running on Travis.'
+ );
+ browsers = ['Firefox'];
+ } else if (process.env.GITHUB_ACTIONS === 'true') {
+ console.log('Running ci on Github Actions.');
+ browsers = ['FirefoxHeadless', 'ChromeHeadless'];
+ } else {
+ browsers = browsers || ['Chrome'];
+ console.log(`Running ${browsers} locally since SAUCE_USERNAME and SAUCE_ACCESS_KEY environment variables are not set.`);
+ }
+
+ config.set({
+ // base path that will be used to resolve all patterns (eg. files, exclude)
+ basePath: '',
+
+
+ // frameworks to use
+ // available frameworks: https://npmjs.org/browse/keyword/karma-adapter
+ frameworks: ['jasmine-ajax', 'jasmine', 'sinon'],
+
+
+ // list of files / patterns to load in the browser
+ files: [
+ {pattern: 'test/specs/__helpers.js', watched: false},
+ {pattern: 'test/specs/**/*.spec.js', watched: false}
+ ],
+
+
+ // list of files to exclude
+ exclude: [],
+
+
+ // preprocess matching files before serving them to the browser
+ // available preprocessors: https://npmjs.org/browse/keyword/karma-preprocessor
+ preprocessors: {
+ 'test/specs/__helpers.js': ['rollup'],
+ 'test/specs/**/*.spec.js': ['rollup']
+ },
+
+ rollupPreprocessor: {
+ plugins: [
+ resolve({browser: true}),
+ commonjs()
+ ],
+ output: {
+ format: 'iife',
+ name: '_axios',
+ sourcemap: 'inline'
+ }
+ },
+
+
+ // test results reporter to use
+ // possible values: 'dots', 'progress'
+ // available reporters: https://npmjs.org/browse/keyword/karma-reporter
+ // Disable code coverage, as it's breaking CI:
+ // reporters: ['dots', 'coverage', 'saucelabs'],
+ reporters: ['progress'],
+
+
+ // web server port
+ port: 9876,
+
+
+ // Increase timeouts to prevent the issue with disconnected tests (https://goo.gl/nstA69)
+ captureTimeout: 4 * 60 * 1000,
+ browserDisconnectTimeout: 10000,
+ browserDisconnectTolerance: 1,
+ browserNoActivityTimeout: 4 * 60 * 1000,
+
+
+ // enable / disable colors in the output (reporters and logs)
+ colors: true,
+
+
+ // level of logging
+ // possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG
+ logLevel: config.LOG_INFO,
+
+
+ // enable / disable watching file and executing tests whenever any file changes
+ autoWatch: false,
+
+
+ // start these browsers
+ // available browser launchers: https://npmjs.org/browse/keyword/karma-launcher
+ browsers: browsers,
+
+
+ // Continuous Integration mode
+ // if true, Karma captures browsers, runs the tests and exits
+ singleRun: false,
+
+ // Webpack config
+ webpack: {
+ mode: 'development',
+ cache: true,
+ devtool: 'inline-source-map',
+ externals: [
+ {
+ './adapters/http': 'var undefined'
+ }
+ ]
+ },
+
+ webpackServer: {
+ stats: {
+ colors: true
+ }
+ },
+
+
+ // Coverage reporting
+ coverageReporter: {
+ type: 'lcov',
+ dir: 'coverage/',
+ subdir: '.'
+ },
+
+ sauceLabs: sauceLabs,
+ customLaunchers: customLaunchers
+ });
+};
diff --git a/node_modules/axios/lib/adapters/README.md b/node_modules/axios/lib/adapters/README.md
new file mode 100644
index 0000000..68f1118
--- /dev/null
+++ b/node_modules/axios/lib/adapters/README.md
@@ -0,0 +1,37 @@
+# axios // adapters
+
+The modules under `adapters/` are modules that handle dispatching a request and settling a returned `Promise` once a response is received.
+
+## Example
+
+```js
+var settle = require('./../core/settle');
+
+module.exports = function myAdapter(config) {
+ // At this point:
+ // - config has been merged with defaults
+ // - request transformers have already run
+ // - request interceptors have already run
+
+ // Make the request using config provided
+ // Upon response settle the Promise
+
+ return new Promise(function(resolve, reject) {
+
+ var response = {
+ data: responseData,
+ status: request.status,
+ statusText: request.statusText,
+ headers: responseHeaders,
+ config: config,
+ request: request
+ };
+
+ settle(resolve, reject, response);
+
+ // From here:
+ // - response transformers will run
+ // - response interceptors will run
+ });
+}
+```
diff --git a/node_modules/axios/lib/adapters/http.js b/node_modules/axios/lib/adapters/http.js
new file mode 100755
index 0000000..9e56fda
--- /dev/null
+++ b/node_modules/axios/lib/adapters/http.js
@@ -0,0 +1,591 @@
+'use strict';
+
+import utils from './../utils.js';
+import settle from './../core/settle.js';
+import buildFullPath from '../core/buildFullPath.js';
+import buildURL from './../helpers/buildURL.js';
+import {getProxyForUrl} from 'proxy-from-env';
+import http from 'http';
+import https from 'https';
+import followRedirects from 'follow-redirects';
+import zlib from 'zlib';
+import {VERSION} from '../env/data.js';
+import transitionalDefaults from '../defaults/transitional.js';
+import AxiosError from '../core/AxiosError.js';
+import CanceledError from '../cancel/CanceledError.js';
+import platform from '../platform/index.js';
+import fromDataURI from '../helpers/fromDataURI.js';
+import stream from 'stream';
+import AxiosHeaders from '../core/AxiosHeaders.js';
+import AxiosTransformStream from '../helpers/AxiosTransformStream.js';
+import EventEmitter from 'events';
+
+const isBrotliSupported = utils.isFunction(zlib.createBrotliDecompress);
+
+const {http: httpFollow, https: httpsFollow} = followRedirects;
+
+const isHttps = /https:?/;
+
+const supportedProtocols = platform.protocols.map(protocol => {
+ return protocol + ':';
+});
+
+/**
+ * If the proxy or config beforeRedirects functions are defined, call them with the options
+ * object.
+ *
+ * @param {Object<string, any>} options - The options object that was passed to the request.
+ *
+ * @returns {Object<string, any>}
+ */
+function dispatchBeforeRedirect(options) {
+ if (options.beforeRedirects.proxy) {
+ options.beforeRedirects.proxy(options);
+ }
+ if (options.beforeRedirects.config) {
+ options.beforeRedirects.config(options);
+ }
+}
+
+/**
+ * If the proxy or config afterRedirects functions are defined, call them with the options
+ *
+ * @param {http.ClientRequestArgs} options
+ * @param {AxiosProxyConfig} configProxy configuration from Axios options object
+ * @param {string} location
+ *
+ * @returns {http.ClientRequestArgs}
+ */
+function setProxy(options, configProxy, location) {
+ let proxy = configProxy;
+ if (!proxy && proxy !== false) {
+ const proxyUrl = getProxyForUrl(location);
+ if (proxyUrl) {
+ proxy = new URL(proxyUrl);
+ }
+ }
+ if (proxy) {
+ // Basic proxy authorization
+ if (proxy.username) {
+ proxy.auth = (proxy.username || '') + ':' + (proxy.password || '');
+ }
+
+ if (proxy.auth) {
+ // Support proxy auth object form
+ if (proxy.auth.username || proxy.auth.password) {
+ proxy.auth = (proxy.auth.username || '') + ':' + (proxy.auth.password || '');
+ }
+ const base64 = Buffer
+ .from(proxy.auth, 'utf8')
+ .toString('base64');
+ options.headers['Proxy-Authorization'] = 'Basic ' + base64;
+ }
+
+ options.headers.host = options.hostname + (options.port ? ':' + options.port : '');
+ const proxyHost = proxy.hostname || proxy.host;
+ options.hostname = proxyHost;
+ // Replace 'host' since options is not a URL object
+ options.host = proxyHost;
+ options.port = proxy.port;
+ options.path = location;
+ if (proxy.protocol) {
+ options.protocol = proxy.protocol.includes(':') ? proxy.protocol : `${proxy.protocol}:`;
+ }
+ }
+
+ options.beforeRedirects.proxy = function beforeRedirect(redirectOptions) {
+ // Configure proxy for redirected request, passing the original config proxy to apply
+ // the exact same logic as if the redirected request was performed by axios directly.
+ setProxy(redirectOptions, configProxy, redirectOptions.href);
+ };
+}
+
+/*eslint consistent-return:0*/
+export default function httpAdapter(config) {
+ return new Promise(function dispatchHttpRequest(resolvePromise, rejectPromise) {
+ let data = config.data;
+ const responseType = config.responseType;
+ const responseEncoding = config.responseEncoding;
+ const method = config.method.toUpperCase();
+ let isFinished;
+ let isDone;
+ let rejected = false;
+ let req;
+
+ // temporary internal emitter until the AxiosRequest class will be implemented
+ const emitter = new EventEmitter();
+
+ function onFinished() {
+ if (isFinished) return;
+ isFinished = true;
+
+ if (config.cancelToken) {
+ config.cancelToken.unsubscribe(abort);
+ }
+
+ if (config.signal) {
+ config.signal.removeEventListener('abort', abort);
+ }
+
+ emitter.removeAllListeners();
+ }
+
+ function done(value, isRejected) {
+ if (isDone) return;
+
+ isDone = true;
+
+ if (isRejected) {
+ rejected = true;
+ onFinished();
+ }
+
+ isRejected ? rejectPromise(value) : resolvePromise(value);
+ }
+
+ const resolve = function resolve(value) {
+ done(value);
+ };
+
+ const reject = function reject(value) {
+ done(value, true);
+ };
+
+ function abort(reason) {
+ emitter.emit('abort', !reason || reason.type ? new CanceledError(null, config, req) : reason);
+ }
+
+ emitter.once('abort', reject);
+
+ if (config.cancelToken || config.signal) {
+ config.cancelToken && config.cancelToken.subscribe(abort);
+ if (config.signal) {
+ config.signal.aborted ? abort() : config.signal.addEventListener('abort', abort);
+ }
+ }
+
+ // Parse url
+ const fullPath = buildFullPath(config.baseURL, config.url);
+ const parsed = new URL(fullPath);
+ const protocol = parsed.protocol || supportedProtocols[0];
+
+ if (protocol === 'data:') {
+ let convertedData;
+
+ if (method !== 'GET') {
+ return settle(resolve, reject, {
+ status: 405,
+ statusText: 'method not allowed',
+ headers: {},
+ config
+ });
+ }
+
+ try {
+ convertedData = fromDataURI(config.url, responseType === 'blob', {
+ Blob: config.env && config.env.Blob
+ });
+ } catch (err) {
+ throw AxiosError.from(err, AxiosError.ERR_BAD_REQUEST, config);
+ }
+
+ if (responseType === 'text') {
+ convertedData = convertedData.toString(responseEncoding);
+
+ if (!responseEncoding || responseEncoding === 'utf8') {
+ data = utils.stripBOM(convertedData);
+ }
+ } else if (responseType === 'stream') {
+ convertedData = stream.Readable.from(convertedData);
+ }
+
+ return settle(resolve, reject, {
+ data: convertedData,
+ status: 200,
+ statusText: 'OK',
+ headers: {},
+ config
+ });
+ }
+
+ if (supportedProtocols.indexOf(protocol) === -1) {
+ return reject(new AxiosError(
+ 'Unsupported protocol ' + protocol,
+ AxiosError.ERR_BAD_REQUEST,
+ config
+ ));
+ }
+
+ const headers = AxiosHeaders.from(config.headers).normalize();
+
+ // Set User-Agent (required by some servers)
+ // See https://github.com/axios/axios/issues/69
+ // User-Agent is specified; handle case where no UA header is desired
+ // Only set header if it hasn't been set in config
+ headers.set('User-Agent', 'axios/' + VERSION, false);
+
+ const onDownloadProgress = config.onDownloadProgress;
+ const onUploadProgress = config.onUploadProgress;
+ const maxRate = config.maxRate;
+ let maxUploadRate = undefined;
+ let maxDownloadRate = undefined;
+
+ // support for https://www.npmjs.com/package/form-data api
+ if (utils.isFormData(data) && utils.isFunction(data.getHeaders)) {
+ headers.set(data.getHeaders());
+ } else if (data && !utils.isStream(data)) {
+ if (Buffer.isBuffer(data)) {
+ // Nothing to do...
+ } else if (utils.isArrayBuffer(data)) {
+ data = Buffer.from(new Uint8Array(data));
+ } else if (utils.isString(data)) {
+ data = Buffer.from(data, 'utf-8');
+ } else {
+ return reject(new AxiosError(
+ 'Data after transformation must be a string, an ArrayBuffer, a Buffer, or a Stream',
+ AxiosError.ERR_BAD_REQUEST,
+ config
+ ));
+ }
+
+ // Add Content-Length header if data exists
+ headers.set('Content-Length', data.length, false);
+
+ if (config.maxBodyLength > -1 && data.length > config.maxBodyLength) {
+ return reject(new AxiosError(
+ 'Request body larger than maxBodyLength limit',
+ AxiosError.ERR_BAD_REQUEST,
+ config
+ ));
+ }
+ }
+
+ const contentLength = +headers.getContentLength();
+
+ if (utils.isArray(maxRate)) {
+ maxUploadRate = maxRate[0];
+ maxDownloadRate = maxRate[1];
+ } else {
+ maxUploadRate = maxDownloadRate = maxRate;
+ }
+
+ if (data && (onUploadProgress || maxUploadRate)) {
+ if (!utils.isStream(data)) {
+ data = stream.Readable.from(data, {objectMode: false});
+ }
+
+ data = stream.pipeline([data, new AxiosTransformStream({
+ length: utils.toFiniteNumber(contentLength),
+ maxRate: utils.toFiniteNumber(maxUploadRate)
+ })], utils.noop);
+
+ onUploadProgress && data.on('progress', progress => {
+ onUploadProgress(Object.assign(progress, {
+ upload: true
+ }));
+ });
+ }
+
+ // HTTP basic authentication
+ let auth = undefined;
+ if (config.auth) {
+ const username = config.auth.username || '';
+ const password = config.auth.password || '';
+ auth = username + ':' + password;
+ }
+
+ if (!auth && parsed.username) {
+ const urlUsername = parsed.username;
+ const urlPassword = parsed.password;
+ auth = urlUsername + ':' + urlPassword;
+ }
+
+ auth && headers.delete('authorization');
+
+ let path;
+
+ try {
+ path = buildURL(
+ parsed.pathname + parsed.search,
+ config.params,
+ config.paramsSerializer
+ ).replace(/^\?/, '');
+ } catch (err) {
+ const customErr = new Error(err.message);
+ customErr.config = config;
+ customErr.url = config.url;
+ customErr.exists = true;
+ return reject(customErr);
+ }
+
+ headers.set('Accept-Encoding', 'gzip, deflate, br', false);
+
+ const options = {
+ path,
+ method: method,
+ headers: headers.toJSON(),
+ agents: { http: config.httpAgent, https: config.httpsAgent },
+ auth,
+ protocol,
+ beforeRedirect: dispatchBeforeRedirect,
+ beforeRedirects: {}
+ };
+
+ if (config.socketPath) {
+ options.socketPath = config.socketPath;
+ } else {
+ options.hostname = parsed.hostname;
+ options.port = parsed.port;
+ setProxy(options, config.proxy, protocol + '//' + parsed.hostname + (parsed.port ? ':' + parsed.port : '') + options.path);
+ }
+
+ let transport;
+ const isHttpsRequest = isHttps.test(options.protocol);
+ options.agent = isHttpsRequest ? config.httpsAgent : config.httpAgent;
+ if (config.transport) {
+ transport = config.transport;
+ } else if (config.maxRedirects === 0) {
+ transport = isHttpsRequest ? https : http;
+ } else {
+ if (config.maxRedirects) {
+ options.maxRedirects = config.maxRedirects;
+ }
+ if (config.beforeRedirect) {
+ options.beforeRedirects.config = config.beforeRedirect;
+ }
+ transport = isHttpsRequest ? httpsFollow : httpFollow;
+ }
+
+ if (config.maxBodyLength > -1) {
+ options.maxBodyLength = config.maxBodyLength;
+ } else {
+ // follow-redirects does not skip comparison, so it should always succeed for axios -1 unlimited
+ options.maxBodyLength = Infinity;
+ }
+
+ if (config.insecureHTTPParser) {
+ options.insecureHTTPParser = config.insecureHTTPParser;
+ }
+
+ // Create the request
+ req = transport.request(options, function handleResponse(res) {
+ if (req.destroyed) return;
+
+ const streams = [res];
+
+ // uncompress the response body transparently if required
+ let responseStream = res;
+
+ // return the last request in case of redirects
+ const lastRequest = res.req || req;
+
+ // if decompress disabled we should not decompress
+ if (config.decompress !== false) {
+ // if no content, but headers still say that it is encoded,
+ // remove the header not confuse downstream operations
+ if (data && data.length === 0 && res.headers['content-encoding']) {
+ delete res.headers['content-encoding'];
+ }
+
+ switch (res.headers['content-encoding']) {
+ /*eslint default-case:0*/
+ case 'gzip':
+ case 'compress':
+ case 'deflate':
+ // add the unzipper to the body stream processing pipeline
+ streams.push(zlib.createUnzip());
+
+ // remove the content-encoding in order to not confuse downstream operations
+ delete res.headers['content-encoding'];
+ break;
+ case 'br':
+ if (isBrotliSupported) {
+ streams.push(zlib.createBrotliDecompress());
+ delete res.headers['content-encoding'];
+ }
+ }
+ }
+
+ if (onDownloadProgress) {
+ const responseLength = +res.headers['content-length'];
+
+ const transformStream = new AxiosTransformStream({
+ length: utils.toFiniteNumber(responseLength),
+ maxRate: utils.toFiniteNumber(maxDownloadRate)
+ });
+
+ onDownloadProgress && transformStream.on('progress', progress => {
+ onDownloadProgress(Object.assign(progress, {
+ download: true
+ }));
+ });
+
+ streams.push(transformStream);
+ }
+
+ responseStream = streams.length > 1 ? stream.pipeline(streams, utils.noop) : streams[0];
+
+ const offListeners = stream.finished(responseStream, () => {
+ offListeners();
+ onFinished();
+ });
+
+ const response = {
+ status: res.statusCode,
+ statusText: res.statusMessage,
+ headers: new AxiosHeaders(res.headers),
+ config,
+ request: lastRequest
+ };
+
+ if (responseType === 'stream') {
+ response.data = responseStream;
+ settle(resolve, reject, response);
+ } else {
+ const responseBuffer = [];
+ let totalResponseBytes = 0;
+
+ responseStream.on('data', function handleStreamData(chunk) {
+ responseBuffer.push(chunk);
+ totalResponseBytes += chunk.length;
+
+ // make sure the content length is not over the maxContentLength if specified
+ if (config.maxContentLength > -1 && totalResponseBytes > config.maxContentLength) {
+ // stream.destroy() emit aborted event before calling reject() on Node.js v16
+ rejected = true;
+ responseStream.destroy();
+ reject(new AxiosError('maxContentLength size of ' + config.maxContentLength + ' exceeded',
+ AxiosError.ERR_BAD_RESPONSE, config, lastRequest));
+ }
+ });
+
+ responseStream.on('aborted', function handlerStreamAborted() {
+ if (rejected) {
+ return;
+ }
+
+ const err = new AxiosError(
+ 'maxContentLength size of ' + config.maxContentLength + ' exceeded',
+ AxiosError.ERR_BAD_RESPONSE,
+ config,
+ lastRequest
+ );
+ responseStream.destroy(err);
+ reject(err);
+ });
+
+ responseStream.on('error', function handleStreamError(err) {
+ if (req.destroyed) return;
+ reject(AxiosError.from(err, null, config, lastRequest));
+ });
+
+ responseStream.on('end', function handleStreamEnd() {
+ try {
+ let responseData = responseBuffer.length === 1 ? responseBuffer[0] : Buffer.concat(responseBuffer);
+ if (responseType !== 'arraybuffer') {
+ responseData = responseData.toString(responseEncoding);
+ if (!responseEncoding || responseEncoding === 'utf8') {
+ responseData = utils.stripBOM(responseData);
+ }
+ }
+ response.data = responseData;
+ } catch (err) {
+ reject(AxiosError.from(err, null, config, response.request, response));
+ }
+ settle(resolve, reject, response);
+ });
+ }
+
+ emitter.once('abort', err => {
+ if (!responseStream.destroyed) {
+ responseStream.emit('error', err);
+ responseStream.destroy();
+ }
+ });
+ });
+
+ emitter.once('abort', err => {
+ reject(err);
+ req.destroy(err);
+ });
+
+ // Handle errors
+ req.on('error', function handleRequestError(err) {
+ // @todo remove
+ // if (req.aborted && err.code !== AxiosError.ERR_FR_TOO_MANY_REDIRECTS) return;
+ reject(AxiosError.from(err, null, config, req));
+ });
+
+ // set tcp keep alive to prevent drop connection by peer
+ req.on('socket', function handleRequestSocket(socket) {
+ // default interval of sending ack packet is 1 minute
+ socket.setKeepAlive(true, 1000 * 60);
+ });
+
+ // Handle request timeout
+ if (config.timeout) {
+ // This is forcing a int timeout to avoid problems if the `req` interface doesn't handle other types.
+ const timeout = parseInt(config.timeout, 10);
+
+ if (isNaN(timeout)) {
+ reject(new AxiosError(
+ 'error trying to parse `config.timeout` to int',
+ AxiosError.ERR_BAD_OPTION_VALUE,
+ config,
+ req
+ ));
+
+ return;
+ }
+
+ // Sometime, the response will be very slow, and does not respond, the connect event will be block by event loop system.
+ // And timer callback will be fired, and abort() will be invoked before connection, then get "socket hang up" and code ECONNRESET.
+ // At this time, if we have a large number of request, nodejs will hang up some socket on background. and the number will up and up.
+ // And then these socket which be hang up will devouring CPU little by little.
+ // ClientRequest.setTimeout will be fired on the specify milliseconds, and can make sure that abort() will be fired after connect.
+ req.setTimeout(timeout, function handleRequestTimeout() {
+ if (isDone) return;
+ let timeoutErrorMessage = config.timeout ? 'timeout of ' + config.timeout + 'ms exceeded' : 'timeout exceeded';
+ const transitional = config.transitional || transitionalDefaults;
+ if (config.timeoutErrorMessage) {
+ timeoutErrorMessage = config.timeoutErrorMessage;
+ }
+ reject(new AxiosError(
+ timeoutErrorMessage,
+ transitional.clarifyTimeoutError ? AxiosError.ETIMEDOUT : AxiosError.ECONNABORTED,
+ config,
+ req
+ ));
+ abort();
+ });
+ }
+
+
+ // Send the request
+ if (utils.isStream(data)) {
+ let ended = false;
+ let errored = false;
+
+ data.on('end', () => {
+ ended = true;
+ });
+
+ data.once('error', err => {
+ errored = true;
+ req.destroy(err);
+ });
+
+ data.on('close', () => {
+ if (!ended && !errored) {
+ abort(new CanceledError('Request stream has been aborted', config, req));
+ }
+ });
+
+ data.pipe(req);
+ } else {
+ req.end(data);
+ }
+ });
+}
+
+export const __setProxy = setProxy; \ No newline at end of file
diff --git a/node_modules/axios/lib/adapters/index.js b/node_modules/axios/lib/adapters/index.js
new file mode 100644
index 0000000..02ab126
--- /dev/null
+++ b/node_modules/axios/lib/adapters/index.js
@@ -0,0 +1,33 @@
+import utils from '../utils.js';
+import httpAdapter from './http.js';
+import xhrAdapter from './xhr.js';
+
+const adapters = {
+ http: httpAdapter,
+ xhr: xhrAdapter
+}
+
+export default {
+ getAdapter: (nameOrAdapter) => {
+ if(utils.isString(nameOrAdapter)){
+ const adapter = adapters[nameOrAdapter];
+
+ if (!nameOrAdapter) {
+ throw Error(
+ utils.hasOwnProp(nameOrAdapter) ?
+ `Adapter '${nameOrAdapter}' is not available in the build` :
+ `Can not resolve adapter '${nameOrAdapter}'`
+ );
+ }
+
+ return adapter
+ }
+
+ if (!utils.isFunction(nameOrAdapter)) {
+ throw new TypeError('adapter is not a function');
+ }
+
+ return nameOrAdapter;
+ },
+ adapters
+}
diff --git a/node_modules/axios/lib/adapters/xhr.js b/node_modules/axios/lib/adapters/xhr.js
new file mode 100644
index 0000000..e0233f5
--- /dev/null
+++ b/node_modules/axios/lib/adapters/xhr.js
@@ -0,0 +1,246 @@
+'use strict';
+
+import utils from './../utils.js';
+import settle from './../core/settle.js';
+import cookies from './../helpers/cookies.js';
+import buildURL from './../helpers/buildURL.js';
+import buildFullPath from '../core/buildFullPath.js';
+import isURLSameOrigin from './../helpers/isURLSameOrigin.js';
+import transitionalDefaults from '../defaults/transitional.js';
+import AxiosError from '../core/AxiosError.js';
+import CanceledError from '../cancel/CanceledError.js';
+import parseProtocol from '../helpers/parseProtocol.js';
+import platform from '../platform/index.js';
+import AxiosHeaders from '../core/AxiosHeaders.js';
+import speedometer from '../helpers/speedometer.js';
+
+function progressEventReducer(listener, isDownloadStream) {
+ let bytesNotified = 0;
+ const _speedometer = speedometer(50, 250);
+
+ return e => {
+ const loaded = e.loaded;
+ const total = e.lengthComputable ? e.total : undefined;
+ const progressBytes = loaded - bytesNotified;
+ const rate = _speedometer(progressBytes);
+ const inRange = loaded <= total;
+
+ bytesNotified = loaded;
+
+ const data = {
+ loaded,
+ total,
+ progress: total ? (loaded / total) : undefined,
+ bytes: progressBytes,
+ rate: rate ? rate : undefined,
+ estimated: rate && total && inRange ? (total - loaded) / rate : undefined
+ };
+
+ data[isDownloadStream ? 'download' : 'upload'] = true;
+
+ listener(data);
+ };
+}
+
+export default function xhrAdapter(config) {
+ return new Promise(function dispatchXhrRequest(resolve, reject) {
+ let requestData = config.data;
+ const requestHeaders = AxiosHeaders.from(config.headers).normalize();
+ const responseType = config.responseType;
+ let onCanceled;
+ function done() {
+ if (config.cancelToken) {
+ config.cancelToken.unsubscribe(onCanceled);
+ }
+
+ if (config.signal) {
+ config.signal.removeEventListener('abort', onCanceled);
+ }
+ }
+
+ if (utils.isFormData(requestData) && platform.isStandardBrowserEnv) {
+ requestHeaders.setContentType(false); // Let the browser set it
+ }
+
+ let request = new XMLHttpRequest();
+
+ // HTTP basic authentication
+ if (config.auth) {
+ const username = config.auth.username || '';
+ const password = config.auth.password ? unescape(encodeURIComponent(config.auth.password)) : '';
+ requestHeaders.set('Authorization', 'Basic ' + btoa(username + ':' + password));
+ }
+
+ const fullPath = buildFullPath(config.baseURL, config.url);
+
+ request.open(config.method.toUpperCase(), buildURL(fullPath, config.params, config.paramsSerializer), true);
+
+ // Set the request timeout in MS
+ request.timeout = config.timeout;
+
+ function onloadend() {
+ if (!request) {
+ return;
+ }
+ // Prepare the response
+ const responseHeaders = AxiosHeaders.from(
+ 'getAllResponseHeaders' in request && request.getAllResponseHeaders()
+ );
+ const responseData = !responseType || responseType === 'text' || responseType === 'json' ?
+ request.responseText : request.response;
+ const response = {
+ data: responseData,
+ status: request.status,
+ statusText: request.statusText,
+ headers: responseHeaders,
+ config,
+ request
+ };
+
+ settle(function _resolve(value) {
+ resolve(value);
+ done();
+ }, function _reject(err) {
+ reject(err);
+ done();
+ }, response);
+
+ // Clean up request
+ request = null;
+ }
+
+ if ('onloadend' in request) {
+ // Use onloadend if available
+ request.onloadend = onloadend;
+ } else {
+ // Listen for ready state to emulate onloadend
+ request.onreadystatechange = function handleLoad() {
+ if (!request || request.readyState !== 4) {
+ return;
+ }
+
+ // The request errored out and we didn't get a response, this will be
+ // handled by onerror instead
+ // With one exception: request that using file: protocol, most browsers
+ // will return status as 0 even though it's a successful request
+ if (request.status === 0 && !(request.responseURL && request.responseURL.indexOf('file:') === 0)) {
+ return;
+ }
+ // readystate handler is calling before onerror or ontimeout handlers,
+ // so we should call onloadend on the next 'tick'
+ setTimeout(onloadend);
+ };
+ }
+
+ // Handle browser request cancellation (as opposed to a manual cancellation)
+ request.onabort = function handleAbort() {
+ if (!request) {
+ return;
+ }
+
+ reject(new AxiosError('Request aborted', AxiosError.ECONNABORTED, config, request));
+
+ // Clean up request
+ request = null;
+ };
+
+ // Handle low level network errors
+ request.onerror = function handleError() {
+ // Real errors are hidden from us by the browser
+ // onerror should only fire if it's a network error
+ reject(new AxiosError('Network Error', AxiosError.ERR_NETWORK, config, request));
+
+ // Clean up request
+ request = null;
+ };
+
+ // Handle timeout
+ request.ontimeout = function handleTimeout() {
+ let timeoutErrorMessage = config.timeout ? 'timeout of ' + config.timeout + 'ms exceeded' : 'timeout exceeded';
+ const transitional = config.transitional || transitionalDefaults;
+ if (config.timeoutErrorMessage) {
+ timeoutErrorMessage = config.timeoutErrorMessage;
+ }
+ reject(new AxiosError(
+ timeoutErrorMessage,
+ transitional.clarifyTimeoutError ? AxiosError.ETIMEDOUT : AxiosError.ECONNABORTED,
+ config,
+ request));
+
+ // Clean up request
+ request = null;
+ };
+
+ // Add xsrf header
+ // This is only done if running in a standard browser environment.
+ // Specifically not if we're in a web worker, or react-native.
+ if (platform.isStandardBrowserEnv) {
+ // Add xsrf header
+ const xsrfValue = (config.withCredentials || isURLSameOrigin(fullPath))
+ && config.xsrfCookieName && cookies.read(config.xsrfCookieName);
+
+ if (xsrfValue) {
+ requestHeaders.set(config.xsrfHeaderName, xsrfValue);
+ }
+ }
+
+ // Remove Content-Type if data is undefined
+ requestData === undefined && requestHeaders.setContentType(null);
+
+ // Add headers to the request
+ if ('setRequestHeader' in request) {
+ utils.forEach(requestHeaders.toJSON(), function setRequestHeader(val, key) {
+ request.setRequestHeader(key, val);
+ });
+ }
+
+ // Add withCredentials to request if needed
+ if (!utils.isUndefined(config.withCredentials)) {
+ request.withCredentials = !!config.withCredentials;
+ }
+
+ // Add responseType to request if needed
+ if (responseType && responseType !== 'json') {
+ request.responseType = config.responseType;
+ }
+
+ // Handle progress if needed
+ if (typeof config.onDownloadProgress === 'function') {
+ request.addEventListener('progress', progressEventReducer(config.onDownloadProgress, true));
+ }
+
+ // Not all browsers support upload events
+ if (typeof config.onUploadProgress === 'function' && request.upload) {
+ request.upload.addEventListener('progress', progressEventReducer(config.onUploadProgress));
+ }
+
+ if (config.cancelToken || config.signal) {
+ // Handle cancellation
+ // eslint-disable-next-line func-names
+ onCanceled = cancel => {
+ if (!request) {
+ return;
+ }
+ reject(!cancel || cancel.type ? new CanceledError(null, config, request) : cancel);
+ request.abort();
+ request = null;
+ };
+
+ config.cancelToken && config.cancelToken.subscribe(onCanceled);
+ if (config.signal) {
+ config.signal.aborted ? onCanceled() : config.signal.addEventListener('abort', onCanceled);
+ }
+ }
+
+ const protocol = parseProtocol(fullPath);
+
+ if (protocol && platform.protocols.indexOf(protocol) === -1) {
+ reject(new AxiosError('Unsupported protocol ' + protocol + ':', AxiosError.ERR_BAD_REQUEST, config));
+ return;
+ }
+
+
+ // Send the request
+ request.send(requestData || null);
+ });
+}
diff --git a/node_modules/axios/lib/axios.js b/node_modules/axios/lib/axios.js
new file mode 100644
index 0000000..e79082c
--- /dev/null
+++ b/node_modules/axios/lib/axios.js
@@ -0,0 +1,76 @@
+'use strict';
+
+import utils from './utils.js';
+import bind from './helpers/bind.js';
+import Axios from './core/Axios.js';
+import mergeConfig from './core/mergeConfig.js';
+import defaults from './defaults/index.js';
+import formDataToJSON from './helpers/formDataToJSON.js';
+import CanceledError from './cancel/CanceledError.js';
+import CancelToken from './cancel/CancelToken.js';
+import isCancel from './cancel/isCancel.js';
+import {VERSION} from './env/data.js';
+import toFormData from './helpers/toFormData.js';
+import AxiosError from './core/AxiosError.js';
+import spread from './helpers/spread.js';
+import isAxiosError from './helpers/isAxiosError.js';
+
+/**
+ * Create an instance of Axios
+ *
+ * @param {Object} defaultConfig The default config for the instance
+ *
+ * @returns {Axios} A new instance of Axios
+ */
+function createInstance(defaultConfig) {
+ const context = new Axios(defaultConfig);
+ const instance = bind(Axios.prototype.request, context);
+
+ // Copy axios.prototype to instance
+ utils.extend(instance, Axios.prototype, context, {allOwnKeys: true});
+
+ // Copy context to instance
+ utils.extend(instance, context, null, {allOwnKeys: true});
+
+ // Factory for creating new instances
+ instance.create = function create(instanceConfig) {
+ return createInstance(mergeConfig(defaultConfig, instanceConfig));
+ };
+
+ return instance;
+}
+
+// Create the default instance to be exported
+const axios = createInstance(defaults);
+
+// Expose Axios class to allow class inheritance
+axios.Axios = Axios;
+
+// Expose Cancel & CancelToken
+axios.CanceledError = CanceledError;
+axios.CancelToken = CancelToken;
+axios.isCancel = isCancel;
+axios.VERSION = VERSION;
+axios.toFormData = toFormData;
+
+// Expose AxiosError class
+axios.AxiosError = AxiosError;
+
+// alias for CanceledError for backward compatibility
+axios.Cancel = axios.CanceledError;
+
+// Expose all/spread
+axios.all = function all(promises) {
+ return Promise.all(promises);
+};
+
+axios.spread = spread;
+
+// Expose isAxiosError
+axios.isAxiosError = isAxiosError;
+
+axios.formToJSON = thing => {
+ return formDataToJSON(utils.isHTMLForm(thing) ? new FormData(thing) : thing);
+};
+
+export default axios
diff --git a/node_modules/axios/lib/cancel/CancelToken.js b/node_modules/axios/lib/cancel/CancelToken.js
new file mode 100644
index 0000000..20d8f68
--- /dev/null
+++ b/node_modules/axios/lib/cancel/CancelToken.js
@@ -0,0 +1,121 @@
+'use strict';
+
+import CanceledError from './CanceledError.js';
+
+/**
+ * A `CancelToken` is an object that can be used to request cancellation of an operation.
+ *
+ * @param {Function} executor The executor function.
+ *
+ * @returns {CancelToken}
+ */
+class CancelToken {
+ constructor(executor) {
+ if (typeof executor !== 'function') {
+ throw new TypeError('executor must be a function.');
+ }
+
+ let resolvePromise;
+
+ this.promise = new Promise(function promiseExecutor(resolve) {
+ resolvePromise = resolve;
+ });
+
+ const token = this;
+
+ // eslint-disable-next-line func-names
+ this.promise.then(cancel => {
+ if (!token._listeners) return;
+
+ let i = token._listeners.length;
+
+ while (i-- > 0) {
+ token._listeners[i](cancel);
+ }
+ token._listeners = null;
+ });
+
+ // eslint-disable-next-line func-names
+ this.promise.then = onfulfilled => {
+ let _resolve;
+ // eslint-disable-next-line func-names
+ const promise = new Promise(resolve => {
+ token.subscribe(resolve);
+ _resolve = resolve;
+ }).then(onfulfilled);
+
+ promise.cancel = function reject() {
+ token.unsubscribe(_resolve);
+ };
+
+ return promise;
+ };
+
+ executor(function cancel(message, config, request) {
+ if (token.reason) {
+ // Cancellation has already been requested
+ return;
+ }
+
+ token.reason = new CanceledError(message, config, request);
+ resolvePromise(token.reason);
+ });
+ }
+
+ /**
+ * Throws a `CanceledError` if cancellation has been requested.
+ */
+ throwIfRequested() {
+ if (this.reason) {
+ throw this.reason;
+ }
+ }
+
+ /**
+ * Subscribe to the cancel signal
+ */
+
+ subscribe(listener) {
+ if (this.reason) {
+ listener(this.reason);
+ return;
+ }
+
+ if (this._listeners) {
+ this._listeners.push(listener);
+ } else {
+ this._listeners = [listener];
+ }
+ }
+
+ /**
+ * Unsubscribe from the cancel signal
+ */
+
+ unsubscribe(listener) {
+ if (!this._listeners) {
+ return;
+ }
+ const index = this._listeners.indexOf(listener);
+ if (index !== -1) {
+ this._listeners.splice(index, 1);
+ }
+ }
+
+ /**
+ * Returns an object that contains a new `CancelToken` and a function that, when called,
+ * cancels the `CancelToken`.
+ */
+ static source() {
+ let cancel;
+ const token = new CancelToken(function executor(c) {
+ cancel = c;
+ });
+ return {
+ token,
+ cancel
+ };
+ }
+}
+
+export default CancelToken;
diff --git a/node_modules/axios/lib/cancel/CanceledError.js b/node_modules/axios/lib/cancel/CanceledError.js
new file mode 100644
index 0000000..880066e
--- /dev/null
+++ b/node_modules/axios/lib/cancel/CanceledError.js
@@ -0,0 +1,25 @@
+'use strict';
+
+import AxiosError from '../core/AxiosError.js';
+import utils from '../utils.js';
+
+/**
+ * A `CanceledError` is an object that is thrown when an operation is canceled.
+ *
+ * @param {string=} message The message.
+ * @param {Object=} config The config.
+ * @param {Object=} request The request.
+ *
+ * @returns {CanceledError} The created error.
+ */
+function CanceledError(message, config, request) {
+ // eslint-disable-next-line no-eq-null,eqeqeq
+ AxiosError.call(this, message == null ? 'canceled' : message, AxiosError.ERR_CANCELED, config, request);
+ this.name = 'CanceledError';
+}
+
+utils.inherits(CanceledError, AxiosError, {
+ __CANCEL__: true
+});
+
+export default CanceledError;
diff --git a/node_modules/axios/lib/cancel/isCancel.js b/node_modules/axios/lib/cancel/isCancel.js
new file mode 100644
index 0000000..a444a12
--- /dev/null
+++ b/node_modules/axios/lib/cancel/isCancel.js
@@ -0,0 +1,5 @@
+'use strict';
+
+export default function isCancel(value) {
+ return !!(value && value.__CANCEL__);
+}
diff --git a/node_modules/axios/lib/core/Axios.js b/node_modules/axios/lib/core/Axios.js
new file mode 100644
index 0000000..31f8b53
--- /dev/null
+++ b/node_modules/axios/lib/core/Axios.js
@@ -0,0 +1,195 @@
+'use strict';
+
+import utils from './../utils.js';
+import buildURL from '../helpers/buildURL.js';
+import InterceptorManager from './InterceptorManager.js';
+import dispatchRequest from './dispatchRequest.js';
+import mergeConfig from './mergeConfig.js';
+import buildFullPath from './buildFullPath.js';
+import validator from '../helpers/validator.js';
+import AxiosHeaders from './AxiosHeaders.js';
+
+const validators = validator.validators;
+
+/**
+ * Create a new instance of Axios
+ *
+ * @param {Object} instanceConfig The default config for the instance
+ *
+ * @return {Axios} A new instance of Axios
+ */
+class Axios {
+ constructor(instanceConfig) {
+ this.defaults = instanceConfig;
+ this.interceptors = {
+ request: new InterceptorManager(),
+ response: new InterceptorManager()
+ };
+ }
+
+ /**
+ * Dispatch a request
+ *
+ * @param {String|Object} configOrUrl The config specific for this request (merged with this.defaults)
+ * @param {?Object} config
+ *
+ * @returns {Promise} The Promise to be fulfilled
+ */
+ request(configOrUrl, config) {
+ /*eslint no-param-reassign:0*/
+ // Allow for axios('example/url'[, config]) a la fetch API
+ if (typeof configOrUrl === 'string') {
+ config = config || {};
+ config.url = configOrUrl;
+ } else {
+ config = configOrUrl || {};
+ }
+
+ config = mergeConfig(this.defaults, config);
+
+ const {transitional, paramsSerializer} = config;
+
+ if (transitional !== undefined) {
+ validator.assertOptions(transitional, {
+ silentJSONParsing: validators.transitional(validators.boolean),
+ forcedJSONParsing: validators.transitional(validators.boolean),
+ clarifyTimeoutError: validators.transitional(validators.boolean)
+ }, false);
+ }
+
+ if (paramsSerializer !== undefined) {
+ validator.assertOptions(paramsSerializer, {
+ encode: validators.function,
+ serialize: validators.function
+ }, true);
+ }
+
+ // Set config.method
+ config.method = (config.method || this.defaults.method || 'get').toLowerCase();
+
+ // Flatten headers
+ const defaultHeaders = config.headers && utils.merge(
+ config.headers.common,
+ config.headers[config.method]
+ );
+
+ defaultHeaders && utils.forEach(
+ ['delete', 'get', 'head', 'post', 'put', 'patch', 'common'],
+ function cleanHeaderConfig(method) {
+ delete config.headers[method];
+ }
+ );
+
+ config.headers = new AxiosHeaders(config.headers, defaultHeaders);
+
+ // filter out skipped interceptors
+ const requestInterceptorChain = [];
+ let synchronousRequestInterceptors = true;
+ this.interceptors.request.forEach(function unshiftRequestInterceptors(interceptor) {
+ if (typeof interceptor.runWhen === 'function' && interceptor.runWhen(config) === false) {
+ return;
+ }
+
+ synchronousRequestInterceptors = synchronousRequestInterceptors && interceptor.synchronous;
+
+ requestInterceptorChain.unshift(interceptor.fulfilled, interceptor.rejected);
+ });
+
+ const responseInterceptorChain = [];
+ this.interceptors.response.forEach(function pushResponseInterceptors(interceptor) {
+ responseInterceptorChain.push(interceptor.fulfilled, interceptor.rejected);
+ });
+
+ let promise;
+ let i = 0;
+ let len;
+
+ if (!synchronousRequestInterceptors) {
+ const chain = [dispatchRequest.bind(this), undefined];
+ chain.unshift.apply(chain, requestInterceptorChain);
+ chain.push.apply(chain, responseInterceptorChain);
+ len = chain.length;
+
+ promise = Promise.resolve(config);
+
+ while (i < len) {
+ promise = promise.then(chain[i++], chain[i++]);
+ }
+
+ return promise;
+ }
+
+ len = requestInterceptorChain.length;
+
+ let newConfig = config;
+
+ i = 0;
+
+ while (i < len) {
+ const onFulfilled = requestInterceptorChain[i++];
+ const onRejected = requestInterceptorChain[i++];
+ try {
+ newConfig = onFulfilled(newConfig);
+ } catch (error) {
+ onRejected.call(this, error);
+ break;
+ }
+ }
+
+ try {
+ promise = dispatchRequest.call(this, newConfig);
+ } catch (error) {
+ return Promise.reject(error);
+ }
+
+ i = 0;
+ len = responseInterceptorChain.length;
+
+ while (i < len) {
+ promise = promise.then(responseInterceptorChain[i++], responseInterceptorChain[i++]);
+ }
+
+ return promise;
+ }
+
+ getUri(config) {
+ config = mergeConfig(this.defaults, config);
+ const fullPath = buildFullPath(config.baseURL, config.url);
+ return buildURL(fullPath, config.params, config.paramsSerializer);
+ }
+}
+
+// Provide aliases for supported request methods
+utils.forEach(['delete', 'get', 'head', 'options'], function forEachMethodNoData(method) {
+ /*eslint func-names:0*/
+ Axios.prototype[method] = function(url, config) {
+ return this.request(mergeConfig(config || {}, {
+ method,
+ url,
+ data: (config || {}).data
+ }));
+ };
+});
+
+utils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {
+ /*eslint func-names:0*/
+
+ function generateHTTPMethod(isForm) {
+ return function httpMethod(url, data, config) {
+ return this.request(mergeConfig(config || {}, {
+ method,
+ headers: isForm ? {
+ 'Content-Type': 'multipart/form-data'
+ } : {},
+ url,
+ data
+ }));
+ };
+ }
+
+ Axios.prototype[method] = generateHTTPMethod();
+
+ Axios.prototype[method + 'Form'] = generateHTTPMethod(true);
+});
+
+export default Axios;
diff --git a/node_modules/axios/lib/core/AxiosError.js b/node_modules/axios/lib/core/AxiosError.js
new file mode 100644
index 0000000..1539e9a
--- /dev/null
+++ b/node_modules/axios/lib/core/AxiosError.js
@@ -0,0 +1,100 @@
+'use strict';
+
+import utils from '../utils.js';
+
+/**
+ * Create an Error with the specified message, config, error code, request and response.
+ *
+ * @param {string} message The error message.
+ * @param {string} [code] The error code (for example, 'ECONNABORTED').
+ * @param {Object} [config] The config.
+ * @param {Object} [request] The request.
+ * @param {Object} [response] The response.
+ *
+ * @returns {Error} The created error.
+ */
+function AxiosError(message, code, config, request, response) {
+ Error.call(this);
+
+ if (Error.captureStackTrace) {
+ Error.captureStackTrace(this, this.constructor);
+ } else {
+ this.stack = (new Error()).stack;
+ }
+
+ this.message = message;
+ this.name = 'AxiosError';
+ code && (this.code = code);
+ config && (this.config = config);
+ request && (this.request = request);
+ response && (this.response = response);
+}
+
+utils.inherits(AxiosError, Error, {
+ toJSON: function toJSON() {
+ return {
+ // Standard
+ message: this.message,
+ name: this.name,
+ // Microsoft
+ description: this.description,
+ number: this.number,
+ // Mozilla
+ fileName: this.fileName,
+ lineNumber: this.lineNumber,
+ columnNumber: this.columnNumber,
+ stack: this.stack,
+ // Axios
+ config: this.config,
+ code: this.code,
+ status: this.response && this.response.status ? this.response.status : null
+ };
+ }
+});
+
+const prototype = AxiosError.prototype;
+const descriptors = {};
+
+[
+ 'ERR_BAD_OPTION_VALUE',
+ 'ERR_BAD_OPTION',
+ 'ECONNABORTED',
+ 'ETIMEDOUT',
+ 'ERR_NETWORK',
+ 'ERR_FR_TOO_MANY_REDIRECTS',
+ 'ERR_DEPRECATED',
+ 'ERR_BAD_RESPONSE',
+ 'ERR_BAD_REQUEST',
+ 'ERR_CANCELED',
+ 'ERR_NOT_SUPPORT',
+ 'ERR_INVALID_URL'
+// eslint-disable-next-line func-names
+].forEach(code => {
+ descriptors[code] = {value: code};
+});
+
+Object.defineProperties(AxiosError, descriptors);
+Object.defineProperty(prototype, 'isAxiosError', {value: true});
+
+// eslint-disable-next-line func-names
+AxiosError.from = (error, code, config, request, response, customProps) => {
+ const axiosError = Object.create(prototype);
+
+ utils.toFlatObject(error, axiosError, function filter(obj) {
+ return obj !== Error.prototype;
+ }, prop => {
+ return prop !== 'isAxiosError';
+ });
+
+ AxiosError.call(axiosError, error.message, code, config, request, response);
+
+ axiosError.cause = error;
+
+ axiosError.name = error.name;
+
+ customProps && Object.assign(axiosError, customProps);
+
+ return axiosError;
+};
+
+export default AxiosError;
diff --git a/node_modules/axios/lib/core/AxiosHeaders.js b/node_modules/axios/lib/core/AxiosHeaders.js
new file mode 100644
index 0000000..68e098a
--- /dev/null
+++ b/node_modules/axios/lib/core/AxiosHeaders.js
@@ -0,0 +1,268 @@
+'use strict';
+
+import utils from '../utils.js';
+import parseHeaders from '../helpers/parseHeaders.js';
+
+const $internals = Symbol('internals');
+const $defaults = Symbol('defaults');
+
+function normalizeHeader(header) {
+ return header && String(header).trim().toLowerCase();
+}
+
+function normalizeValue(value) {
+ if (value === false || value == null) {
+ return value;
+ }
+
+ return utils.isArray(value) ? value.map(normalizeValue) : String(value);
+}
+
+function parseTokens(str) {
+ const tokens = Object.create(null);
+ const tokensRE = /([^\s,;=]+)\s*(?:=\s*([^,;]+))?/g;
+ let match;
+
+ while ((match = tokensRE.exec(str))) {
+ tokens[match[1]] = match[2];
+ }
+
+ return tokens;
+}
+
+function matchHeaderValue(context, value, header, filter) {
+ if (utils.isFunction(filter)) {
+ return filter.call(this, value, header);
+ }
+
+ if (!utils.isString(value)) return;
+
+ if (utils.isString(filter)) {
+ return value.indexOf(filter) !== -1;
+ }
+
+ if (utils.isRegExp(filter)) {
+ return filter.test(value);
+ }
+}
+
+function formatHeader(header) {
+ return header.trim()
+ .toLowerCase().replace(/([a-z\d])(\w*)/g, (w, char, str) => {
+ return char.toUpperCase() + str;
+ });
+}
+
+function buildAccessors(obj, header) {
+ const accessorName = utils.toCamelCase(' ' + header);
+
+ ['get', 'set', 'has'].forEach(methodName => {
+ Object.defineProperty(obj, methodName + accessorName, {
+ value: function(arg1, arg2, arg3) {
+ return this[methodName].call(this, header, arg1, arg2, arg3);
+ },
+ configurable: true
+ });
+ });
+}
+
+function findKey(obj, key) {
+ key = key.toLowerCase();
+ const keys = Object.keys(obj);
+ let i = keys.length;
+ let _key;
+ while (i-- > 0) {
+ _key = keys[i];
+ if (key === _key.toLowerCase()) {
+ return _key;
+ }
+ }
+ return null;
+}
+
+function AxiosHeaders(headers, defaults) {
+ headers && this.set(headers);
+ this[$defaults] = defaults || null;
+}
+
+Object.assign(AxiosHeaders.prototype, {
+ set: function(header, valueOrRewrite, rewrite) {
+ const self = this;
+
+ function setHeader(_value, _header, _rewrite) {
+ const lHeader = normalizeHeader(_header);
+
+ if (!lHeader) {
+ throw new Error('header name must be a non-empty string');
+ }
+
+ const key = findKey(self, lHeader);
+
+ if (key && _rewrite !== true && (self[key] === false || _rewrite === false)) {
+ return;
+ }
+
+ self[key || _header] = normalizeValue(_value);
+ }
+
+ if (utils.isPlainObject(header)) {
+ utils.forEach(header, (_value, _header) => {
+ setHeader(_value, _header, valueOrRewrite);
+ });
+ } else {
+ setHeader(valueOrRewrite, header, rewrite);
+ }
+
+ return this;
+ },
+
+ get: function(header, parser) {
+ header = normalizeHeader(header);
+
+ if (!header) return undefined;
+
+ const key = findKey(this, header);
+
+ if (key) {
+ const value = this[key];
+
+ if (!parser) {
+ return value;
+ }
+
+ if (parser === true) {
+ return parseTokens(value);
+ }
+
+ if (utils.isFunction(parser)) {
+ return parser.call(this, value, key);
+ }
+
+ if (utils.isRegExp(parser)) {
+ return parser.exec(value);
+ }
+
+ throw new TypeError('parser must be boolean|regexp|function');
+ }
+ },
+
+ has: function(header, matcher) {
+ header = normalizeHeader(header);
+
+ if (header) {
+ const key = findKey(this, header);
+
+ return !!(key && (!matcher || matchHeaderValue(this, this[key], key, matcher)));
+ }
+
+ return false;
+ },
+
+ delete: function(header, matcher) {
+ const self = this;
+ let deleted = false;
+
+ function deleteHeader(_header) {
+ _header = normalizeHeader(_header);
+
+ if (_header) {
+ const key = findKey(self, _header);
+
+ if (key && (!matcher || matchHeaderValue(self, self[key], key, matcher))) {
+ delete self[key];
+
+ deleted = true;
+ }
+ }
+ }
+
+ if (utils.isArray(header)) {
+ header.forEach(deleteHeader);
+ } else {
+ deleteHeader(header);
+ }
+
+ return deleted;
+ },
+
+ clear: function() {
+ return Object.keys(this).forEach(this.delete.bind(this));
+ },
+
+ normalize: function(format) {
+ const self = this;
+ const headers = {};
+
+ utils.forEach(this, (value, header) => {
+ const key = findKey(headers, header);
+
+ if (key) {
+ self[key] = normalizeValue(value);
+ delete self[header];
+ return;
+ }
+
+ const normalized = format ? formatHeader(header) : String(header).trim();
+
+ if (normalized !== header) {
+ delete self[header];
+ }
+
+ self[normalized] = normalizeValue(value);
+
+ headers[normalized] = true;
+ });
+
+ return this;
+ },
+
+ toJSON: function(asStrings) {
+ const obj = Object.create(null);
+
+ utils.forEach(Object.assign({}, this[$defaults] || null, this),
+ (value, header) => {
+ if (value == null || value === false) return;
+ obj[header] = asStrings && utils.isArray(value) ? value.join(', ') : value;
+ });
+
+ return obj;
+ }
+});
+
+Object.assign(AxiosHeaders, {
+ from: function(thing) {
+ if (utils.isString(thing)) {
+ return new this(parseHeaders(thing));
+ }
+ return thing instanceof this ? thing : new this(thing);
+ },
+
+ accessor: function(header) {
+ const internals = this[$internals] = (this[$internals] = {
+ accessors: {}
+ });
+
+ const accessors = internals.accessors;
+ const prototype = this.prototype;
+
+ function defineAccessor(_header) {
+ const lHeader = normalizeHeader(_header);
+
+ if (!accessors[lHeader]) {
+ buildAccessors(prototype, _header);
+ accessors[lHeader] = true;
+ }
+ }
+
+ utils.isArray(header) ? header.forEach(defineAccessor) : defineAccessor(header);
+
+ return this;
+ }
+});
+
+AxiosHeaders.accessor(['Content-Type', 'Content-Length', 'Accept', 'Accept-Encoding', 'User-Agent']);
+
+utils.freezeMethods(AxiosHeaders.prototype);
+utils.freezeMethods(AxiosHeaders);
+
+export default AxiosHeaders;
diff --git a/node_modules/axios/lib/core/InterceptorManager.js b/node_modules/axios/lib/core/InterceptorManager.js
new file mode 100644
index 0000000..6657a9d
--- /dev/null
+++ b/node_modules/axios/lib/core/InterceptorManager.js
@@ -0,0 +1,71 @@
+'use strict';
+
+import utils from './../utils.js';
+
+class InterceptorManager {
+ constructor() {
+ this.handlers = [];
+ }
+
+ /**
+ * Add a new interceptor to the stack
+ *
+ * @param {Function} fulfilled The function to handle `then` for a `Promise`
+ * @param {Function} rejected The function to handle `reject` for a `Promise`
+ *
+ * @return {Number} An ID used to remove interceptor later
+ */
+ use(fulfilled, rejected, options) {
+ this.handlers.push({
+ fulfilled,
+ rejected,
+ synchronous: options ? options.synchronous : false,
+ runWhen: options ? options.runWhen : null
+ });
+ return this.handlers.length - 1;
+ }
+
+ /**
+ * Remove an interceptor from the stack
+ *
+ * @param {Number} id The ID that was returned by `use`
+ *
+ * @returns {Boolean} `true` if the interceptor was removed, `false` otherwise
+ */
+ eject(id) {
+ if (this.handlers[id]) {
+ this.handlers[id] = null;
+ }
+ }
+
+ /**
+ * Clear all interceptors from the stack
+ *
+ * @returns {void}
+ */
+ clear() {
+ if (this.handlers) {
+ this.handlers = [];
+ }
+ }
+
+ /**
+ * Iterate over all the registered interceptors
+ *
+ * This method is particularly useful for skipping over any
+ * interceptors that may have become `null` calling `eject`.
+ *
+ * @param {Function} fn The function to call for each interceptor
+ *
+ * @returns {void}
+ */
+ forEach(fn) {
+ utils.forEach(this.handlers, function forEachHandler(h) {
+ if (h !== null) {
+ fn(h);
+ }
+ });
+ }
+}
+
+export default InterceptorManager;
diff --git a/node_modules/axios/lib/core/README.md b/node_modules/axios/lib/core/README.md
new file mode 100644
index 0000000..84559ce
--- /dev/null
+++ b/node_modules/axios/lib/core/README.md
@@ -0,0 +1,8 @@
+# axios // core
+
+The modules found in `core/` should be modules that are specific to the domain logic of axios. These modules would most likely not make sense to be consumed outside of the axios module, as their logic is too specific. Some examples of core modules are:
+
+- Dispatching requests
+ - Requests sent via `adapters/` (see lib/adapters/README.md)
+- Managing interceptors
+- Handling config
diff --git a/node_modules/axios/lib/core/buildFullPath.js b/node_modules/axios/lib/core/buildFullPath.js
new file mode 100644
index 0000000..b60927c
--- /dev/null
+++ b/node_modules/axios/lib/core/buildFullPath.js
@@ -0,0 +1,21 @@
+'use strict';
+
+import isAbsoluteURL from '../helpers/isAbsoluteURL.js';
+import combineURLs from '../helpers/combineURLs.js';
+
+/**
+ * Creates a new URL by combining the baseURL with the requestedURL,
+ * only when the requestedURL is not already an absolute URL.
+ * If the requestURL is absolute, this function returns the requestedURL untouched.
+ *
+ * @param {string} baseURL The base URL
+ * @param {string} requestedURL Absolute or relative URL to combine
+ *
+ * @returns {string} The combined full path
+ */
+export default function buildFullPath(baseURL, requestedURL) {
+ if (baseURL && !isAbsoluteURL(requestedURL)) {
+ return combineURLs(baseURL, requestedURL);
+ }
+ return requestedURL;
+}
diff --git a/node_modules/axios/lib/core/dispatchRequest.js b/node_modules/axios/lib/core/dispatchRequest.js
new file mode 100644
index 0000000..46ced28
--- /dev/null
+++ b/node_modules/axios/lib/core/dispatchRequest.js
@@ -0,0 +1,76 @@
+'use strict';
+
+import transformData from './transformData.js';
+import isCancel from '../cancel/isCancel.js';
+import defaults from '../defaults/index.js';
+import CanceledError from '../cancel/CanceledError.js';
+import AxiosHeaders from '../core/AxiosHeaders.js';
+
+/**
+ * Throws a `CanceledError` if cancellation has been requested.
+ *
+ * @param {Object} config The config that is to be used for the request
+ *
+ * @returns {void}
+ */
+function throwIfCancellationRequested(config) {
+ if (config.cancelToken) {
+ config.cancelToken.throwIfRequested();
+ }
+
+ if (config.signal && config.signal.aborted) {
+ throw new CanceledError();
+ }
+}
+
+/**
+ * Dispatch a request to the server using the configured adapter.
+ *
+ * @param {object} config The config that is to be used for the request
+ *
+ * @returns {Promise} The Promise to be fulfilled
+ */
+export default function dispatchRequest(config) {
+ throwIfCancellationRequested(config);
+
+ config.headers = AxiosHeaders.from(config.headers);
+
+ // Transform request data
+ config.data = transformData.call(
+ config,
+ config.transformRequest
+ );
+
+ const adapter = config.adapter || defaults.adapter;
+
+ return adapter(config).then(function onAdapterResolution(response) {
+ throwIfCancellationRequested(config);
+
+ // Transform response data
+ response.data = transformData.call(
+ config,
+ config.transformResponse,
+ response
+ );
+
+ response.headers = AxiosHeaders.from(response.headers);
+
+ return response;
+ }, function onAdapterRejection(reason) {
+ if (!isCancel(reason)) {
+ throwIfCancellationRequested(config);
+
+ // Transform response data
+ if (reason && reason.response) {
+ reason.response.data = transformData.call(
+ config,
+ config.transformResponse,
+ reason.response
+ );
+ reason.response.headers = AxiosHeaders.from(reason.response.headers);
+ }
+ }
+
+ return Promise.reject(reason);
+ });
+}
diff --git a/node_modules/axios/lib/core/mergeConfig.js b/node_modules/axios/lib/core/mergeConfig.js
new file mode 100644
index 0000000..328e631
--- /dev/null
+++ b/node_modules/axios/lib/core/mergeConfig.js
@@ -0,0 +1,101 @@
+'use strict';
+
+import utils from '../utils.js';
+
+/**
+ * Config-specific merge-function which creates a new config-object
+ * by merging two configuration objects together.
+ *
+ * @param {Object} config1
+ * @param {Object} config2
+ *
+ * @returns {Object} New object resulting from merging config2 to config1
+ */
+export default function mergeConfig(config1, config2) {
+ // eslint-disable-next-line no-param-reassign
+ config2 = config2 || {};
+ const config = {};
+
+ function getMergedValue(target, source) {
+ if (utils.isPlainObject(target) && utils.isPlainObject(source)) {
+ return utils.merge(target, source);
+ } else if (utils.isPlainObject(source)) {
+ return utils.merge({}, source);
+ } else if (utils.isArray(source)) {
+ return source.slice();
+ }
+ return source;
+ }
+
+ // eslint-disable-next-line consistent-return
+ function mergeDeepProperties(prop) {
+ if (!utils.isUndefined(config2[prop])) {
+ return getMergedValue(config1[prop], config2[prop]);
+ } else if (!utils.isUndefined(config1[prop])) {
+ return getMergedValue(undefined, config1[prop]);
+ }
+ }
+
+ // eslint-disable-next-line consistent-return
+ function valueFromConfig2(prop) {
+ if (!utils.isUndefined(config2[prop])) {
+ return getMergedValue(undefined, config2[prop]);
+ }
+ }
+
+ // eslint-disable-next-line consistent-return
+ function defaultToConfig2(prop) {
+ if (!utils.isUndefined(config2[prop])) {
+ return getMergedValue(undefined, config2[prop]);
+ } else if (!utils.isUndefined(config1[prop])) {
+ return getMergedValue(undefined, config1[prop]);
+ }
+ }
+
+ // eslint-disable-next-line consistent-return
+ function mergeDirectKeys(prop) {
+ if (prop in config2) {
+ return getMergedValue(config1[prop], config2[prop]);
+ } else if (prop in config1) {
+ return getMergedValue(undefined, config1[prop]);
+ }
+ }
+
+ const mergeMap = {
+ 'url': valueFromConfig2,
+ 'method': valueFromConfig2,
+ 'data': valueFromConfig2,
+ 'baseURL': defaultToConfig2,
+ 'transformRequest': defaultToConfig2,
+ 'transformResponse': defaultToConfig2,
+ 'paramsSerializer': defaultToConfig2,
+ 'timeout': defaultToConfig2,
+ 'timeoutMessage': defaultToConfig2,
+ 'withCredentials': defaultToConfig2,
+ 'adapter': defaultToConfig2,
+ 'responseType': defaultToConfig2,
+ 'xsrfCookieName': defaultToConfig2,
+ 'xsrfHeaderName': defaultToConfig2,
+ 'onUploadProgress': defaultToConfig2,
+ 'onDownloadProgress': defaultToConfig2,
+ 'decompress': defaultToConfig2,
+ 'maxContentLength': defaultToConfig2,
+ 'maxBodyLength': defaultToConfig2,
+ 'beforeRedirect': defaultToConfig2,
+ 'transport': defaultToConfig2,
+ 'httpAgent': defaultToConfig2,
+ 'httpsAgent': defaultToConfig2,
+ 'cancelToken': defaultToConfig2,
+ 'socketPath': defaultToConfig2,
+ 'responseEncoding': defaultToConfig2,
+ 'validateStatus': mergeDirectKeys
+ };
+
+ utils.forEach(Object.keys(config1).concat(Object.keys(config2)), function computeConfigValue(prop) {
+ const merge = mergeMap[prop] || mergeDeepProperties;
+ const configValue = merge(prop);
+ (utils.isUndefined(configValue) && merge !== mergeDirectKeys) || (config[prop] = configValue);
+ });
+
+ return config;
+}
diff --git a/node_modules/axios/lib/core/settle.js b/node_modules/axios/lib/core/settle.js
new file mode 100644
index 0000000..ac905c4
--- /dev/null
+++ b/node_modules/axios/lib/core/settle.js
@@ -0,0 +1,27 @@
+'use strict';
+
+import AxiosError from './AxiosError.js';
+
+/**
+ * Resolve or reject a Promise based on response status.
+ *
+ * @param {Function} resolve A function that resolves the promise.
+ * @param {Function} reject A function that rejects the promise.
+ * @param {object} response The response.
+ *
+ * @returns {object} The response.
+ */
+export default function settle(resolve, reject, response) {
+ const validateStatus = response.config.validateStatus;
+ if (!response.status || !validateStatus || validateStatus(response.status)) {
+ resolve(response);
+ } else {
+ reject(new AxiosError(
+ 'Request failed with status code ' + response.status,
+ [AxiosError.ERR_BAD_REQUEST, AxiosError.ERR_BAD_RESPONSE][Math.floor(response.status / 100) - 4],
+ response.config,
+ response.request,
+ response
+ ));
+ }
+}
diff --git a/node_modules/axios/lib/core/transformData.js b/node_modules/axios/lib/core/transformData.js
new file mode 100644
index 0000000..eeb5a8a
--- /dev/null
+++ b/node_modules/axios/lib/core/transformData.js
@@ -0,0 +1,28 @@
+'use strict';
+
+import utils from './../utils.js';
+import defaults from '../defaults/index.js';
+import AxiosHeaders from '../core/AxiosHeaders.js';
+
+/**
+ * Transform the data for a request or a response
+ *
+ * @param {Array|Function} fns A single function or Array of functions
+ * @param {?Object} response The response object
+ *
+ * @returns {*} The resulting transformed data
+ */
+export default function transformData(fns, response) {
+ const config = this || defaults;
+ const context = response || config;
+ const headers = AxiosHeaders.from(context.headers);
+ let data = context.data;
+
+ utils.forEach(fns, function transform(fn) {
+ data = fn.call(config, data, headers.normalize(), response ? response.status : undefined);
+ });
+
+ headers.normalize();
+
+ return data;
+}
diff --git a/node_modules/axios/lib/defaults/index.js b/node_modules/axios/lib/defaults/index.js
new file mode 100644
index 0000000..b4b9db2
--- /dev/null
+++ b/node_modules/axios/lib/defaults/index.js
@@ -0,0 +1,185 @@
+'use strict';
+
+import utils from '../utils.js';
+import AxiosError from '../core/AxiosError.js';
+import transitionalDefaults from './transitional.js';
+import toFormData from '../helpers/toFormData.js';
+import toURLEncodedForm from '../helpers/toURLEncodedForm.js';
+import platform from '../platform/index.js';
+import formDataToJSON from '../helpers/formDataToJSON.js';
+import adapters from '../adapters/index.js';
+
+const DEFAULT_CONTENT_TYPE = {
+ 'Content-Type': 'application/x-www-form-urlencoded'
+};
+
+/**
+ * If the browser has an XMLHttpRequest object, use the XHR adapter, otherwise use the HTTP
+ * adapter
+ *
+ * @returns {Function}
+ */
+function getDefaultAdapter() {
+ let adapter;
+ if (typeof XMLHttpRequest !== 'undefined') {
+ // For browsers use XHR adapter
+ adapter = adapters.getAdapter('xhr');
+ } else if (typeof process !== 'undefined' && utils.kindOf(process) === 'process') {
+ // For node use HTTP adapter
+ adapter = adapters.getAdapter('http');
+ }
+ return adapter;
+}
+
+/**
+ * It takes a string, tries to parse it, and if it fails, it returns the stringified version
+ * of the input
+ *
+ * @param {any} rawValue - The value to be stringified.
+ * @param {Function} parser - A function that parses a string into a JavaScript object.
+ * @param {Function} encoder - A function that takes a value and returns a string.
+ *
+ * @returns {string} A stringified version of the rawValue.
+ */
+function stringifySafely(rawValue, parser, encoder) {
+ if (utils.isString(rawValue)) {
+ try {
+ (parser || JSON.parse)(rawValue);
+ return utils.trim(rawValue);
+ } catch (e) {
+ if (e.name !== 'SyntaxError') {
+ throw e;
+ }
+ }
+ }
+
+ return (encoder || JSON.stringify)(rawValue);
+}
+
+const defaults = {
+
+ transitional: transitionalDefaults,
+
+ adapter: getDefaultAdapter(),
+
+ transformRequest: [function transformRequest(data, headers) {
+ const contentType = headers.getContentType() || '';
+ const hasJSONContentType = contentType.indexOf('application/json') > -1;
+ const isObjectPayload = utils.isObject(data);
+
+ if (isObjectPayload && utils.isHTMLForm(data)) {
+ data = new FormData(data);
+ }
+
+ const isFormData = utils.isFormData(data);
+
+ if (isFormData) {
+ if (!hasJSONContentType) {
+ return data;
+ }
+ return hasJSONContentType ? JSON.stringify(formDataToJSON(data)) : data;
+ }
+
+ if (utils.isArrayBuffer(data) ||
+ utils.isBuffer(data) ||
+ utils.isStream(data) ||
+ utils.isFile(data) ||
+ utils.isBlob(data)
+ ) {
+ return data;
+ }
+ if (utils.isArrayBufferView(data)) {
+ return data.buffer;
+ }
+ if (utils.isURLSearchParams(data)) {
+ headers.setContentType('application/x-www-form-urlencoded;charset=utf-8', false);
+ return data.toString();
+ }
+
+ let isFileList;
+
+ if (isObjectPayload) {
+ if (contentType.indexOf('application/x-www-form-urlencoded') > -1) {
+ return toURLEncodedForm(data, this.formSerializer).toString();
+ }
+
+ if ((isFileList = utils.isFileList(data)) || contentType.indexOf('multipart/form-data') > -1) {
+ const _FormData = this.env && this.env.FormData;
+
+ return toFormData(
+ isFileList ? {'files[]': data} : data,
+ _FormData && new _FormData(),
+ this.formSerializer
+ );
+ }
+ }
+
+ if (isObjectPayload || hasJSONContentType ) {
+ headers.setContentType('application/json', false);
+ return stringifySafely(data);
+ }
+
+ return data;
+ }],
+
+ transformResponse: [function transformResponse(data) {
+ const transitional = this.transitional || defaults.transitional;
+ const forcedJSONParsing = transitional && transitional.forcedJSONParsing;
+ const JSONRequested = this.responseType === 'json';
+
+ if (data && utils.isString(data) && ((forcedJSONParsing && !this.responseType) || JSONRequested)) {
+ const silentJSONParsing = transitional && transitional.silentJSONParsing;
+ const strictJSONParsing = !silentJSONParsing && JSONRequested;
+
+ try {
+ return JSON.parse(data);
+ } catch (e) {
+ if (strictJSONParsing) {
+ if (e.name === 'SyntaxError') {
+ throw AxiosError.from(e, AxiosError.ERR_BAD_RESPONSE, this, null, this.response);
+ }
+ throw e;
+ }
+ }
+ }
+
+ return data;
+ }],
+
+ /**
+ * A timeout in milliseconds to abort a request. If set to 0 (default) a
+ * timeout is not created.
+ */
+ timeout: 0,
+
+ xsrfCookieName: 'XSRF-TOKEN',
+ xsrfHeaderName: 'X-XSRF-TOKEN',
+
+ maxContentLength: -1,
+ maxBodyLength: -1,
+
+ env: {
+ FormData: platform.classes.FormData,
+ Blob: platform.classes.Blob
+ },
+
+ validateStatus: function validateStatus(status) {
+ return status >= 200 && status < 300;
+ },
+
+ headers: {
+ common: {
+ 'Accept': 'application/json, text/plain, */*'
+ }
+ }
+};
+
+utils.forEach(['delete', 'get', 'head'], function forEachMethodNoData(method) {
+ defaults.headers[method] = {};
+});
+
+utils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {
+ defaults.headers[method] = utils.merge(DEFAULT_CONTENT_TYPE);
+});
+
+export default defaults;
diff --git a/node_modules/axios/lib/defaults/transitional.js b/node_modules/axios/lib/defaults/transitional.js
new file mode 100644
index 0000000..f891331
--- /dev/null
+++ b/node_modules/axios/lib/defaults/transitional.js
@@ -0,0 +1,7 @@
+'use strict';
+
+export default {
+ silentJSONParsing: true,
+ forcedJSONParsing: true,
+ clarifyTimeoutError: false
+};
diff --git a/node_modules/axios/lib/env/README.md b/node_modules/axios/lib/env/README.md
new file mode 100644
index 0000000..b41baff
--- /dev/null
+++ b/node_modules/axios/lib/env/README.md
@@ -0,0 +1,3 @@
+# axios // env
+
+The `data.js` file is updated automatically when the package version is upgrading. Please do not edit it manually.
diff --git a/node_modules/axios/lib/env/classes/FormData.js b/node_modules/axios/lib/env/classes/FormData.js
new file mode 100644
index 0000000..d3a90ec
--- /dev/null
+++ b/node_modules/axios/lib/env/classes/FormData.js
@@ -0,0 +1,2 @@
+import FormData from 'form-data';
+export default FormData;
diff --git a/node_modules/axios/lib/env/data.js b/node_modules/axios/lib/env/data.js
new file mode 100644
index 0000000..7a019e3
--- /dev/null
+++ b/node_modules/axios/lib/env/data.js
@@ -0,0 +1 @@
+export const VERSION = "1.1.3"; \ No newline at end of file
diff --git a/node_modules/axios/lib/helpers/AxiosTransformStream.js b/node_modules/axios/lib/helpers/AxiosTransformStream.js
new file mode 100644
index 0000000..8e8c6d4
--- /dev/null
+++ b/node_modules/axios/lib/helpers/AxiosTransformStream.js
@@ -0,0 +1,191 @@
+'use strict';
+
+import stream from 'stream';
+import utils from '../utils.js';
+import throttle from './throttle.js';
+import speedometer from './speedometer.js';
+
+const kInternals = Symbol('internals');
+
+class AxiosTransformStream extends stream.Transform{
+ constructor(options) {
+ options = utils.toFlatObject(options, {
+ maxRate: 0,
+ chunkSize: 64 * 1024,
+ minChunkSize: 100,
+ timeWindow: 500,
+ ticksRate: 2,
+ samplesCount: 15
+ }, null, (prop, source) => {
+ return !utils.isUndefined(source[prop]);
+ });
+
+ super({
+ readableHighWaterMark: options.chunkSize
+ });
+
+ const self = this;
+
+ const internals = this[kInternals] = {
+ length: options.length,
+ timeWindow: options.timeWindow,
+ ticksRate: options.ticksRate,
+ chunkSize: options.chunkSize,
+ maxRate: options.maxRate,
+ minChunkSize: options.minChunkSize,
+ bytesSeen: 0,
+ isCaptured: false,
+ notifiedBytesLoaded: 0,
+ ts: Date.now(),
+ bytes: 0,
+ onReadCallback: null
+ };
+
+ const _speedometer = speedometer(internals.ticksRate * options.samplesCount, internals.timeWindow);
+
+ this.on('newListener', event => {
+ if (event === 'progress') {
+ if (!internals.isCaptured) {
+ internals.isCaptured = true;
+ }
+ }
+ });
+
+ let bytesNotified = 0;
+
+ internals.updateProgress = throttle(function throttledHandler() {
+ const totalBytes = internals.length;
+ const bytesTransferred = internals.bytesSeen;
+ const progressBytes = bytesTransferred - bytesNotified;
+ if (!progressBytes || self.destroyed) return;
+
+ const rate = _speedometer(progressBytes);
+
+ bytesNotified = bytesTransferred;
+
+ process.nextTick(() => {
+ self.emit('progress', {
+ 'loaded': bytesTransferred,
+ 'total': totalBytes,
+ 'progress': totalBytes ? (bytesTransferred / totalBytes) : undefined,
+ 'bytes': progressBytes,
+ 'rate': rate ? rate : undefined,
+ 'estimated': rate && totalBytes && bytesTransferred <= totalBytes ?
+ (totalBytes - bytesTransferred) / rate : undefined
+ });
+ });
+ }, internals.ticksRate);
+
+ const onFinish = () => {
+ internals.updateProgress(true);
+ };
+
+ this.once('end', onFinish);
+ this.once('error', onFinish);
+ }
+
+ _read(size) {
+ const internals = this[kInternals];
+
+ if (internals.onReadCallback) {
+ internals.onReadCallback();
+ }
+
+ return super._read(size);
+ }
+
+ _transform(chunk, encoding, callback) {
+ const self = this;
+ const internals = this[kInternals];
+ const maxRate = internals.maxRate;
+
+ const readableHighWaterMark = this.readableHighWaterMark;
+
+ const timeWindow = internals.timeWindow;
+
+ const divider = 1000 / timeWindow;
+ const bytesThreshold = (maxRate / divider);
+ const minChunkSize = internals.minChunkSize !== false ? Math.max(internals.minChunkSize, bytesThreshold * 0.01) : 0;
+
+ function pushChunk(_chunk, _callback) {
+ const bytes = Buffer.byteLength(_chunk);
+ internals.bytesSeen += bytes;
+ internals.bytes += bytes;
+
+ if (internals.isCaptured) {
+ internals.updateProgress();
+ }
+
+ if (self.push(_chunk)) {
+ process.nextTick(_callback);
+ } else {
+ internals.onReadCallback = () => {
+ internals.onReadCallback = null;
+ process.nextTick(_callback);
+ };
+ }
+ }
+
+ const transformChunk = (_chunk, _callback) => {
+ const chunkSize = Buffer.byteLength(_chunk);
+ let chunkRemainder = null;
+ let maxChunkSize = readableHighWaterMark;
+ let bytesLeft;
+ let passed = 0;
+
+ if (maxRate) {
+ const now = Date.now();
+
+ if (!internals.ts || (passed = (now - internals.ts)) >= timeWindow) {
+ internals.ts = now;
+ bytesLeft = bytesThreshold - internals.bytes;
+ internals.bytes = bytesLeft < 0 ? -bytesLeft : 0;
+ passed = 0;
+ }
+
+ bytesLeft = bytesThreshold - internals.bytes;
+ }
+
+ if (maxRate) {
+ if (bytesLeft <= 0) {
+ // next time window
+ return setTimeout(() => {
+ _callback(null, _chunk);
+ }, timeWindow - passed);
+ }
+
+ if (bytesLeft < maxChunkSize) {
+ maxChunkSize = bytesLeft;
+ }
+ }
+
+ if (maxChunkSize && chunkSize > maxChunkSize && (chunkSize - maxChunkSize) > minChunkSize) {
+ chunkRemainder = _chunk.subarray(maxChunkSize);
+ _chunk = _chunk.subarray(0, maxChunkSize);
+ }
+
+ pushChunk(_chunk, chunkRemainder ? () => {
+ process.nextTick(_callback, null, chunkRemainder);
+ } : _callback);
+ };
+
+ transformChunk(chunk, function transformNextChunk(err, _chunk) {
+ if (err) {
+ return callback(err);
+ }
+
+ if (_chunk) {
+ transformChunk(_chunk, transformNextChunk);
+ } else {
+ callback(null);
+ }
+ });
+ }
+
+ setLength(length) {
+ this[kInternals].length = +length;
+ return this;
+ }
+}
+
+export default AxiosTransformStream;
diff --git a/node_modules/axios/lib/helpers/AxiosURLSearchParams.js b/node_modules/axios/lib/helpers/AxiosURLSearchParams.js
new file mode 100644
index 0000000..b9aa9f0
--- /dev/null
+++ b/node_modules/axios/lib/helpers/AxiosURLSearchParams.js
@@ -0,0 +1,58 @@
+'use strict';
+
+import toFormData from './toFormData.js';
+
+/**
+ * It encodes a string by replacing all characters that are not in the unreserved set with
+ * their percent-encoded equivalents
+ *
+ * @param {string} str - The string to encode.
+ *
+ * @returns {string} The encoded string.
+ */
+function encode(str) {
+ const charMap = {
+ '!': '%21',
+ "'": '%27',
+ '(': '%28',
+ ')': '%29',
+ '~': '%7E',
+ '%20': '+',
+ '%00': '\x00'
+ };
+ return encodeURIComponent(str).replace(/[!'()~]|%20|%00/g, function replacer(match) {
+ return charMap[match];
+ });
+}
+
+/**
+ * It takes a params object and converts it to a FormData object
+ *
+ * @param {Object<string, any>} params - The parameters to be converted to a FormData object.
+ * @param {Object<string, any>} options - The options object passed to the Axios constructor.
+ *
+ * @returns {void}
+ */
+function AxiosURLSearchParams(params, options) {
+ this._pairs = [];
+
+ params && toFormData(params, this, options);
+}
+
+const prototype = AxiosURLSearchParams.prototype;
+
+prototype.append = function append(name, value) {
+ this._pairs.push([name, value]);
+};
+
+prototype.toString = function toString(encoder) {
+ const _encode = encoder ? function(value) {
+ return encoder.call(this, value, encode);
+ } : encode;
+
+ return this._pairs.map(function each(pair) {
+ return _encode(pair[0]) + '=' + _encode(pair[1]);
+ }, '').join('&');
+};
+
+export default AxiosURLSearchParams;
diff --git a/node_modules/axios/lib/helpers/README.md b/node_modules/axios/lib/helpers/README.md
new file mode 100644
index 0000000..4ae3419
--- /dev/null
+++ b/node_modules/axios/lib/helpers/README.md
@@ -0,0 +1,7 @@
+# axios // helpers
+
+The modules found in `helpers/` should be generic modules that are _not_ specific to the domain logic of axios. These modules could theoretically be published to npm on their own and consumed by other modules or apps. Some examples of generic modules are things like:
+
+- Browser polyfills
+- Managing cookies
+- Parsing HTTP headers
diff --git a/node_modules/axios/lib/helpers/bind.js b/node_modules/axios/lib/helpers/bind.js
new file mode 100644
index 0000000..b3aa83b
--- /dev/null
+++ b/node_modules/axios/lib/helpers/bind.js
@@ -0,0 +1,7 @@
+'use strict';
+
+export default function bind(fn, thisArg) {
+ return function wrap() {
+ return fn.apply(thisArg, arguments);
+ };
+}
diff --git a/node_modules/axios/lib/helpers/buildURL.js b/node_modules/axios/lib/helpers/buildURL.js
new file mode 100644
index 0000000..d769fdf
--- /dev/null
+++ b/node_modules/axios/lib/helpers/buildURL.js
@@ -0,0 +1,63 @@
+'use strict';
+
+import utils from '../utils.js';
+import AxiosURLSearchParams from '../helpers/AxiosURLSearchParams.js';
+
+/**
+ * It replaces all instances of the characters `:`, `$`, `,`, `+`, `[`, and `]` with their
+ * URI encoded counterparts
+ *
+ * @param {string} val The value to be encoded.
+ *
+ * @returns {string} The encoded value.
+ */
+function encode(val) {
+ return encodeURIComponent(val).
+ replace(/%3A/gi, ':').
+ replace(/%24/g, '$').
+ replace(/%2C/gi, ',').
+ replace(/%20/g, '+').
+ replace(/%5B/gi, '[').
+ replace(/%5D/gi, ']');
+}
+
+/**
+ * Build a URL by appending params to the end
+ *
+ * @param {string} url The base of the url (e.g., http://www.google.com)
+ * @param {object} [params] The params to be appended
+ * @param {?object} options
+ *
+ * @returns {string} The formatted url
+ */
+export default function buildURL(url, params, options) {
+ /*eslint no-param-reassign:0*/
+ if (!params) {
+ return url;
+ }
+
+ const _encode = options && options.encode || encode;
+
+ const serializeFn = options && options.serialize;
+
+ let serializedParams;
+
+ if (serializeFn) {
+ serializedParams = serializeFn(params, options);
+ } else {
+ serializedParams = utils.isURLSearchParams(params) ?
+ params.toString() :
+ new AxiosURLSearchParams(params, options).toString(_encode);
+ }
+
+ if (serializedParams) {
+ const hashmarkIndex = url.indexOf("#");
+
+ if (hashmarkIndex !== -1) {
+ url = url.slice(0, hashmarkIndex);
+ }
+ url += (url.indexOf('?') === -1 ? '?' : '&') + serializedParams;
+ }
+
+ return url;
+}
diff --git a/node_modules/axios/lib/helpers/combineURLs.js b/node_modules/axios/lib/helpers/combineURLs.js
new file mode 100644
index 0000000..cba9a23
--- /dev/null
+++ b/node_modules/axios/lib/helpers/combineURLs.js
@@ -0,0 +1,15 @@
+'use strict';
+
+/**
+ * Creates a new URL by combining the specified URLs
+ *
+ * @param {string} baseURL The base URL
+ * @param {string} relativeURL The relative URL
+ *
+ * @returns {string} The combined URL
+ */
+export default function combineURLs(baseURL, relativeURL) {
+ return relativeURL
+ ? baseURL.replace(/\/+$/, '') + '/' + relativeURL.replace(/^\/+/, '')
+ : baseURL;
+}
diff --git a/node_modules/axios/lib/helpers/cookies.js b/node_modules/axios/lib/helpers/cookies.js
new file mode 100644
index 0000000..361493a
--- /dev/null
+++ b/node_modules/axios/lib/helpers/cookies.js
@@ -0,0 +1,52 @@
+'use strict';
+
+import utils from './../utils.js';
+import platform from '../platform/index.js';
+
+export default platform.isStandardBrowserEnv ?
+
+// Standard browser envs support document.cookie
+ (function standardBrowserEnv() {
+ return {
+ write: function write(name, value, expires, path, domain, secure) {
+ const cookie = [];
+ cookie.push(name + '=' + encodeURIComponent(value));
+
+ if (utils.isNumber(expires)) {
+ cookie.push('expires=' + new Date(expires).toGMTString());
+ }
+
+ if (utils.isString(path)) {
+ cookie.push('path=' + path);
+ }
+
+ if (utils.isString(domain)) {
+ cookie.push('domain=' + domain);
+ }
+
+ if (secure === true) {
+ cookie.push('secure');
+ }
+
+ document.cookie = cookie.join('; ');
+ },
+
+ read: function read(name) {
+ const match = document.cookie.match(new RegExp('(^|;\\s*)(' + name + ')=([^;]*)'));
+ return (match ? decodeURIComponent(match[3]) : null);
+ },
+
+ remove: function remove(name) {
+ this.write(name, '', Date.now() - 86400000);
+ }
+ };
+ })() :
+
+// Non standard browser env (web workers, react-native) lack needed support.
+ (function nonStandardBrowserEnv() {
+ return {
+ write: function write() {},
+ read: function read() { return null; },
+ remove: function remove() {}
+ };
+ })();
diff --git a/node_modules/axios/lib/helpers/deprecatedMethod.js b/node_modules/axios/lib/helpers/deprecatedMethod.js
new file mode 100644
index 0000000..9e8fae6
--- /dev/null
+++ b/node_modules/axios/lib/helpers/deprecatedMethod.js
@@ -0,0 +1,26 @@
+'use strict';
+
+/*eslint no-console:0*/
+
+/**
+ * Supply a warning to the developer that a method they are using
+ * has been deprecated.
+ *
+ * @param {string} method The name of the deprecated method
+ * @param {string} [instead] The alternate method to use if applicable
+ * @param {string} [docs] The documentation URL to get further details
+ *
+ * @returns {void}
+ */
+export default function deprecatedMethod(method, instead, docs) {
+ try {
+ console.warn(
+ 'DEPRECATED method `' + method + '`.' +
+ (instead ? ' Use `' + instead + '` instead.' : '') +
+ ' This method will be removed in a future release.');
+
+ if (docs) {
+ console.warn('For more information about usage see ' + docs);
+ }
+ } catch (e) { /* Ignore */ }
+}
diff --git a/node_modules/axios/lib/helpers/formDataToJSON.js b/node_modules/axios/lib/helpers/formDataToJSON.js
new file mode 100644
index 0000000..f4581df
--- /dev/null
+++ b/node_modules/axios/lib/helpers/formDataToJSON.js
@@ -0,0 +1,92 @@
+'use strict';
+
+import utils from '../utils.js';
+
+/**
+ * It takes a string like `foo[x][y][z]` and returns an array like `['foo', 'x', 'y', 'z']
+ *
+ * @param {string} name - The name of the property to get.
+ *
+ * @returns An array of strings.
+ */
+function parsePropPath(name) {
+ // foo[x][y][z]
+ // foo.x.y.z
+ // foo-x-y-z
+ // foo x y z
+ return utils.matchAll(/\w+|\[(\w*)]/g, name).map(match => {
+ return match[0] === '[]' ? '' : match[1] || match[0];
+ });
+}
+
+/**
+ * Convert an array to an object.
+ *
+ * @param {Array<any>} arr - The array to convert to an object.
+ *
+ * @returns An object with the same keys and values as the array.
+ */
+function arrayToObject(arr) {
+ const obj = {};
+ const keys = Object.keys(arr);
+ let i;
+ const len = keys.length;
+ let key;
+ for (i = 0; i < len; i++) {
+ key = keys[i];
+ obj[key] = arr[key];
+ }
+ return obj;
+}
+
+/**
+ * It takes a FormData object and returns a JavaScript object
+ *
+ * @param {string} formData The FormData object to convert to JSON.
+ *
+ * @returns {Object<string, any> | null} The converted object.
+ */
+function formDataToJSON(formData) {
+ function buildPath(path, value, target, index) {
+ let name = path[index++];
+ const isNumericKey = Number.isFinite(+name);
+ const isLast = index >= path.length;
+ name = !name && utils.isArray(target) ? target.length : name;
+
+ if (isLast) {
+ if (utils.hasOwnProp(target, name)) {
+ target[name] = [target[name], value];
+ } else {
+ target[name] = value;
+ }
+
+ return !isNumericKey;
+ }
+
+ if (!target[name] || !utils.isObject(target[name])) {
+ target[name] = [];
+ }
+
+ const result = buildPath(path, value, target[name], index);
+
+ if (result && utils.isArray(target[name])) {
+ target[name] = arrayToObject(target[name]);
+ }
+
+ return !isNumericKey;
+ }
+
+ if (utils.isFormData(formData) && utils.isFunction(formData.entries)) {
+ const obj = {};
+
+ utils.forEachEntry(formData, (name, value) => {
+ buildPath(parsePropPath(name), value, obj, 0);
+ });
+
+ return obj;
+ }
+
+ return null;
+}
+
+export default formDataToJSON;
diff --git a/node_modules/axios/lib/helpers/fromDataURI.js b/node_modules/axios/lib/helpers/fromDataURI.js
new file mode 100644
index 0000000..eb71d3f
--- /dev/null
+++ b/node_modules/axios/lib/helpers/fromDataURI.js
@@ -0,0 +1,53 @@
+'use strict';
+
+import AxiosError from '../core/AxiosError.js';
+import parseProtocol from './parseProtocol.js';
+import platform from '../platform/index.js';
+
+const DATA_URL_PATTERN = /^(?:([^;]+);)?(?:[^;]+;)?(base64|),([\s\S]*)$/;
+
+/**
+ * Parse data uri to a Buffer or Blob
+ *
+ * @param {String} uri
+ * @param {?Boolean} asBlob
+ * @param {?Object} options
+ * @param {?Function} options.Blob
+ *
+ * @returns {Buffer|Blob}
+ */
+export default function fromDataURI(uri, asBlob, options) {
+ const _Blob = options && options.Blob || platform.classes.Blob;
+ const protocol = parseProtocol(uri);
+
+ if (asBlob === undefined && _Blob) {
+ asBlob = true;
+ }
+
+ if (protocol === 'data') {
+ uri = protocol.length ? uri.slice(protocol.length + 1) : uri;
+
+ const match = DATA_URL_PATTERN.exec(uri);
+
+ if (!match) {
+ throw new AxiosError('Invalid URL', AxiosError.ERR_INVALID_URL);
+ }
+
+ const mime = match[1];
+ const isBase64 = match[2];
+ const body = match[3];
+ const buffer = Buffer.from(decodeURIComponent(body), isBase64 ? 'base64' : 'utf8');
+
+ if (asBlob) {
+ if (!_Blob) {
+ throw new AxiosError('Blob is not supported', AxiosError.ERR_NOT_SUPPORT);
+ }
+
+ return new _Blob([buffer], {type: mime});
+ }
+
+ return buffer;
+ }
+
+ throw new AxiosError('Unsupported protocol ' + protocol, AxiosError.ERR_NOT_SUPPORT);
+}
diff --git a/node_modules/axios/lib/helpers/isAbsoluteURL.js b/node_modules/axios/lib/helpers/isAbsoluteURL.js
new file mode 100644
index 0000000..4747a45
--- /dev/null
+++ b/node_modules/axios/lib/helpers/isAbsoluteURL.js
@@ -0,0 +1,15 @@
+'use strict';
+
+/**
+ * Determines whether the specified URL is absolute
+ *
+ * @param {string} url The URL to test
+ *
+ * @returns {boolean} True if the specified URL is absolute, otherwise false
+ */
+export default function isAbsoluteURL(url) {
+ // A URL is considered absolute if it begins with "<scheme>://" or "//" (protocol-relative URL).
+ // RFC 3986 defines scheme name as a sequence of characters beginning with a letter and followed
+ // by any combination of letters, digits, plus, period, or hyphen.
+ return /^([a-z][a-z\d+\-.]*:)?\/\//i.test(url);
+}
diff --git a/node_modules/axios/lib/helpers/isAxiosError.js b/node_modules/axios/lib/helpers/isAxiosError.js
new file mode 100644
index 0000000..da6cd63
--- /dev/null
+++ b/node_modules/axios/lib/helpers/isAxiosError.js
@@ -0,0 +1,14 @@
+'use strict';
+
+import utils from './../utils.js';
+
+/**
+ * Determines whether the payload is an error thrown by Axios
+ *
+ * @param {*} payload The value to test
+ *
+ * @returns {boolean} True if the payload is an error thrown by Axios, otherwise false
+ */
+export default function isAxiosError(payload) {
+ return utils.isObject(payload) && (payload.isAxiosError === true);
+}
diff --git a/node_modules/axios/lib/helpers/isURLSameOrigin.js b/node_modules/axios/lib/helpers/isURLSameOrigin.js
new file mode 100644
index 0000000..18db03b
--- /dev/null
+++ b/node_modules/axios/lib/helpers/isURLSameOrigin.js
@@ -0,0 +1,67 @@
+'use strict';
+
+import utils from './../utils.js';
+import platform from '../platform/index.js';
+
+export default platform.isStandardBrowserEnv ?
+
+// Standard browser envs have full support of the APIs needed to test
+// whether the request URL is of the same origin as current location.
+ (function standardBrowserEnv() {
+ const msie = /(msie|trident)/i.test(navigator.userAgent);
+ const urlParsingNode = document.createElement('a');
+ let originURL;
+
+ /**
+ * Parse a URL to discover it's components
+ *
+ * @param {String} url The URL to be parsed
+ * @returns {Object}
+ */
+ function resolveURL(url) {
+ let href = url;
+
+ if (msie) {
+ // IE needs attribute set twice to normalize properties
+ urlParsingNode.setAttribute('href', href);
+ href = urlParsingNode.href;
+ }
+
+ urlParsingNode.setAttribute('href', href);
+
+ // urlParsingNode provides the UrlUtils interface - http://url.spec.whatwg.org/#urlutils
+ return {
+ href: urlParsingNode.href,
+ protocol: urlParsingNode.protocol ? urlParsingNode.protocol.replace(/:$/, '') : '',
+ host: urlParsingNode.host,
+ search: urlParsingNode.search ? urlParsingNode.search.replace(/^\?/, '') : '',
+ hash: urlParsingNode.hash ? urlParsingNode.hash.replace(/^#/, '') : '',
+ hostname: urlParsingNode.hostname,
+ port: urlParsingNode.port,
+ pathname: (urlParsingNode.pathname.charAt(0) === '/') ?
+ urlParsingNode.pathname :
+ '/' + urlParsingNode.pathname
+ };
+ }
+
+ originURL = resolveURL(window.location.href);
+
+ /**
+ * Determine if a URL shares the same origin as the current location
+ *
+ * @param {String} requestURL The URL to test
+ * @returns {boolean} True if URL shares the same origin, otherwise false
+ */
+ return function isURLSameOrigin(requestURL) {
+ const parsed = (utils.isString(requestURL)) ? resolveURL(requestURL) : requestURL;
+ return (parsed.protocol === originURL.protocol &&
+ parsed.host === originURL.host);
+ };
+ })() :
+
+ // Non standard browser envs (web workers, react-native) lack needed support.
+ (function nonStandardBrowserEnv() {
+ return function isURLSameOrigin() {
+ return true;
+ };
+ })();
diff --git a/node_modules/axios/lib/helpers/null.js b/node_modules/axios/lib/helpers/null.js
new file mode 100644
index 0000000..b9f82c4
--- /dev/null
+++ b/node_modules/axios/lib/helpers/null.js
@@ -0,0 +1,2 @@
+// eslint-disable-next-line strict
+export default null;
diff --git a/node_modules/axios/lib/helpers/parseHeaders.js b/node_modules/axios/lib/helpers/parseHeaders.js
new file mode 100644
index 0000000..50af948
--- /dev/null
+++ b/node_modules/axios/lib/helpers/parseHeaders.js
@@ -0,0 +1,55 @@
+'use strict';
+
+import utils from './../utils.js';
+
+// RawAxiosHeaders whose duplicates are ignored by node
+// c.f. https://nodejs.org/api/http.html#http_message_headers
+const ignoreDuplicateOf = utils.toObjectSet([
+ 'age', 'authorization', 'content-length', 'content-type', 'etag',
+ 'expires', 'from', 'host', 'if-modified-since', 'if-unmodified-since',
+ 'last-modified', 'location', 'max-forwards', 'proxy-authorization',
+ 'referer', 'retry-after', 'user-agent'
+]);
+
+/**
+ * Parse headers into an object
+ *
+ * ```
+ * Date: Wed, 27 Aug 2014 08:58:49 GMT
+ * Content-Type: application/json
+ * Connection: keep-alive
+ * Transfer-Encoding: chunked
+ * ```
+ *
+ * @param {String} rawHeaders Headers needing to be parsed
+ *
+ * @returns {Object} Headers parsed into an object
+ */
+export default rawHeaders => {
+ const parsed = {};
+ let key;
+ let val;
+ let i;
+
+ rawHeaders && rawHeaders.split('\n').forEach(function parser(line) {
+ i = line.indexOf(':');
+ key = line.substring(0, i).trim().toLowerCase();
+ val = line.substring(i + 1).trim();
+
+ if (!key || (parsed[key] && ignoreDuplicateOf[key])) {
+ return;
+ }
+
+ if (key === 'set-cookie') {
+ if (parsed[key]) {
+ parsed[key].push(val);
+ } else {
+ parsed[key] = [val];
+ }
+ } else {
+ parsed[key] = parsed[key] ? parsed[key] + ', ' + val : val;
+ }
+ });
+
+ return parsed;
+};
diff --git a/node_modules/axios/lib/helpers/parseProtocol.js b/node_modules/axios/lib/helpers/parseProtocol.js
new file mode 100644
index 0000000..586ec96
--- /dev/null
+++ b/node_modules/axios/lib/helpers/parseProtocol.js
@@ -0,0 +1,6 @@
+'use strict';
+
+export default function parseProtocol(url) {
+ const match = /^([-+\w]{1,25})(:?\/\/|:)/.exec(url);
+ return match && match[1] || '';
+}
diff --git a/node_modules/axios/lib/helpers/speedometer.js b/node_modules/axios/lib/helpers/speedometer.js
new file mode 100644
index 0000000..10782b7
--- /dev/null
+++ b/node_modules/axios/lib/helpers/speedometer.js
@@ -0,0 +1,55 @@
+'use strict';
+
+/**
+ * Calculate data maxRate
+ * @param {Number} [samplesCount= 10]
+ * @param {Number} [min= 1000]
+ * @returns {Function}
+ */
+function speedometer(samplesCount, min) {
+ samplesCount = samplesCount || 10;
+ const bytes = new Array(samplesCount);
+ const timestamps = new Array(samplesCount);
+ let head = 0;
+ let tail = 0;
+ let firstSampleTS;
+
+ min = min !== undefined ? min : 1000;
+
+ return function push(chunkLength) {
+ const now = Date.now();
+
+ const startedAt = timestamps[tail];
+
+ if (!firstSampleTS) {
+ firstSampleTS = now;
+ }
+
+ bytes[head] = chunkLength;
+ timestamps[head] = now;
+
+ let i = tail;
+ let bytesCount = 0;
+
+ while (i !== head) {
+ bytesCount += bytes[i++];
+ i = i % samplesCount;
+ }
+
+ head = (head + 1) % samplesCount;
+
+ if (head === tail) {
+ tail = (tail + 1) % samplesCount;
+ }
+
+ if (now - firstSampleTS < min) {
+ return;
+ }
+
+ const passed = startedAt && now - startedAt;
+
+ return passed ? Math.round(bytesCount * 1000 / passed) : undefined;
+ };
+}
+
+export default speedometer;
diff --git a/node_modules/axios/lib/helpers/spread.js b/node_modules/axios/lib/helpers/spread.js
new file mode 100644
index 0000000..13479cb
--- /dev/null
+++ b/node_modules/axios/lib/helpers/spread.js
@@ -0,0 +1,28 @@
+'use strict';
+
+/**
+ * Syntactic sugar for invoking a function and expanding an array for arguments.
+ *
+ * Common use case would be to use `Function.prototype.apply`.
+ *
+ * ```js
+ * function f(x, y, z) {}
+ * var args = [1, 2, 3];
+ * f.apply(null, args);
+ * ```
+ *
+ * With `spread` this example can be re-written.
+ *
+ * ```js
+ * spread(function(x, y, z) {})([1, 2, 3]);
+ * ```
+ *
+ * @param {Function} callback
+ *
+ * @returns {Function}
+ */
+export default function spread(callback) {
+ return function wrap(arr) {
+ return callback.apply(null, arr);
+ };
+}
diff --git a/node_modules/axios/lib/helpers/throttle.js b/node_modules/axios/lib/helpers/throttle.js
new file mode 100644
index 0000000..6969df1
--- /dev/null
+++ b/node_modules/axios/lib/helpers/throttle.js
@@ -0,0 +1,33 @@
+'use strict';
+
+/**
+ * Throttle decorator
+ * @param {Function} fn
+ * @param {Number} freq
+ * @return {Function}
+ */
+function throttle(fn, freq) {
+ let timestamp = 0;
+ const threshold = 1000 / freq;
+ let timer = null;
+ return function throttled(force, args) {
+ const now = Date.now();
+ if (force || now - timestamp > threshold) {
+ if (timer) {
+ clearTimeout(timer);
+ timer = null;
+ }
+ timestamp = now;
+ return fn.apply(null, args);
+ }
+ if (!timer) {
+ timer = setTimeout(() => {
+ timer = null;
+ timestamp = Date.now();
+ return fn.apply(null, args);
+ }, threshold - (now - timestamp));
+ }
+ };
+}
+
+export default throttle;
diff --git a/node_modules/axios/lib/helpers/toFormData.js b/node_modules/axios/lib/helpers/toFormData.js
new file mode 100644
index 0000000..ce99ce1
--- /dev/null
+++ b/node_modules/axios/lib/helpers/toFormData.js
@@ -0,0 +1,229 @@
+'use strict';
+
+import utils from '../utils.js';
+import AxiosError from '../core/AxiosError.js';
+import envFormData from '../env/classes/FormData.js';
+
+/**
+ * Determines if the given thing is a array or js object.
+ *
+ * @param {string} thing - The object or array to be visited.
+ *
+ * @returns {boolean}
+ */
+function isVisitable(thing) {
+ return utils.isPlainObject(thing) || utils.isArray(thing);
+}
+
+/**
+ * It removes the brackets from the end of a string
+ *
+ * @param {string} key - The key of the parameter.
+ *
+ * @returns {string} the key without the brackets.
+ */
+function removeBrackets(key) {
+ return utils.endsWith(key, '[]') ? key.slice(0, -2) : key;
+}
+
+/**
+ * It takes a path, a key, and a boolean, and returns a string
+ *
+ * @param {string} path - The path to the current key.
+ * @param {string} key - The key of the current object being iterated over.
+ * @param {string} dots - If true, the key will be rendered with dots instead of brackets.
+ *
+ * @returns {string} The path to the current key.
+ */
+function renderKey(path, key, dots) {
+ if (!path) return key;
+ return path.concat(key).map(function each(token, i) {
+ // eslint-disable-next-line no-param-reassign
+ token = removeBrackets(token);
+ return !dots && i ? '[' + token + ']' : token;
+ }).join(dots ? '.' : '');
+}
+
+/**
+ * If the array is an array and none of its elements are visitable, then it's a flat array.
+ *
+ * @param {Array<any>} arr - The array to check
+ *
+ * @returns {boolean}
+ */
+function isFlatArray(arr) {
+ return utils.isArray(arr) && !arr.some(isVisitable);
+}
+
+const predicates = utils.toFlatObject(utils, {}, null, function filter(prop) {
+ return /^is[A-Z]/.test(prop);
+});
+
+/**
+ * If the thing is a FormData object, return true, otherwise return false.
+ *
+ * @param {unknown} thing - The thing to check.
+ *
+ * @returns {boolean}
+ */
+function isSpecCompliant(thing) {
+ return thing && utils.isFunction(thing.append) && thing[Symbol.toStringTag] === 'FormData' && thing[Symbol.iterator];
+}
+
+/**
+ * Convert a data object to FormData
+ *
+ * @param {Object} obj
+ * @param {?Object} [formData]
+ * @param {?Object} [options]
+ * @param {Function} [options.visitor]
+ * @param {Boolean} [options.metaTokens = true]
+ * @param {Boolean} [options.dots = false]
+ * @param {?Boolean} [options.indexes = false]
+ *
+ * @returns {Object}
+ **/
+
+/**
+ * It converts an object into a FormData object
+ *
+ * @param {Object<any, any>} obj - The object to convert to form data.
+ * @param {string} formData - The FormData object to append to.
+ * @param {Object<string, any>} options
+ *
+ * @returns
+ */
+function toFormData(obj, formData, options) {
+ if (!utils.isObject(obj)) {
+ throw new TypeError('target must be an object');
+ }
+
+ // eslint-disable-next-line no-param-reassign
+ formData = formData || new (envFormData || FormData)();
+
+ // eslint-disable-next-line no-param-reassign
+ options = utils.toFlatObject(options, {
+ metaTokens: true,
+ dots: false,
+ indexes: false
+ }, false, function defined(option, source) {
+ // eslint-disable-next-line no-eq-null,eqeqeq
+ return !utils.isUndefined(source[option]);
+ });
+
+ const metaTokens = options.metaTokens;
+ // eslint-disable-next-line no-use-before-define
+ const visitor = options.visitor || defaultVisitor;
+ const dots = options.dots;
+ const indexes = options.indexes;
+ const _Blob = options.Blob || typeof Blob !== 'undefined' && Blob;
+ const useBlob = _Blob && isSpecCompliant(formData);
+
+ if (!utils.isFunction(visitor)) {
+ throw new TypeError('visitor must be a function');
+ }
+
+ function convertValue(value) {
+ if (value === null) return '';
+
+ if (utils.isDate(value)) {
+ return value.toISOString();
+ }
+
+ if (!useBlob && utils.isBlob(value)) {
+ throw new AxiosError('Blob is not supported. Use a Buffer instead.');
+ }
+
+ if (utils.isArrayBuffer(value) || utils.isTypedArray(value)) {
+ return useBlob && typeof Blob === 'function' ? new Blob([value]) : Buffer.from(value);
+ }
+
+ return value;
+ }
+
+ /**
+ * Default visitor.
+ *
+ * @param {*} value
+ * @param {String|Number} key
+ * @param {Array<String|Number>} path
+ * @this {FormData}
+ *
+ * @returns {boolean} return true to visit the each prop of the value recursively
+ */
+ function defaultVisitor(value, key, path) {
+ let arr = value;
+
+ if (value && !path && typeof value === 'object') {
+ if (utils.endsWith(key, '{}')) {
+ // eslint-disable-next-line no-param-reassign
+ key = metaTokens ? key : key.slice(0, -2);
+ // eslint-disable-next-line no-param-reassign
+ value = JSON.stringify(value);
+ } else if (
+ (utils.isArray(value) && isFlatArray(value)) ||
+ (utils.isFileList(value) || utils.endsWith(key, '[]') && (arr = utils.toArray(value))
+ )) {
+ // eslint-disable-next-line no-param-reassign
+ key = removeBrackets(key);
+
+ arr.forEach(function each(el, index) {
+ !(utils.isUndefined(el) || el === null) && formData.append(
+ // eslint-disable-next-line no-nested-ternary
+ indexes === true ? renderKey([key], index, dots) : (indexes === null ? key : key + '[]'),
+ convertValue(el)
+ );
+ });
+ return false;
+ }
+ }
+
+ if (isVisitable(value)) {
+ return true;
+ }
+
+ formData.append(renderKey(path, key, dots), convertValue(value));
+
+ return false;
+ }
+
+ const stack = [];
+
+ const exposedHelpers = Object.assign(predicates, {
+ defaultVisitor,
+ convertValue,
+ isVisitable
+ });
+
+ function build(value, path) {
+ if (utils.isUndefined(value)) return;
+
+ if (stack.indexOf(value) !== -1) {
+ throw Error('Circular reference detected in ' + path.join('.'));
+ }
+
+ stack.push(value);
+
+ utils.forEach(value, function each(el, key) {
+ const result = !(utils.isUndefined(el) || el === null) && visitor.call(
+ formData, el, utils.isString(key) ? key.trim() : key, path, exposedHelpers
+ );
+
+ if (result === true) {
+ build(el, path ? path.concat(key) : [key]);
+ }
+ });
+
+ stack.pop();
+ }
+
+ if (!utils.isObject(obj)) {
+ throw new TypeError('data must be an object');
+ }
+
+ build(obj);
+
+ return formData;
+}
+
+export default toFormData;
diff --git a/node_modules/axios/lib/helpers/toURLEncodedForm.js b/node_modules/axios/lib/helpers/toURLEncodedForm.js
new file mode 100644
index 0000000..988a38a
--- /dev/null
+++ b/node_modules/axios/lib/helpers/toURLEncodedForm.js
@@ -0,0 +1,18 @@
+'use strict';
+
+import utils from '../utils.js';
+import toFormData from './toFormData.js';
+import platform from '../platform/index.js';
+
+export default function toURLEncodedForm(data, options) {
+ return toFormData(data, new platform.classes.URLSearchParams(), Object.assign({
+ visitor: function(value, key, path, helpers) {
+ if (platform.isNode && utils.isBuffer(value)) {
+ this.append(key, value.toString('base64'));
+ return false;
+ }
+
+ return helpers.defaultVisitor.apply(this, arguments);
+ }
+ }, options));
+}
diff --git a/node_modules/axios/lib/helpers/validator.js b/node_modules/axios/lib/helpers/validator.js
new file mode 100644
index 0000000..14b4696
--- /dev/null
+++ b/node_modules/axios/lib/helpers/validator.js
@@ -0,0 +1,91 @@
+'use strict';
+
+import {VERSION} from '../env/data.js';
+import AxiosError from '../core/AxiosError.js';
+
+const validators = {};
+
+// eslint-disable-next-line func-names
+['object', 'boolean', 'number', 'function', 'string', 'symbol'].forEach((type, i) => {
+ validators[type] = function validator(thing) {
+ return typeof thing === type || 'a' + (i < 1 ? 'n ' : ' ') + type;
+ };
+});
+
+const deprecatedWarnings = {};
+
+/**
+ * Transitional option validator
+ *
+ * @param {function|boolean?} validator - set to false if the transitional option has been removed
+ * @param {string?} version - deprecated version / removed since version
+ * @param {string?} message - some message with additional info
+ *
+ * @returns {function}
+ */
+validators.transitional = function transitional(validator, version, message) {
+ function formatMessage(opt, desc) {
+ return '[Axios v' + VERSION + '] Transitional option \'' + opt + '\'' + desc + (message ? '. ' + message : '');
+ }
+
+ // eslint-disable-next-line func-names
+ return (value, opt, opts) => {
+ if (validator === false) {
+ throw new AxiosError(
+ formatMessage(opt, ' has been removed' + (version ? ' in ' + version : '')),
+ AxiosError.ERR_DEPRECATED
+ );
+ }
+
+ if (version && !deprecatedWarnings[opt]) {
+ deprecatedWarnings[opt] = true;
+ // eslint-disable-next-line no-console
+ console.warn(
+ formatMessage(
+ opt,
+ ' has been deprecated since v' + version + ' and will be removed in the near future'
+ )
+ );
+ }
+
+ return validator ? validator(value, opt, opts) : true;
+ };
+};
+
+/**
+ * Assert object's properties type
+ *
+ * @param {object} options
+ * @param {object} schema
+ * @param {boolean?} allowUnknown
+ *
+ * @returns {object}
+ */
+
+function assertOptions(options, schema, allowUnknown) {
+ if (typeof options !== 'object') {
+ throw new AxiosError('options must be an object', AxiosError.ERR_BAD_OPTION_VALUE);
+ }
+ const keys = Object.keys(options);
+ let i = keys.length;
+ while (i-- > 0) {
+ const opt = keys[i];
+ const validator = schema[opt];
+ if (validator) {
+ const value = options[opt];
+ const result = value === undefined || validator(value, opt, options);
+ if (result !== true) {
+ throw new AxiosError('option ' + opt + ' must be ' + result, AxiosError.ERR_BAD_OPTION_VALUE);
+ }
+ continue;
+ }
+ if (allowUnknown !== true) {
+ throw new AxiosError('Unknown option ' + opt, AxiosError.ERR_BAD_OPTION);
+ }
+ }
+}
+
+export default {
+ assertOptions,
+ validators
+};
diff --git a/node_modules/axios/lib/platform/browser/classes/FormData.js b/node_modules/axios/lib/platform/browser/classes/FormData.js
new file mode 100644
index 0000000..4369056
--- /dev/null
+++ b/node_modules/axios/lib/platform/browser/classes/FormData.js
@@ -0,0 +1,3 @@
+'use strict';
+
+export default FormData;
diff --git a/node_modules/axios/lib/platform/browser/classes/URLSearchParams.js b/node_modules/axios/lib/platform/browser/classes/URLSearchParams.js
new file mode 100644
index 0000000..b7dae95
--- /dev/null
+++ b/node_modules/axios/lib/platform/browser/classes/URLSearchParams.js
@@ -0,0 +1,4 @@
+'use strict';
+
+import AxiosURLSearchParams from '../../../helpers/AxiosURLSearchParams.js';
+export default typeof URLSearchParams !== 'undefined' ? URLSearchParams : AxiosURLSearchParams;
diff --git a/node_modules/axios/lib/platform/browser/index.js b/node_modules/axios/lib/platform/browser/index.js
new file mode 100644
index 0000000..80284eb
--- /dev/null
+++ b/node_modules/axios/lib/platform/browser/index.js
@@ -0,0 +1,43 @@
+import URLSearchParams from './classes/URLSearchParams.js'
+import FormData from './classes/FormData.js'
+
+/**
+ * Determine if we're running in a standard browser environment
+ *
+ * This allows axios to run in a web worker, and react-native.
+ * Both environments support XMLHttpRequest, but not fully standard globals.
+ *
+ * web workers:
+ * typeof window -> undefined
+ * typeof document -> undefined
+ *
+ * react-native:
+ * navigator.product -> 'ReactNative'
+ * nativescript
+ * navigator.product -> 'NativeScript' or 'NS'
+ *
+ * @returns {boolean}
+ */
+const isStandardBrowserEnv = (() => {
+ let product;
+ if (typeof navigator !== 'undefined' && (
+ (product = navigator.product) === 'ReactNative' ||
+ product === 'NativeScript' ||
+ product === 'NS')
+ ) {
+ return false;
+ }
+
+ return typeof window !== 'undefined' && typeof document !== 'undefined';
+})();
+
+export default {
+ isBrowser: true,
+ classes: {
+ URLSearchParams,
+ FormData,
+ Blob
+ },
+ isStandardBrowserEnv,
+ protocols: ['http', 'https', 'file', 'blob', 'url', 'data']
+};
diff --git a/node_modules/axios/lib/platform/index.js b/node_modules/axios/lib/platform/index.js
new file mode 100644
index 0000000..5e9d005
--- /dev/null
+++ b/node_modules/axios/lib/platform/index.js
@@ -0,0 +1,3 @@
+import platform from './node/index.js';
+
+export {platform as default}
diff --git a/node_modules/axios/lib/platform/node/classes/FormData.js b/node_modules/axios/lib/platform/node/classes/FormData.js
new file mode 100644
index 0000000..b07f947
--- /dev/null
+++ b/node_modules/axios/lib/platform/node/classes/FormData.js
@@ -0,0 +1,3 @@
+import FormData from 'form-data';
+
+export default FormData;
diff --git a/node_modules/axios/lib/platform/node/classes/URLSearchParams.js b/node_modules/axios/lib/platform/node/classes/URLSearchParams.js
new file mode 100644
index 0000000..fba5842
--- /dev/null
+++ b/node_modules/axios/lib/platform/node/classes/URLSearchParams.js
@@ -0,0 +1,4 @@
+'use strict';
+
+import url from 'url';
+export default url.URLSearchParams;
diff --git a/node_modules/axios/lib/platform/node/index.js b/node_modules/axios/lib/platform/node/index.js
new file mode 100644
index 0000000..aef514a
--- /dev/null
+++ b/node_modules/axios/lib/platform/node/index.js
@@ -0,0 +1,12 @@
+import URLSearchParams from './classes/URLSearchParams.js'
+import FormData from './classes/FormData.js'
+
+export default {
+ isNode: true,
+ classes: {
+ URLSearchParams,
+ FormData,
+ Blob: typeof Blob !== 'undefined' && Blob || null
+ },
+ protocols: [ 'http', 'https', 'file', 'data' ]
+};
diff --git a/node_modules/axios/lib/utils.js b/node_modules/axios/lib/utils.js
new file mode 100644
index 0000000..e075f9e
--- /dev/null
+++ b/node_modules/axios/lib/utils.js
@@ -0,0 +1,613 @@
+'use strict';
+
+import bind from './helpers/bind.js';
+
+// utils is a library of generic helper functions non-specific to axios
+
+const {toString} = Object.prototype;
+const {getPrototypeOf} = Object;
+
+const kindOf = (cache => thing => {
+ const str = toString.call(thing);
+ return cache[str] || (cache[str] = str.slice(8, -1).toLowerCase());
+})(Object.create(null));
+
+const kindOfTest = (type) => {
+ type = type.toLowerCase();
+ return (thing) => kindOf(thing) === type
+}
+
+const typeOfTest = type => thing => typeof thing === type;
+
+/**
+ * Determine if a value is an Array
+ *
+ * @param {Object} val The value to test
+ *
+ * @returns {boolean} True if value is an Array, otherwise false
+ */
+const {isArray} = Array;
+
+/**
+ * Determine if a value is undefined
+ *
+ * @param {*} val The value to test
+ *
+ * @returns {boolean} True if the value is undefined, otherwise false
+ */
+const isUndefined = typeOfTest('undefined');
+
+/**
+ * Determine if a value is a Buffer
+ *
+ * @param {*} val The value to test
+ *
+ * @returns {boolean} True if value is a Buffer, otherwise false
+ */
+function isBuffer(val) {
+ return val !== null && !isUndefined(val) && val.constructor !== null && !isUndefined(val.constructor)
+ && isFunction(val.constructor.isBuffer) && val.constructor.isBuffer(val);
+}
+
+/**
+ * Determine if a value is an ArrayBuffer
+ *
+ * @param {*} val The value to test
+ *
+ * @returns {boolean} True if value is an ArrayBuffer, otherwise false
+ */
+const isArrayBuffer = kindOfTest('ArrayBuffer');
+
+
+/**
+ * Determine if a value is a view on an ArrayBuffer
+ *
+ * @param {*} val The value to test
+ *
+ * @returns {boolean} True if value is a view on an ArrayBuffer, otherwise false
+ */
+function isArrayBufferView(val) {
+ let result;
+ if ((typeof ArrayBuffer !== 'undefined') && (ArrayBuffer.isView)) {
+ result = ArrayBuffer.isView(val);
+ } else {
+ result = (val) && (val.buffer) && (isArrayBuffer(val.buffer));
+ }
+ return result;
+}
+
+/**
+ * Determine if a value is a String
+ *
+ * @param {*} val The value to test
+ *
+ * @returns {boolean} True if value is a String, otherwise false
+ */
+const isString = typeOfTest('string');
+
+/**
+ * Determine if a value is a Function
+ *
+ * @param {*} val The value to test
+ * @returns {boolean} True if value is a Function, otherwise false
+ */
+const isFunction = typeOfTest('function');
+
+/**
+ * Determine if a value is a Number
+ *
+ * @param {*} val The value to test
+ *
+ * @returns {boolean} True if value is a Number, otherwise false
+ */
+const isNumber = typeOfTest('number');
+
+/**
+ * Determine if a value is an Object
+ *
+ * @param {*} thing The value to test
+ *
+ * @returns {boolean} True if value is an Object, otherwise false
+ */
+const isObject = (thing) => thing !== null && typeof thing === 'object';
+
+/**
+ * Determine if a value is a Boolean
+ *
+ * @param {*} thing The value to test
+ * @returns {boolean} True if value is a Boolean, otherwise false
+ */
+const isBoolean = thing => thing === true || thing === false;
+
+/**
+ * Determine if a value is a plain Object
+ *
+ * @param {*} val The value to test
+ *
+ * @returns {boolean} True if value is a plain Object, otherwise false
+ */
+const isPlainObject = (val) => {
+ if (kindOf(val) !== 'object') {
+ return false;
+ }
+
+ const prototype = getPrototypeOf(val);
+ return (prototype === null || prototype === Object.prototype || Object.getPrototypeOf(prototype) === null) && !(Symbol.toStringTag in val) && !(Symbol.iterator in val);
+}
+
+/**
+ * Determine if a value is a Date
+ *
+ * @param {*} val The value to test
+ *
+ * @returns {boolean} True if value is a Date, otherwise false
+ */
+const isDate = kindOfTest('Date');
+
+/**
+ * Determine if a value is a File
+ *
+ * @param {*} val The value to test
+ *
+ * @returns {boolean} True if value is a File, otherwise false
+ */
+const isFile = kindOfTest('File');
+
+/**
+ * Determine if a value is a Blob
+ *
+ * @param {*} val The value to test
+ *
+ * @returns {boolean} True if value is a Blob, otherwise false
+ */
+const isBlob = kindOfTest('Blob');
+
+/**
+ * Determine if a value is a FileList
+ *
+ * @param {*} val The value to test
+ *
+ * @returns {boolean} True if value is a File, otherwise false
+ */
+const isFileList = kindOfTest('FileList');
+
+/**
+ * Determine if a value is a Stream
+ *
+ * @param {*} val The value to test
+ *
+ * @returns {boolean} True if value is a Stream, otherwise false
+ */
+const isStream = (val) => isObject(val) && isFunction(val.pipe);
+
+/**
+ * Determine if a value is a FormData
+ *
+ * @param {*} thing The value to test
+ *
+ * @returns {boolean} True if value is an FormData, otherwise false
+ */
+const isFormData = (thing) => {
+ const pattern = '[object FormData]';
+ return thing && (
+ (typeof FormData === 'function' && thing instanceof FormData) ||
+ toString.call(thing) === pattern ||
+ (isFunction(thing.toString) && thing.toString() === pattern)
+ );
+}
+
+/**
+ * Determine if a value is a URLSearchParams object
+ *
+ * @param {*} val The value to test
+ *
+ * @returns {boolean} True if value is a URLSearchParams object, otherwise false
+ */
+const isURLSearchParams = kindOfTest('URLSearchParams');
+
+/**
+ * Trim excess whitespace off the beginning and end of a string
+ *
+ * @param {String} str The String to trim
+ *
+ * @returns {String} The String freed of excess whitespace
+ */
+const trim = (str) => str.trim ?
+ str.trim() : str.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, '');
+
+/**
+ * Iterate over an Array or an Object invoking a function for each item.
+ *
+ * If `obj` is an Array callback will be called passing
+ * the value, index, and complete array for each item.
+ *
+ * If 'obj' is an Object callback will be called passing
+ * the value, key, and complete object for each property.
+ *
+ * @param {Object|Array} obj The object to iterate
+ * @param {Function} fn The callback to invoke for each item
+ *
+ * @param {Boolean} [allOwnKeys = false]
+ * @returns {void}
+ */
+function forEach(obj, fn, {allOwnKeys = false} = {}) {
+ // Don't bother if no value provided
+ if (obj === null || typeof obj === 'undefined') {
+ return;
+ }
+
+ let i;
+ let l;
+
+ // Force an array if not already something iterable
+ if (typeof obj !== 'object') {
+ /*eslint no-param-reassign:0*/
+ obj = [obj];
+ }
+
+ if (isArray(obj)) {
+ // Iterate over array values
+ for (i = 0, l = obj.length; i < l; i++) {
+ fn.call(null, obj[i], i, obj);
+ }
+ } else {
+ // Iterate over object keys
+ const keys = allOwnKeys ? Object.getOwnPropertyNames(obj) : Object.keys(obj);
+ const len = keys.length;
+ let key;
+
+ for (i = 0; i < len; i++) {
+ key = keys[i];
+ fn.call(null, obj[key], key, obj);
+ }
+ }
+}
+
+/**
+ * Accepts varargs expecting each argument to be an object, then
+ * immutably merges the properties of each object and returns result.
+ *
+ * When multiple objects contain the same key the later object in
+ * the arguments list will take precedence.
+ *
+ * Example:
+ *
+ * ```js
+ * var result = merge({foo: 123}, {foo: 456});
+ * console.log(result.foo); // outputs 456
+ * ```
+ *
+ * @param {Object} obj1 Object to merge
+ *
+ * @returns {Object} Result of all merge properties
+ */
+function merge(/* obj1, obj2, obj3, ... */) {
+ const result = {};
+ const assignValue = (val, key) => {
+ if (isPlainObject(result[key]) && isPlainObject(val)) {
+ result[key] = merge(result[key], val);
+ } else if (isPlainObject(val)) {
+ result[key] = merge({}, val);
+ } else if (isArray(val)) {
+ result[key] = val.slice();
+ } else {
+ result[key] = val;
+ }
+ }
+
+ for (let i = 0, l = arguments.length; i < l; i++) {
+ arguments[i] && forEach(arguments[i], assignValue);
+ }
+ return result;
+}
+
+/**
+ * Extends object a by mutably adding to it the properties of object b.
+ *
+ * @param {Object} a The object to be extended
+ * @param {Object} b The object to copy properties from
+ * @param {Object} thisArg The object to bind function to
+ *
+ * @param {Boolean} [allOwnKeys]
+ * @returns {Object} The resulting value of object a
+ */
+const extend = (a, b, thisArg, {allOwnKeys}= {}) => {
+ forEach(b, (val, key) => {
+ if (thisArg && isFunction(val)) {
+ a[key] = bind(val, thisArg);
+ } else {
+ a[key] = val;
+ }
+ }, {allOwnKeys});
+ return a;
+}
+
+/**
+ * Remove byte order marker. This catches EF BB BF (the UTF-8 BOM)
+ *
+ * @param {string} content with BOM
+ *
+ * @returns {string} content value without BOM
+ */
+const stripBOM = (content) => {
+ if (content.charCodeAt(0) === 0xFEFF) {
+ content = content.slice(1);
+ }
+ return content;
+}
+
+/**
+ * Inherit the prototype methods from one constructor into another
+ * @param {function} constructor
+ * @param {function} superConstructor
+ * @param {object} [props]
+ * @param {object} [descriptors]
+ *
+ * @returns {void}
+ */
+const inherits = (constructor, superConstructor, props, descriptors) => {
+ constructor.prototype = Object.create(superConstructor.prototype, descriptors);
+ constructor.prototype.constructor = constructor;
+ Object.defineProperty(constructor, 'super', {
+ value: superConstructor.prototype
+ });
+ props && Object.assign(constructor.prototype, props);
+}
+
+/**
+ * Resolve object with deep prototype chain to a flat object
+ * @param {Object} sourceObj source object
+ * @param {Object} [destObj]
+ * @param {Function|Boolean} [filter]
+ * @param {Function} [propFilter]
+ *
+ * @returns {Object}
+ */
+const toFlatObject = (sourceObj, destObj, filter, propFilter) => {
+ let props;
+ let i;
+ let prop;
+ const merged = {};
+
+ destObj = destObj || {};
+ // eslint-disable-next-line no-eq-null,eqeqeq
+ if (sourceObj == null) return destObj;
+
+ do {
+ props = Object.getOwnPropertyNames(sourceObj);
+ i = props.length;
+ while (i-- > 0) {
+ prop = props[i];
+ if ((!propFilter || propFilter(prop, sourceObj, destObj)) && !merged[prop]) {
+ destObj[prop] = sourceObj[prop];
+ merged[prop] = true;
+ }
+ }
+ sourceObj = filter !== false && getPrototypeOf(sourceObj);
+ } while (sourceObj && (!filter || filter(sourceObj, destObj)) && sourceObj !== Object.prototype);
+
+ return destObj;
+}
+
+/**
+ * Determines whether a string ends with the characters of a specified string
+ *
+ * @param {String} str
+ * @param {String} searchString
+ * @param {Number} [position= 0]
+ *
+ * @returns {boolean}
+ */
+const endsWith = (str, searchString, position) => {
+ str = String(str);
+ if (position === undefined || position > str.length) {
+ position = str.length;
+ }
+ position -= searchString.length;
+ const lastIndex = str.indexOf(searchString, position);
+ return lastIndex !== -1 && lastIndex === position;
+}
+
+
+/**
+ * Returns new array from array like object or null if failed
+ *
+ * @param {*} [thing]
+ *
+ * @returns {?Array}
+ */
+const toArray = (thing) => {
+ if (!thing) return null;
+ if (isArray(thing)) return thing;
+ let i = thing.length;
+ if (!isNumber(i)) return null;
+ const arr = new Array(i);
+ while (i-- > 0) {
+ arr[i] = thing[i];
+ }
+ return arr;
+}
+
+/**
+ * Checking if the Uint8Array exists and if it does, it returns a function that checks if the
+ * thing passed in is an instance of Uint8Array
+ *
+ * @param {TypedArray}
+ *
+ * @returns {Array}
+ */
+// eslint-disable-next-line func-names
+const isTypedArray = (TypedArray => {
+ // eslint-disable-next-line func-names
+ return thing => {
+ return TypedArray && thing instanceof TypedArray;
+ };
+})(typeof Uint8Array !== 'undefined' && getPrototypeOf(Uint8Array));
+
+/**
+ * For each entry in the object, call the function with the key and value.
+ *
+ * @param {Object<any, any>} obj - The object to iterate over.
+ * @param {Function} fn - The function to call for each entry.
+ *
+ * @returns {void}
+ */
+const forEachEntry = (obj, fn) => {
+ const generator = obj && obj[Symbol.iterator];
+
+ const iterator = generator.call(obj);
+
+ let result;
+
+ while ((result = iterator.next()) && !result.done) {
+ const pair = result.value;
+ fn.call(obj, pair[0], pair[1]);
+ }
+}
+
+/**
+ * It takes a regular expression and a string, and returns an array of all the matches
+ *
+ * @param {string} regExp - The regular expression to match against.
+ * @param {string} str - The string to search.
+ *
+ * @returns {Array<boolean>}
+ */
+const matchAll = (regExp, str) => {
+ let matches;
+ const arr = [];
+
+ while ((matches = regExp.exec(str)) !== null) {
+ arr.push(matches);
+ }
+
+ return arr;
+}
+
+/* Checking if the kindOfTest function returns true when passed an HTMLFormElement. */
+const isHTMLForm = kindOfTest('HTMLFormElement');
+
+const toCamelCase = str => {
+ return str.toLowerCase().replace(/[_-\s]([a-z\d])(\w*)/g,
+ function replacer(m, p1, p2) {
+ return p1.toUpperCase() + p2;
+ }
+ );
+};
+
+/* Creating a function that will check if an object has a property. */
+const hasOwnProperty = (({hasOwnProperty}) => (obj, prop) => hasOwnProperty.call(obj, prop))(Object.prototype);
+
+/**
+ * Determine if a value is a RegExp object
+ *
+ * @param {*} val The value to test
+ *
+ * @returns {boolean} True if value is a RegExp object, otherwise false
+ */
+const isRegExp = kindOfTest('RegExp');
+
+const reduceDescriptors = (obj, reducer) => {
+ const descriptors = Object.getOwnPropertyDescriptors(obj);
+ const reducedDescriptors = {};
+
+ forEach(descriptors, (descriptor, name) => {
+ if (reducer(descriptor, name, obj) !== false) {
+ reducedDescriptors[name] = descriptor;
+ }
+ });
+
+ Object.defineProperties(obj, reducedDescriptors);
+}
+
+/**
+ * Makes all methods read-only
+ * @param {Object} obj
+ */
+
+const freezeMethods = (obj) => {
+ reduceDescriptors(obj, (descriptor, name) => {
+ const value = obj[name];
+
+ if (!isFunction(value)) return;
+
+ descriptor.enumerable = false;
+
+ if ('writable' in descriptor) {
+ descriptor.writable = false;
+ return;
+ }
+
+ if (!descriptor.set) {
+ descriptor.set = () => {
+ throw Error('Can not read-only method \'' + name + '\'');
+ };
+ }
+ });
+}
+
+const toObjectSet = (arrayOrString, delimiter) => {
+ const obj = {};
+
+ const define = (arr) => {
+ arr.forEach(value => {
+ obj[value] = true;
+ });
+ }
+
+ isArray(arrayOrString) ? define(arrayOrString) : define(String(arrayOrString).split(delimiter));
+
+ return obj;
+}
+
+const noop = () => {}
+
+const toFiniteNumber = (value, defaultValue) => {
+ value = +value;
+ return Number.isFinite(value) ? value : defaultValue;
+}
+
+export default {
+ isArray,
+ isArrayBuffer,
+ isBuffer,
+ isFormData,
+ isArrayBufferView,
+ isString,
+ isNumber,
+ isBoolean,
+ isObject,
+ isPlainObject,
+ isUndefined,
+ isDate,
+ isFile,
+ isBlob,
+ isRegExp,
+ isFunction,
+ isStream,
+ isURLSearchParams,
+ isTypedArray,
+ isFileList,
+ forEach,
+ merge,
+ extend,
+ trim,
+ stripBOM,
+ inherits,
+ toFlatObject,
+ kindOf,
+ kindOfTest,
+ endsWith,
+ toArray,
+ forEachEntry,
+ matchAll,
+ isHTMLForm,
+ hasOwnProperty,
+ hasOwnProp: hasOwnProperty, // an alias to avoid ESLint no-prototype-builtins detection
+ reduceDescriptors,
+ freezeMethods,
+ toObjectSet,
+ toCamelCase,
+ noop,
+ toFiniteNumber
+};
diff --git a/node_modules/axios/package.json b/node_modules/axios/package.json
new file mode 100644
index 0000000..685f3fc
--- /dev/null
+++ b/node_modules/axios/package.json
@@ -0,0 +1,134 @@
+{
+ "name": "axios",
+ "version": "1.1.3",
+ "description": "Promise based HTTP client for the browser and node.js",
+ "main": "index.js",
+ "exports": {
+ ".": {
+ "browser": {
+ "require": "./dist/node/axios.cjs",
+ "default": "./index.js"
+ },
+ "default": {
+ "require": "./dist/node/axios.cjs",
+ "default": "./index.js"
+ }
+ }
+ },
+ "type": "module",
+ "types": "index.d.ts",
+ "scripts": {
+ "test": "npm run test:eslint && npm run test:mocha && npm run test:karma && npm run test:dtslint",
+ "test:eslint": "node bin/ssl_hotfix.js eslint lib/**/*.js",
+ "test:dtslint": "node bin/ssl_hotfix.js dtslint",
+ "test:mocha": "node bin/ssl_hotfix.js mocha test/unit/**/*.js --timeout 30000 --exit",
+ "test:karma": "node bin/ssl_hotfix.js cross-env LISTEN_ADDR=:: karma start karma.conf.cjs --single-run",
+ "test:karma:server": "node bin/ssl_hotfix.js cross-env karma start karma.conf.cjs",
+ "start": "node ./sandbox/server.js",
+ "preversion": "gulp version && npm test",
+ "version": "npm run build && git add dist && git add package.json",
+ "prepublishOnly": "npm test",
+ "postpublish": "git push && git push --tags",
+ "build": "gulp clear && cross-env NODE_ENV=production rollup -c -m",
+ "examples": "node ./examples/server.js",
+ "coveralls": "cat coverage/lcov.info | ./node_modules/coveralls/bin/coveralls.js",
+ "fix": "eslint --fix lib/**/*.js"
+ },
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/axios/axios.git"
+ },
+ "keywords": [
+ "xhr",
+ "http",
+ "ajax",
+ "promise",
+ "node"
+ ],
+ "author": "Matt Zabriskie",
+ "license": "MIT",
+ "bugs": {
+ "url": "https://github.com/axios/axios/issues"
+ },
+ "homepage": "https://axios-http.com",
+ "devDependencies": {
+ "@babel/core": "^7.18.2",
+ "@babel/preset-env": "^7.18.2",
+ "@rollup/plugin-babel": "^5.3.1",
+ "@rollup/plugin-commonjs": "^15.1.0",
+ "@rollup/plugin-json": "^4.1.0",
+ "@rollup/plugin-multi-entry": "^4.0.0",
+ "@rollup/plugin-node-resolve": "^9.0.0",
+ "abortcontroller-polyfill": "^1.7.3",
+ "body-parser": "^1.20.0",
+ "coveralls": "^3.1.1",
+ "cross-env": "^7.0.3",
+ "dev-null": "^0.1.1",
+ "dtslint": "^4.2.1",
+ "es6-promise": "^4.2.8",
+ "eslint": "^8.17.0",
+ "express": "^4.18.1",
+ "formidable": "^2.0.1",
+ "fs-extra": "^10.1.0",
+ "get-stream": "^3.0.0",
+ "gulp": "^4.0.2",
+ "istanbul-instrumenter-loader": "^3.0.1",
+ "jasmine-core": "^2.4.1",
+ "karma": "^6.3.17",
+ "karma-chrome-launcher": "^3.1.1",
+ "karma-firefox-launcher": "^2.1.2",
+ "karma-jasmine": "^1.1.1",
+ "karma-jasmine-ajax": "^0.1.13",
+ "karma-rollup-preprocessor": "^7.0.8",
+ "karma-safari-launcher": "^1.0.0",
+ "karma-sauce-launcher": "^4.3.6",
+ "karma-sinon": "^1.0.5",
+ "karma-sourcemap-loader": "^0.3.8",
+ "minimist": "^1.2.6",
+ "mocha": "^10.0.0",
+ "multer": "^1.4.4",
+ "rollup": "^2.67.0",
+ "rollup-plugin-auto-external": "^2.0.0",
+ "rollup-plugin-bundle-size": "^1.0.3",
+ "rollup-plugin-terser": "^7.0.2",
+ "sinon": "^4.5.0",
+ "stream-throttle": "^0.1.3",
+ "terser-webpack-plugin": "^4.2.3",
+ "typescript": "^4.6.3",
+ "url-search-params": "^0.10.0"
+ },
+ "browser": {
+ "./lib/adapters/http.js": "./lib/adapters/xhr.js",
+ "./lib/platform/node/index.js": "./lib/platform/browser/index.js"
+ },
+ "jsdelivr": "dist/axios.min.js",
+ "unpkg": "dist/axios.min.js",
+ "typings": "./index.d.ts",
+ "dependencies": {
+ "follow-redirects": "^1.15.0",
+ "form-data": "^4.0.0",
+ "proxy-from-env": "^1.1.0"
+ },
+ "bundlesize": [
+ {
+ "path": "./dist/axios.min.js",
+ "threshold": "5kB"
+ }
+ ],
+ "contributors": [
+ "Matt Zabriskie (https://github.com/mzabriskie)",
+ "Nick Uraltsev (https://github.com/nickuraltsev)",
+ "Jay (https://github.com/jasonsaayman)",
+ "Dmitriy Mozgovoy (https://github.com/DigitalBrainJS)",
+ "Emily Morehouse (https://github.com/emilyemorehouse)",
+ "Rubén Norte (https://github.com/rubennorte)",
+ "Justin Beckwith (https://github.com/JustinBeckwith)",
+ "Martti Laine (https://github.com/codeclown)",
+ "Xianming Zhong (https://github.com/chinesedfan)",
+ "Rikki Gibson (https://github.com/RikkiGibson)",
+ "Remco Haszing (https://github.com/remcohaszing)",
+ "Yasu Flores (https://github.com/yasuf)",
+ "Ben Carp (https://github.com/carpben)",
+ "Daniel Lopretto (https://github.com/timemachine3030)"
+ ]
+} \ No newline at end of file
diff --git a/node_modules/axios/rollup.config.js b/node_modules/axios/rollup.config.js
new file mode 100644
index 0000000..9fd12d1
--- /dev/null
+++ b/node_modules/axios/rollup.config.js
@@ -0,0 +1,90 @@
+import resolve from '@rollup/plugin-node-resolve';
+import commonjs from '@rollup/plugin-commonjs';
+import {terser} from "rollup-plugin-terser";
+import json from '@rollup/plugin-json';
+import { babel } from '@rollup/plugin-babel';
+import autoExternal from 'rollup-plugin-auto-external';
+import bundleSize from 'rollup-plugin-bundle-size'
+
+const lib = require("./package.json");
+const outputFileName = 'axios';
+const name = "axios";
+const input = './lib/axios.js';
+
+const buildConfig = ({es5, browser = true, minifiedVersion = true, ...config}) => {
+
+ const build = ({minified}) => ({
+ input,
+ ...config,
+ output: {
+ ...config.output,
+ file: `${config.output.file}.${minified ? "min.js" : "js"}`
+ },
+ plugins: [
+ json(),
+ resolve({browser}),
+ commonjs(),
+ minified && terser(),
+ minified && bundleSize(),
+ ...(es5 ? [babel({
+ babelHelpers: 'bundled',
+ presets: ['@babel/preset-env']
+ })] : []),
+ ...(config.plugins || []),
+ ]
+ });
+
+ const configs = [
+ build({minified: false}),
+ ];
+
+ if (minifiedVersion) {
+ configs.push(build({minified: true}))
+ }
+
+ return configs;
+};
+
+export default async () => {
+ const year = new Date().getFullYear();
+ const banner = `// Axios v${lib.version} Copyright (c) ${year} ${lib.author} and contributors`;
+
+ return [
+ ...buildConfig({
+ es5: true,
+ output: {
+ file: `dist/${outputFileName}`,
+ name,
+ format: "umd",
+ exports: "default",
+ banner
+ }
+ }),
+
+ ...buildConfig({
+ output: {
+ file: `dist/esm/${outputFileName}`,
+ format: "esm",
+ preferConst: true,
+ exports: "named",
+ banner
+ }
+ }),
+ // Node.js commonjs build
+ {
+ input,
+ output: {
+ file: `dist/node/${name}.cjs`,
+ format: "cjs",
+ preferConst: true,
+ exports: "default",
+ banner
+ },
+ plugins: [
+ autoExternal(),
+ resolve(),
+ commonjs()
+ ]
+ }
+ ]
+};
diff --git a/node_modules/axios/tsconfig.json b/node_modules/axios/tsconfig.json
new file mode 100644
index 0000000..6665188
--- /dev/null
+++ b/node_modules/axios/tsconfig.json
@@ -0,0 +1,14 @@
+{
+ "compilerOptions": {
+ "module": "es2015",
+ "lib": ["dom", "es2015"],
+ "types": [],
+ "moduleResolution": "node",
+ "strict": true,
+ "noEmit": true,
+ "baseUrl": ".",
+ "paths": {
+ "axios": ["."]
+ }
+ }
+}
diff --git a/node_modules/axios/tslint.json b/node_modules/axios/tslint.json
new file mode 100644
index 0000000..3ec44a7
--- /dev/null
+++ b/node_modules/axios/tslint.json
@@ -0,0 +1,6 @@
+{
+ "extends": "dtslint/dtslint.json",
+ "rules": {
+ "no-unnecessary-generics": false
+ }
+}
diff --git a/node_modules/chalk/index.d.ts b/node_modules/chalk/index.d.ts
new file mode 100644
index 0000000..9cd88f3
--- /dev/null
+++ b/node_modules/chalk/index.d.ts
@@ -0,0 +1,415 @@
+/**
+Basic foreground colors.
+
+[More colors here.](https://github.com/chalk/chalk/blob/master/readme.md#256-and-truecolor-color-support)
+*/
+declare type ForegroundColor =
+ | 'black'
+ | 'red'
+ | 'green'
+ | 'yellow'
+ | 'blue'
+ | 'magenta'
+ | 'cyan'
+ | 'white'
+ | 'gray'
+ | 'grey'
+ | 'blackBright'
+ | 'redBright'
+ | 'greenBright'
+ | 'yellowBright'
+ | 'blueBright'
+ | 'magentaBright'
+ | 'cyanBright'
+ | 'whiteBright';
+
+/**
+Basic background colors.
+
+[More colors here.](https://github.com/chalk/chalk/blob/master/readme.md#256-and-truecolor-color-support)
+*/
+declare type BackgroundColor =
+ | 'bgBlack'
+ | 'bgRed'
+ | 'bgGreen'
+ | 'bgYellow'
+ | 'bgBlue'
+ | 'bgMagenta'
+ | 'bgCyan'
+ | 'bgWhite'
+ | 'bgGray'
+ | 'bgGrey'
+ | 'bgBlackBright'
+ | 'bgRedBright'
+ | 'bgGreenBright'
+ | 'bgYellowBright'
+ | 'bgBlueBright'
+ | 'bgMagentaBright'
+ | 'bgCyanBright'
+ | 'bgWhiteBright';
+
+/**
+Basic colors.
+
+[More colors here.](https://github.com/chalk/chalk/blob/master/readme.md#256-and-truecolor-color-support)
+*/
+declare type Color = ForegroundColor | BackgroundColor;
+
+declare type Modifiers =
+ | 'reset'
+ | 'bold'
+ | 'dim'
+ | 'italic'
+ | 'underline'
+ | 'inverse'
+ | 'hidden'
+ | 'strikethrough'
+ | 'visible';
+
+declare namespace chalk {
+ /**
+ Levels:
+ - `0` - All colors disabled.
+ - `1` - Basic 16 colors support.
+ - `2` - ANSI 256 colors support.
+ - `3` - Truecolor 16 million colors support.
+ */
+ type Level = 0 | 1 | 2 | 3;
+
+ interface Options {
+ /**
+ Specify the color support for Chalk.
+
+ By default, color support is automatically detected based on the environment.
+
+ Levels:
+ - `0` - All colors disabled.
+ - `1` - Basic 16 colors support.
+ - `2` - ANSI 256 colors support.
+ - `3` - Truecolor 16 million colors support.
+ */
+ level?: Level;
+ }
+
+ /**
+ Return a new Chalk instance.
+ */
+ type Instance = new (options?: Options) => Chalk;
+
+ /**
+ Detect whether the terminal supports color.
+ */
+ interface ColorSupport {
+ /**
+ The color level used by Chalk.
+ */
+ level: Level;
+
+ /**
+ Return whether Chalk supports basic 16 colors.
+ */
+ hasBasic: boolean;
+
+ /**
+ Return whether Chalk supports ANSI 256 colors.
+ */
+ has256: boolean;
+
+ /**
+ Return whether Chalk supports Truecolor 16 million colors.
+ */
+ has16m: boolean;
+ }
+
+ interface ChalkFunction {
+ /**
+ Use a template string.
+
+ @remarks Template literals are unsupported for nested calls (see [issue #341](https://github.com/chalk/chalk/issues/341))
+
+ @example
+ ```
+ import chalk = require('chalk');
+
+ log(chalk`
+ CPU: {red ${cpu.totalPercent}%}
+ RAM: {green ${ram.used / ram.total * 100}%}
+ DISK: {rgb(255,131,0) ${disk.used / disk.total * 100}%}
+ `);
+ ```
+
+ @example
+ ```
+ import chalk = require('chalk');
+
+ log(chalk.red.bgBlack`2 + 3 = {bold ${2 + 3}}`)
+ ```
+ */
+ (text: TemplateStringsArray, ...placeholders: unknown[]): string;
+
+ (...text: unknown[]): string;
+ }
+
+ interface Chalk extends ChalkFunction {
+ /**
+ Return a new Chalk instance.
+ */
+ Instance: Instance;
+
+ /**
+ The color support for Chalk.
+
+ By default, color support is automatically detected based on the environment.
+
+ Levels:
+ - `0` - All colors disabled.
+ - `1` - Basic 16 colors support.
+ - `2` - ANSI 256 colors support.
+ - `3` - Truecolor 16 million colors support.
+ */
+ level: Level;
+
+ /**
+ Use HEX value to set text color.
+
+ @param color - Hexadecimal value representing the desired color.
+
+ @example
+ ```
+ import chalk = require('chalk');
+
+ chalk.hex('#DEADED');
+ ```
+ */
+ hex(color: string): Chalk;
+
+ /**
+ Use keyword color value to set text color.
+
+ @param color - Keyword value representing the desired color.
+
+ @example
+ ```
+ import chalk = require('chalk');
+
+ chalk.keyword('orange');
+ ```
+ */
+ keyword(color: string): Chalk;
+
+ /**
+ Use RGB values to set text color.
+ */
+ rgb(red: number, green: number, blue: number): Chalk;
+
+ /**
+ Use HSL values to set text color.
+ */
+ hsl(hue: number, saturation: number, lightness: number): Chalk;
+
+ /**
+ Use HSV values to set text color.
+ */
+ hsv(hue: number, saturation: number, value: number): Chalk;
+
+ /**
+ Use HWB values to set text color.
+ */
+ hwb(hue: number, whiteness: number, blackness: number): Chalk;
+
+ /**
+ Use a [Select/Set Graphic Rendition](https://en.wikipedia.org/wiki/ANSI_escape_code#SGR_parameters) (SGR) [color code number](https://en.wikipedia.org/wiki/ANSI_escape_code#3/4_bit) to set text color.
+
+ 30 <= code && code < 38 || 90 <= code && code < 98
+ For example, 31 for red, 91 for redBright.
+ */
+ ansi(code: number): Chalk;
+
+ /**
+ Use a [8-bit unsigned number](https://en.wikipedia.org/wiki/ANSI_escape_code#8-bit) to set text color.
+ */
+ ansi256(index: number): Chalk;
+
+ /**
+ Use HEX value to set background color.
+
+ @param color - Hexadecimal value representing the desired color.
+
+ @example
+ ```
+ import chalk = require('chalk');
+
+ chalk.bgHex('#DEADED');
+ ```
+ */
+ bgHex(color: string): Chalk;
+
+ /**
+ Use keyword color value to set background color.
+
+ @param color - Keyword value representing the desired color.
+
+ @example
+ ```
+ import chalk = require('chalk');
+
+ chalk.bgKeyword('orange');
+ ```
+ */
+ bgKeyword(color: string): Chalk;
+
+ /**
+ Use RGB values to set background color.
+ */
+ bgRgb(red: number, green: number, blue: number): Chalk;
+
+ /**
+ Use HSL values to set background color.
+ */
+ bgHsl(hue: number, saturation: number, lightness: number): Chalk;
+
+ /**
+ Use HSV values to set background color.
+ */
+ bgHsv(hue: number, saturation: number, value: number): Chalk;
+
+ /**
+ Use HWB values to set background color.
+ */
+ bgHwb(hue: number, whiteness: number, blackness: number): Chalk;
+
+ /**
+ Use a [Select/Set Graphic Rendition](https://en.wikipedia.org/wiki/ANSI_escape_code#SGR_parameters) (SGR) [color code number](https://en.wikipedia.org/wiki/ANSI_escape_code#3/4_bit) to set background color.
+
+ 30 <= code && code < 38 || 90 <= code && code < 98
+ For example, 31 for red, 91 for redBright.
+ Use the foreground code, not the background code (for example, not 41, nor 101).
+ */
+ bgAnsi(code: number): Chalk;
+
+ /**
+ Use a [8-bit unsigned number](https://en.wikipedia.org/wiki/ANSI_escape_code#8-bit) to set background color.
+ */
+ bgAnsi256(index: number): Chalk;
+
+ /**
+ Modifier: Resets the current color chain.
+ */
+ readonly reset: Chalk;
+
+ /**
+ Modifier: Make text bold.
+ */
+ readonly bold: Chalk;
+
+ /**
+ Modifier: Emitting only a small amount of light.
+ */
+ readonly dim: Chalk;
+
+ /**
+ Modifier: Make text italic. (Not widely supported)
+ */
+ readonly italic: Chalk;
+
+ /**
+ Modifier: Make text underline. (Not widely supported)
+ */
+ readonly underline: Chalk;
+
+ /**
+ Modifier: Inverse background and foreground colors.
+ */
+ readonly inverse: Chalk;
+
+ /**
+ Modifier: Prints the text, but makes it invisible.
+ */
+ readonly hidden: Chalk;
+
+ /**
+ Modifier: Puts a horizontal line through the center of the text. (Not widely supported)
+ */
+ readonly strikethrough: Chalk;
+
+ /**
+ Modifier: Prints the text only when Chalk has a color support level > 0.
+ Can be useful for things that are purely cosmetic.
+ */
+ readonly visible: Chalk;
+
+ readonly black: Chalk;
+ readonly red: Chalk;
+ readonly green: Chalk;
+ readonly yellow: Chalk;
+ readonly blue: Chalk;
+ readonly magenta: Chalk;
+ readonly cyan: Chalk;
+ readonly white: Chalk;
+
+ /*
+ Alias for `blackBright`.
+ */
+ readonly gray: Chalk;
+
+ /*
+ Alias for `blackBright`.
+ */
+ readonly grey: Chalk;
+
+ readonly blackBright: Chalk;
+ readonly redBright: Chalk;
+ readonly greenBright: Chalk;
+ readonly yellowBright: Chalk;
+ readonly blueBright: Chalk;
+ readonly magentaBright: Chalk;
+ readonly cyanBright: Chalk;
+ readonly whiteBright: Chalk;
+
+ readonly bgBlack: Chalk;
+ readonly bgRed: Chalk;
+ readonly bgGreen: Chalk;
+ readonly bgYellow: Chalk;
+ readonly bgBlue: Chalk;
+ readonly bgMagenta: Chalk;
+ readonly bgCyan: Chalk;
+ readonly bgWhite: Chalk;
+
+ /*
+ Alias for `bgBlackBright`.
+ */
+ readonly bgGray: Chalk;
+
+ /*
+ Alias for `bgBlackBright`.
+ */
+ readonly bgGrey: Chalk;
+
+ readonly bgBlackBright: Chalk;
+ readonly bgRedBright: Chalk;
+ readonly bgGreenBright: Chalk;
+ readonly bgYellowBright: Chalk;
+ readonly bgBlueBright: Chalk;
+ readonly bgMagentaBright: Chalk;
+ readonly bgCyanBright: Chalk;
+ readonly bgWhiteBright: Chalk;
+ }
+}
+
+/**
+Main Chalk object that allows to chain styles together.
+Call the last one as a method with a string argument.
+Order doesn't matter, and later styles take precedent in case of a conflict.
+This simply means that `chalk.red.yellow.green` is equivalent to `chalk.green`.
+*/
+declare const chalk: chalk.Chalk & chalk.ChalkFunction & {
+ supportsColor: chalk.ColorSupport | false;
+ Level: chalk.Level;
+ Color: Color;
+ ForegroundColor: ForegroundColor;
+ BackgroundColor: BackgroundColor;
+ Modifiers: Modifiers;
+ stderr: chalk.Chalk & {supportsColor: chalk.ColorSupport | false};
+};
+
+export = chalk;
diff --git a/node_modules/chalk/license b/node_modules/chalk/license
new file mode 100644
index 0000000..e7af2f7
--- /dev/null
+++ b/node_modules/chalk/license
@@ -0,0 +1,9 @@
+MIT License
+
+Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/node_modules/chalk/package.json b/node_modules/chalk/package.json
new file mode 100644
index 0000000..47c23f2
--- /dev/null
+++ b/node_modules/chalk/package.json
@@ -0,0 +1,68 @@
+{
+ "name": "chalk",
+ "version": "4.1.2",
+ "description": "Terminal string styling done right",
+ "license": "MIT",
+ "repository": "chalk/chalk",
+ "funding": "https://github.com/chalk/chalk?sponsor=1",
+ "main": "source",
+ "engines": {
+ "node": ">=10"
+ },
+ "scripts": {
+ "test": "xo && nyc ava && tsd",
+ "bench": "matcha benchmark.js"
+ },
+ "files": [
+ "source",
+ "index.d.ts"
+ ],
+ "keywords": [
+ "color",
+ "colour",
+ "colors",
+ "terminal",
+ "console",
+ "cli",
+ "string",
+ "str",
+ "ansi",
+ "style",
+ "styles",
+ "tty",
+ "formatting",
+ "rgb",
+ "256",
+ "shell",
+ "xterm",
+ "log",
+ "logging",
+ "command-line",
+ "text"
+ ],
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "devDependencies": {
+ "ava": "^2.4.0",
+ "coveralls": "^3.0.7",
+ "execa": "^4.0.0",
+ "import-fresh": "^3.1.0",
+ "matcha": "^0.7.0",
+ "nyc": "^15.0.0",
+ "resolve-from": "^5.0.0",
+ "tsd": "^0.7.4",
+ "xo": "^0.28.2"
+ },
+ "xo": {
+ "rules": {
+ "unicorn/prefer-string-slice": "off",
+ "unicorn/prefer-includes": "off",
+ "@typescript-eslint/member-ordering": "off",
+ "no-redeclare": "off",
+ "unicorn/string-content": "off",
+ "unicorn/better-regex": "off"
+ }
+ }
+}
diff --git a/node_modules/chalk/readme.md b/node_modules/chalk/readme.md
new file mode 100644
index 0000000..a055d21
--- /dev/null
+++ b/node_modules/chalk/readme.md
@@ -0,0 +1,341 @@
+<h1 align="center">
+ <br>
+ <br>
+ <img width="320" src="media/logo.svg" alt="Chalk">
+ <br>
+ <br>
+ <br>
+</h1>
+
+> Terminal string styling done right
+
+[![Build Status](https://travis-ci.org/chalk/chalk.svg?branch=master)](https://travis-ci.org/chalk/chalk) [![Coverage Status](https://coveralls.io/repos/github/chalk/chalk/badge.svg?branch=master)](https://coveralls.io/github/chalk/chalk?branch=master) [![npm dependents](https://badgen.net/npm/dependents/chalk)](https://www.npmjs.com/package/chalk?activeTab=dependents) [![Downloads](https://badgen.net/npm/dt/chalk)](https://www.npmjs.com/package/chalk) [![](https://img.shields.io/badge/unicorn-approved-ff69b4.svg)](https://www.youtube.com/watch?v=9auOCbH5Ns4) [![XO code style](https://img.shields.io/badge/code_style-XO-5ed9c7.svg)](https://github.com/xojs/xo) ![TypeScript-ready](https://img.shields.io/npm/types/chalk.svg) [![run on repl.it](https://repl.it/badge/github/chalk/chalk)](https://repl.it/github/chalk/chalk)
+
+<img src="https://cdn.jsdelivr.net/gh/chalk/ansi-styles@8261697c95bf34b6c7767e2cbe9941a851d59385/screenshot.svg" width="900">
+
+<br>
+
+---
+
+<div align="center">
+ <p>
+ <p>
+ <sup>
+ Sindre Sorhus' open source work is supported by the community on <a href="https://github.com/sponsors/sindresorhus">GitHub Sponsors</a> and <a href="https://stakes.social/0x44d871aebF0126Bf646753E2C976Aa7e68A66c15">Dev</a>
+ </sup>
+ </p>
+ <sup>Special thanks to:</sup>
+ <br>
+ <br>
+ <a href="https://standardresume.co/tech">
+ <img src="https://sindresorhus.com/assets/thanks/standard-resume-logo.svg" width="160"/>
+ </a>
+ <br>
+ <br>
+ <a href="https://retool.com/?utm_campaign=sindresorhus">
+ <img src="https://sindresorhus.com/assets/thanks/retool-logo.svg" width="230"/>
+ </a>
+ <br>
+ <br>
+ <a href="https://doppler.com/?utm_campaign=github_repo&utm_medium=referral&utm_content=chalk&utm_source=github">
+ <div>
+ <img src="https://dashboard.doppler.com/imgs/logo-long.svg" width="240" alt="Doppler">
+ </div>
+ <b>All your environment variables, in one place</b>
+ <div>
+ <span>Stop struggling with scattered API keys, hacking together home-brewed tools,</span>
+ <br>
+ <span>and avoiding access controls. Keep your team and servers in sync with Doppler.</span>
+ </div>
+ </a>
+ <br>
+ <a href="https://uibakery.io/?utm_source=chalk&utm_medium=sponsor&utm_campaign=github">
+ <div>
+ <img src="https://sindresorhus.com/assets/thanks/uibakery-logo.jpg" width="270" alt="UI Bakery">
+ </div>
+ </a>
+ </p>
+</div>
+
+---
+
+<br>
+
+## Highlights
+
+- Expressive API
+- Highly performant
+- Ability to nest styles
+- [256/Truecolor color support](#256-and-truecolor-color-support)
+- Auto-detects color support
+- Doesn't extend `String.prototype`
+- Clean and focused
+- Actively maintained
+- [Used by ~50,000 packages](https://www.npmjs.com/browse/depended/chalk) as of January 1, 2020
+
+## Install
+
+```console
+$ npm install chalk
+```
+
+## Usage
+
+```js
+const chalk = require('chalk');
+
+console.log(chalk.blue('Hello world!'));
+```
+
+Chalk comes with an easy to use composable API where you just chain and nest the styles you want.
+
+```js
+const chalk = require('chalk');
+const log = console.log;
+
+// Combine styled and normal strings
+log(chalk.blue('Hello') + ' World' + chalk.red('!'));
+
+// Compose multiple styles using the chainable API
+log(chalk.blue.bgRed.bold('Hello world!'));
+
+// Pass in multiple arguments
+log(chalk.blue('Hello', 'World!', 'Foo', 'bar', 'biz', 'baz'));
+
+// Nest styles
+log(chalk.red('Hello', chalk.underline.bgBlue('world') + '!'));
+
+// Nest styles of the same type even (color, underline, background)
+log(chalk.green(
+ 'I am a green line ' +
+ chalk.blue.underline.bold('with a blue substring') +
+ ' that becomes green again!'
+));
+
+// ES2015 template literal
+log(`
+CPU: ${chalk.red('90%')}
+RAM: ${chalk.green('40%')}
+DISK: ${chalk.yellow('70%')}
+`);
+
+// ES2015 tagged template literal
+log(chalk`
+CPU: {red ${cpu.totalPercent}%}
+RAM: {green ${ram.used / ram.total * 100}%}
+DISK: {rgb(255,131,0) ${disk.used / disk.total * 100}%}
+`);
+
+// Use RGB colors in terminal emulators that support it.
+log(chalk.keyword('orange')('Yay for orange colored text!'));
+log(chalk.rgb(123, 45, 67).underline('Underlined reddish color'));
+log(chalk.hex('#DEADED').bold('Bold gray!'));
+```
+
+Easily define your own themes:
+
+```js
+const chalk = require('chalk');
+
+const error = chalk.bold.red;
+const warning = chalk.keyword('orange');
+
+console.log(error('Error!'));
+console.log(warning('Warning!'));
+```
+
+Take advantage of console.log [string substitution](https://nodejs.org/docs/latest/api/console.html#console_console_log_data_args):
+
+```js
+const name = 'Sindre';
+console.log(chalk.green('Hello %s'), name);
+//=> 'Hello Sindre'
+```
+
+## API
+
+### chalk.`<style>[.<style>...](string, [string...])`
+
+Example: `chalk.red.bold.underline('Hello', 'world');`
+
+Chain [styles](#styles) and call the last one as a method with a string argument. Order doesn't matter, and later styles take precedent in case of a conflict. This simply means that `chalk.red.yellow.green` is equivalent to `chalk.green`.
+
+Multiple arguments will be separated by space.
+
+### chalk.level
+
+Specifies the level of color support.
+
+Color support is automatically detected, but you can override it by setting the `level` property. You should however only do this in your own code as it applies globally to all Chalk consumers.
+
+If you need to change this in a reusable module, create a new instance:
+
+```js
+const ctx = new chalk.Instance({level: 0});
+```
+
+| Level | Description |
+| :---: | :--- |
+| `0` | All colors disabled |
+| `1` | Basic color support (16 colors) |
+| `2` | 256 color support |
+| `3` | Truecolor support (16 million colors) |
+
+### chalk.supportsColor
+
+Detect whether the terminal [supports color](https://github.com/chalk/supports-color). Used internally and handled for you, but exposed for convenience.
+
+Can be overridden by the user with the flags `--color` and `--no-color`. For situations where using `--color` is not possible, use the environment variable `FORCE_COLOR=1` (level 1), `FORCE_COLOR=2` (level 2), or `FORCE_COLOR=3` (level 3) 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.
+
+### chalk.stderr and chalk.stderr.supportsColor
+
+`chalk.stderr` contains a separate instance configured with color support detected for `stderr` stream instead of `stdout`. Override rules from `chalk.supportsColor` apply to this too. `chalk.stderr.supportsColor` is exposed for convenience.
+
+## Styles
+
+### Modifiers
+
+- `reset` - Resets the current color chain.
+- `bold` - Make text bold.
+- `dim` - Emitting only a small amount of light.
+- `italic` - Make text italic. *(Not widely supported)*
+- `underline` - Make text underline. *(Not widely supported)*
+- `inverse`- Inverse background and foreground colors.
+- `hidden` - Prints the text, but makes it invisible.
+- `strikethrough` - Puts a horizontal line through the center of the text. *(Not widely supported)*
+- `visible`- Prints the text only when Chalk has a color level > 0. Can be useful for things that are purely cosmetic.
+
+### Colors
+
+- `black`
+- `red`
+- `green`
+- `yellow`
+- `blue`
+- `magenta`
+- `cyan`
+- `white`
+- `blackBright` (alias: `gray`, `grey`)
+- `redBright`
+- `greenBright`
+- `yellowBright`
+- `blueBright`
+- `magentaBright`
+- `cyanBright`
+- `whiteBright`
+
+### Background colors
+
+- `bgBlack`
+- `bgRed`
+- `bgGreen`
+- `bgYellow`
+- `bgBlue`
+- `bgMagenta`
+- `bgCyan`
+- `bgWhite`
+- `bgBlackBright` (alias: `bgGray`, `bgGrey`)
+- `bgRedBright`
+- `bgGreenBright`
+- `bgYellowBright`
+- `bgBlueBright`
+- `bgMagentaBright`
+- `bgCyanBright`
+- `bgWhiteBright`
+
+## Tagged template literal
+
+Chalk can be used as a [tagged template literal](https://exploringjs.com/es6/ch_template-literals.html#_tagged-template-literals).
+
+```js
+const chalk = require('chalk');
+
+const miles = 18;
+const calculateFeet = miles => miles * 5280;
+
+console.log(chalk`
+ There are {bold 5280 feet} in a mile.
+ In {bold ${miles} miles}, there are {green.bold ${calculateFeet(miles)} feet}.
+`);
+```
+
+Blocks are delimited by an opening curly brace (`{`), a style, some content, and a closing curly brace (`}`).
+
+Template styles are chained exactly like normal Chalk styles. The following three statements are equivalent:
+
+```js
+console.log(chalk.bold.rgb(10, 100, 200)('Hello!'));
+console.log(chalk.bold.rgb(10, 100, 200)`Hello!`);
+console.log(chalk`{bold.rgb(10,100,200) Hello!}`);
+```
+
+Note that function styles (`rgb()`, `hsl()`, `keyword()`, etc.) may not contain spaces between parameters.
+
+All interpolated values (`` chalk`${foo}` ``) are converted to strings via the `.toString()` method. All curly braces (`{` and `}`) in interpolated value strings are escaped.
+
+## 256 and Truecolor color support
+
+Chalk supports 256 colors and [Truecolor](https://gist.github.com/XVilka/8346728) (16 million colors) on supported terminal apps.
+
+Colors are downsampled from 16 million RGB values to an ANSI color format that is supported by the terminal emulator (or by specifying `{level: n}` as a Chalk option). For example, Chalk configured to run at level 1 (basic color support) will downsample an RGB value of #FF0000 (red) to 31 (ANSI escape for red).
+
+Examples:
+
+- `chalk.hex('#DEADED').underline('Hello, world!')`
+- `chalk.keyword('orange')('Some orange text')`
+- `chalk.rgb(15, 100, 204).inverse('Hello!')`
+
+Background versions of these models are prefixed with `bg` and the first level of the module capitalized (e.g. `keyword` for foreground colors and `bgKeyword` for background colors).
+
+- `chalk.bgHex('#DEADED').underline('Hello, world!')`
+- `chalk.bgKeyword('orange')('Some orange text')`
+- `chalk.bgRgb(15, 100, 204).inverse('Hello!')`
+
+The following color models can be used:
+
+- [`rgb`](https://en.wikipedia.org/wiki/RGB_color_model) - Example: `chalk.rgb(255, 136, 0).bold('Orange!')`
+- [`hex`](https://en.wikipedia.org/wiki/Web_colors#Hex_triplet) - Example: `chalk.hex('#FF8800').bold('Orange!')`
+- [`keyword`](https://www.w3.org/wiki/CSS/Properties/color/keywords) (CSS keywords) - Example: `chalk.keyword('orange').bold('Orange!')`
+- [`hsl`](https://en.wikipedia.org/wiki/HSL_and_HSV) - Example: `chalk.hsl(32, 100, 50).bold('Orange!')`
+- [`hsv`](https://en.wikipedia.org/wiki/HSL_and_HSV) - Example: `chalk.hsv(32, 100, 100).bold('Orange!')`
+- [`hwb`](https://en.wikipedia.org/wiki/HWB_color_model) - Example: `chalk.hwb(32, 0, 50).bold('Orange!')`
+- [`ansi`](https://en.wikipedia.org/wiki/ANSI_escape_code#3/4_bit) - Example: `chalk.ansi(31).bgAnsi(93)('red on yellowBright')`
+- [`ansi256`](https://en.wikipedia.org/wiki/ANSI_escape_code#8-bit) - Example: `chalk.bgAnsi256(194)('Honeydew, more or less')`
+
+## Windows
+
+If you're on Windows, do yourself a favor and use [Windows Terminal](https://github.com/microsoft/terminal) instead of `cmd.exe`.
+
+## Origin story
+
+[colors.js](https://github.com/Marak/colors.js) used to be the most popular string styling module, but it has serious deficiencies like extending `String.prototype` which causes all kinds of [problems](https://github.com/yeoman/yo/issues/68) and the package is unmaintained. Although there are other packages, they either do too much or not enough. Chalk is a clean and focused alternative.
+
+## chalk for enterprise
+
+Available as part of the Tidelift Subscription.
+
+The maintainers of chalk and thousands of other packages are working with Tidelift to deliver commercial support and maintenance for the open source dependencies you use to build your applications. Save time, reduce risk, and improve code health, while paying the maintainers of the exact dependencies you use. [Learn more.](https://tidelift.com/subscription/pkg/npm-chalk?utm_source=npm-chalk&utm_medium=referral&utm_campaign=enterprise&utm_term=repo)
+
+## Related
+
+- [chalk-cli](https://github.com/chalk/chalk-cli) - CLI for this module
+- [ansi-styles](https://github.com/chalk/ansi-styles) - ANSI escape codes for styling strings in the terminal
+- [supports-color](https://github.com/chalk/supports-color) - Detect whether a terminal supports color
+- [strip-ansi](https://github.com/chalk/strip-ansi) - Strip ANSI escape codes
+- [strip-ansi-stream](https://github.com/chalk/strip-ansi-stream) - Strip ANSI escape codes from a stream
+- [has-ansi](https://github.com/chalk/has-ansi) - Check if a string has ANSI escape codes
+- [ansi-regex](https://github.com/chalk/ansi-regex) - Regular expression for matching ANSI escape codes
+- [wrap-ansi](https://github.com/chalk/wrap-ansi) - Wordwrap a string with ANSI escape codes
+- [slice-ansi](https://github.com/chalk/slice-ansi) - Slice a string with ANSI escape codes
+- [color-convert](https://github.com/qix-/color-convert) - Converts colors between different models
+- [chalk-animation](https://github.com/bokub/chalk-animation) - Animate strings in the terminal
+- [gradient-string](https://github.com/bokub/gradient-string) - Apply color gradients to strings
+- [chalk-pipe](https://github.com/LitoMore/chalk-pipe) - Create chalk style schemes with simpler style strings
+- [terminal-link](https://github.com/sindresorhus/terminal-link) - Create clickable links in the terminal
+
+## Maintainers
+
+- [Sindre Sorhus](https://github.com/sindresorhus)
+- [Josh Junon](https://github.com/qix-)
diff --git a/node_modules/chalk/source/index.js b/node_modules/chalk/source/index.js
new file mode 100644
index 0000000..75ec663
--- /dev/null
+++ b/node_modules/chalk/source/index.js
@@ -0,0 +1,229 @@
+'use strict';
+const ansiStyles = require('ansi-styles');
+const {stdout: stdoutColor, stderr: stderrColor} = require('supports-color');
+const {
+ stringReplaceAll,
+ stringEncaseCRLFWithFirstIndex
+} = require('./util');
+
+const {isArray} = Array;
+
+// `supportsColor.level` → `ansiStyles.color[name]` mapping
+const levelMapping = [
+ 'ansi',
+ 'ansi',
+ 'ansi256',
+ 'ansi16m'
+];
+
+const styles = Object.create(null);
+
+const applyOptions = (object, options = {}) => {
+ if (options.level && !(Number.isInteger(options.level) && options.level >= 0 && options.level <= 3)) {
+ throw new Error('The `level` option should be an integer from 0 to 3');
+ }
+
+ // Detect level if not set manually
+ const colorLevel = stdoutColor ? stdoutColor.level : 0;
+ object.level = options.level === undefined ? colorLevel : options.level;
+};
+
+class ChalkClass {
+ constructor(options) {
+ // eslint-disable-next-line no-constructor-return
+ return chalkFactory(options);
+ }
+}
+
+const chalkFactory = options => {
+ const chalk = {};
+ applyOptions(chalk, options);
+
+ chalk.template = (...arguments_) => chalkTag(chalk.template, ...arguments_);
+
+ Object.setPrototypeOf(chalk, Chalk.prototype);
+ Object.setPrototypeOf(chalk.template, chalk);
+
+ chalk.template.constructor = () => {
+ throw new Error('`chalk.constructor()` is deprecated. Use `new chalk.Instance()` instead.');
+ };
+
+ chalk.template.Instance = ChalkClass;
+
+ return chalk.template;
+};
+
+function Chalk(options) {
+ return chalkFactory(options);
+}
+
+for (const [styleName, style] of Object.entries(ansiStyles)) {
+ styles[styleName] = {
+ get() {
+ const builder = createBuilder(this, createStyler(style.open, style.close, this._styler), this._isEmpty);
+ Object.defineProperty(this, styleName, {value: builder});
+ return builder;
+ }
+ };
+}
+
+styles.visible = {
+ get() {
+ const builder = createBuilder(this, this._styler, true);
+ Object.defineProperty(this, 'visible', {value: builder});
+ return builder;
+ }
+};
+
+const usedModels = ['rgb', 'hex', 'keyword', 'hsl', 'hsv', 'hwb', 'ansi', 'ansi256'];
+
+for (const model of usedModels) {
+ styles[model] = {
+ get() {
+ const {level} = this;
+ return function (...arguments_) {
+ const styler = createStyler(ansiStyles.color[levelMapping[level]][model](...arguments_), ansiStyles.color.close, this._styler);
+ return createBuilder(this, styler, this._isEmpty);
+ };
+ }
+ };
+}
+
+for (const model of usedModels) {
+ const bgModel = 'bg' + model[0].toUpperCase() + model.slice(1);
+ styles[bgModel] = {
+ get() {
+ const {level} = this;
+ return function (...arguments_) {
+ const styler = createStyler(ansiStyles.bgColor[levelMapping[level]][model](...arguments_), ansiStyles.bgColor.close, this._styler);
+ return createBuilder(this, styler, this._isEmpty);
+ };
+ }
+ };
+}
+
+const proto = Object.defineProperties(() => {}, {
+ ...styles,
+ level: {
+ enumerable: true,
+ get() {
+ return this._generator.level;
+ },
+ set(level) {
+ this._generator.level = level;
+ }
+ }
+});
+
+const createStyler = (open, close, parent) => {
+ let openAll;
+ let closeAll;
+ if (parent === undefined) {
+ openAll = open;
+ closeAll = close;
+ } else {
+ openAll = parent.openAll + open;
+ closeAll = close + parent.closeAll;
+ }
+
+ return {
+ open,
+ close,
+ openAll,
+ closeAll,
+ parent
+ };
+};
+
+const createBuilder = (self, _styler, _isEmpty) => {
+ const builder = (...arguments_) => {
+ if (isArray(arguments_[0]) && isArray(arguments_[0].raw)) {
+ // Called as a template literal, for example: chalk.red`2 + 3 = {bold ${2+3}}`
+ return applyStyle(builder, chalkTag(builder, ...arguments_));
+ }
+
+ // Single argument is hot path, implicit coercion is faster than anything
+ // eslint-disable-next-line no-implicit-coercion
+ return applyStyle(builder, (arguments_.length === 1) ? ('' + arguments_[0]) : arguments_.join(' '));
+ };
+
+ // We alter the prototype because we must return a function, but there is
+ // no way to create a function with a different prototype
+ Object.setPrototypeOf(builder, proto);
+
+ builder._generator = self;
+ builder._styler = _styler;
+ builder._isEmpty = _isEmpty;
+
+ return builder;
+};
+
+const applyStyle = (self, string) => {
+ if (self.level <= 0 || !string) {
+ return self._isEmpty ? '' : string;
+ }
+
+ let styler = self._styler;
+
+ if (styler === undefined) {
+ return string;
+ }
+
+ const {openAll, closeAll} = styler;
+ if (string.indexOf('\u001B') !== -1) {
+ while (styler !== undefined) {
+ // Replace any instances already present with a re-opening code
+ // otherwise only the part of the string until said closing code
+ // will be colored, and the rest will simply be 'plain'.
+ string = stringReplaceAll(string, styler.close, styler.open);
+
+ styler = styler.parent;
+ }
+ }
+
+ // We can move both next actions out of loop, because remaining actions in loop won't have
+ // any/visible effect on parts we add here. Close the styling before a linebreak and reopen
+ // after next line to fix a bleed issue on macOS: https://github.com/chalk/chalk/pull/92
+ const lfIndex = string.indexOf('\n');
+ if (lfIndex !== -1) {
+ string = stringEncaseCRLFWithFirstIndex(string, closeAll, openAll, lfIndex);
+ }
+
+ return openAll + string + closeAll;
+};
+
+let template;
+const chalkTag = (chalk, ...strings) => {
+ const [firstString] = strings;
+
+ if (!isArray(firstString) || !isArray(firstString.raw)) {
+ // If chalk() was called by itself or with a string,
+ // return the string itself as a string.
+ return strings.join(' ');
+ }
+
+ const arguments_ = strings.slice(1);
+ const parts = [firstString.raw[0]];
+
+ for (let i = 1; i < firstString.length; i++) {
+ parts.push(
+ String(arguments_[i - 1]).replace(/[{}\\]/g, '\\$&'),
+ String(firstString.raw[i])
+ );
+ }
+
+ if (template === undefined) {
+ template = require('./templates');
+ }
+
+ return template(chalk, parts.join(''));
+};
+
+Object.defineProperties(Chalk.prototype, styles);
+
+const chalk = Chalk(); // eslint-disable-line new-cap
+chalk.supportsColor = stdoutColor;
+chalk.stderr = Chalk({level: stderrColor ? stderrColor.level : 0}); // eslint-disable-line new-cap
+chalk.stderr.supportsColor = stderrColor;
+
+module.exports = chalk;
diff --git a/node_modules/chalk/source/templates.js b/node_modules/chalk/source/templates.js
new file mode 100644
index 0000000..b130949
--- /dev/null
+++ b/node_modules/chalk/source/templates.js
@@ -0,0 +1,134 @@
+'use strict';
+const TEMPLATE_REGEX = /(?:\\(u(?:[a-f\d]{4}|\{[a-f\d]{1,6}\})|x[a-f\d]{2}|.))|(?:\{(~)?(\w+(?:\([^)]*\))?(?:\.\w+(?:\([^)]*\))?)*)(?:[ \t]|(?=\r?\n)))|(\})|((?:.|[\r\n\f])+?)/gi;
+const STYLE_REGEX = /(?:^|\.)(\w+)(?:\(([^)]*)\))?/g;
+const STRING_REGEX = /^(['"])((?:\\.|(?!\1)[^\\])*)\1$/;
+const ESCAPE_REGEX = /\\(u(?:[a-f\d]{4}|{[a-f\d]{1,6}})|x[a-f\d]{2}|.)|([^\\])/gi;
+
+const ESCAPES = new Map([
+ ['n', '\n'],
+ ['r', '\r'],
+ ['t', '\t'],
+ ['b', '\b'],
+ ['f', '\f'],
+ ['v', '\v'],
+ ['0', '\0'],
+ ['\\', '\\'],
+ ['e', '\u001B'],
+ ['a', '\u0007']
+]);
+
+function unescape(c) {
+ const u = c[0] === 'u';
+ const bracket = c[1] === '{';
+
+ if ((u && !bracket && c.length === 5) || (c[0] === 'x' && c.length === 3)) {
+ return String.fromCharCode(parseInt(c.slice(1), 16));
+ }
+
+ if (u && bracket) {
+ return String.fromCodePoint(parseInt(c.slice(2, -1), 16));
+ }
+
+ return ESCAPES.get(c) || c;
+}
+
+function parseArguments(name, arguments_) {
+ const results = [];
+ const chunks = arguments_.trim().split(/\s*,\s*/g);
+ let matches;
+
+ for (const chunk of chunks) {
+ const number = Number(chunk);
+ if (!Number.isNaN(number)) {
+ results.push(number);
+ } else if ((matches = chunk.match(STRING_REGEX))) {
+ results.push(matches[2].replace(ESCAPE_REGEX, (m, escape, character) => escape ? unescape(escape) : character));
+ } else {
+ throw new Error(`Invalid Chalk template style argument: ${chunk} (in style '${name}')`);
+ }
+ }
+
+ return results;
+}
+
+function parseStyle(style) {
+ STYLE_REGEX.lastIndex = 0;
+
+ const results = [];
+ let matches;
+
+ while ((matches = STYLE_REGEX.exec(style)) !== null) {
+ const name = matches[1];
+
+ if (matches[2]) {
+ const args = parseArguments(name, matches[2]);
+ results.push([name].concat(args));
+ } else {
+ results.push([name]);
+ }
+ }
+
+ return results;
+}
+
+function buildStyle(chalk, styles) {
+ const enabled = {};
+
+ for (const layer of styles) {
+ for (const style of layer.styles) {
+ enabled[style[0]] = layer.inverse ? null : style.slice(1);
+ }
+ }
+
+ let current = chalk;
+ for (const [styleName, styles] of Object.entries(enabled)) {
+ if (!Array.isArray(styles)) {
+ continue;
+ }
+
+ if (!(styleName in current)) {
+ throw new Error(`Unknown Chalk style: ${styleName}`);
+ }
+
+ current = styles.length > 0 ? current[styleName](...styles) : current[styleName];
+ }
+
+ return current;
+}
+
+module.exports = (chalk, temporary) => {
+ const styles = [];
+ const chunks = [];
+ let chunk = [];
+
+ // eslint-disable-next-line max-params
+ temporary.replace(TEMPLATE_REGEX, (m, escapeCharacter, inverse, style, close, character) => {
+ if (escapeCharacter) {
+ chunk.push(unescape(escapeCharacter));
+ } else if (style) {
+ const string = chunk.join('');
+ chunk = [];
+ chunks.push(styles.length === 0 ? string : buildStyle(chalk, styles)(string));
+ styles.push({inverse, styles: parseStyle(style)});
+ } else if (close) {
+ if (styles.length === 0) {
+ throw new Error('Found extraneous } in Chalk template literal');
+ }
+
+ chunks.push(buildStyle(chalk, styles)(chunk.join('')));
+ chunk = [];
+ styles.pop();
+ } else {
+ chunk.push(character);
+ }
+ });
+
+ chunks.push(chunk.join(''));
+
+ if (styles.length > 0) {
+ const errMessage = `Chalk template literal is missing ${styles.length} closing bracket${styles.length === 1 ? '' : 's'} (\`}\`)`;
+ throw new Error(errMessage);
+ }
+
+ return chunks.join('');
+};
diff --git a/node_modules/chalk/source/util.js b/node_modules/chalk/source/util.js
new file mode 100644
index 0000000..ca466fd
--- /dev/null
+++ b/node_modules/chalk/source/util.js
@@ -0,0 +1,39 @@
+'use strict';
+
+const stringReplaceAll = (string, substring, replacer) => {
+ let index = string.indexOf(substring);
+ if (index === -1) {
+ return string;
+ }
+
+ const substringLength = substring.length;
+ let endIndex = 0;
+ let returnValue = '';
+ do {
+ returnValue += string.substr(endIndex, index - endIndex) + substring + replacer;
+ endIndex = index + substringLength;
+ index = string.indexOf(substring, endIndex);
+ } while (index !== -1);
+
+ returnValue += string.substr(endIndex);
+ return returnValue;
+};
+
+const stringEncaseCRLFWithFirstIndex = (string, prefix, postfix, index) => {
+ let endIndex = 0;
+ let returnValue = '';
+ do {
+ const gotCR = string[index - 1] === '\r';
+ returnValue += string.substr(endIndex, (gotCR ? index - 1 : index) - endIndex) + prefix + (gotCR ? '\r\n' : '\n') + postfix;
+ endIndex = index + 1;
+ index = string.indexOf('\n', endIndex);
+ } while (index !== -1);
+
+ returnValue += string.substr(endIndex);
+ return returnValue;
+};
+
+module.exports = {
+ stringReplaceAll,
+ stringEncaseCRLFWithFirstIndex
+};
diff --git a/node_modules/color-convert/CHANGELOG.md b/node_modules/color-convert/CHANGELOG.md
new file mode 100644
index 0000000..0a7bce4
--- /dev/null
+++ b/node_modules/color-convert/CHANGELOG.md
@@ -0,0 +1,54 @@
+# 1.0.0 - 2016-01-07
+
+- Removed: unused speed test
+- Added: Automatic routing between previously unsupported conversions
+([#27](https://github.com/Qix-/color-convert/pull/27))
+- Removed: `xxx2xxx()` and `xxx2xxxRaw()` functions
+([#27](https://github.com/Qix-/color-convert/pull/27))
+- Removed: `convert()` class
+([#27](https://github.com/Qix-/color-convert/pull/27))
+- Changed: all functions to lookup dictionary
+([#27](https://github.com/Qix-/color-convert/pull/27))
+- Changed: `ansi` to `ansi256`
+([#27](https://github.com/Qix-/color-convert/pull/27))
+- Fixed: argument grouping for functions requiring only one argument
+([#27](https://github.com/Qix-/color-convert/pull/27))
+
+# 0.6.0 - 2015-07-23
+
+- Added: methods to handle
+[ANSI](https://en.wikipedia.org/wiki/ANSI_escape_code#Colors) 16/256 colors:
+ - rgb2ansi16
+ - rgb2ansi
+ - hsl2ansi16
+ - hsl2ansi
+ - hsv2ansi16
+ - hsv2ansi
+ - hwb2ansi16
+ - hwb2ansi
+ - cmyk2ansi16
+ - cmyk2ansi
+ - keyword2ansi16
+ - keyword2ansi
+ - ansi162rgb
+ - ansi162hsl
+ - ansi162hsv
+ - ansi162hwb
+ - ansi162cmyk
+ - ansi162keyword
+ - ansi2rgb
+ - ansi2hsl
+ - ansi2hsv
+ - ansi2hwb
+ - ansi2cmyk
+ - ansi2keyword
+([#18](https://github.com/harthur/color-convert/pull/18))
+
+# 0.5.3 - 2015-06-02
+
+- Fixed: hsl2hsv does not return `NaN` anymore when using `[0,0,0]`
+([#15](https://github.com/harthur/color-convert/issues/15))
+
+---
+
+Check out commit logs for older releases
diff --git a/node_modules/color-convert/LICENSE b/node_modules/color-convert/LICENSE
new file mode 100644
index 0000000..5b4c386
--- /dev/null
+++ b/node_modules/color-convert/LICENSE
@@ -0,0 +1,21 @@
+Copyright (c) 2011-2016 Heather Arthur <fayearthur@gmail.com>
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
diff --git a/node_modules/color-convert/README.md b/node_modules/color-convert/README.md
new file mode 100644
index 0000000..d4b08fc
--- /dev/null
+++ b/node_modules/color-convert/README.md
@@ -0,0 +1,68 @@
+# color-convert
+
+[![Build Status](https://travis-ci.org/Qix-/color-convert.svg?branch=master)](https://travis-ci.org/Qix-/color-convert)
+
+Color-convert is a color conversion library for JavaScript and node.
+It converts all ways between `rgb`, `hsl`, `hsv`, `hwb`, `cmyk`, `ansi`, `ansi16`, `hex` strings, and CSS `keyword`s (will round to closest):
+
+```js
+var convert = require('color-convert');
+
+convert.rgb.hsl(140, 200, 100); // [96, 48, 59]
+convert.keyword.rgb('blue'); // [0, 0, 255]
+
+var rgbChannels = convert.rgb.channels; // 3
+var cmykChannels = convert.cmyk.channels; // 4
+var ansiChannels = convert.ansi16.channels; // 1
+```
+
+# Install
+
+```console
+$ npm install color-convert
+```
+
+# API
+
+Simply get the property of the _from_ and _to_ conversion that you're looking for.
+
+All functions have a rounded and unrounded variant. By default, return values are rounded. To get the unrounded (raw) results, simply tack on `.raw` to the function.
+
+All 'from' functions have a hidden property called `.channels` that indicates the number of channels the function expects (not including alpha).
+
+```js
+var convert = require('color-convert');
+
+// Hex to LAB
+convert.hex.lab('DEADBF'); // [ 76, 21, -2 ]
+convert.hex.lab.raw('DEADBF'); // [ 75.56213190997677, 20.653827952644754, -2.290532499330533 ]
+
+// RGB to CMYK
+convert.rgb.cmyk(167, 255, 4); // [ 35, 0, 98, 0 ]
+convert.rgb.cmyk.raw(167, 255, 4); // [ 34.509803921568626, 0, 98.43137254901961, 0 ]
+```
+
+### Arrays
+All functions that accept multiple arguments also support passing an array.
+
+Note that this does **not** apply to functions that convert from a color that only requires one value (e.g. `keyword`, `ansi256`, `hex`, etc.)
+
+```js
+var convert = require('color-convert');
+
+convert.rgb.hex(123, 45, 67); // '7B2D43'
+convert.rgb.hex([123, 45, 67]); // '7B2D43'
+```
+
+## Routing
+
+Conversions that don't have an _explicitly_ defined conversion (in [conversions.js](conversions.js)), but can be converted by means of sub-conversions (e.g. XYZ -> **RGB** -> CMYK), are automatically routed together. This allows just about any color model supported by `color-convert` to be converted to any other model, so long as a sub-conversion path exists. This is also true for conversions requiring more than one step in between (e.g. LCH -> **LAB** -> **XYZ** -> **RGB** -> Hex).
+
+Keep in mind that extensive conversions _may_ result in a loss of precision, and exist only to be complete. For a list of "direct" (single-step) conversions, see [conversions.js](conversions.js).
+
+# Contribute
+
+If there is a new model you would like to support, or want to add a direct conversion between two existing models, please send us a pull request.
+
+# License
+Copyright &copy; 2011-2016, Heather Arthur and Josh Junon. Licensed under the [MIT License](LICENSE).
diff --git a/node_modules/color-convert/conversions.js b/node_modules/color-convert/conversions.js
new file mode 100644
index 0000000..2657f26
--- /dev/null
+++ b/node_modules/color-convert/conversions.js
@@ -0,0 +1,839 @@
+/* MIT license */
+/* eslint-disable no-mixed-operators */
+const cssKeywords = require('color-name');
+
+// NOTE: conversions should only return primitive values (i.e. arrays, or
+// values that give correct `typeof` results).
+// do not use box values types (i.e. Number(), String(), etc.)
+
+const reverseKeywords = {};
+for (const key of Object.keys(cssKeywords)) {
+ reverseKeywords[cssKeywords[key]] = key;
+}
+
+const convert = {
+ rgb: {channels: 3, labels: 'rgb'},
+ hsl: {channels: 3, labels: 'hsl'},
+ hsv: {channels: 3, labels: 'hsv'},
+ hwb: {channels: 3, labels: 'hwb'},
+ cmyk: {channels: 4, labels: 'cmyk'},
+ xyz: {channels: 3, labels: 'xyz'},
+ lab: {channels: 3, labels: 'lab'},
+ lch: {channels: 3, labels: 'lch'},
+ hex: {channels: 1, labels: ['hex']},
+ keyword: {channels: 1, labels: ['keyword']},
+ ansi16: {channels: 1, labels: ['ansi16']},
+ ansi256: {channels: 1, labels: ['ansi256']},
+ hcg: {channels: 3, labels: ['h', 'c', 'g']},
+ apple: {channels: 3, labels: ['r16', 'g16', 'b16']},
+ gray: {channels: 1, labels: ['gray']}
+};
+
+module.exports = convert;
+
+// Hide .channels and .labels properties
+for (const model of Object.keys(convert)) {
+ if (!('channels' in convert[model])) {
+ throw new Error('missing channels property: ' + model);
+ }
+
+ if (!('labels' in convert[model])) {
+ throw new Error('missing channel labels property: ' + model);
+ }
+
+ if (convert[model].labels.length !== convert[model].channels) {
+ throw new Error('channel and label counts mismatch: ' + model);
+ }
+
+ const {channels, labels} = convert[model];
+ delete convert[model].channels;
+ delete convert[model].labels;
+ Object.defineProperty(convert[model], 'channels', {value: channels});
+ Object.defineProperty(convert[model], 'labels', {value: labels});
+}
+
+convert.rgb.hsl = function (rgb) {
+ const r = rgb[0] / 255;
+ const g = rgb[1] / 255;
+ const b = rgb[2] / 255;
+ const min = Math.min(r, g, b);
+ const max = Math.max(r, g, b);
+ const delta = max - min;
+ let h;
+ let s;
+
+ if (max === min) {
+ h = 0;
+ } else if (r === max) {
+ h = (g - b) / delta;
+ } else if (g === max) {
+ h = 2 + (b - r) / delta;
+ } else if (b === max) {
+ h = 4 + (r - g) / delta;
+ }
+
+ h = Math.min(h * 60, 360);
+
+ if (h < 0) {
+ h += 360;
+ }
+
+ const l = (min + max) / 2;
+
+ if (max === min) {
+ s = 0;
+ } else if (l <= 0.5) {
+ s = delta / (max + min);
+ } else {
+ s = delta / (2 - max - min);
+ }
+
+ return [h, s * 100, l * 100];
+};
+
+convert.rgb.hsv = function (rgb) {
+ let rdif;
+ let gdif;
+ let bdif;
+ let h;
+ let s;
+
+ const r = rgb[0] / 255;
+ const g = rgb[1] / 255;
+ const b = rgb[2] / 255;
+ const v = Math.max(r, g, b);
+ const diff = v - Math.min(r, g, b);
+ const diffc = function (c) {
+ return (v - c) / 6 / diff + 1 / 2;
+ };
+
+ if (diff === 0) {
+ h = 0;
+ s = 0;
+ } else {
+ s = diff / v;
+ rdif = diffc(r);
+ gdif = diffc(g);
+ bdif = diffc(b);
+
+ if (r === v) {
+ h = bdif - gdif;
+ } else if (g === v) {
+ h = (1 / 3) + rdif - bdif;
+ } else if (b === v) {
+ h = (2 / 3) + gdif - rdif;
+ }
+
+ if (h < 0) {
+ h += 1;
+ } else if (h > 1) {
+ h -= 1;
+ }
+ }
+
+ return [
+ h * 360,
+ s * 100,
+ v * 100
+ ];
+};
+
+convert.rgb.hwb = function (rgb) {
+ const r = rgb[0];
+ const g = rgb[1];
+ let b = rgb[2];
+ const h = convert.rgb.hsl(rgb)[0];
+ const w = 1 / 255 * Math.min(r, Math.min(g, b));
+
+ b = 1 - 1 / 255 * Math.max(r, Math.max(g, b));
+
+ return [h, w * 100, b * 100];
+};
+
+convert.rgb.cmyk = function (rgb) {
+ const r = rgb[0] / 255;
+ const g = rgb[1] / 255;
+ const b = rgb[2] / 255;
+
+ const k = Math.min(1 - r, 1 - g, 1 - b);
+ const c = (1 - r - k) / (1 - k) || 0;
+ const m = (1 - g - k) / (1 - k) || 0;
+ const y = (1 - b - k) / (1 - k) || 0;
+
+ return [c * 100, m * 100, y * 100, k * 100];
+};
+
+function comparativeDistance(x, y) {
+ /*
+ See https://en.m.wikipedia.org/wiki/Euclidean_distance#Squared_Euclidean_distance
+ */
+ return (
+ ((x[0] - y[0]) ** 2) +
+ ((x[1] - y[1]) ** 2) +
+ ((x[2] - y[2]) ** 2)
+ );
+}
+
+convert.rgb.keyword = function (rgb) {
+ const reversed = reverseKeywords[rgb];
+ if (reversed) {
+ return reversed;
+ }
+
+ let currentClosestDistance = Infinity;
+ let currentClosestKeyword;
+
+ for (const keyword of Object.keys(cssKeywords)) {
+ const value = cssKeywords[keyword];
+
+ // Compute comparative distance
+ const distance = comparativeDistance(rgb, value);
+
+ // Check if its less, if so set as closest
+ if (distance < currentClosestDistance) {
+ currentClosestDistance = distance;
+ currentClosestKeyword = keyword;
+ }
+ }
+
+ return currentClosestKeyword;
+};
+
+convert.keyword.rgb = function (keyword) {
+ return cssKeywords[keyword];
+};
+
+convert.rgb.xyz = function (rgb) {
+ let r = rgb[0] / 255;
+ let g = rgb[1] / 255;
+ let b = rgb[2] / 255;
+
+ // Assume sRGB
+ r = r > 0.04045 ? (((r + 0.055) / 1.055) ** 2.4) : (r / 12.92);
+ g = g > 0.04045 ? (((g + 0.055) / 1.055) ** 2.4) : (g / 12.92);
+ b = b > 0.04045 ? (((b + 0.055) / 1.055) ** 2.4) : (b / 12.92);
+
+ const x = (r * 0.4124) + (g * 0.3576) + (b * 0.1805);
+ const y = (r * 0.2126) + (g * 0.7152) + (b * 0.0722);
+ const z = (r * 0.0193) + (g * 0.1192) + (b * 0.9505);
+
+ return [x * 100, y * 100, z * 100];
+};
+
+convert.rgb.lab = function (rgb) {
+ const xyz = convert.rgb.xyz(rgb);
+ let x = xyz[0];
+ let y = xyz[1];
+ let z = xyz[2];
+
+ x /= 95.047;
+ y /= 100;
+ z /= 108.883;
+
+ x = x > 0.008856 ? (x ** (1 / 3)) : (7.787 * x) + (16 / 116);
+ y = y > 0.008856 ? (y ** (1 / 3)) : (7.787 * y) + (16 / 116);
+ z = z > 0.008856 ? (z ** (1 / 3)) : (7.787 * z) + (16 / 116);
+
+ const l = (116 * y) - 16;
+ const a = 500 * (x - y);
+ const b = 200 * (y - z);
+
+ return [l, a, b];
+};
+
+convert.hsl.rgb = function (hsl) {
+ const h = hsl[0] / 360;
+ const s = hsl[1] / 100;
+ const l = hsl[2] / 100;
+ let t2;
+ let t3;
+ let val;
+
+ if (s === 0) {
+ val = l * 255;
+ return [val, val, val];
+ }
+
+ if (l < 0.5) {
+ t2 = l * (1 + s);
+ } else {
+ t2 = l + s - l * s;
+ }
+
+ const t1 = 2 * l - t2;
+
+ const rgb = [0, 0, 0];
+ for (let i = 0; i < 3; i++) {
+ t3 = h + 1 / 3 * -(i - 1);
+ if (t3 < 0) {
+ t3++;
+ }
+
+ if (t3 > 1) {
+ t3--;
+ }
+
+ if (6 * t3 < 1) {
+ val = t1 + (t2 - t1) * 6 * t3;
+ } else if (2 * t3 < 1) {
+ val = t2;
+ } else if (3 * t3 < 2) {
+ val = t1 + (t2 - t1) * (2 / 3 - t3) * 6;
+ } else {
+ val = t1;
+ }
+
+ rgb[i] = val * 255;
+ }
+
+ return rgb;
+};
+
+convert.hsl.hsv = function (hsl) {
+ const h = hsl[0];
+ let s = hsl[1] / 100;
+ let l = hsl[2] / 100;
+ let smin = s;
+ const lmin = Math.max(l, 0.01);
+
+ l *= 2;
+ s *= (l <= 1) ? l : 2 - l;
+ smin *= lmin <= 1 ? lmin : 2 - lmin;
+ const v = (l + s) / 2;
+ const sv = l === 0 ? (2 * smin) / (lmin + smin) : (2 * s) / (l + s);
+
+ return [h, sv * 100, v * 100];
+};
+
+convert.hsv.rgb = function (hsv) {
+ const h = hsv[0] / 60;
+ const s = hsv[1] / 100;
+ let v = hsv[2] / 100;
+ const hi = Math.floor(h) % 6;
+
+ const f = h - Math.floor(h);
+ const p = 255 * v * (1 - s);
+ const q = 255 * v * (1 - (s * f));
+ const t = 255 * v * (1 - (s * (1 - f)));
+ v *= 255;
+
+ switch (hi) {
+ case 0:
+ return [v, t, p];
+ case 1:
+ return [q, v, p];
+ case 2:
+ return [p, v, t];
+ case 3:
+ return [p, q, v];
+ case 4:
+ return [t, p, v];
+ case 5:
+ return [v, p, q];
+ }
+};
+
+convert.hsv.hsl = function (hsv) {
+ const h = hsv[0];
+ const s = hsv[1] / 100;
+ const v = hsv[2] / 100;
+ const vmin = Math.max(v, 0.01);
+ let sl;
+ let l;
+
+ l = (2 - s) * v;
+ const lmin = (2 - s) * vmin;
+ sl = s * vmin;
+ sl /= (lmin <= 1) ? lmin : 2 - lmin;
+ sl = sl || 0;
+ l /= 2;
+
+ return [h, sl * 100, l * 100];
+};
+
+// http://dev.w3.org/csswg/css-color/#hwb-to-rgb
+convert.hwb.rgb = function (hwb) {
+ const h = hwb[0] / 360;
+ let wh = hwb[1] / 100;
+ let bl = hwb[2] / 100;
+ const ratio = wh + bl;
+ let f;
+
+ // Wh + bl cant be > 1
+ if (ratio > 1) {
+ wh /= ratio;
+ bl /= ratio;
+ }
+
+ const i = Math.floor(6 * h);
+ const v = 1 - bl;
+ f = 6 * h - i;
+
+ if ((i & 0x01) !== 0) {
+ f = 1 - f;
+ }
+
+ const n = wh + f * (v - wh); // Linear interpolation
+
+ let r;
+ let g;
+ let b;
+ /* eslint-disable max-statements-per-line,no-multi-spaces */
+ switch (i) {
+ default:
+ case 6:
+ case 0: r = v; g = n; b = wh; break;
+ case 1: r = n; g = v; b = wh; break;
+ case 2: r = wh; g = v; b = n; break;
+ case 3: r = wh; g = n; b = v; break;
+ case 4: r = n; g = wh; b = v; break;
+ case 5: r = v; g = wh; b = n; break;
+ }
+ /* eslint-enable max-statements-per-line,no-multi-spaces */
+
+ return [r * 255, g * 255, b * 255];
+};
+
+convert.cmyk.rgb = function (cmyk) {
+ const c = cmyk[0] / 100;
+ const m = cmyk[1] / 100;
+ const y = cmyk[2] / 100;
+ const k = cmyk[3] / 100;
+
+ const r = 1 - Math.min(1, c * (1 - k) + k);
+ const g = 1 - Math.min(1, m * (1 - k) + k);
+ const b = 1 - Math.min(1, y * (1 - k) + k);
+
+ return [r * 255, g * 255, b * 255];
+};
+
+convert.xyz.rgb = function (xyz) {
+ const x = xyz[0] / 100;
+ const y = xyz[1] / 100;
+ const z = xyz[2] / 100;
+ let r;
+ let g;
+ let b;
+
+ r = (x * 3.2406) + (y * -1.5372) + (z * -0.4986);
+ g = (x * -0.9689) + (y * 1.8758) + (z * 0.0415);
+ b = (x * 0.0557) + (y * -0.2040) + (z * 1.0570);
+
+ // Assume sRGB
+ r = r > 0.0031308
+ ? ((1.055 * (r ** (1.0 / 2.4))) - 0.055)
+ : r * 12.92;
+
+ g = g > 0.0031308
+ ? ((1.055 * (g ** (1.0 / 2.4))) - 0.055)
+ : g * 12.92;
+
+ b = b > 0.0031308
+ ? ((1.055 * (b ** (1.0 / 2.4))) - 0.055)
+ : b * 12.92;
+
+ r = Math.min(Math.max(0, r), 1);
+ g = Math.min(Math.max(0, g), 1);
+ b = Math.min(Math.max(0, b), 1);
+
+ return [r * 255, g * 255, b * 255];
+};
+
+convert.xyz.lab = function (xyz) {
+ let x = xyz[0];
+ let y = xyz[1];
+ let z = xyz[2];
+
+ x /= 95.047;
+ y /= 100;
+ z /= 108.883;
+
+ x = x > 0.008856 ? (x ** (1 / 3)) : (7.787 * x) + (16 / 116);
+ y = y > 0.008856 ? (y ** (1 / 3)) : (7.787 * y) + (16 / 116);
+ z = z > 0.008856 ? (z ** (1 / 3)) : (7.787 * z) + (16 / 116);
+
+ const l = (116 * y) - 16;
+ const a = 500 * (x - y);
+ const b = 200 * (y - z);
+
+ return [l, a, b];
+};
+
+convert.lab.xyz = function (lab) {
+ const l = lab[0];
+ const a = lab[1];
+ const b = lab[2];
+ let x;
+ let y;
+ let z;
+
+ y = (l + 16) / 116;
+ x = a / 500 + y;
+ z = y - b / 200;
+
+ const y2 = y ** 3;
+ const x2 = x ** 3;
+ const z2 = z ** 3;
+ y = y2 > 0.008856 ? y2 : (y - 16 / 116) / 7.787;
+ x = x2 > 0.008856 ? x2 : (x - 16 / 116) / 7.787;
+ z = z2 > 0.008856 ? z2 : (z - 16 / 116) / 7.787;
+
+ x *= 95.047;
+ y *= 100;
+ z *= 108.883;
+
+ return [x, y, z];
+};
+
+convert.lab.lch = function (lab) {
+ const l = lab[0];
+ const a = lab[1];
+ const b = lab[2];
+ let h;
+
+ const hr = Math.atan2(b, a);
+ h = hr * 360 / 2 / Math.PI;
+
+ if (h < 0) {
+ h += 360;
+ }
+
+ const c = Math.sqrt(a * a + b * b);
+
+ return [l, c, h];
+};
+
+convert.lch.lab = function (lch) {
+ const l = lch[0];
+ const c = lch[1];
+ const h = lch[2];
+
+ const hr = h / 360 * 2 * Math.PI;
+ const a = c * Math.cos(hr);
+ const b = c * Math.sin(hr);
+
+ return [l, a, b];
+};
+
+convert.rgb.ansi16 = function (args, saturation = null) {
+ const [r, g, b] = args;
+ let value = saturation === null ? convert.rgb.hsv(args)[2] : saturation; // Hsv -> ansi16 optimization
+
+ value = Math.round(value / 50);
+
+ if (value === 0) {
+ return 30;
+ }
+
+ let ansi = 30
+ + ((Math.round(b / 255) << 2)
+ | (Math.round(g / 255) << 1)
+ | Math.round(r / 255));
+
+ if (value === 2) {
+ ansi += 60;
+ }
+
+ return ansi;
+};
+
+convert.hsv.ansi16 = function (args) {
+ // Optimization here; we already know the value and don't need to get
+ // it converted for us.
+ return convert.rgb.ansi16(convert.hsv.rgb(args), args[2]);
+};
+
+convert.rgb.ansi256 = function (args) {
+ const r = args[0];
+ const g = args[1];
+ const b = args[2];
+
+ // We use the extended greyscale palette here, with the exception of
+ // black and white. normal palette only has 4 greyscale shades.
+ if (r === g && g === b) {
+ if (r < 8) {
+ return 16;
+ }
+
+ if (r > 248) {
+ return 231;
+ }
+
+ return Math.round(((r - 8) / 247) * 24) + 232;
+ }
+
+ const ansi = 16
+ + (36 * Math.round(r / 255 * 5))
+ + (6 * Math.round(g / 255 * 5))
+ + Math.round(b / 255 * 5);
+
+ return ansi;
+};
+
+convert.ansi16.rgb = function (args) {
+ let color = args % 10;
+
+ // Handle greyscale
+ if (color === 0 || color === 7) {
+ if (args > 50) {
+ color += 3.5;
+ }
+
+ color = color / 10.5 * 255;
+
+ return [color, color, color];
+ }
+
+ const mult = (~~(args > 50) + 1) * 0.5;
+ const r = ((color & 1) * mult) * 255;
+ const g = (((color >> 1) & 1) * mult) * 255;
+ const b = (((color >> 2) & 1) * mult) * 255;
+
+ return [r, g, b];
+};
+
+convert.ansi256.rgb = function (args) {
+ // Handle greyscale
+ if (args >= 232) {
+ const c = (args - 232) * 10 + 8;
+ return [c, c, c];
+ }
+
+ args -= 16;
+
+ let rem;
+ const r = Math.floor(args / 36) / 5 * 255;
+ const g = Math.floor((rem = args % 36) / 6) / 5 * 255;
+ const b = (rem % 6) / 5 * 255;
+
+ return [r, g, b];
+};
+
+convert.rgb.hex = function (args) {
+ const integer = ((Math.round(args[0]) & 0xFF) << 16)
+ + ((Math.round(args[1]) & 0xFF) << 8)
+ + (Math.round(args[2]) & 0xFF);
+
+ const string = integer.toString(16).toUpperCase();
+ return '000000'.substring(string.length) + string;
+};
+
+convert.hex.rgb = function (args) {
+ const match = args.toString(16).match(/[a-f0-9]{6}|[a-f0-9]{3}/i);
+ if (!match) {
+ return [0, 0, 0];
+ }
+
+ let colorString = match[0];
+
+ if (match[0].length === 3) {
+ colorString = colorString.split('').map(char => {
+ return char + char;
+ }).join('');
+ }
+
+ const integer = parseInt(colorString, 16);
+ const r = (integer >> 16) & 0xFF;
+ const g = (integer >> 8) & 0xFF;
+ const b = integer & 0xFF;
+
+ return [r, g, b];
+};
+
+convert.rgb.hcg = function (rgb) {
+ const r = rgb[0] / 255;
+ const g = rgb[1] / 255;
+ const b = rgb[2] / 255;
+ const max = Math.max(Math.max(r, g), b);
+ const min = Math.min(Math.min(r, g), b);
+ const chroma = (max - min);
+ let grayscale;
+ let hue;
+
+ if (chroma < 1) {
+ grayscale = min / (1 - chroma);
+ } else {
+ grayscale = 0;
+ }
+
+ if (chroma <= 0) {
+ hue = 0;
+ } else
+ if (max === r) {
+ hue = ((g - b) / chroma) % 6;
+ } else
+ if (max === g) {
+ hue = 2 + (b - r) / chroma;
+ } else {
+ hue = 4 + (r - g) / chroma;
+ }
+
+ hue /= 6;
+ hue %= 1;
+
+ return [hue * 360, chroma * 100, grayscale * 100];
+};
+
+convert.hsl.hcg = function (hsl) {
+ const s = hsl[1] / 100;
+ const l = hsl[2] / 100;
+
+ const c = l < 0.5 ? (2.0 * s * l) : (2.0 * s * (1.0 - l));
+
+ let f = 0;
+ if (c < 1.0) {
+ f = (l - 0.5 * c) / (1.0 - c);
+ }
+
+ return [hsl[0], c * 100, f * 100];
+};
+
+convert.hsv.hcg = function (hsv) {
+ const s = hsv[1] / 100;
+ const v = hsv[2] / 100;
+
+ const c = s * v;
+ let f = 0;
+
+ if (c < 1.0) {
+ f = (v - c) / (1 - c);
+ }
+
+ return [hsv[0], c * 100, f * 100];
+};
+
+convert.hcg.rgb = function (hcg) {
+ const h = hcg[0] / 360;
+ const c = hcg[1] / 100;
+ const g = hcg[2] / 100;
+
+ if (c === 0.0) {
+ return [g * 255, g * 255, g * 255];
+ }
+
+ const pure = [0, 0, 0];
+ const hi = (h % 1) * 6;
+ const v = hi % 1;
+ const w = 1 - v;
+ let mg = 0;
+
+ /* eslint-disable max-statements-per-line */
+ switch (Math.floor(hi)) {
+ case 0:
+ pure[0] = 1; pure[1] = v; pure[2] = 0; break;
+ case 1:
+ pure[0] = w; pure[1] = 1; pure[2] = 0; break;
+ case 2:
+ pure[0] = 0; pure[1] = 1; pure[2] = v; break;
+ case 3:
+ pure[0] = 0; pure[1] = w; pure[2] = 1; break;
+ case 4:
+ pure[0] = v; pure[1] = 0; pure[2] = 1; break;
+ default:
+ pure[0] = 1; pure[1] = 0; pure[2] = w;
+ }
+ /* eslint-enable max-statements-per-line */
+
+ mg = (1.0 - c) * g;
+
+ return [
+ (c * pure[0] + mg) * 255,
+ (c * pure[1] + mg) * 255,
+ (c * pure[2] + mg) * 255
+ ];
+};
+
+convert.hcg.hsv = function (hcg) {
+ const c = hcg[1] / 100;
+ const g = hcg[2] / 100;
+
+ const v = c + g * (1.0 - c);
+ let f = 0;
+
+ if (v > 0.0) {
+ f = c / v;
+ }
+
+ return [hcg[0], f * 100, v * 100];
+};
+
+convert.hcg.hsl = function (hcg) {
+ const c = hcg[1] / 100;
+ const g = hcg[2] / 100;
+
+ const l = g * (1.0 - c) + 0.5 * c;
+ let s = 0;
+
+ if (l > 0.0 && l < 0.5) {
+ s = c / (2 * l);
+ } else
+ if (l >= 0.5 && l < 1.0) {
+ s = c / (2 * (1 - l));
+ }
+
+ return [hcg[0], s * 100, l * 100];
+};
+
+convert.hcg.hwb = function (hcg) {
+ const c = hcg[1] / 100;
+ const g = hcg[2] / 100;
+ const v = c + g * (1.0 - c);
+ return [hcg[0], (v - c) * 100, (1 - v) * 100];
+};
+
+convert.hwb.hcg = function (hwb) {
+ const w = hwb[1] / 100;
+ const b = hwb[2] / 100;
+ const v = 1 - b;
+ const c = v - w;
+ let g = 0;
+
+ if (c < 1) {
+ g = (v - c) / (1 - c);
+ }
+
+ return [hwb[0], c * 100, g * 100];
+};
+
+convert.apple.rgb = function (apple) {
+ return [(apple[0] / 65535) * 255, (apple[1] / 65535) * 255, (apple[2] / 65535) * 255];
+};
+
+convert.rgb.apple = function (rgb) {
+ return [(rgb[0] / 255) * 65535, (rgb[1] / 255) * 65535, (rgb[2] / 255) * 65535];
+};
+
+convert.gray.rgb = function (args) {
+ return [args[0] / 100 * 255, args[0] / 100 * 255, args[0] / 100 * 255];
+};
+
+convert.gray.hsl = function (args) {
+ return [0, 0, args[0]];
+};
+
+convert.gray.hsv = convert.gray.hsl;
+
+convert.gray.hwb = function (gray) {
+ return [0, 100, gray[0]];
+};
+
+convert.gray.cmyk = function (gray) {
+ return [0, 0, 0, gray[0]];
+};
+
+convert.gray.lab = function (gray) {
+ return [gray[0], 0, 0];
+};
+
+convert.gray.hex = function (gray) {
+ const val = Math.round(gray[0] / 100 * 255) & 0xFF;
+ const integer = (val << 16) + (val << 8) + val;
+
+ const string = integer.toString(16).toUpperCase();
+ return '000000'.substring(string.length) + string;
+};
+
+convert.rgb.gray = function (rgb) {
+ const val = (rgb[0] + rgb[1] + rgb[2]) / 3;
+ return [val / 255 * 100];
+};
diff --git a/node_modules/color-convert/index.js b/node_modules/color-convert/index.js
new file mode 100644
index 0000000..b648e57
--- /dev/null
+++ b/node_modules/color-convert/index.js
@@ -0,0 +1,81 @@
+const conversions = require('./conversions');
+const route = require('./route');
+
+const convert = {};
+
+const models = Object.keys(conversions);
+
+function wrapRaw(fn) {
+ const wrappedFn = function (...args) {
+ const arg0 = args[0];
+ if (arg0 === undefined || arg0 === null) {
+ return arg0;
+ }
+
+ if (arg0.length > 1) {
+ args = arg0;
+ }
+
+ return fn(args);
+ };
+
+ // Preserve .conversion property if there is one
+ if ('conversion' in fn) {
+ wrappedFn.conversion = fn.conversion;
+ }
+
+ return wrappedFn;
+}
+
+function wrapRounded(fn) {
+ const wrappedFn = function (...args) {
+ const arg0 = args[0];
+
+ if (arg0 === undefined || arg0 === null) {
+ return arg0;
+ }
+
+ if (arg0.length > 1) {
+ args = arg0;
+ }
+
+ const result = fn(args);
+
+ // We're assuming the result is an array here.
+ // see notice in conversions.js; don't use box types
+ // in conversion functions.
+ if (typeof result === 'object') {
+ for (let len = result.length, i = 0; i < len; i++) {
+ result[i] = Math.round(result[i]);
+ }
+ }
+
+ return result;
+ };
+
+ // Preserve .conversion property if there is one
+ if ('conversion' in fn) {
+ wrappedFn.conversion = fn.conversion;
+ }
+
+ return wrappedFn;
+}
+
+models.forEach(fromModel => {
+ convert[fromModel] = {};
+
+ Object.defineProperty(convert[fromModel], 'channels', {value: conversions[fromModel].channels});
+ Object.defineProperty(convert[fromModel], 'labels', {value: conversions[fromModel].labels});
+
+ const routes = route(fromModel);
+ const routeModels = Object.keys(routes);
+
+ routeModels.forEach(toModel => {
+ const fn = routes[toModel];
+
+ convert[fromModel][toModel] = wrapRounded(fn);
+ convert[fromModel][toModel].raw = wrapRaw(fn);
+ });
+});
+
+module.exports = convert;
diff --git a/node_modules/color-convert/package.json b/node_modules/color-convert/package.json
new file mode 100644
index 0000000..6e48000
--- /dev/null
+++ b/node_modules/color-convert/package.json
@@ -0,0 +1,48 @@
+{
+ "name": "color-convert",
+ "description": "Plain color conversion functions",
+ "version": "2.0.1",
+ "author": "Heather Arthur <fayearthur@gmail.com>",
+ "license": "MIT",
+ "repository": "Qix-/color-convert",
+ "scripts": {
+ "pretest": "xo",
+ "test": "node test/basic.js"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ },
+ "keywords": [
+ "color",
+ "colour",
+ "convert",
+ "converter",
+ "conversion",
+ "rgb",
+ "hsl",
+ "hsv",
+ "hwb",
+ "cmyk",
+ "ansi",
+ "ansi16"
+ ],
+ "files": [
+ "index.js",
+ "conversions.js",
+ "route.js"
+ ],
+ "xo": {
+ "rules": {
+ "default-case": 0,
+ "no-inline-comments": 0,
+ "operator-linebreak": 0
+ }
+ },
+ "devDependencies": {
+ "chalk": "^2.4.2",
+ "xo": "^0.24.0"
+ },
+ "dependencies": {
+ "color-name": "~1.1.4"
+ }
+}
diff --git a/node_modules/color-convert/route.js b/node_modules/color-convert/route.js
new file mode 100644
index 0000000..1a08521
--- /dev/null
+++ b/node_modules/color-convert/route.js
@@ -0,0 +1,97 @@
+const conversions = require('./conversions');
+
+/*
+ This function routes a model to all other models.
+
+ all functions that are routed have a property `.conversion` attached
+ to the returned synthetic function. This property is an array
+ of strings, each with the steps in between the 'from' and 'to'
+ color models (inclusive).
+
+ conversions that are not possible simply are not included.
+*/
+
+function buildGraph() {
+ const graph = {};
+ // https://jsperf.com/object-keys-vs-for-in-with-closure/3
+ const models = Object.keys(conversions);
+
+ for (let len = models.length, i = 0; i < len; i++) {
+ graph[models[i]] = {
+ // http://jsperf.com/1-vs-infinity
+ // micro-opt, but this is simple.
+ distance: -1,
+ parent: null
+ };
+ }
+
+ return graph;
+}
+
+// https://en.wikipedia.org/wiki/Breadth-first_search
+function deriveBFS(fromModel) {
+ const graph = buildGraph();
+ const queue = [fromModel]; // Unshift -> queue -> pop
+
+ graph[fromModel].distance = 0;
+
+ while (queue.length) {
+ const current = queue.pop();
+ const adjacents = Object.keys(conversions[current]);
+
+ for (let len = adjacents.length, i = 0; i < len; i++) {
+ const adjacent = adjacents[i];
+ const node = graph[adjacent];
+
+ if (node.distance === -1) {
+ node.distance = graph[current].distance + 1;
+ node.parent = current;
+ queue.unshift(adjacent);
+ }
+ }
+ }
+
+ return graph;
+}
+
+function link(from, to) {
+ return function (args) {
+ return to(from(args));
+ };
+}
+
+function wrapConversion(toModel, graph) {
+ const path = [graph[toModel].parent, toModel];
+ let fn = conversions[graph[toModel].parent][toModel];
+
+ let cur = graph[toModel].parent;
+ while (graph[cur].parent) {
+ path.unshift(graph[cur].parent);
+ fn = link(conversions[graph[cur].parent][cur], fn);
+ cur = graph[cur].parent;
+ }
+
+ fn.conversion = path;
+ return fn;
+}
+
+module.exports = function (fromModel) {
+ const graph = deriveBFS(fromModel);
+ const conversion = {};
+
+ const models = Object.keys(graph);
+ for (let len = models.length, i = 0; i < len; i++) {
+ const toModel = models[i];
+ const node = graph[toModel];
+
+ if (node.parent === null) {
+ // No possible conversion, or this node is the source model.
+ continue;
+ }
+
+ conversion[toModel] = wrapConversion(toModel, graph);
+ }
+
+ return conversion;
+};
+
diff --git a/node_modules/color-name/LICENSE b/node_modules/color-name/LICENSE
new file mode 100644
index 0000000..c6b1001
--- /dev/null
+++ b/node_modules/color-name/LICENSE
@@ -0,0 +1,8 @@
+The MIT License (MIT)
+Copyright (c) 2015 Dmitry Ivanov
+
+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/color-name/README.md b/node_modules/color-name/README.md
new file mode 100644
index 0000000..932b979
--- /dev/null
+++ b/node_modules/color-name/README.md
@@ -0,0 +1,11 @@
+A JSON with color names and its values. Based on http://dev.w3.org/csswg/css-color/#named-colors.
+
+[![NPM](https://nodei.co/npm/color-name.png?mini=true)](https://nodei.co/npm/color-name/)
+
+
+```js
+var colors = require('color-name');
+colors.red //[255,0,0]
+```
+
+<a href="LICENSE"><img src="https://upload.wikimedia.org/wikipedia/commons/0/0c/MIT_logo.svg" width="120"/></a>
diff --git a/node_modules/color-name/index.js b/node_modules/color-name/index.js
new file mode 100644
index 0000000..b7c198a
--- /dev/null
+++ b/node_modules/color-name/index.js
@@ -0,0 +1,152 @@
+'use strict'
+
+module.exports = {
+ "aliceblue": [240, 248, 255],
+ "antiquewhite": [250, 235, 215],
+ "aqua": [0, 255, 255],
+ "aquamarine": [127, 255, 212],
+ "azure": [240, 255, 255],
+ "beige": [245, 245, 220],
+ "bisque": [255, 228, 196],
+ "black": [0, 0, 0],
+ "blanchedalmond": [255, 235, 205],
+ "blue": [0, 0, 255],
+ "blueviolet": [138, 43, 226],
+ "brown": [165, 42, 42],
+ "burlywood": [222, 184, 135],
+ "cadetblue": [95, 158, 160],
+ "chartreuse": [127, 255, 0],
+ "chocolate": [210, 105, 30],
+ "coral": [255, 127, 80],
+ "cornflowerblue": [100, 149, 237],
+ "cornsilk": [255, 248, 220],
+ "crimson": [220, 20, 60],
+ "cyan": [0, 255, 255],
+ "darkblue": [0, 0, 139],
+ "darkcyan": [0, 139, 139],
+ "darkgoldenrod": [184, 134, 11],
+ "darkgray": [169, 169, 169],
+ "darkgreen": [0, 100, 0],
+ "darkgrey": [169, 169, 169],
+ "darkkhaki": [189, 183, 107],
+ "darkmagenta": [139, 0, 139],
+ "darkolivegreen": [85, 107, 47],
+ "darkorange": [255, 140, 0],
+ "darkorchid": [153, 50, 204],
+ "darkred": [139, 0, 0],
+ "darksalmon": [233, 150, 122],
+ "darkseagreen": [143, 188, 143],
+ "darkslateblue": [72, 61, 139],
+ "darkslategray": [47, 79, 79],
+ "darkslategrey": [47, 79, 79],
+ "darkturquoise": [0, 206, 209],
+ "darkviolet": [148, 0, 211],
+ "deeppink": [255, 20, 147],
+ "deepskyblue": [0, 191, 255],
+ "dimgray": [105, 105, 105],
+ "dimgrey": [105, 105, 105],
+ "dodgerblue": [30, 144, 255],
+ "firebrick": [178, 34, 34],
+ "floralwhite": [255, 250, 240],
+ "forestgreen": [34, 139, 34],
+ "fuchsia": [255, 0, 255],
+ "gainsboro": [220, 220, 220],
+ "ghostwhite": [248, 248, 255],
+ "gold": [255, 215, 0],
+ "goldenrod": [218, 165, 32],
+ "gray": [128, 128, 128],
+ "green": [0, 128, 0],
+ "greenyellow": [173, 255, 47],
+ "grey": [128, 128, 128],
+ "honeydew": [240, 255, 240],
+ "hotpink": [255, 105, 180],
+ "indianred": [205, 92, 92],
+ "indigo": [75, 0, 130],
+ "ivory": [255, 255, 240],
+ "khaki": [240, 230, 140],
+ "lavender": [230, 230, 250],
+ "lavenderblush": [255, 240, 245],
+ "lawngreen": [124, 252, 0],
+ "lemonchiffon": [255, 250, 205],
+ "lightblue": [173, 216, 230],
+ "lightcoral": [240, 128, 128],
+ "lightcyan": [224, 255, 255],
+ "lightgoldenrodyellow": [250, 250, 210],
+ "lightgray": [211, 211, 211],
+ "lightgreen": [144, 238, 144],
+ "lightgrey": [211, 211, 211],
+ "lightpink": [255, 182, 193],
+ "lightsalmon": [255, 160, 122],
+ "lightseagreen": [32, 178, 170],
+ "lightskyblue": [135, 206, 250],
+ "lightslategray": [119, 136, 153],
+ "lightslategrey": [119, 136, 153],
+ "lightsteelblue": [176, 196, 222],
+ "lightyellow": [255, 255, 224],
+ "lime": [0, 255, 0],
+ "limegreen": [50, 205, 50],
+ "linen": [250, 240, 230],
+ "magenta": [255, 0, 255],
+ "maroon": [128, 0, 0],
+ "mediumaquamarine": [102, 205, 170],
+ "mediumblue": [0, 0, 205],
+ "mediumorchid": [186, 85, 211],
+ "mediumpurple": [147, 112, 219],
+ "mediumseagreen": [60, 179, 113],
+ "mediumslateblue": [123, 104, 238],
+ "mediumspringgreen": [0, 250, 154],
+ "mediumturquoise": [72, 209, 204],
+ "mediumvioletred": [199, 21, 133],
+ "midnightblue": [25, 25, 112],
+ "mintcream": [245, 255, 250],
+ "mistyrose": [255, 228, 225],
+ "moccasin": [255, 228, 181],
+ "navajowhite": [255, 222, 173],
+ "navy": [0, 0, 128],
+ "oldlace": [253, 245, 230],
+ "olive": [128, 128, 0],
+ "olivedrab": [107, 142, 35],
+ "orange": [255, 165, 0],
+ "orangered": [255, 69, 0],
+ "orchid": [218, 112, 214],
+ "palegoldenrod": [238, 232, 170],
+ "palegreen": [152, 251, 152],
+ "paleturquoise": [175, 238, 238],
+ "palevioletred": [219, 112, 147],
+ "papayawhip": [255, 239, 213],
+ "peachpuff": [255, 218, 185],
+ "peru": [205, 133, 63],
+ "pink": [255, 192, 203],
+ "plum": [221, 160, 221],
+ "powderblue": [176, 224, 230],
+ "purple": [128, 0, 128],
+ "rebeccapurple": [102, 51, 153],
+ "red": [255, 0, 0],
+ "rosybrown": [188, 143, 143],
+ "royalblue": [65, 105, 225],
+ "saddlebrown": [139, 69, 19],
+ "salmon": [250, 128, 114],
+ "sandybrown": [244, 164, 96],
+ "seagreen": [46, 139, 87],
+ "seashell": [255, 245, 238],
+ "sienna": [160, 82, 45],
+ "silver": [192, 192, 192],
+ "skyblue": [135, 206, 235],
+ "slateblue": [106, 90, 205],
+ "slategray": [112, 128, 144],
+ "slategrey": [112, 128, 144],
+ "snow": [255, 250, 250],
+ "springgreen": [0, 255, 127],
+ "steelblue": [70, 130, 180],
+ "tan": [210, 180, 140],
+ "teal": [0, 128, 128],
+ "thistle": [216, 191, 216],
+ "tomato": [255, 99, 71],
+ "turquoise": [64, 224, 208],
+ "violet": [238, 130, 238],
+ "wheat": [245, 222, 179],
+ "white": [255, 255, 255],
+ "whitesmoke": [245, 245, 245],
+ "yellow": [255, 255, 0],
+ "yellowgreen": [154, 205, 50]
+};
diff --git a/node_modules/color-name/package.json b/node_modules/color-name/package.json
new file mode 100644
index 0000000..782dd82
--- /dev/null
+++ b/node_modules/color-name/package.json
@@ -0,0 +1,28 @@
+{
+ "name": "color-name",
+ "version": "1.1.4",
+ "description": "A list of color names and its values",
+ "main": "index.js",
+ "files": [
+ "index.js"
+ ],
+ "scripts": {
+ "test": "node test.js"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git@github.com:colorjs/color-name.git"
+ },
+ "keywords": [
+ "color-name",
+ "color",
+ "color-keyword",
+ "keyword"
+ ],
+ "author": "DY <dfcreative@gmail.com>",
+ "license": "MIT",
+ "bugs": {
+ "url": "https://github.com/colorjs/color-name/issues"
+ },
+ "homepage": "https://github.com/colorjs/color-name"
+}
diff --git a/node_modules/combined-stream/License b/node_modules/combined-stream/License
new file mode 100644
index 0000000..4804b7a
--- /dev/null
+++ b/node_modules/combined-stream/License
@@ -0,0 +1,19 @@
+Copyright (c) 2011 Debuggable Limited <felix@debuggable.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/combined-stream/Readme.md b/node_modules/combined-stream/Readme.md
new file mode 100644
index 0000000..9e367b5
--- /dev/null
+++ b/node_modules/combined-stream/Readme.md
@@ -0,0 +1,138 @@
+# combined-stream
+
+A stream that emits multiple other streams one after another.
+
+**NB** Currently `combined-stream` works with streams version 1 only. There is ongoing effort to switch this library to streams version 2. Any help is welcome. :) Meanwhile you can explore other libraries that provide streams2 support with more or less compatibility with `combined-stream`.
+
+- [combined-stream2](https://www.npmjs.com/package/combined-stream2): A drop-in streams2-compatible replacement for the combined-stream module.
+
+- [multistream](https://www.npmjs.com/package/multistream): A stream that emits multiple other streams one after another.
+
+## Installation
+
+``` bash
+npm install combined-stream
+```
+
+## Usage
+
+Here is a simple example that shows how you can use combined-stream to combine
+two files into one:
+
+``` javascript
+var CombinedStream = require('combined-stream');
+var fs = require('fs');
+
+var combinedStream = CombinedStream.create();
+combinedStream.append(fs.createReadStream('file1.txt'));
+combinedStream.append(fs.createReadStream('file2.txt'));
+
+combinedStream.pipe(fs.createWriteStream('combined.txt'));
+```
+
+While the example above works great, it will pause all source streams until
+they are needed. If you don't want that to happen, you can set `pauseStreams`
+to `false`:
+
+``` javascript
+var CombinedStream = require('combined-stream');
+var fs = require('fs');
+
+var combinedStream = CombinedStream.create({pauseStreams: false});
+combinedStream.append(fs.createReadStream('file1.txt'));
+combinedStream.append(fs.createReadStream('file2.txt'));
+
+combinedStream.pipe(fs.createWriteStream('combined.txt'));
+```
+
+However, what if you don't have all the source streams yet, or you don't want
+to allocate the resources (file descriptors, memory, etc.) for them right away?
+Well, in that case you can simply provide a callback that supplies the stream
+by calling a `next()` function:
+
+``` javascript
+var CombinedStream = require('combined-stream');
+var fs = require('fs');
+
+var combinedStream = CombinedStream.create();
+combinedStream.append(function(next) {
+ next(fs.createReadStream('file1.txt'));
+});
+combinedStream.append(function(next) {
+ next(fs.createReadStream('file2.txt'));
+});
+
+combinedStream.pipe(fs.createWriteStream('combined.txt'));
+```
+
+## API
+
+### CombinedStream.create([options])
+
+Returns a new combined stream object. Available options are:
+
+* `maxDataSize`
+* `pauseStreams`
+
+The effect of those options is described below.
+
+### combinedStream.pauseStreams = `true`
+
+Whether to apply back pressure to the underlaying streams. If set to `false`,
+the underlaying streams will never be paused. If set to `true`, the
+underlaying streams will be paused right after being appended, as well as when
+`delayedStream.pipe()` wants to throttle.
+
+### combinedStream.maxDataSize = `2 * 1024 * 1024`
+
+The maximum amount of bytes (or characters) to buffer for all source streams.
+If this value is exceeded, `combinedStream` emits an `'error'` event.
+
+### combinedStream.dataSize = `0`
+
+The amount of bytes (or characters) currently buffered by `combinedStream`.
+
+### combinedStream.append(stream)
+
+Appends the given `stream` to the combinedStream object. If `pauseStreams` is
+set to `true, this stream will also be paused right away.
+
+`streams` can also be a function that takes one parameter called `next`. `next`
+is a function that must be invoked in order to provide the `next` stream, see
+example above.
+
+Regardless of how the `stream` is appended, combined-stream always attaches an
+`'error'` listener to it, so you don't have to do that manually.
+
+Special case: `stream` can also be a String or Buffer.
+
+### combinedStream.write(data)
+
+You should not call this, `combinedStream` takes care of piping the appended
+streams into itself for you.
+
+### combinedStream.resume()
+
+Causes `combinedStream` to start drain the streams it manages. The function is
+idempotent, and also emits a `'resume'` event each time which usually goes to
+the stream that is currently being drained.
+
+### combinedStream.pause();
+
+If `combinedStream.pauseStreams` is set to `false`, this does nothing.
+Otherwise a `'pause'` event is emitted, this goes to the stream that is
+currently being drained, so you can use it to apply back pressure.
+
+### combinedStream.end();
+
+Sets `combinedStream.writable` to false, emits an `'end'` event, and removes
+all streams from the queue.
+
+### combinedStream.destroy();
+
+Same as `combinedStream.end()`, except it emits a `'close'` event instead of
+`'end'`.
+
+## License
+
+combined-stream is licensed under the MIT license.
diff --git a/node_modules/combined-stream/lib/combined_stream.js b/node_modules/combined-stream/lib/combined_stream.js
new file mode 100644
index 0000000..125f097
--- /dev/null
+++ b/node_modules/combined-stream/lib/combined_stream.js
@@ -0,0 +1,208 @@
+var util = require('util');
+var Stream = require('stream').Stream;
+var DelayedStream = require('delayed-stream');
+
+module.exports = CombinedStream;
+function CombinedStream() {
+ this.writable = false;
+ this.readable = true;
+ this.dataSize = 0;
+ this.maxDataSize = 2 * 1024 * 1024;
+ this.pauseStreams = true;
+
+ this._released = false;
+ this._streams = [];
+ this._currentStream = null;
+ this._insideLoop = false;
+ this._pendingNext = false;
+}
+util.inherits(CombinedStream, Stream);
+
+CombinedStream.create = function(options) {
+ var combinedStream = new this();
+
+ options = options || {};
+ for (var option in options) {
+ combinedStream[option] = options[option];
+ }
+
+ return combinedStream;
+};
+
+CombinedStream.isStreamLike = function(stream) {
+ return (typeof stream !== 'function')
+ && (typeof stream !== 'string')
+ && (typeof stream !== 'boolean')
+ && (typeof stream !== 'number')
+ && (!Buffer.isBuffer(stream));
+};
+
+CombinedStream.prototype.append = function(stream) {
+ var isStreamLike = CombinedStream.isStreamLike(stream);
+
+ if (isStreamLike) {
+ if (!(stream instanceof DelayedStream)) {
+ var newStream = DelayedStream.create(stream, {
+ maxDataSize: Infinity,
+ pauseStream: this.pauseStreams,
+ });
+ stream.on('data', this._checkDataSize.bind(this));
+ stream = newStream;
+ }
+
+ this._handleErrors(stream);
+
+ if (this.pauseStreams) {
+ stream.pause();
+ }
+ }
+
+ this._streams.push(stream);
+ return this;
+};
+
+CombinedStream.prototype.pipe = function(dest, options) {
+ Stream.prototype.pipe.call(this, dest, options);
+ this.resume();
+ return dest;
+};
+
+CombinedStream.prototype._getNext = function() {
+ this._currentStream = null;
+
+ if (this._insideLoop) {
+ this._pendingNext = true;
+ return; // defer call
+ }
+
+ this._insideLoop = true;
+ try {
+ do {
+ this._pendingNext = false;
+ this._realGetNext();
+ } while (this._pendingNext);
+ } finally {
+ this._insideLoop = false;
+ }
+};
+
+CombinedStream.prototype._realGetNext = function() {
+ var stream = this._streams.shift();
+
+
+ if (typeof stream == 'undefined') {
+ this.end();
+ return;
+ }
+
+ if (typeof stream !== 'function') {
+ this._pipeNext(stream);
+ return;
+ }
+
+ var getStream = stream;
+ getStream(function(stream) {
+ var isStreamLike = CombinedStream.isStreamLike(stream);
+ if (isStreamLike) {
+ stream.on('data', this._checkDataSize.bind(this));
+ this._handleErrors(stream);
+ }
+
+ this._pipeNext(stream);
+ }.bind(this));
+};
+
+CombinedStream.prototype._pipeNext = function(stream) {
+ this._currentStream = stream;
+
+ var isStreamLike = CombinedStream.isStreamLike(stream);
+ if (isStreamLike) {
+ stream.on('end', this._getNext.bind(this));
+ stream.pipe(this, {end: false});
+ return;
+ }
+
+ var value = stream;
+ this.write(value);
+ this._getNext();
+};
+
+CombinedStream.prototype._handleErrors = function(stream) {
+ var self = this;
+ stream.on('error', function(err) {
+ self._emitError(err);
+ });
+};
+
+CombinedStream.prototype.write = function(data) {
+ this.emit('data', data);
+};
+
+CombinedStream.prototype.pause = function() {
+ if (!this.pauseStreams) {
+ return;
+ }
+
+ if(this.pauseStreams && this._currentStream && typeof(this._currentStream.pause) == 'function') this._currentStream.pause();
+ this.emit('pause');
+};
+
+CombinedStream.prototype.resume = function() {
+ if (!this._released) {
+ this._released = true;
+ this.writable = true;
+ this._getNext();
+ }
+
+ if(this.pauseStreams && this._currentStream && typeof(this._currentStream.resume) == 'function') this._currentStream.resume();
+ this.emit('resume');
+};
+
+CombinedStream.prototype.end = function() {
+ this._reset();
+ this.emit('end');
+};
+
+CombinedStream.prototype.destroy = function() {
+ this._reset();
+ this.emit('close');
+};
+
+CombinedStream.prototype._reset = function() {
+ this.writable = false;
+ this._streams = [];
+ this._currentStream = null;
+};
+
+CombinedStream.prototype._checkDataSize = function() {
+ this._updateDataSize();
+ if (this.dataSize <= this.maxDataSize) {
+ return;
+ }
+
+ var message =
+ 'DelayedStream#maxDataSize of ' + this.maxDataSize + ' bytes exceeded.';
+ this._emitError(new Error(message));
+};
+
+CombinedStream.prototype._updateDataSize = function() {
+ this.dataSize = 0;
+
+ var self = this;
+ this._streams.forEach(function(stream) {
+ if (!stream.dataSize) {
+ return;
+ }
+
+ self.dataSize += stream.dataSize;
+ });
+
+ if (this._currentStream && this._currentStream.dataSize) {
+ this.dataSize += this._currentStream.dataSize;
+ }
+};
+
+CombinedStream.prototype._emitError = function(err) {
+ this._reset();
+ this.emit('error', err);
+};
diff --git a/node_modules/combined-stream/package.json b/node_modules/combined-stream/package.json
new file mode 100644
index 0000000..6982b6d
--- /dev/null
+++ b/node_modules/combined-stream/package.json
@@ -0,0 +1,25 @@
+{
+ "author": "Felix Geisendörfer <felix@debuggable.com> (http://debuggable.com/)",
+ "name": "combined-stream",
+ "description": "A stream that emits multiple other streams one after another.",
+ "version": "1.0.8",
+ "homepage": "https://github.com/felixge/node-combined-stream",
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/felixge/node-combined-stream.git"
+ },
+ "main": "./lib/combined_stream",
+ "scripts": {
+ "test": "node test/run.js"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ },
+ "dependencies": {
+ "delayed-stream": "~1.0.0"
+ },
+ "devDependencies": {
+ "far": "~0.0.7"
+ },
+ "license": "MIT"
+}
diff --git a/node_modules/combined-stream/yarn.lock b/node_modules/combined-stream/yarn.lock
new file mode 100644
index 0000000..7edf418
--- /dev/null
+++ b/node_modules/combined-stream/yarn.lock
@@ -0,0 +1,17 @@
+# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
+# yarn lockfile v1
+
+
+delayed-stream@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
+
+far@~0.0.7:
+ version "0.0.7"
+ resolved "https://registry.yarnpkg.com/far/-/far-0.0.7.tgz#01c1fd362bcd26ce9cf161af3938aa34619f79a7"
+ dependencies:
+ oop "0.0.3"
+
+oop@0.0.3:
+ version "0.0.3"
+ resolved "https://registry.yarnpkg.com/oop/-/oop-0.0.3.tgz#70fa405a5650891a194fdc82ca68dad6dabf4401"
diff --git a/node_modules/command-line-args/LICENSE b/node_modules/command-line-args/LICENSE
new file mode 100644
index 0000000..07fadb4
--- /dev/null
+++ b/node_modules/command-line-args/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2014-22 Lloyd Brookes <75pound@gmail.com>
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/node_modules/command-line-args/README.md b/node_modules/command-line-args/README.md
new file mode 100644
index 0000000..d7003b8
--- /dev/null
+++ b/node_modules/command-line-args/README.md
@@ -0,0 +1,105 @@
+[![view on npm](https://badgen.net/npm/v/command-line-args)](https://www.npmjs.org/package/command-line-args)
+[![npm module downloads](https://badgen.net/npm/dt/command-line-args)](https://www.npmjs.org/package/command-line-args)
+[![Gihub repo dependents](https://badgen.net/github/dependents-repo/75lb/command-line-args)](https://github.com/75lb/command-line-args/network/dependents?dependent_type=REPOSITORY)
+[![Gihub package dependents](https://badgen.net/github/dependents-pkg/75lb/command-line-args)](https://github.com/75lb/command-line-args/network/dependents?dependent_type=PACKAGE)
+[![Node.js CI](https://github.com/75lb/command-line-args/actions/workflows/node.js.yml/badge.svg)](https://github.com/75lb/command-line-args/actions/workflows/node.js.yml)
+[![Coverage Status](https://coveralls.io/repos/github/75lb/command-line-args/badge.svg)](https://coveralls.io/github/75lb/command-line-args)
+[![js-standard-style](https://img.shields.io/badge/code%20style-standard-brightgreen.svg)](https://github.com/feross/standard)
+
+***Upgraders, please read the [release notes](https://github.com/75lb/command-line-args/releases)***
+
+# command-line-args
+
+A mature, feature-complete library to parse command-line options.
+
+## Synopsis
+
+You can set options using the main notation standards ([learn more](https://github.com/75lb/command-line-args/wiki/Notation-rules)). These commands are all equivalent, setting the same values:
+```
+$ example --verbose --timeout=1000 --src one.js --src two.js
+$ example --verbose --timeout 1000 --src one.js two.js
+$ example -vt 1000 --src one.js two.js
+$ example -vt 1000 one.js two.js
+```
+
+To access the values, first create a list of [option definitions](https://github.com/75lb/command-line-args/blob/master/doc/option-definition.md) describing the options your application accepts. The [`type`](https://github.com/75lb/command-line-args/blob/master/doc/option-definition.md#optiontype--function) property is a setter function (the value supplied is passed through this), giving you full control over the value received.
+
+```js
+const optionDefinitions = [
+ { name: 'verbose', alias: 'v', type: Boolean },
+ { name: 'src', type: String, multiple: true, defaultOption: true },
+ { name: 'timeout', alias: 't', type: Number }
+]
+```
+
+Next, parse the options using [commandLineArgs()](https://github.com/75lb/command-line-args/blob/master/doc/API.md#commandlineargsoptiondefinitions-options--object-):
+```js
+const commandLineArgs = require('command-line-args')
+const options = commandLineArgs(optionDefinitions)
+```
+
+`options` now looks like this:
+```js
+{
+ src: [
+ 'one.js',
+ 'two.js'
+ ],
+ verbose: true,
+ timeout: 1000
+}
+```
+
+### Advanced usage
+
+Beside the above typical usage, you can configure command-line-args to accept more advanced syntax forms.
+
+* [Command-based syntax](https://github.com/75lb/command-line-args/wiki/Implement-command-parsing-(git-style)) (git style) in the form:
+
+ ```
+ $ executable <command> [options]
+ ```
+
+ For example.
+
+ ```
+ $ git commit --squash -m "This is my commit message"
+ ```
+
+* [Command and sub-command syntax](https://github.com/75lb/command-line-args/wiki/Implement-multiple-command-parsing-(docker-style)) (docker style) in the form:
+
+ ```
+ $ executable <command> [options] <sub-command> [options]
+ ```
+
+ For example.
+
+ ```
+ $ docker run --detached --image centos bash -c yum install -y httpd
+ ```
+
+## Usage guide generation
+
+A usage guide (typically printed when `--help` is set) can be generated using [command-line-usage](https://github.com/75lb/command-line-usage). See the examples below and [read the documentation](https://github.com/75lb/command-line-usage) for instructions how to create them.
+
+A typical usage guide example.
+
+![usage](https://raw.githubusercontent.com/75lb/command-line-usage/master/example/screens/footer.png)
+
+The [polymer-cli](https://github.com/Polymer/polymer-cli/) usage guide is a good real-life example.
+
+![usage](https://raw.githubusercontent.com/75lb/command-line-usage/master/example/screens/polymer.png)
+
+## Further Reading
+
+There is plenty more to learn, please see [the wiki](https://github.com/75lb/command-line-args/wiki) for examples and documentation.
+
+## Install
+
+```sh
+$ npm install command-line-args --save
+```
+
+* * *
+
+&copy; 2014-22 Lloyd Brookes \<75pound@gmail.com\>. Documented by [jsdoc-to-markdown](https://github.com/75lb/jsdoc-to-markdown).
diff --git a/node_modules/command-line-args/dist/index.js b/node_modules/command-line-args/dist/index.js
new file mode 100644
index 0000000..90a0c5e
--- /dev/null
+++ b/node_modules/command-line-args/dist/index.js
@@ -0,0 +1,1399 @@
+'use strict';
+
+function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; }
+
+var camelCase = _interopDefault(require('lodash.camelcase'));
+
+/**
+ * Takes any input and guarantees an array back.
+ *
+ * - Converts array-like objects (e.g. `arguments`, `Set`) to a real array.
+ * - Converts `undefined` to an empty array.
+ * - Converts any another other, singular value (including `null`, objects and iterables other than `Set`) into an array containing that value.
+ * - Ignores input which is already an array.
+ *
+ * @module array-back
+ * @example
+ * > const arrayify = require('array-back')
+ *
+ * > arrayify(undefined)
+ * []
+ *
+ * > arrayify(null)
+ * [ null ]
+ *
+ * > arrayify(0)
+ * [ 0 ]
+ *
+ * > arrayify([ 1, 2 ])
+ * [ 1, 2 ]
+ *
+ * > arrayify(new Set([ 1, 2 ]))
+ * [ 1, 2 ]
+ *
+ * > function f(){ return arrayify(arguments); }
+ * > f(1,2,3)
+ * [ 1, 2, 3 ]
+ */
+
+function isObject (input) {
+ return typeof input === 'object' && input !== null
+}
+
+function isArrayLike (input) {
+ return isObject(input) && typeof input.length === 'number'
+}
+
+/**
+ * @param {*} - The input value to convert to an array
+ * @returns {Array}
+ * @alias module:array-back
+ */
+function arrayify (input) {
+ if (Array.isArray(input)) {
+ return input
+ }
+
+ if (input === undefined) {
+ return []
+ }
+
+ if (isArrayLike(input) || input instanceof Set) {
+ return Array.from(input)
+ }
+
+ return [ input ]
+}
+
+/**
+ * Takes any input and guarantees an array back.
+ *
+ * - converts array-like objects (e.g. `arguments`) to a real array
+ * - converts `undefined` to an empty array
+ * - converts any another other, singular value (including `null`) into an array containing that value
+ * - ignores input which is already an array
+ *
+ * @module array-back
+ * @example
+ * > const arrayify = require('array-back')
+ *
+ * > arrayify(undefined)
+ * []
+ *
+ * > arrayify(null)
+ * [ null ]
+ *
+ * > arrayify(0)
+ * [ 0 ]
+ *
+ * > arrayify([ 1, 2 ])
+ * [ 1, 2 ]
+ *
+ * > function f(){ return arrayify(arguments); }
+ * > f(1,2,3)
+ * [ 1, 2, 3 ]
+ */
+
+function isObject$1 (input) {
+ return typeof input === 'object' && input !== null
+}
+
+function isArrayLike$1 (input) {
+ return isObject$1(input) && typeof input.length === 'number'
+}
+
+/**
+ * @param {*} - the input value to convert to an array
+ * @returns {Array}
+ * @alias module:array-back
+ */
+function arrayify$1 (input) {
+ if (Array.isArray(input)) {
+ return input
+ } else {
+ if (input === undefined) {
+ return []
+ } else if (isArrayLike$1(input)) {
+ return Array.prototype.slice.call(input)
+ } else {
+ return [ input ]
+ }
+ }
+}
+
+/**
+ * Find and either replace or remove items in an array.
+ *
+ * @module find-replace
+ * @example
+ * > const findReplace = require('find-replace')
+ * > const numbers = [ 1, 2, 3]
+ *
+ * > findReplace(numbers, n => n === 2, 'two')
+ * [ 1, 'two', 3 ]
+ *
+ * > findReplace(numbers, n => n === 2, [ 'two', 'zwei' ])
+ * [ 1, [ 'two', 'zwei' ], 3 ]
+ *
+ * > findReplace(numbers, n => n === 2, 'two', 'zwei')
+ * [ 1, 'two', 'zwei', 3 ]
+ *
+ * > findReplace(numbers, n => n === 2) // no replacement, so remove
+ * [ 1, 3 ]
+ */
+
+/**
+ * @param {array} - The input array
+ * @param {testFn} - A predicate function which, if returning `true` causes the current item to be operated on.
+ * @param [replaceWith] {...any} - If specified, found values will be replaced with these values, else removed.
+ * @returns {array}
+ * @alias module:find-replace
+ */
+function findReplace (array, testFn) {
+ const found = [];
+ const replaceWiths = arrayify$1(arguments);
+ replaceWiths.splice(0, 2);
+
+ arrayify$1(array).forEach((value, index) => {
+ let expanded = [];
+ replaceWiths.forEach(replaceWith => {
+ if (typeof replaceWith === 'function') {
+ expanded = expanded.concat(replaceWith(value));
+ } else {
+ expanded.push(replaceWith);
+ }
+ });
+
+ if (testFn(value)) {
+ found.push({
+ index: index,
+ replaceWithValue: expanded
+ });
+ }
+ });
+
+ found.reverse().forEach(item => {
+ const spliceArgs = [ item.index, 1 ].concat(item.replaceWithValue);
+ array.splice.apply(array, spliceArgs);
+ });
+
+ return array
+}
+
+/**
+ * Some useful tools for working with `process.argv`.
+ *
+ * @module argv-tools
+ * @typicalName argvTools
+ * @example
+ * const argvTools = require('argv-tools')
+ */
+
+/**
+ * Regular expressions for matching option formats.
+ * @static
+ */
+const re = {
+ short: /^-([^\d-])$/,
+ long: /^--(\S+)/,
+ combinedShort: /^-[^\d-]{2,}$/,
+ optEquals: /^(--\S+?)=(.*)/
+};
+
+/**
+ * Array subclass encapsulating common operations on `process.argv`.
+ * @static
+ */
+class ArgvArray extends Array {
+ /**
+ * Clears the array has loads the supplied input.
+ * @param {string[]} argv - The argv list to load. Defaults to `process.argv`.
+ */
+ load (argv) {
+ this.clear();
+ if (argv && argv !== process.argv) {
+ argv = arrayify(argv);
+ } else {
+ /* if no argv supplied, assume we are parsing process.argv */
+ argv = process.argv.slice(0);
+ const deleteCount = process.execArgv.some(isExecArg) ? 1 : 2;
+ argv.splice(0, deleteCount);
+ }
+ argv.forEach(arg => this.push(String(arg)));
+ }
+
+ /**
+ * Clear the array.
+ */
+ clear () {
+ this.length = 0;
+ }
+
+ /**
+ * expand ``--option=value` style args.
+ */
+ expandOptionEqualsNotation () {
+ if (this.some(arg => re.optEquals.test(arg))) {
+ const expandedArgs = [];
+ this.forEach(arg => {
+ const matches = arg.match(re.optEquals);
+ if (matches) {
+ expandedArgs.push(matches[1], matches[2]);
+ } else {
+ expandedArgs.push(arg);
+ }
+ });
+ this.clear();
+ this.load(expandedArgs);
+ }
+ }
+
+ /**
+ * expand getopt-style combinedShort options.
+ */
+ expandGetoptNotation () {
+ if (this.hasCombinedShortOptions()) {
+ findReplace(this, re.combinedShort, expandCombinedShortArg);
+ }
+ }
+
+ /**
+ * Returns true if the array contains combined short options (e.g. `-ab`).
+ * @returns {boolean}
+ */
+ hasCombinedShortOptions () {
+ return this.some(arg => re.combinedShort.test(arg))
+ }
+
+ static from (argv) {
+ const result = new this();
+ result.load(argv);
+ return result
+ }
+}
+
+/**
+ * Expand a combined short option.
+ * @param {string} - the string to expand, e.g. `-ab`
+ * @returns {string[]}
+ * @static
+ */
+function expandCombinedShortArg (arg) {
+ /* remove initial hypen */
+ arg = arg.slice(1);
+ return arg.split('').map(letter => '-' + letter)
+}
+
+/**
+ * Returns true if the supplied arg matches `--option=value` notation.
+ * @param {string} - the arg to test, e.g. `--one=something`
+ * @returns {boolean}
+ * @static
+ */
+function isOptionEqualsNotation (arg) {
+ return re.optEquals.test(arg)
+}
+
+/**
+ * Returns true if the supplied arg is in either long (`--one`) or short (`-o`) format.
+ * @param {string} - the arg to test, e.g. `--one`
+ * @returns {boolean}
+ * @static
+ */
+function isOption (arg) {
+ return (re.short.test(arg) || re.long.test(arg)) && !re.optEquals.test(arg)
+}
+
+/**
+ * Returns true if the supplied arg is in long (`--one`) format.
+ * @param {string} - the arg to test, e.g. `--one`
+ * @returns {boolean}
+ * @static
+ */
+function isLongOption (arg) {
+ return re.long.test(arg) && !isOptionEqualsNotation(arg)
+}
+
+/**
+ * Returns the name from a long, short or `--options=value` arg.
+ * @param {string} - the arg to inspect, e.g. `--one`
+ * @returns {string}
+ * @static
+ */
+function getOptionName (arg) {
+ if (re.short.test(arg)) {
+ return arg.match(re.short)[1]
+ } else if (isLongOption(arg)) {
+ return arg.match(re.long)[1]
+ } else if (isOptionEqualsNotation(arg)) {
+ return arg.match(re.optEquals)[1].replace(/^--/, '')
+ } else {
+ return null
+ }
+}
+
+function isValue (arg) {
+ return !(isOption(arg) || re.combinedShort.test(arg) || re.optEquals.test(arg))
+}
+
+function isExecArg (arg) {
+ return ['--eval', '-e'].indexOf(arg) > -1 || arg.startsWith('--eval=')
+}
+
+/**
+ * For type-checking Javascript values.
+ * @module typical
+ * @typicalname t
+ * @example
+ * const t = require('typical')
+ */
+
+/**
+ * Returns true if input is a number
+ * @param {*} - the input to test
+ * @returns {boolean}
+ * @static
+ * @example
+ * > t.isNumber(0)
+ * true
+ * > t.isNumber(1)
+ * true
+ * > t.isNumber(1.1)
+ * true
+ * > t.isNumber(0xff)
+ * true
+ * > t.isNumber(0644)
+ * true
+ * > t.isNumber(6.2e5)
+ * true
+ * > t.isNumber(NaN)
+ * false
+ * > t.isNumber(Infinity)
+ * false
+ */
+function isNumber (n) {
+ return !isNaN(parseFloat(n)) && isFinite(n)
+}
+
+/**
+ * A plain object is a simple object literal, it is not an instance of a class. Returns true if the input `typeof` is `object` and directly decends from `Object`.
+ *
+ * @param {*} - the input to test
+ * @returns {boolean}
+ * @static
+ * @example
+ * > t.isPlainObject({ something: 'one' })
+ * true
+ * > t.isPlainObject(new Date())
+ * false
+ * > t.isPlainObject([ 0, 1 ])
+ * false
+ * > t.isPlainObject(/test/)
+ * false
+ * > t.isPlainObject(1)
+ * false
+ * > t.isPlainObject('one')
+ * false
+ * > t.isPlainObject(null)
+ * false
+ * > t.isPlainObject((function * () {})())
+ * false
+ * > t.isPlainObject(function * () {})
+ * false
+ */
+function isPlainObject (input) {
+ return input !== null && typeof input === 'object' && input.constructor === Object
+}
+
+/**
+ * An array-like value has all the properties of an array, but is not an array instance. Examples in the `arguments` object. Returns true if the input value is an object, not null and has a `length` property with a numeric value.
+ *
+ * @param {*} - the input to test
+ * @returns {boolean}
+ * @static
+ * @example
+ * function sum(x, y){
+ * console.log(t.isArrayLike(arguments))
+ * // prints `true`
+ * }
+ */
+function isArrayLike$2 (input) {
+ return isObject$2(input) && typeof input.length === 'number'
+}
+
+/**
+ * returns true if the typeof input is `'object'`, but not null!
+ * @param {*} - the input to test
+ * @returns {boolean}
+ * @static
+ */
+function isObject$2 (input) {
+ return typeof input === 'object' && input !== null
+}
+
+/**
+ * Returns true if the input value is defined
+ * @param {*} - the input to test
+ * @returns {boolean}
+ * @static
+ */
+function isDefined (input) {
+ return typeof input !== 'undefined'
+}
+
+/**
+ * Returns true if the input value is a string
+ * @param {*} - the input to test
+ * @returns {boolean}
+ * @static
+ */
+function isString (input) {
+ return typeof input === 'string'
+}
+
+/**
+ * Returns true if the input value is a boolean
+ * @param {*} - the input to test
+ * @returns {boolean}
+ * @static
+ */
+function isBoolean (input) {
+ return typeof input === 'boolean'
+}
+
+/**
+ * Returns true if the input value is a function
+ * @param {*} - the input to test
+ * @returns {boolean}
+ * @static
+ */
+function isFunction (input) {
+ return typeof input === 'function'
+}
+
+/**
+ * Returns true if the input value is an es2015 `class`.
+ * @param {*} - the input to test
+ * @returns {boolean}
+ * @static
+ */
+function isClass (input) {
+ if (isFunction(input)) {
+ return /^class /.test(Function.prototype.toString.call(input))
+ } else {
+ return false
+ }
+}
+
+/**
+ * Returns true if the input is a string, number, symbol, boolean, null or undefined value.
+ * @param {*} - the input to test
+ * @returns {boolean}
+ * @static
+ */
+function isPrimitive (input) {
+ if (input === null) return true
+ switch (typeof input) {
+ case 'string':
+ case 'number':
+ case 'symbol':
+ case 'undefined':
+ case 'boolean':
+ return true
+ default:
+ return false
+ }
+}
+
+/**
+ * Returns true if the input is a Promise.
+ * @param {*} - the input to test
+ * @returns {boolean}
+ * @static
+ */
+function isPromise (input) {
+ if (input) {
+ const isPromise = isDefined(Promise) && input instanceof Promise;
+ const isThenable = input.then && typeof input.then === 'function';
+ return !!(isPromise || isThenable)
+ } else {
+ return false
+ }
+}
+
+/**
+ * Returns true if the input is an iterable (`Map`, `Set`, `Array`, Generator etc.).
+ * @param {*} - the input to test
+ * @returns {boolean}
+ * @static
+ * @example
+ * > t.isIterable('string')
+ * true
+ * > t.isIterable(new Map())
+ * true
+ * > t.isIterable([])
+ * true
+ * > t.isIterable((function * () {})())
+ * true
+ * > t.isIterable(Promise.resolve())
+ * false
+ * > t.isIterable(Promise)
+ * false
+ * > t.isIterable(true)
+ * false
+ * > t.isIterable({})
+ * false
+ * > t.isIterable(0)
+ * false
+ * > t.isIterable(1.1)
+ * false
+ * > t.isIterable(NaN)
+ * false
+ * > t.isIterable(Infinity)
+ * false
+ * > t.isIterable(function () {})
+ * false
+ * > t.isIterable(Date)
+ * false
+ * > t.isIterable()
+ * false
+ * > t.isIterable({ then: function () {} })
+ * false
+ */
+function isIterable (input) {
+ if (input === null || !isDefined(input)) {
+ return false
+ } else {
+ return (
+ typeof input[Symbol.iterator] === 'function' ||
+ typeof input[Symbol.asyncIterator] === 'function'
+ )
+ }
+}
+
+var t = {
+ isNumber,
+ isString,
+ isBoolean,
+ isPlainObject,
+ isArrayLike: isArrayLike$2,
+ isObject: isObject$2,
+ isDefined,
+ isFunction,
+ isClass,
+ isPrimitive,
+ isPromise,
+ isIterable
+};
+
+/**
+ * @module option-definition
+ */
+
+/**
+ * Describes a command-line option. Additionally, if generating a usage guide with [command-line-usage](https://github.com/75lb/command-line-usage) you could optionally add `description` and `typeLabel` properties to each definition.
+ *
+ * @alias module:option-definition
+ * @typicalname option
+ */
+class OptionDefinition {
+ constructor (definition) {
+ /**
+ * The only required definition property is `name`, so the simplest working example is
+ * ```js
+ * const optionDefinitions = [
+ * { name: 'file' },
+ * { name: 'depth' }
+ * ]
+ * ```
+ *
+ * Where a `type` property is not specified it will default to `String`.
+ *
+ * | # | argv input | commandLineArgs() output |
+ * | --- | -------------------- | ------------ |
+ * | 1 | `--file` | `{ file: null }` |
+ * | 2 | `--file lib.js` | `{ file: 'lib.js' }` |
+ * | 3 | `--depth 2` | `{ depth: '2' }` |
+ *
+ * Unicode option names and aliases are valid, for example:
+ * ```js
+ * const optionDefinitions = [
+ * { name: 'один' },
+ * { name: '两' },
+ * { name: 'три', alias: 'т' }
+ * ]
+ * ```
+ * @type {string}
+ */
+ this.name = definition.name;
+
+ /**
+ * The `type` value is a setter function (you receive the output from this), enabling you to be specific about the type and value received.
+ *
+ * The most common values used are `String` (the default), `Number` and `Boolean` but you can use a custom function, for example:
+ *
+ * ```js
+ * const fs = require('fs')
+ *
+ * class FileDetails {
+ * constructor (filename) {
+ * this.filename = filename
+ * this.exists = fs.existsSync(filename)
+ * }
+ * }
+ *
+ * const cli = commandLineArgs([
+ * { name: 'file', type: filename => new FileDetails(filename) },
+ * { name: 'depth', type: Number }
+ * ])
+ * ```
+ *
+ * | # | argv input | commandLineArgs() output |
+ * | --- | ----------------- | ------------ |
+ * | 1 | `--file asdf.txt` | `{ file: { filename: 'asdf.txt', exists: false } }` |
+ *
+ * The `--depth` option expects a `Number`. If no value was set, you will receive `null`.
+ *
+ * | # | argv input | commandLineArgs() output |
+ * | --- | ----------------- | ------------ |
+ * | 2 | `--depth` | `{ depth: null }` |
+ * | 3 | `--depth 2` | `{ depth: 2 }` |
+ *
+ * @type {function}
+ * @default String
+ */
+ this.type = definition.type || String;
+
+ /**
+ * getopt-style short option names. Can be any single character (unicode included) except a digit or hyphen.
+ *
+ * ```js
+ * const optionDefinitions = [
+ * { name: 'hot', alias: 'h', type: Boolean },
+ * { name: 'discount', alias: 'd', type: Boolean },
+ * { name: 'courses', alias: 'c' , type: Number }
+ * ]
+ * ```
+ *
+ * | # | argv input | commandLineArgs() output |
+ * | --- | ------------ | ------------ |
+ * | 1 | `-hcd` | `{ hot: true, courses: null, discount: true }` |
+ * | 2 | `-hdc 3` | `{ hot: true, discount: true, courses: 3 }` |
+ *
+ * @type {string}
+ */
+ this.alias = definition.alias;
+
+ /**
+ * Set this flag if the option takes a list of values. You will receive an array of values, each passed through the `type` function (if specified).
+ *
+ * ```js
+ * const optionDefinitions = [
+ * { name: 'files', type: String, multiple: true }
+ * ]
+ * ```
+ *
+ * Note, examples 1 and 3 below demonstrate "greedy" parsing which can be disabled by using `lazyMultiple`.
+ *
+ * | # | argv input | commandLineArgs() output |
+ * | --- | ------------ | ------------ |
+ * | 1 | `--files one.js two.js` | `{ files: [ 'one.js', 'two.js' ] }` |
+ * | 2 | `--files one.js --files two.js` | `{ files: [ 'one.js', 'two.js' ] }` |
+ * | 3 | `--files *` | `{ files: [ 'one.js', 'two.js' ] }` |
+ *
+ * @type {boolean}
+ */
+ this.multiple = definition.multiple;
+
+ /**
+ * Identical to `multiple` but with greedy parsing disabled.
+ *
+ * ```js
+ * const optionDefinitions = [
+ * { name: 'files', lazyMultiple: true },
+ * { name: 'verbose', alias: 'v', type: Boolean, lazyMultiple: true }
+ * ]
+ * ```
+ *
+ * | # | argv input | commandLineArgs() output |
+ * | --- | ------------ | ------------ |
+ * | 1 | `--files one.js --files two.js` | `{ files: [ 'one.js', 'two.js' ] }` |
+ * | 2 | `-vvv` | `{ verbose: [ true, true, true ] }` |
+ *
+ * @type {boolean}
+ */
+ this.lazyMultiple = definition.lazyMultiple;
+
+ /**
+ * Any values unaccounted for by an option definition will be set on the `defaultOption`. This flag is typically set on the most commonly-used option to make for more concise usage (i.e. `$ example *.js` instead of `$ example --files *.js`).
+ *
+ * ```js
+ * const optionDefinitions = [
+ * { name: 'files', multiple: true, defaultOption: true }
+ * ]
+ * ```
+ *
+ * | # | argv input | commandLineArgs() output |
+ * | --- | ------------ | ------------ |
+ * | 1 | `--files one.js two.js` | `{ files: [ 'one.js', 'two.js' ] }` |
+ * | 2 | `one.js two.js` | `{ files: [ 'one.js', 'two.js' ] }` |
+ * | 3 | `*` | `{ files: [ 'one.js', 'two.js' ] }` |
+ *
+ * @type {boolean}
+ */
+ this.defaultOption = definition.defaultOption;
+
+ /**
+ * An initial value for the option.
+ *
+ * ```js
+ * const optionDefinitions = [
+ * { name: 'files', multiple: true, defaultValue: [ 'one.js' ] },
+ * { name: 'max', type: Number, defaultValue: 3 }
+ * ]
+ * ```
+ *
+ * | # | argv input | commandLineArgs() output |
+ * | --- | ------------ | ------------ |
+ * | 1 | | `{ files: [ 'one.js' ], max: 3 }` |
+ * | 2 | `--files two.js` | `{ files: [ 'two.js' ], max: 3 }` |
+ * | 3 | `--max 4` | `{ files: [ 'one.js' ], max: 4 }` |
+ *
+ * @type {*}
+ */
+ this.defaultValue = definition.defaultValue;
+
+ /**
+ * When your app has a large amount of options it makes sense to organise them in groups.
+ *
+ * There are two automatic groups: `_all` (contains all options) and `_none` (contains options without a `group` specified in their definition).
+ *
+ * ```js
+ * const optionDefinitions = [
+ * { name: 'verbose', group: 'standard' },
+ * { name: 'help', group: [ 'standard', 'main' ] },
+ * { name: 'compress', group: [ 'server', 'main' ] },
+ * { name: 'static', group: 'server' },
+ * { name: 'debug' }
+ * ]
+ * ```
+ *
+ *<table>
+ * <tr>
+ * <th>#</th><th>Command Line</th><th>commandLineArgs() output</th>
+ * </tr>
+ * <tr>
+ * <td>1</td><td><code>--verbose</code></td><td><pre><code>
+ *{
+ * _all: { verbose: true },
+ * standard: { verbose: true }
+ *}
+ *</code></pre></td>
+ * </tr>
+ * <tr>
+ * <td>2</td><td><code>--debug</code></td><td><pre><code>
+ *{
+ * _all: { debug: true },
+ * _none: { debug: true }
+ *}
+ *</code></pre></td>
+ * </tr>
+ * <tr>
+ * <td>3</td><td><code>--verbose --debug --compress</code></td><td><pre><code>
+ *{
+ * _all: {
+ * verbose: true,
+ * debug: true,
+ * compress: true
+ * },
+ * standard: { verbose: true },
+ * server: { compress: true },
+ * main: { compress: true },
+ * _none: { debug: true }
+ *}
+ *</code></pre></td>
+ * </tr>
+ * <tr>
+ * <td>4</td><td><code>--compress</code></td><td><pre><code>
+ *{
+ * _all: { compress: true },
+ * server: { compress: true },
+ * main: { compress: true }
+ *}
+ *</code></pre></td>
+ * </tr>
+ *</table>
+ *
+ * @type {string|string[]}
+ */
+ this.group = definition.group;
+
+ /* pick up any remaining properties */
+ for (const prop in definition) {
+ if (!this[prop]) this[prop] = definition[prop];
+ }
+ }
+
+ isBoolean () {
+ return this.type === Boolean || (t.isFunction(this.type) && this.type.name === 'Boolean')
+ }
+
+ isMultiple () {
+ return this.multiple || this.lazyMultiple
+ }
+
+ static create (def) {
+ const result = new this(def);
+ return result
+ }
+}
+
+/**
+ * @module option-definitions
+ */
+
+/**
+ * @alias module:option-definitions
+ */
+class Definitions extends Array {
+ /**
+ * validate option definitions
+ * @param {boolean} [caseInsensitive=false] - whether arguments will be parsed in a case insensitive manner
+ * @returns {string}
+ */
+ validate (caseInsensitive) {
+ const someHaveNoName = this.some(def => !def.name);
+ if (someHaveNoName) {
+ halt(
+ 'INVALID_DEFINITIONS',
+ 'Invalid option definitions: the `name` property is required on each definition'
+ );
+ }
+
+ const someDontHaveFunctionType = this.some(def => def.type && typeof def.type !== 'function');
+ if (someDontHaveFunctionType) {
+ halt(
+ 'INVALID_DEFINITIONS',
+ 'Invalid option definitions: the `type` property must be a setter fuction (default: `Boolean`)'
+ );
+ }
+
+ let invalidOption;
+
+ const numericAlias = this.some(def => {
+ invalidOption = def;
+ return t.isDefined(def.alias) && t.isNumber(def.alias)
+ });
+ if (numericAlias) {
+ halt(
+ 'INVALID_DEFINITIONS',
+ 'Invalid option definition: to avoid ambiguity an alias cannot be numeric [--' + invalidOption.name + ' alias is -' + invalidOption.alias + ']'
+ );
+ }
+
+ const multiCharacterAlias = this.some(def => {
+ invalidOption = def;
+ return t.isDefined(def.alias) && def.alias.length !== 1
+ });
+ if (multiCharacterAlias) {
+ halt(
+ 'INVALID_DEFINITIONS',
+ 'Invalid option definition: an alias must be a single character'
+ );
+ }
+
+ const hypenAlias = this.some(def => {
+ invalidOption = def;
+ return def.alias === '-'
+ });
+ if (hypenAlias) {
+ halt(
+ 'INVALID_DEFINITIONS',
+ 'Invalid option definition: an alias cannot be "-"'
+ );
+ }
+
+ const duplicateName = hasDuplicates(this.map(def => caseInsensitive ? def.name.toLowerCase() : def.name));
+ if (duplicateName) {
+ halt(
+ 'INVALID_DEFINITIONS',
+ 'Two or more option definitions have the same name'
+ );
+ }
+
+ const duplicateAlias = hasDuplicates(this.map(def => caseInsensitive && t.isDefined(def.alias) ? def.alias.toLowerCase() : def.alias));
+ if (duplicateAlias) {
+ halt(
+ 'INVALID_DEFINITIONS',
+ 'Two or more option definitions have the same alias'
+ );
+ }
+
+ const duplicateDefaultOption = this.filter(def => def.defaultOption === true).length > 1;
+ if (duplicateDefaultOption) {
+ halt(
+ 'INVALID_DEFINITIONS',
+ 'Only one option definition can be the defaultOption'
+ );
+ }
+
+ const defaultBoolean = this.some(def => {
+ invalidOption = def;
+ return def.isBoolean() && def.defaultOption
+ });
+ if (defaultBoolean) {
+ halt(
+ 'INVALID_DEFINITIONS',
+ `A boolean option ["${invalidOption.name}"] can not also be the defaultOption.`
+ );
+ }
+ }
+
+ /**
+ * Get definition by option arg (e.g. `--one` or `-o`)
+ * @param {string} [arg] the argument name to get the definition for
+ * @param {boolean} [caseInsensitive] whether to use case insensitive comparisons when finding the appropriate definition
+ * @returns {Definition}
+ */
+ get (arg, caseInsensitive) {
+ if (isOption(arg)) {
+ if (re.short.test(arg)) {
+ const shortOptionName = getOptionName(arg);
+ if (caseInsensitive) {
+ const lowercaseShortOptionName = shortOptionName.toLowerCase();
+ return this.find(def => t.isDefined(def.alias) && def.alias.toLowerCase() === lowercaseShortOptionName)
+ } else {
+ return this.find(def => def.alias === shortOptionName)
+ }
+ } else {
+ const optionName = getOptionName(arg);
+ if (caseInsensitive) {
+ const lowercaseOptionName = optionName.toLowerCase();
+ return this.find(def => def.name.toLowerCase() === lowercaseOptionName)
+ } else {
+ return this.find(def => def.name === optionName)
+ }
+ }
+ } else {
+ return this.find(def => def.name === arg)
+ }
+ }
+
+ getDefault () {
+ return this.find(def => def.defaultOption === true)
+ }
+
+ isGrouped () {
+ return this.some(def => def.group)
+ }
+
+ whereGrouped () {
+ return this.filter(containsValidGroup)
+ }
+
+ whereNotGrouped () {
+ return this.filter(def => !containsValidGroup(def))
+ }
+
+ whereDefaultValueSet () {
+ return this.filter(def => t.isDefined(def.defaultValue))
+ }
+
+ static from (definitions, caseInsensitive) {
+ if (definitions instanceof this) return definitions
+ const result = super.from(arrayify(definitions), def => OptionDefinition.create(def));
+ result.validate(caseInsensitive);
+ return result
+ }
+}
+
+function halt (name, message) {
+ const err = new Error(message);
+ err.name = name;
+ throw err
+}
+
+function containsValidGroup (def) {
+ return arrayify(def.group).some(group => group)
+}
+
+function hasDuplicates (array) {
+ const items = {};
+ for (let i = 0; i < array.length; i++) {
+ const value = array[i];
+ if (items[value]) {
+ return true
+ } else {
+ if (t.isDefined(value)) items[value] = true;
+ }
+ }
+}
+
+/**
+ * @module argv-parser
+ */
+
+/**
+ * @alias module:argv-parser
+ */
+class ArgvParser {
+ /**
+ * @param {OptionDefinitions} - Definitions array
+ * @param {object} [options] - Options
+ * @param {string[]} [options.argv] - Overrides `process.argv`
+ * @param {boolean} [options.stopAtFirstUnknown] -
+ * @param {boolean} [options.caseInsensitive] - Arguments will be parsed in a case insensitive manner. Defaults to false.
+ */
+ constructor (definitions, options) {
+ this.options = Object.assign({}, options);
+ /**
+ * Option Definitions
+ */
+ this.definitions = Definitions.from(definitions, this.options.caseInsensitive);
+
+ /**
+ * Argv
+ */
+ this.argv = ArgvArray.from(this.options.argv);
+ if (this.argv.hasCombinedShortOptions()) {
+ findReplace(this.argv, re.combinedShort.test.bind(re.combinedShort), arg => {
+ arg = arg.slice(1);
+ return arg.split('').map(letter => ({ origArg: `-${arg}`, arg: '-' + letter }))
+ });
+ }
+ }
+
+ /**
+ * Yields one `{ event, name, value, arg, def }` argInfo object for each arg in `process.argv` (or `options.argv`).
+ */
+ * [Symbol.iterator] () {
+ const definitions = this.definitions;
+
+ let def;
+ let value;
+ let name;
+ let event;
+ let singularDefaultSet = false;
+ let unknownFound = false;
+ let origArg;
+
+ for (let arg of this.argv) {
+ if (t.isPlainObject(arg)) {
+ origArg = arg.origArg;
+ arg = arg.arg;
+ }
+
+ if (unknownFound && this.options.stopAtFirstUnknown) {
+ yield { event: 'unknown_value', arg, name: '_unknown', value: undefined };
+ continue
+ }
+
+ /* handle long or short option */
+ if (isOption(arg)) {
+ def = definitions.get(arg, this.options.caseInsensitive);
+ value = undefined;
+ if (def) {
+ value = def.isBoolean() ? true : null;
+ event = 'set';
+ } else {
+ event = 'unknown_option';
+ }
+
+ /* handle --option-value notation */
+ } else if (isOptionEqualsNotation(arg)) {
+ const matches = arg.match(re.optEquals);
+ def = definitions.get(matches[1], this.options.caseInsensitive);
+ if (def) {
+ if (def.isBoolean()) {
+ yield { event: 'unknown_value', arg, name: '_unknown', value, def };
+ event = 'set';
+ value = true;
+ } else {
+ event = 'set';
+ value = matches[2];
+ }
+ } else {
+ event = 'unknown_option';
+ }
+
+ /* handle value */
+ } else if (isValue(arg)) {
+ if (def) {
+ value = arg;
+ event = 'set';
+ } else {
+ /* get the defaultOption */
+ def = this.definitions.getDefault();
+ if (def && !singularDefaultSet) {
+ value = arg;
+ event = 'set';
+ } else {
+ event = 'unknown_value';
+ def = undefined;
+ }
+ }
+ }
+
+ name = def ? def.name : '_unknown';
+ const argInfo = { event, arg, name, value, def };
+ if (origArg) {
+ argInfo.subArg = arg;
+ argInfo.arg = origArg;
+ }
+ yield argInfo;
+
+ /* unknownFound logic */
+ if (name === '_unknown') unknownFound = true;
+
+ /* singularDefaultSet logic */
+ if (def && def.defaultOption && !def.isMultiple() && event === 'set') singularDefaultSet = true;
+
+ /* reset values once consumed and yielded */
+ if (def && def.isBoolean()) def = undefined;
+ /* reset the def if it's a singular which has been set */
+ if (def && !def.multiple && t.isDefined(value) && value !== null) {
+ def = undefined;
+ }
+ value = undefined;
+ event = undefined;
+ name = undefined;
+ origArg = undefined;
+ }
+ }
+}
+
+const _value = new WeakMap();
+
+/**
+ * Encapsulates behaviour (defined by an OptionDefinition) when setting values
+ */
+class Option {
+ constructor (definition) {
+ this.definition = new OptionDefinition(definition);
+ this.state = null; /* set or default */
+ this.resetToDefault();
+ }
+
+ get () {
+ return _value.get(this)
+ }
+
+ set (val) {
+ this._set(val, 'set');
+ }
+
+ _set (val, state) {
+ const def = this.definition;
+ if (def.isMultiple()) {
+ /* don't add null or undefined to a multiple */
+ if (val !== null && val !== undefined) {
+ const arr = this.get();
+ if (this.state === 'default') arr.length = 0;
+ arr.push(def.type(val));
+ this.state = state;
+ }
+ } else {
+ /* throw if already set on a singlar defaultOption */
+ if (!def.isMultiple() && this.state === 'set') {
+ const err = new Error(`Singular option already set [${this.definition.name}=${this.get()}]`);
+ err.name = 'ALREADY_SET';
+ err.value = val;
+ err.optionName = def.name;
+ throw err
+ } else if (val === null || val === undefined) {
+ _value.set(this, val);
+ // /* required to make 'partial: defaultOption with value equal to defaultValue 2' pass */
+ // if (!(def.defaultOption && !def.isMultiple())) {
+ // this.state = state
+ // }
+ } else {
+ _value.set(this, def.type(val));
+ this.state = state;
+ }
+ }
+ }
+
+ resetToDefault () {
+ if (t.isDefined(this.definition.defaultValue)) {
+ if (this.definition.isMultiple()) {
+ _value.set(this, arrayify(this.definition.defaultValue).slice());
+ } else {
+ _value.set(this, this.definition.defaultValue);
+ }
+ } else {
+ if (this.definition.isMultiple()) {
+ _value.set(this, []);
+ } else {
+ _value.set(this, null);
+ }
+ }
+ this.state = 'default';
+ }
+
+ static create (definition) {
+ definition = new OptionDefinition(definition);
+ if (definition.isBoolean()) {
+ return FlagOption.create(definition)
+ } else {
+ return new this(definition)
+ }
+ }
+}
+
+class FlagOption extends Option {
+ set (val) {
+ super.set(true);
+ }
+
+ static create (def) {
+ return new this(def)
+ }
+}
+
+/**
+ * A map of { DefinitionNameString: Option }. By default, an Output has an `_unknown` property and any options with defaultValues.
+ */
+class Output extends Map {
+ constructor (definitions) {
+ super();
+ /**
+ * @type {OptionDefinitions}
+ */
+ this.definitions = Definitions.from(definitions);
+
+ /* by default, an Output has an `_unknown` property and any options with defaultValues */
+ this.set('_unknown', Option.create({ name: '_unknown', multiple: true }));
+ for (const def of this.definitions.whereDefaultValueSet()) {
+ this.set(def.name, Option.create(def));
+ }
+ }
+
+ toObject (options) {
+ options = options || {};
+ const output = {};
+ for (const item of this) {
+ const name = options.camelCase && item[0] !== '_unknown' ? camelCase(item[0]) : item[0];
+ const option = item[1];
+ if (name === '_unknown' && !option.get().length) continue
+ output[name] = option.get();
+ }
+
+ if (options.skipUnknown) delete output._unknown;
+ return output
+ }
+}
+
+class GroupedOutput extends Output {
+ toObject (options) {
+ const superOutputNoCamel = super.toObject({ skipUnknown: options.skipUnknown });
+ const superOutput = super.toObject(options);
+ const unknown = superOutput._unknown;
+ delete superOutput._unknown;
+ const grouped = {
+ _all: superOutput
+ };
+ if (unknown && unknown.length) grouped._unknown = unknown;
+
+ this.definitions.whereGrouped().forEach(def => {
+ const name = options.camelCase ? camelCase(def.name) : def.name;
+ const outputValue = superOutputNoCamel[def.name];
+ for (const groupName of arrayify(def.group)) {
+ grouped[groupName] = grouped[groupName] || {};
+ if (t.isDefined(outputValue)) {
+ grouped[groupName][name] = outputValue;
+ }
+ }
+ });
+
+ this.definitions.whereNotGrouped().forEach(def => {
+ const name = options.camelCase ? camelCase(def.name) : def.name;
+ const outputValue = superOutputNoCamel[def.name];
+ if (t.isDefined(outputValue)) {
+ if (!grouped._none) grouped._none = {};
+ grouped._none[name] = outputValue;
+ }
+ });
+ return grouped
+ }
+}
+
+/**
+ * @module command-line-args
+ */
+
+/**
+ * Returns an object containing all option values set on the command line. By default it parses the global [`process.argv`](https://nodejs.org/api/process.html#process_process_argv) array.
+ *
+ * Parsing is strict by default - an exception is thrown if the user sets a singular option more than once or sets an unknown value or option (one without a valid [definition](https://github.com/75lb/command-line-args/blob/master/doc/option-definition.md)). To be more permissive, enabling [partial](https://github.com/75lb/command-line-args/wiki/Partial-mode-example) or [stopAtFirstUnknown](https://github.com/75lb/command-line-args/wiki/stopAtFirstUnknown) modes will return known options in the usual manner while collecting unknown arguments in a separate `_unknown` property.
+ *
+ * @param {Array<OptionDefinition>} - An array of [OptionDefinition](https://github.com/75lb/command-line-args/blob/master/doc/option-definition.md) objects
+ * @param {object} [options] - Options.
+ * @param {string[]} [options.argv] - An array of strings which, if present will be parsed instead of `process.argv`.
+ * @param {boolean} [options.partial] - If `true`, an array of unknown arguments is returned in the `_unknown` property of the output.
+ * @param {boolean} [options.stopAtFirstUnknown] - If `true`, parsing will stop at the first unknown argument and the remaining arguments returned in `_unknown`. When set, `partial: true` is also implied.
+ * @param {boolean} [options.camelCase] - If `true`, options with hypenated names (e.g. `move-to`) will be returned in camel-case (e.g. `moveTo`).
+ * @param {boolean} [options.caseInsensitive] - If `true`, the case of each option name or alias parsed is insignificant. In other words, both `--Verbose` and `--verbose`, `-V` and `-v` would be equivalent. Defaults to false.
+ * @returns {object}
+ * @throws `UNKNOWN_OPTION` If `options.partial` is false and the user set an undefined option. The `err.optionName` property contains the arg that specified an unknown option, e.g. `--one`.
+ * @throws `UNKNOWN_VALUE` If `options.partial` is false and the user set a value unaccounted for by an option definition. The `err.value` property contains the unknown value, e.g. `5`.
+ * @throws `ALREADY_SET` If a user sets a singular, non-multiple option more than once. The `err.optionName` property contains the option name that has already been set, e.g. `one`.
+ * @throws `INVALID_DEFINITIONS`
+ * - If an option definition is missing the required `name` property
+ * - If an option definition has a `type` value that's not a function
+ * - If an alias is numeric, a hyphen or a length other than 1
+ * - If an option definition name was used more than once
+ * - If an option definition alias was used more than once
+ * - If more than one option definition has `defaultOption: true`
+ * - If a `Boolean` option is also set as the `defaultOption`.
+ * @alias module:command-line-args
+ */
+function commandLineArgs (optionDefinitions, options) {
+ options = options || {};
+ if (options.stopAtFirstUnknown) options.partial = true;
+ optionDefinitions = Definitions.from(optionDefinitions, options.caseInsensitive);
+
+ const parser = new ArgvParser(optionDefinitions, {
+ argv: options.argv,
+ stopAtFirstUnknown: options.stopAtFirstUnknown,
+ caseInsensitive: options.caseInsensitive
+ });
+
+ const OutputClass = optionDefinitions.isGrouped() ? GroupedOutput : Output;
+ const output = new OutputClass(optionDefinitions);
+
+ /* Iterate the parser setting each known value to the output. Optionally, throw on unknowns. */
+ for (const argInfo of parser) {
+ const arg = argInfo.subArg || argInfo.arg;
+ if (!options.partial) {
+ if (argInfo.event === 'unknown_value') {
+ const err = new Error(`Unknown value: ${arg}`);
+ err.name = 'UNKNOWN_VALUE';
+ err.value = arg;
+ throw err
+ } else if (argInfo.event === 'unknown_option') {
+ const err = new Error(`Unknown option: ${arg}`);
+ err.name = 'UNKNOWN_OPTION';
+ err.optionName = arg;
+ throw err
+ }
+ }
+
+ let option;
+ if (output.has(argInfo.name)) {
+ option = output.get(argInfo.name);
+ } else {
+ option = Option.create(argInfo.def);
+ output.set(argInfo.name, option);
+ }
+
+ if (argInfo.name === '_unknown') {
+ option.set(arg);
+ } else {
+ option.set(argInfo.value);
+ }
+ }
+
+ return output.toObject({ skipUnknown: !options.partial, camelCase: options.camelCase })
+}
+
+module.exports = commandLineArgs;
diff --git a/node_modules/command-line-args/dist/index.mjs b/node_modules/command-line-args/dist/index.mjs
new file mode 100644
index 0000000..00683e4
--- /dev/null
+++ b/node_modules/command-line-args/dist/index.mjs
@@ -0,0 +1,1395 @@
+import camelCase from 'lodash.camelcase';
+
+/**
+ * Takes any input and guarantees an array back.
+ *
+ * - Converts array-like objects (e.g. `arguments`, `Set`) to a real array.
+ * - Converts `undefined` to an empty array.
+ * - Converts any another other, singular value (including `null`, objects and iterables other than `Set`) into an array containing that value.
+ * - Ignores input which is already an array.
+ *
+ * @module array-back
+ * @example
+ * > const arrayify = require('array-back')
+ *
+ * > arrayify(undefined)
+ * []
+ *
+ * > arrayify(null)
+ * [ null ]
+ *
+ * > arrayify(0)
+ * [ 0 ]
+ *
+ * > arrayify([ 1, 2 ])
+ * [ 1, 2 ]
+ *
+ * > arrayify(new Set([ 1, 2 ]))
+ * [ 1, 2 ]
+ *
+ * > function f(){ return arrayify(arguments); }
+ * > f(1,2,3)
+ * [ 1, 2, 3 ]
+ */
+
+function isObject (input) {
+ return typeof input === 'object' && input !== null
+}
+
+function isArrayLike (input) {
+ return isObject(input) && typeof input.length === 'number'
+}
+
+/**
+ * @param {*} - The input value to convert to an array
+ * @returns {Array}
+ * @alias module:array-back
+ */
+function arrayify (input) {
+ if (Array.isArray(input)) {
+ return input
+ }
+
+ if (input === undefined) {
+ return []
+ }
+
+ if (isArrayLike(input) || input instanceof Set) {
+ return Array.from(input)
+ }
+
+ return [ input ]
+}
+
+/**
+ * Takes any input and guarantees an array back.
+ *
+ * - converts array-like objects (e.g. `arguments`) to a real array
+ * - converts `undefined` to an empty array
+ * - converts any another other, singular value (including `null`) into an array containing that value
+ * - ignores input which is already an array
+ *
+ * @module array-back
+ * @example
+ * > const arrayify = require('array-back')
+ *
+ * > arrayify(undefined)
+ * []
+ *
+ * > arrayify(null)
+ * [ null ]
+ *
+ * > arrayify(0)
+ * [ 0 ]
+ *
+ * > arrayify([ 1, 2 ])
+ * [ 1, 2 ]
+ *
+ * > function f(){ return arrayify(arguments); }
+ * > f(1,2,3)
+ * [ 1, 2, 3 ]
+ */
+
+function isObject$1 (input) {
+ return typeof input === 'object' && input !== null
+}
+
+function isArrayLike$1 (input) {
+ return isObject$1(input) && typeof input.length === 'number'
+}
+
+/**
+ * @param {*} - the input value to convert to an array
+ * @returns {Array}
+ * @alias module:array-back
+ */
+function arrayify$1 (input) {
+ if (Array.isArray(input)) {
+ return input
+ } else {
+ if (input === undefined) {
+ return []
+ } else if (isArrayLike$1(input)) {
+ return Array.prototype.slice.call(input)
+ } else {
+ return [ input ]
+ }
+ }
+}
+
+/**
+ * Find and either replace or remove items in an array.
+ *
+ * @module find-replace
+ * @example
+ * > const findReplace = require('find-replace')
+ * > const numbers = [ 1, 2, 3]
+ *
+ * > findReplace(numbers, n => n === 2, 'two')
+ * [ 1, 'two', 3 ]
+ *
+ * > findReplace(numbers, n => n === 2, [ 'two', 'zwei' ])
+ * [ 1, [ 'two', 'zwei' ], 3 ]
+ *
+ * > findReplace(numbers, n => n === 2, 'two', 'zwei')
+ * [ 1, 'two', 'zwei', 3 ]
+ *
+ * > findReplace(numbers, n => n === 2) // no replacement, so remove
+ * [ 1, 3 ]
+ */
+
+/**
+ * @param {array} - The input array
+ * @param {testFn} - A predicate function which, if returning `true` causes the current item to be operated on.
+ * @param [replaceWith] {...any} - If specified, found values will be replaced with these values, else removed.
+ * @returns {array}
+ * @alias module:find-replace
+ */
+function findReplace (array, testFn) {
+ const found = [];
+ const replaceWiths = arrayify$1(arguments);
+ replaceWiths.splice(0, 2);
+
+ arrayify$1(array).forEach((value, index) => {
+ let expanded = [];
+ replaceWiths.forEach(replaceWith => {
+ if (typeof replaceWith === 'function') {
+ expanded = expanded.concat(replaceWith(value));
+ } else {
+ expanded.push(replaceWith);
+ }
+ });
+
+ if (testFn(value)) {
+ found.push({
+ index: index,
+ replaceWithValue: expanded
+ });
+ }
+ });
+
+ found.reverse().forEach(item => {
+ const spliceArgs = [ item.index, 1 ].concat(item.replaceWithValue);
+ array.splice.apply(array, spliceArgs);
+ });
+
+ return array
+}
+
+/**
+ * Some useful tools for working with `process.argv`.
+ *
+ * @module argv-tools
+ * @typicalName argvTools
+ * @example
+ * const argvTools = require('argv-tools')
+ */
+
+/**
+ * Regular expressions for matching option formats.
+ * @static
+ */
+const re = {
+ short: /^-([^\d-])$/,
+ long: /^--(\S+)/,
+ combinedShort: /^-[^\d-]{2,}$/,
+ optEquals: /^(--\S+?)=(.*)/
+};
+
+/**
+ * Array subclass encapsulating common operations on `process.argv`.
+ * @static
+ */
+class ArgvArray extends Array {
+ /**
+ * Clears the array has loads the supplied input.
+ * @param {string[]} argv - The argv list to load. Defaults to `process.argv`.
+ */
+ load (argv) {
+ this.clear();
+ if (argv && argv !== process.argv) {
+ argv = arrayify(argv);
+ } else {
+ /* if no argv supplied, assume we are parsing process.argv */
+ argv = process.argv.slice(0);
+ const deleteCount = process.execArgv.some(isExecArg) ? 1 : 2;
+ argv.splice(0, deleteCount);
+ }
+ argv.forEach(arg => this.push(String(arg)));
+ }
+
+ /**
+ * Clear the array.
+ */
+ clear () {
+ this.length = 0;
+ }
+
+ /**
+ * expand ``--option=value` style args.
+ */
+ expandOptionEqualsNotation () {
+ if (this.some(arg => re.optEquals.test(arg))) {
+ const expandedArgs = [];
+ this.forEach(arg => {
+ const matches = arg.match(re.optEquals);
+ if (matches) {
+ expandedArgs.push(matches[1], matches[2]);
+ } else {
+ expandedArgs.push(arg);
+ }
+ });
+ this.clear();
+ this.load(expandedArgs);
+ }
+ }
+
+ /**
+ * expand getopt-style combinedShort options.
+ */
+ expandGetoptNotation () {
+ if (this.hasCombinedShortOptions()) {
+ findReplace(this, re.combinedShort, expandCombinedShortArg);
+ }
+ }
+
+ /**
+ * Returns true if the array contains combined short options (e.g. `-ab`).
+ * @returns {boolean}
+ */
+ hasCombinedShortOptions () {
+ return this.some(arg => re.combinedShort.test(arg))
+ }
+
+ static from (argv) {
+ const result = new this();
+ result.load(argv);
+ return result
+ }
+}
+
+/**
+ * Expand a combined short option.
+ * @param {string} - the string to expand, e.g. `-ab`
+ * @returns {string[]}
+ * @static
+ */
+function expandCombinedShortArg (arg) {
+ /* remove initial hypen */
+ arg = arg.slice(1);
+ return arg.split('').map(letter => '-' + letter)
+}
+
+/**
+ * Returns true if the supplied arg matches `--option=value` notation.
+ * @param {string} - the arg to test, e.g. `--one=something`
+ * @returns {boolean}
+ * @static
+ */
+function isOptionEqualsNotation (arg) {
+ return re.optEquals.test(arg)
+}
+
+/**
+ * Returns true if the supplied arg is in either long (`--one`) or short (`-o`) format.
+ * @param {string} - the arg to test, e.g. `--one`
+ * @returns {boolean}
+ * @static
+ */
+function isOption (arg) {
+ return (re.short.test(arg) || re.long.test(arg)) && !re.optEquals.test(arg)
+}
+
+/**
+ * Returns true if the supplied arg is in long (`--one`) format.
+ * @param {string} - the arg to test, e.g. `--one`
+ * @returns {boolean}
+ * @static
+ */
+function isLongOption (arg) {
+ return re.long.test(arg) && !isOptionEqualsNotation(arg)
+}
+
+/**
+ * Returns the name from a long, short or `--options=value` arg.
+ * @param {string} - the arg to inspect, e.g. `--one`
+ * @returns {string}
+ * @static
+ */
+function getOptionName (arg) {
+ if (re.short.test(arg)) {
+ return arg.match(re.short)[1]
+ } else if (isLongOption(arg)) {
+ return arg.match(re.long)[1]
+ } else if (isOptionEqualsNotation(arg)) {
+ return arg.match(re.optEquals)[1].replace(/^--/, '')
+ } else {
+ return null
+ }
+}
+
+function isValue (arg) {
+ return !(isOption(arg) || re.combinedShort.test(arg) || re.optEquals.test(arg))
+}
+
+function isExecArg (arg) {
+ return ['--eval', '-e'].indexOf(arg) > -1 || arg.startsWith('--eval=')
+}
+
+/**
+ * For type-checking Javascript values.
+ * @module typical
+ * @typicalname t
+ * @example
+ * const t = require('typical')
+ */
+
+/**
+ * Returns true if input is a number
+ * @param {*} - the input to test
+ * @returns {boolean}
+ * @static
+ * @example
+ * > t.isNumber(0)
+ * true
+ * > t.isNumber(1)
+ * true
+ * > t.isNumber(1.1)
+ * true
+ * > t.isNumber(0xff)
+ * true
+ * > t.isNumber(0644)
+ * true
+ * > t.isNumber(6.2e5)
+ * true
+ * > t.isNumber(NaN)
+ * false
+ * > t.isNumber(Infinity)
+ * false
+ */
+function isNumber (n) {
+ return !isNaN(parseFloat(n)) && isFinite(n)
+}
+
+/**
+ * A plain object is a simple object literal, it is not an instance of a class. Returns true if the input `typeof` is `object` and directly decends from `Object`.
+ *
+ * @param {*} - the input to test
+ * @returns {boolean}
+ * @static
+ * @example
+ * > t.isPlainObject({ something: 'one' })
+ * true
+ * > t.isPlainObject(new Date())
+ * false
+ * > t.isPlainObject([ 0, 1 ])
+ * false
+ * > t.isPlainObject(/test/)
+ * false
+ * > t.isPlainObject(1)
+ * false
+ * > t.isPlainObject('one')
+ * false
+ * > t.isPlainObject(null)
+ * false
+ * > t.isPlainObject((function * () {})())
+ * false
+ * > t.isPlainObject(function * () {})
+ * false
+ */
+function isPlainObject (input) {
+ return input !== null && typeof input === 'object' && input.constructor === Object
+}
+
+/**
+ * An array-like value has all the properties of an array, but is not an array instance. Examples in the `arguments` object. Returns true if the input value is an object, not null and has a `length` property with a numeric value.
+ *
+ * @param {*} - the input to test
+ * @returns {boolean}
+ * @static
+ * @example
+ * function sum(x, y){
+ * console.log(t.isArrayLike(arguments))
+ * // prints `true`
+ * }
+ */
+function isArrayLike$2 (input) {
+ return isObject$2(input) && typeof input.length === 'number'
+}
+
+/**
+ * returns true if the typeof input is `'object'`, but not null!
+ * @param {*} - the input to test
+ * @returns {boolean}
+ * @static
+ */
+function isObject$2 (input) {
+ return typeof input === 'object' && input !== null
+}
+
+/**
+ * Returns true if the input value is defined
+ * @param {*} - the input to test
+ * @returns {boolean}
+ * @static
+ */
+function isDefined (input) {
+ return typeof input !== 'undefined'
+}
+
+/**
+ * Returns true if the input value is a string
+ * @param {*} - the input to test
+ * @returns {boolean}
+ * @static
+ */
+function isString (input) {
+ return typeof input === 'string'
+}
+
+/**
+ * Returns true if the input value is a boolean
+ * @param {*} - the input to test
+ * @returns {boolean}
+ * @static
+ */
+function isBoolean (input) {
+ return typeof input === 'boolean'
+}
+
+/**
+ * Returns true if the input value is a function
+ * @param {*} - the input to test
+ * @returns {boolean}
+ * @static
+ */
+function isFunction (input) {
+ return typeof input === 'function'
+}
+
+/**
+ * Returns true if the input value is an es2015 `class`.
+ * @param {*} - the input to test
+ * @returns {boolean}
+ * @static
+ */
+function isClass (input) {
+ if (isFunction(input)) {
+ return /^class /.test(Function.prototype.toString.call(input))
+ } else {
+ return false
+ }
+}
+
+/**
+ * Returns true if the input is a string, number, symbol, boolean, null or undefined value.
+ * @param {*} - the input to test
+ * @returns {boolean}
+ * @static
+ */
+function isPrimitive (input) {
+ if (input === null) return true
+ switch (typeof input) {
+ case 'string':
+ case 'number':
+ case 'symbol':
+ case 'undefined':
+ case 'boolean':
+ return true
+ default:
+ return false
+ }
+}
+
+/**
+ * Returns true if the input is a Promise.
+ * @param {*} - the input to test
+ * @returns {boolean}
+ * @static
+ */
+function isPromise (input) {
+ if (input) {
+ const isPromise = isDefined(Promise) && input instanceof Promise;
+ const isThenable = input.then && typeof input.then === 'function';
+ return !!(isPromise || isThenable)
+ } else {
+ return false
+ }
+}
+
+/**
+ * Returns true if the input is an iterable (`Map`, `Set`, `Array`, Generator etc.).
+ * @param {*} - the input to test
+ * @returns {boolean}
+ * @static
+ * @example
+ * > t.isIterable('string')
+ * true
+ * > t.isIterable(new Map())
+ * true
+ * > t.isIterable([])
+ * true
+ * > t.isIterable((function * () {})())
+ * true
+ * > t.isIterable(Promise.resolve())
+ * false
+ * > t.isIterable(Promise)
+ * false
+ * > t.isIterable(true)
+ * false
+ * > t.isIterable({})
+ * false
+ * > t.isIterable(0)
+ * false
+ * > t.isIterable(1.1)
+ * false
+ * > t.isIterable(NaN)
+ * false
+ * > t.isIterable(Infinity)
+ * false
+ * > t.isIterable(function () {})
+ * false
+ * > t.isIterable(Date)
+ * false
+ * > t.isIterable()
+ * false
+ * > t.isIterable({ then: function () {} })
+ * false
+ */
+function isIterable (input) {
+ if (input === null || !isDefined(input)) {
+ return false
+ } else {
+ return (
+ typeof input[Symbol.iterator] === 'function' ||
+ typeof input[Symbol.asyncIterator] === 'function'
+ )
+ }
+}
+
+var t = {
+ isNumber,
+ isString,
+ isBoolean,
+ isPlainObject,
+ isArrayLike: isArrayLike$2,
+ isObject: isObject$2,
+ isDefined,
+ isFunction,
+ isClass,
+ isPrimitive,
+ isPromise,
+ isIterable
+};
+
+/**
+ * @module option-definition
+ */
+
+/**
+ * Describes a command-line option. Additionally, if generating a usage guide with [command-line-usage](https://github.com/75lb/command-line-usage) you could optionally add `description` and `typeLabel` properties to each definition.
+ *
+ * @alias module:option-definition
+ * @typicalname option
+ */
+class OptionDefinition {
+ constructor (definition) {
+ /**
+ * The only required definition property is `name`, so the simplest working example is
+ * ```js
+ * const optionDefinitions = [
+ * { name: 'file' },
+ * { name: 'depth' }
+ * ]
+ * ```
+ *
+ * Where a `type` property is not specified it will default to `String`.
+ *
+ * | # | argv input | commandLineArgs() output |
+ * | --- | -------------------- | ------------ |
+ * | 1 | `--file` | `{ file: null }` |
+ * | 2 | `--file lib.js` | `{ file: 'lib.js' }` |
+ * | 3 | `--depth 2` | `{ depth: '2' }` |
+ *
+ * Unicode option names and aliases are valid, for example:
+ * ```js
+ * const optionDefinitions = [
+ * { name: 'один' },
+ * { name: '两' },
+ * { name: 'три', alias: 'т' }
+ * ]
+ * ```
+ * @type {string}
+ */
+ this.name = definition.name;
+
+ /**
+ * The `type` value is a setter function (you receive the output from this), enabling you to be specific about the type and value received.
+ *
+ * The most common values used are `String` (the default), `Number` and `Boolean` but you can use a custom function, for example:
+ *
+ * ```js
+ * const fs = require('fs')
+ *
+ * class FileDetails {
+ * constructor (filename) {
+ * this.filename = filename
+ * this.exists = fs.existsSync(filename)
+ * }
+ * }
+ *
+ * const cli = commandLineArgs([
+ * { name: 'file', type: filename => new FileDetails(filename) },
+ * { name: 'depth', type: Number }
+ * ])
+ * ```
+ *
+ * | # | argv input | commandLineArgs() output |
+ * | --- | ----------------- | ------------ |
+ * | 1 | `--file asdf.txt` | `{ file: { filename: 'asdf.txt', exists: false } }` |
+ *
+ * The `--depth` option expects a `Number`. If no value was set, you will receive `null`.
+ *
+ * | # | argv input | commandLineArgs() output |
+ * | --- | ----------------- | ------------ |
+ * | 2 | `--depth` | `{ depth: null }` |
+ * | 3 | `--depth 2` | `{ depth: 2 }` |
+ *
+ * @type {function}
+ * @default String
+ */
+ this.type = definition.type || String;
+
+ /**
+ * getopt-style short option names. Can be any single character (unicode included) except a digit or hyphen.
+ *
+ * ```js
+ * const optionDefinitions = [
+ * { name: 'hot', alias: 'h', type: Boolean },
+ * { name: 'discount', alias: 'd', type: Boolean },
+ * { name: 'courses', alias: 'c' , type: Number }
+ * ]
+ * ```
+ *
+ * | # | argv input | commandLineArgs() output |
+ * | --- | ------------ | ------------ |
+ * | 1 | `-hcd` | `{ hot: true, courses: null, discount: true }` |
+ * | 2 | `-hdc 3` | `{ hot: true, discount: true, courses: 3 }` |
+ *
+ * @type {string}
+ */
+ this.alias = definition.alias;
+
+ /**
+ * Set this flag if the option takes a list of values. You will receive an array of values, each passed through the `type` function (if specified).
+ *
+ * ```js
+ * const optionDefinitions = [
+ * { name: 'files', type: String, multiple: true }
+ * ]
+ * ```
+ *
+ * Note, examples 1 and 3 below demonstrate "greedy" parsing which can be disabled by using `lazyMultiple`.
+ *
+ * | # | argv input | commandLineArgs() output |
+ * | --- | ------------ | ------------ |
+ * | 1 | `--files one.js two.js` | `{ files: [ 'one.js', 'two.js' ] }` |
+ * | 2 | `--files one.js --files two.js` | `{ files: [ 'one.js', 'two.js' ] }` |
+ * | 3 | `--files *` | `{ files: [ 'one.js', 'two.js' ] }` |
+ *
+ * @type {boolean}
+ */
+ this.multiple = definition.multiple;
+
+ /**
+ * Identical to `multiple` but with greedy parsing disabled.
+ *
+ * ```js
+ * const optionDefinitions = [
+ * { name: 'files', lazyMultiple: true },
+ * { name: 'verbose', alias: 'v', type: Boolean, lazyMultiple: true }
+ * ]
+ * ```
+ *
+ * | # | argv input | commandLineArgs() output |
+ * | --- | ------------ | ------------ |
+ * | 1 | `--files one.js --files two.js` | `{ files: [ 'one.js', 'two.js' ] }` |
+ * | 2 | `-vvv` | `{ verbose: [ true, true, true ] }` |
+ *
+ * @type {boolean}
+ */
+ this.lazyMultiple = definition.lazyMultiple;
+
+ /**
+ * Any values unaccounted for by an option definition will be set on the `defaultOption`. This flag is typically set on the most commonly-used option to make for more concise usage (i.e. `$ example *.js` instead of `$ example --files *.js`).
+ *
+ * ```js
+ * const optionDefinitions = [
+ * { name: 'files', multiple: true, defaultOption: true }
+ * ]
+ * ```
+ *
+ * | # | argv input | commandLineArgs() output |
+ * | --- | ------------ | ------------ |
+ * | 1 | `--files one.js two.js` | `{ files: [ 'one.js', 'two.js' ] }` |
+ * | 2 | `one.js two.js` | `{ files: [ 'one.js', 'two.js' ] }` |
+ * | 3 | `*` | `{ files: [ 'one.js', 'two.js' ] }` |
+ *
+ * @type {boolean}
+ */
+ this.defaultOption = definition.defaultOption;
+
+ /**
+ * An initial value for the option.
+ *
+ * ```js
+ * const optionDefinitions = [
+ * { name: 'files', multiple: true, defaultValue: [ 'one.js' ] },
+ * { name: 'max', type: Number, defaultValue: 3 }
+ * ]
+ * ```
+ *
+ * | # | argv input | commandLineArgs() output |
+ * | --- | ------------ | ------------ |
+ * | 1 | | `{ files: [ 'one.js' ], max: 3 }` |
+ * | 2 | `--files two.js` | `{ files: [ 'two.js' ], max: 3 }` |
+ * | 3 | `--max 4` | `{ files: [ 'one.js' ], max: 4 }` |
+ *
+ * @type {*}
+ */
+ this.defaultValue = definition.defaultValue;
+
+ /**
+ * When your app has a large amount of options it makes sense to organise them in groups.
+ *
+ * There are two automatic groups: `_all` (contains all options) and `_none` (contains options without a `group` specified in their definition).
+ *
+ * ```js
+ * const optionDefinitions = [
+ * { name: 'verbose', group: 'standard' },
+ * { name: 'help', group: [ 'standard', 'main' ] },
+ * { name: 'compress', group: [ 'server', 'main' ] },
+ * { name: 'static', group: 'server' },
+ * { name: 'debug' }
+ * ]
+ * ```
+ *
+ *<table>
+ * <tr>
+ * <th>#</th><th>Command Line</th><th>commandLineArgs() output</th>
+ * </tr>
+ * <tr>
+ * <td>1</td><td><code>--verbose</code></td><td><pre><code>
+ *{
+ * _all: { verbose: true },
+ * standard: { verbose: true }
+ *}
+ *</code></pre></td>
+ * </tr>
+ * <tr>
+ * <td>2</td><td><code>--debug</code></td><td><pre><code>
+ *{
+ * _all: { debug: true },
+ * _none: { debug: true }
+ *}
+ *</code></pre></td>
+ * </tr>
+ * <tr>
+ * <td>3</td><td><code>--verbose --debug --compress</code></td><td><pre><code>
+ *{
+ * _all: {
+ * verbose: true,
+ * debug: true,
+ * compress: true
+ * },
+ * standard: { verbose: true },
+ * server: { compress: true },
+ * main: { compress: true },
+ * _none: { debug: true }
+ *}
+ *</code></pre></td>
+ * </tr>
+ * <tr>
+ * <td>4</td><td><code>--compress</code></td><td><pre><code>
+ *{
+ * _all: { compress: true },
+ * server: { compress: true },
+ * main: { compress: true }
+ *}
+ *</code></pre></td>
+ * </tr>
+ *</table>
+ *
+ * @type {string|string[]}
+ */
+ this.group = definition.group;
+
+ /* pick up any remaining properties */
+ for (const prop in definition) {
+ if (!this[prop]) this[prop] = definition[prop];
+ }
+ }
+
+ isBoolean () {
+ return this.type === Boolean || (t.isFunction(this.type) && this.type.name === 'Boolean')
+ }
+
+ isMultiple () {
+ return this.multiple || this.lazyMultiple
+ }
+
+ static create (def) {
+ const result = new this(def);
+ return result
+ }
+}
+
+/**
+ * @module option-definitions
+ */
+
+/**
+ * @alias module:option-definitions
+ */
+class Definitions extends Array {
+ /**
+ * validate option definitions
+ * @param {boolean} [caseInsensitive=false] - whether arguments will be parsed in a case insensitive manner
+ * @returns {string}
+ */
+ validate (caseInsensitive) {
+ const someHaveNoName = this.some(def => !def.name);
+ if (someHaveNoName) {
+ halt(
+ 'INVALID_DEFINITIONS',
+ 'Invalid option definitions: the `name` property is required on each definition'
+ );
+ }
+
+ const someDontHaveFunctionType = this.some(def => def.type && typeof def.type !== 'function');
+ if (someDontHaveFunctionType) {
+ halt(
+ 'INVALID_DEFINITIONS',
+ 'Invalid option definitions: the `type` property must be a setter fuction (default: `Boolean`)'
+ );
+ }
+
+ let invalidOption;
+
+ const numericAlias = this.some(def => {
+ invalidOption = def;
+ return t.isDefined(def.alias) && t.isNumber(def.alias)
+ });
+ if (numericAlias) {
+ halt(
+ 'INVALID_DEFINITIONS',
+ 'Invalid option definition: to avoid ambiguity an alias cannot be numeric [--' + invalidOption.name + ' alias is -' + invalidOption.alias + ']'
+ );
+ }
+
+ const multiCharacterAlias = this.some(def => {
+ invalidOption = def;
+ return t.isDefined(def.alias) && def.alias.length !== 1
+ });
+ if (multiCharacterAlias) {
+ halt(
+ 'INVALID_DEFINITIONS',
+ 'Invalid option definition: an alias must be a single character'
+ );
+ }
+
+ const hypenAlias = this.some(def => {
+ invalidOption = def;
+ return def.alias === '-'
+ });
+ if (hypenAlias) {
+ halt(
+ 'INVALID_DEFINITIONS',
+ 'Invalid option definition: an alias cannot be "-"'
+ );
+ }
+
+ const duplicateName = hasDuplicates(this.map(def => caseInsensitive ? def.name.toLowerCase() : def.name));
+ if (duplicateName) {
+ halt(
+ 'INVALID_DEFINITIONS',
+ 'Two or more option definitions have the same name'
+ );
+ }
+
+ const duplicateAlias = hasDuplicates(this.map(def => caseInsensitive && t.isDefined(def.alias) ? def.alias.toLowerCase() : def.alias));
+ if (duplicateAlias) {
+ halt(
+ 'INVALID_DEFINITIONS',
+ 'Two or more option definitions have the same alias'
+ );
+ }
+
+ const duplicateDefaultOption = this.filter(def => def.defaultOption === true).length > 1;
+ if (duplicateDefaultOption) {
+ halt(
+ 'INVALID_DEFINITIONS',
+ 'Only one option definition can be the defaultOption'
+ );
+ }
+
+ const defaultBoolean = this.some(def => {
+ invalidOption = def;
+ return def.isBoolean() && def.defaultOption
+ });
+ if (defaultBoolean) {
+ halt(
+ 'INVALID_DEFINITIONS',
+ `A boolean option ["${invalidOption.name}"] can not also be the defaultOption.`
+ );
+ }
+ }
+
+ /**
+ * Get definition by option arg (e.g. `--one` or `-o`)
+ * @param {string} [arg] the argument name to get the definition for
+ * @param {boolean} [caseInsensitive] whether to use case insensitive comparisons when finding the appropriate definition
+ * @returns {Definition}
+ */
+ get (arg, caseInsensitive) {
+ if (isOption(arg)) {
+ if (re.short.test(arg)) {
+ const shortOptionName = getOptionName(arg);
+ if (caseInsensitive) {
+ const lowercaseShortOptionName = shortOptionName.toLowerCase();
+ return this.find(def => t.isDefined(def.alias) && def.alias.toLowerCase() === lowercaseShortOptionName)
+ } else {
+ return this.find(def => def.alias === shortOptionName)
+ }
+ } else {
+ const optionName = getOptionName(arg);
+ if (caseInsensitive) {
+ const lowercaseOptionName = optionName.toLowerCase();
+ return this.find(def => def.name.toLowerCase() === lowercaseOptionName)
+ } else {
+ return this.find(def => def.name === optionName)
+ }
+ }
+ } else {
+ return this.find(def => def.name === arg)
+ }
+ }
+
+ getDefault () {
+ return this.find(def => def.defaultOption === true)
+ }
+
+ isGrouped () {
+ return this.some(def => def.group)
+ }
+
+ whereGrouped () {
+ return this.filter(containsValidGroup)
+ }
+
+ whereNotGrouped () {
+ return this.filter(def => !containsValidGroup(def))
+ }
+
+ whereDefaultValueSet () {
+ return this.filter(def => t.isDefined(def.defaultValue))
+ }
+
+ static from (definitions, caseInsensitive) {
+ if (definitions instanceof this) return definitions
+ const result = super.from(arrayify(definitions), def => OptionDefinition.create(def));
+ result.validate(caseInsensitive);
+ return result
+ }
+}
+
+function halt (name, message) {
+ const err = new Error(message);
+ err.name = name;
+ throw err
+}
+
+function containsValidGroup (def) {
+ return arrayify(def.group).some(group => group)
+}
+
+function hasDuplicates (array) {
+ const items = {};
+ for (let i = 0; i < array.length; i++) {
+ const value = array[i];
+ if (items[value]) {
+ return true
+ } else {
+ if (t.isDefined(value)) items[value] = true;
+ }
+ }
+}
+
+/**
+ * @module argv-parser
+ */
+
+/**
+ * @alias module:argv-parser
+ */
+class ArgvParser {
+ /**
+ * @param {OptionDefinitions} - Definitions array
+ * @param {object} [options] - Options
+ * @param {string[]} [options.argv] - Overrides `process.argv`
+ * @param {boolean} [options.stopAtFirstUnknown] -
+ * @param {boolean} [options.caseInsensitive] - Arguments will be parsed in a case insensitive manner. Defaults to false.
+ */
+ constructor (definitions, options) {
+ this.options = Object.assign({}, options);
+ /**
+ * Option Definitions
+ */
+ this.definitions = Definitions.from(definitions, this.options.caseInsensitive);
+
+ /**
+ * Argv
+ */
+ this.argv = ArgvArray.from(this.options.argv);
+ if (this.argv.hasCombinedShortOptions()) {
+ findReplace(this.argv, re.combinedShort.test.bind(re.combinedShort), arg => {
+ arg = arg.slice(1);
+ return arg.split('').map(letter => ({ origArg: `-${arg}`, arg: '-' + letter }))
+ });
+ }
+ }
+
+ /**
+ * Yields one `{ event, name, value, arg, def }` argInfo object for each arg in `process.argv` (or `options.argv`).
+ */
+ * [Symbol.iterator] () {
+ const definitions = this.definitions;
+
+ let def;
+ let value;
+ let name;
+ let event;
+ let singularDefaultSet = false;
+ let unknownFound = false;
+ let origArg;
+
+ for (let arg of this.argv) {
+ if (t.isPlainObject(arg)) {
+ origArg = arg.origArg;
+ arg = arg.arg;
+ }
+
+ if (unknownFound && this.options.stopAtFirstUnknown) {
+ yield { event: 'unknown_value', arg, name: '_unknown', value: undefined };
+ continue
+ }
+
+ /* handle long or short option */
+ if (isOption(arg)) {
+ def = definitions.get(arg, this.options.caseInsensitive);
+ value = undefined;
+ if (def) {
+ value = def.isBoolean() ? true : null;
+ event = 'set';
+ } else {
+ event = 'unknown_option';
+ }
+
+ /* handle --option-value notation */
+ } else if (isOptionEqualsNotation(arg)) {
+ const matches = arg.match(re.optEquals);
+ def = definitions.get(matches[1], this.options.caseInsensitive);
+ if (def) {
+ if (def.isBoolean()) {
+ yield { event: 'unknown_value', arg, name: '_unknown', value, def };
+ event = 'set';
+ value = true;
+ } else {
+ event = 'set';
+ value = matches[2];
+ }
+ } else {
+ event = 'unknown_option';
+ }
+
+ /* handle value */
+ } else if (isValue(arg)) {
+ if (def) {
+ value = arg;
+ event = 'set';
+ } else {
+ /* get the defaultOption */
+ def = this.definitions.getDefault();
+ if (def && !singularDefaultSet) {
+ value = arg;
+ event = 'set';
+ } else {
+ event = 'unknown_value';
+ def = undefined;
+ }
+ }
+ }
+
+ name = def ? def.name : '_unknown';
+ const argInfo = { event, arg, name, value, def };
+ if (origArg) {
+ argInfo.subArg = arg;
+ argInfo.arg = origArg;
+ }
+ yield argInfo;
+
+ /* unknownFound logic */
+ if (name === '_unknown') unknownFound = true;
+
+ /* singularDefaultSet logic */
+ if (def && def.defaultOption && !def.isMultiple() && event === 'set') singularDefaultSet = true;
+
+ /* reset values once consumed and yielded */
+ if (def && def.isBoolean()) def = undefined;
+ /* reset the def if it's a singular which has been set */
+ if (def && !def.multiple && t.isDefined(value) && value !== null) {
+ def = undefined;
+ }
+ value = undefined;
+ event = undefined;
+ name = undefined;
+ origArg = undefined;
+ }
+ }
+}
+
+const _value = new WeakMap();
+
+/**
+ * Encapsulates behaviour (defined by an OptionDefinition) when setting values
+ */
+class Option {
+ constructor (definition) {
+ this.definition = new OptionDefinition(definition);
+ this.state = null; /* set or default */
+ this.resetToDefault();
+ }
+
+ get () {
+ return _value.get(this)
+ }
+
+ set (val) {
+ this._set(val, 'set');
+ }
+
+ _set (val, state) {
+ const def = this.definition;
+ if (def.isMultiple()) {
+ /* don't add null or undefined to a multiple */
+ if (val !== null && val !== undefined) {
+ const arr = this.get();
+ if (this.state === 'default') arr.length = 0;
+ arr.push(def.type(val));
+ this.state = state;
+ }
+ } else {
+ /* throw if already set on a singlar defaultOption */
+ if (!def.isMultiple() && this.state === 'set') {
+ const err = new Error(`Singular option already set [${this.definition.name}=${this.get()}]`);
+ err.name = 'ALREADY_SET';
+ err.value = val;
+ err.optionName = def.name;
+ throw err
+ } else if (val === null || val === undefined) {
+ _value.set(this, val);
+ // /* required to make 'partial: defaultOption with value equal to defaultValue 2' pass */
+ // if (!(def.defaultOption && !def.isMultiple())) {
+ // this.state = state
+ // }
+ } else {
+ _value.set(this, def.type(val));
+ this.state = state;
+ }
+ }
+ }
+
+ resetToDefault () {
+ if (t.isDefined(this.definition.defaultValue)) {
+ if (this.definition.isMultiple()) {
+ _value.set(this, arrayify(this.definition.defaultValue).slice());
+ } else {
+ _value.set(this, this.definition.defaultValue);
+ }
+ } else {
+ if (this.definition.isMultiple()) {
+ _value.set(this, []);
+ } else {
+ _value.set(this, null);
+ }
+ }
+ this.state = 'default';
+ }
+
+ static create (definition) {
+ definition = new OptionDefinition(definition);
+ if (definition.isBoolean()) {
+ return FlagOption.create(definition)
+ } else {
+ return new this(definition)
+ }
+ }
+}
+
+class FlagOption extends Option {
+ set (val) {
+ super.set(true);
+ }
+
+ static create (def) {
+ return new this(def)
+ }
+}
+
+/**
+ * A map of { DefinitionNameString: Option }. By default, an Output has an `_unknown` property and any options with defaultValues.
+ */
+class Output extends Map {
+ constructor (definitions) {
+ super();
+ /**
+ * @type {OptionDefinitions}
+ */
+ this.definitions = Definitions.from(definitions);
+
+ /* by default, an Output has an `_unknown` property and any options with defaultValues */
+ this.set('_unknown', Option.create({ name: '_unknown', multiple: true }));
+ for (const def of this.definitions.whereDefaultValueSet()) {
+ this.set(def.name, Option.create(def));
+ }
+ }
+
+ toObject (options) {
+ options = options || {};
+ const output = {};
+ for (const item of this) {
+ const name = options.camelCase && item[0] !== '_unknown' ? camelCase(item[0]) : item[0];
+ const option = item[1];
+ if (name === '_unknown' && !option.get().length) continue
+ output[name] = option.get();
+ }
+
+ if (options.skipUnknown) delete output._unknown;
+ return output
+ }
+}
+
+class GroupedOutput extends Output {
+ toObject (options) {
+ const superOutputNoCamel = super.toObject({ skipUnknown: options.skipUnknown });
+ const superOutput = super.toObject(options);
+ const unknown = superOutput._unknown;
+ delete superOutput._unknown;
+ const grouped = {
+ _all: superOutput
+ };
+ if (unknown && unknown.length) grouped._unknown = unknown;
+
+ this.definitions.whereGrouped().forEach(def => {
+ const name = options.camelCase ? camelCase(def.name) : def.name;
+ const outputValue = superOutputNoCamel[def.name];
+ for (const groupName of arrayify(def.group)) {
+ grouped[groupName] = grouped[groupName] || {};
+ if (t.isDefined(outputValue)) {
+ grouped[groupName][name] = outputValue;
+ }
+ }
+ });
+
+ this.definitions.whereNotGrouped().forEach(def => {
+ const name = options.camelCase ? camelCase(def.name) : def.name;
+ const outputValue = superOutputNoCamel[def.name];
+ if (t.isDefined(outputValue)) {
+ if (!grouped._none) grouped._none = {};
+ grouped._none[name] = outputValue;
+ }
+ });
+ return grouped
+ }
+}
+
+/**
+ * @module command-line-args
+ */
+
+/**
+ * Returns an object containing all option values set on the command line. By default it parses the global [`process.argv`](https://nodejs.org/api/process.html#process_process_argv) array.
+ *
+ * Parsing is strict by default - an exception is thrown if the user sets a singular option more than once or sets an unknown value or option (one without a valid [definition](https://github.com/75lb/command-line-args/blob/master/doc/option-definition.md)). To be more permissive, enabling [partial](https://github.com/75lb/command-line-args/wiki/Partial-mode-example) or [stopAtFirstUnknown](https://github.com/75lb/command-line-args/wiki/stopAtFirstUnknown) modes will return known options in the usual manner while collecting unknown arguments in a separate `_unknown` property.
+ *
+ * @param {Array<OptionDefinition>} - An array of [OptionDefinition](https://github.com/75lb/command-line-args/blob/master/doc/option-definition.md) objects
+ * @param {object} [options] - Options.
+ * @param {string[]} [options.argv] - An array of strings which, if present will be parsed instead of `process.argv`.
+ * @param {boolean} [options.partial] - If `true`, an array of unknown arguments is returned in the `_unknown` property of the output.
+ * @param {boolean} [options.stopAtFirstUnknown] - If `true`, parsing will stop at the first unknown argument and the remaining arguments returned in `_unknown`. When set, `partial: true` is also implied.
+ * @param {boolean} [options.camelCase] - If `true`, options with hypenated names (e.g. `move-to`) will be returned in camel-case (e.g. `moveTo`).
+ * @param {boolean} [options.caseInsensitive] - If `true`, the case of each option name or alias parsed is insignificant. In other words, both `--Verbose` and `--verbose`, `-V` and `-v` would be equivalent. Defaults to false.
+ * @returns {object}
+ * @throws `UNKNOWN_OPTION` If `options.partial` is false and the user set an undefined option. The `err.optionName` property contains the arg that specified an unknown option, e.g. `--one`.
+ * @throws `UNKNOWN_VALUE` If `options.partial` is false and the user set a value unaccounted for by an option definition. The `err.value` property contains the unknown value, e.g. `5`.
+ * @throws `ALREADY_SET` If a user sets a singular, non-multiple option more than once. The `err.optionName` property contains the option name that has already been set, e.g. `one`.
+ * @throws `INVALID_DEFINITIONS`
+ * - If an option definition is missing the required `name` property
+ * - If an option definition has a `type` value that's not a function
+ * - If an alias is numeric, a hyphen or a length other than 1
+ * - If an option definition name was used more than once
+ * - If an option definition alias was used more than once
+ * - If more than one option definition has `defaultOption: true`
+ * - If a `Boolean` option is also set as the `defaultOption`.
+ * @alias module:command-line-args
+ */
+function commandLineArgs (optionDefinitions, options) {
+ options = options || {};
+ if (options.stopAtFirstUnknown) options.partial = true;
+ optionDefinitions = Definitions.from(optionDefinitions, options.caseInsensitive);
+
+ const parser = new ArgvParser(optionDefinitions, {
+ argv: options.argv,
+ stopAtFirstUnknown: options.stopAtFirstUnknown,
+ caseInsensitive: options.caseInsensitive
+ });
+
+ const OutputClass = optionDefinitions.isGrouped() ? GroupedOutput : Output;
+ const output = new OutputClass(optionDefinitions);
+
+ /* Iterate the parser setting each known value to the output. Optionally, throw on unknowns. */
+ for (const argInfo of parser) {
+ const arg = argInfo.subArg || argInfo.arg;
+ if (!options.partial) {
+ if (argInfo.event === 'unknown_value') {
+ const err = new Error(`Unknown value: ${arg}`);
+ err.name = 'UNKNOWN_VALUE';
+ err.value = arg;
+ throw err
+ } else if (argInfo.event === 'unknown_option') {
+ const err = new Error(`Unknown option: ${arg}`);
+ err.name = 'UNKNOWN_OPTION';
+ err.optionName = arg;
+ throw err
+ }
+ }
+
+ let option;
+ if (output.has(argInfo.name)) {
+ option = output.get(argInfo.name);
+ } else {
+ option = Option.create(argInfo.def);
+ output.set(argInfo.name, option);
+ }
+
+ if (argInfo.name === '_unknown') {
+ option.set(arg);
+ } else {
+ option.set(argInfo.value);
+ }
+ }
+
+ return output.toObject({ skipUnknown: !options.partial, camelCase: options.camelCase })
+}
+
+export default commandLineArgs;
diff --git a/node_modules/command-line-args/index.mjs b/node_modules/command-line-args/index.mjs
new file mode 100644
index 0000000..4ce4dea
--- /dev/null
+++ b/node_modules/command-line-args/index.mjs
@@ -0,0 +1,86 @@
+import Definitions from './lib/option-definitions.mjs'
+import ArgvParser from './lib/argv-parser.mjs'
+import Option from './lib/option.mjs'
+import OutputGrouped from './lib/output-grouped.mjs'
+import Output from './lib/output.mjs'
+
+/**
+ * @module command-line-args
+ */
+
+/**
+ * Returns an object containing all option values set on the command line. By default it parses the global [`process.argv`](https://nodejs.org/api/process.html#process_process_argv) array.
+ *
+ * Parsing is strict by default - an exception is thrown if the user sets a singular option more than once or sets an unknown value or option (one without a valid [definition](https://github.com/75lb/command-line-args/blob/master/doc/option-definition.md)). To be more permissive, enabling [partial](https://github.com/75lb/command-line-args/wiki/Partial-mode-example) or [stopAtFirstUnknown](https://github.com/75lb/command-line-args/wiki/stopAtFirstUnknown) modes will return known options in the usual manner while collecting unknown arguments in a separate `_unknown` property.
+ *
+ * @param {Array<OptionDefinition>} - An array of [OptionDefinition](https://github.com/75lb/command-line-args/blob/master/doc/option-definition.md) objects
+ * @param {object} [options] - Options.
+ * @param {string[]} [options.argv] - An array of strings which, if present will be parsed instead of `process.argv`.
+ * @param {boolean} [options.partial] - If `true`, an array of unknown arguments is returned in the `_unknown` property of the output.
+ * @param {boolean} [options.stopAtFirstUnknown] - If `true`, parsing will stop at the first unknown argument and the remaining arguments returned in `_unknown`. When set, `partial: true` is also implied.
+ * @param {boolean} [options.camelCase] - If `true`, options with hypenated names (e.g. `move-to`) will be returned in camel-case (e.g. `moveTo`).
+ * @param {boolean} [options.caseInsensitive] - If `true`, the case of each option name or alias parsed is insignificant. In other words, both `--Verbose` and `--verbose`, `-V` and `-v` would be equivalent. Defaults to false.
+ * @returns {object}
+ * @throws `UNKNOWN_OPTION` If `options.partial` is false and the user set an undefined option. The `err.optionName` property contains the arg that specified an unknown option, e.g. `--one`.
+ * @throws `UNKNOWN_VALUE` If `options.partial` is false and the user set a value unaccounted for by an option definition. The `err.value` property contains the unknown value, e.g. `5`.
+ * @throws `ALREADY_SET` If a user sets a singular, non-multiple option more than once. The `err.optionName` property contains the option name that has already been set, e.g. `one`.
+ * @throws `INVALID_DEFINITIONS`
+ * - If an option definition is missing the required `name` property
+ * - If an option definition has a `type` value that's not a function
+ * - If an alias is numeric, a hyphen or a length other than 1
+ * - If an option definition name was used more than once
+ * - If an option definition alias was used more than once
+ * - If more than one option definition has `defaultOption: true`
+ * - If a `Boolean` option is also set as the `defaultOption`.
+ * @alias module:command-line-args
+ */
+function commandLineArgs (optionDefinitions, options) {
+ options = options || {}
+ if (options.stopAtFirstUnknown) options.partial = true
+ optionDefinitions = Definitions.from(optionDefinitions, options.caseInsensitive)
+
+ const parser = new ArgvParser(optionDefinitions, {
+ argv: options.argv,
+ stopAtFirstUnknown: options.stopAtFirstUnknown,
+ caseInsensitive: options.caseInsensitive
+ })
+
+ const OutputClass = optionDefinitions.isGrouped() ? OutputGrouped : Output
+ const output = new OutputClass(optionDefinitions)
+
+ /* Iterate the parser setting each known value to the output. Optionally, throw on unknowns. */
+ for (const argInfo of parser) {
+ const arg = argInfo.subArg || argInfo.arg
+ if (!options.partial) {
+ if (argInfo.event === 'unknown_value') {
+ const err = new Error(`Unknown value: ${arg}`)
+ err.name = 'UNKNOWN_VALUE'
+ err.value = arg
+ throw err
+ } else if (argInfo.event === 'unknown_option') {
+ const err = new Error(`Unknown option: ${arg}`)
+ err.name = 'UNKNOWN_OPTION'
+ err.optionName = arg
+ throw err
+ }
+ }
+
+ let option
+ if (output.has(argInfo.name)) {
+ option = output.get(argInfo.name)
+ } else {
+ option = Option.create(argInfo.def)
+ output.set(argInfo.name, option)
+ }
+
+ if (argInfo.name === '_unknown') {
+ option.set(arg)
+ } else {
+ option.set(argInfo.value)
+ }
+ }
+
+ return output.toObject({ skipUnknown: !options.partial, camelCase: options.camelCase })
+}
+
+export default commandLineArgs
diff --git a/node_modules/command-line-args/lib/argv-parser.mjs b/node_modules/command-line-args/lib/argv-parser.mjs
new file mode 100644
index 0000000..a2335d3
--- /dev/null
+++ b/node_modules/command-line-args/lib/argv-parser.mjs
@@ -0,0 +1,139 @@
+import * as argvTools from './argv-tools.mjs'
+import Definitions from './option-definitions.mjs'
+import findReplace from '../node_modules/find-replace/dist/index.mjs'
+import t from '../node_modules/typical/index.mjs'
+
+/**
+ * @module argv-parser
+ */
+
+/**
+ * @alias module:argv-parser
+ */
+class ArgvParser {
+ /**
+ * @param {OptionDefinitions} - Definitions array
+ * @param {object} [options] - Options
+ * @param {string[]} [options.argv] - Overrides `process.argv`
+ * @param {boolean} [options.stopAtFirstUnknown] -
+ * @param {boolean} [options.caseInsensitive] - Arguments will be parsed in a case insensitive manner. Defaults to false.
+ */
+ constructor (definitions, options) {
+ this.options = Object.assign({}, options)
+ /**
+ * Option Definitions
+ */
+ this.definitions = Definitions.from(definitions, this.options.caseInsensitive)
+
+ /**
+ * Argv
+ */
+ this.argv = argvTools.ArgvArray.from(this.options.argv)
+ if (this.argv.hasCombinedShortOptions()) {
+ findReplace(this.argv, argvTools.re.combinedShort.test.bind(argvTools.re.combinedShort), arg => {
+ arg = arg.slice(1)
+ return arg.split('').map(letter => ({ origArg: `-${arg}`, arg: '-' + letter }))
+ })
+ }
+ }
+
+ /**
+ * Yields one `{ event, name, value, arg, def }` argInfo object for each arg in `process.argv` (or `options.argv`).
+ */
+ * [Symbol.iterator] () {
+ const definitions = this.definitions
+
+ let def
+ let value
+ let name
+ let event
+ let singularDefaultSet = false
+ let unknownFound = false
+ let origArg
+
+ for (let arg of this.argv) {
+ if (t.isPlainObject(arg)) {
+ origArg = arg.origArg
+ arg = arg.arg
+ }
+
+ if (unknownFound && this.options.stopAtFirstUnknown) {
+ yield { event: 'unknown_value', arg, name: '_unknown', value: undefined }
+ continue
+ }
+
+ /* handle long or short option */
+ if (argvTools.isOption(arg)) {
+ def = definitions.get(arg, this.options.caseInsensitive)
+ value = undefined
+ if (def) {
+ value = def.isBoolean() ? true : null
+ event = 'set'
+ } else {
+ event = 'unknown_option'
+ }
+
+ /* handle --option-value notation */
+ } else if (argvTools.isOptionEqualsNotation(arg)) {
+ const matches = arg.match(argvTools.re.optEquals)
+ def = definitions.get(matches[1], this.options.caseInsensitive)
+ if (def) {
+ if (def.isBoolean()) {
+ yield { event: 'unknown_value', arg, name: '_unknown', value, def }
+ event = 'set'
+ value = true
+ } else {
+ event = 'set'
+ value = matches[2]
+ }
+ } else {
+ event = 'unknown_option'
+ }
+
+ /* handle value */
+ } else if (argvTools.isValue(arg)) {
+ if (def) {
+ value = arg
+ event = 'set'
+ } else {
+ /* get the defaultOption */
+ def = this.definitions.getDefault()
+ if (def && !singularDefaultSet) {
+ value = arg
+ event = 'set'
+ } else {
+ event = 'unknown_value'
+ def = undefined
+ }
+ }
+ }
+
+ name = def ? def.name : '_unknown'
+ const argInfo = { event, arg, name, value, def }
+ if (origArg) {
+ argInfo.subArg = arg
+ argInfo.arg = origArg
+ }
+ yield argInfo
+
+ /* unknownFound logic */
+ if (name === '_unknown') unknownFound = true
+
+ /* singularDefaultSet logic */
+ if (def && def.defaultOption && !def.isMultiple() && event === 'set') singularDefaultSet = true
+
+ /* reset values once consumed and yielded */
+ if (def && def.isBoolean()) def = undefined
+ /* reset the def if it's a singular which has been set */
+ if (def && !def.multiple && t.isDefined(value) && value !== null) {
+ def = undefined
+ }
+ value = undefined
+ event = undefined
+ name = undefined
+ origArg = undefined
+ }
+ }
+}
+
+export default ArgvParser
diff --git a/node_modules/command-line-args/lib/argv-tools.mjs b/node_modules/command-line-args/lib/argv-tools.mjs
new file mode 100644
index 0000000..7a0e426
--- /dev/null
+++ b/node_modules/command-line-args/lib/argv-tools.mjs
@@ -0,0 +1,173 @@
+import arrayify from '../node_modules/array-back/index.mjs'
+import findReplace from '../node_modules/find-replace/dist/index.mjs'
+
+/**
+ * Some useful tools for working with `process.argv`.
+ *
+ * @module argv-tools
+ * @typicalName argvTools
+ * @example
+ * const argvTools = require('argv-tools')
+ */
+
+/**
+ * Regular expressions for matching option formats.
+ * @static
+ */
+const re = {
+ short: /^-([^\d-])$/,
+ long: /^--(\S+)/,
+ combinedShort: /^-[^\d-]{2,}$/,
+ optEquals: /^(--\S+?)=(.*)/
+}
+
+/**
+ * Array subclass encapsulating common operations on `process.argv`.
+ * @static
+ */
+class ArgvArray extends Array {
+ /**
+ * Clears the array has loads the supplied input.
+ * @param {string[]} argv - The argv list to load. Defaults to `process.argv`.
+ */
+ load (argv) {
+ this.clear()
+ if (argv && argv !== process.argv) {
+ argv = arrayify(argv)
+ } else {
+ /* if no argv supplied, assume we are parsing process.argv */
+ argv = process.argv.slice(0)
+ const deleteCount = process.execArgv.some(isExecArg) ? 1 : 2
+ argv.splice(0, deleteCount)
+ }
+ argv.forEach(arg => this.push(String(arg)))
+ }
+
+ /**
+ * Clear the array.
+ */
+ clear () {
+ this.length = 0
+ }
+
+ /**
+ * expand ``--option=value` style args.
+ */
+ expandOptionEqualsNotation () {
+ if (this.some(arg => re.optEquals.test(arg))) {
+ const expandedArgs = []
+ this.forEach(arg => {
+ const matches = arg.match(re.optEquals)
+ if (matches) {
+ expandedArgs.push(matches[1], matches[2])
+ } else {
+ expandedArgs.push(arg)
+ }
+ })
+ this.clear()
+ this.load(expandedArgs)
+ }
+ }
+
+ /**
+ * expand getopt-style combinedShort options.
+ */
+ expandGetoptNotation () {
+ if (this.hasCombinedShortOptions()) {
+ findReplace(this, re.combinedShort, expandCombinedShortArg)
+ }
+ }
+
+ /**
+ * Returns true if the array contains combined short options (e.g. `-ab`).
+ * @returns {boolean}
+ */
+ hasCombinedShortOptions () {
+ return this.some(arg => re.combinedShort.test(arg))
+ }
+
+ static from (argv) {
+ const result = new this()
+ result.load(argv)
+ return result
+ }
+}
+
+/**
+ * Expand a combined short option.
+ * @param {string} - the string to expand, e.g. `-ab`
+ * @returns {string[]}
+ * @static
+ */
+function expandCombinedShortArg (arg) {
+ /* remove initial hypen */
+ arg = arg.slice(1)
+ return arg.split('').map(letter => '-' + letter)
+}
+
+/**
+ * Returns true if the supplied arg matches `--option=value` notation.
+ * @param {string} - the arg to test, e.g. `--one=something`
+ * @returns {boolean}
+ * @static
+ */
+function isOptionEqualsNotation (arg) {
+ return re.optEquals.test(arg)
+}
+
+/**
+ * Returns true if the supplied arg is in either long (`--one`) or short (`-o`) format.
+ * @param {string} - the arg to test, e.g. `--one`
+ * @returns {boolean}
+ * @static
+ */
+function isOption (arg) {
+ return (re.short.test(arg) || re.long.test(arg)) && !re.optEquals.test(arg)
+}
+
+/**
+ * Returns true if the supplied arg is in long (`--one`) format.
+ * @param {string} - the arg to test, e.g. `--one`
+ * @returns {boolean}
+ * @static
+ */
+function isLongOption (arg) {
+ return re.long.test(arg) && !isOptionEqualsNotation(arg)
+}
+
+/**
+ * Returns the name from a long, short or `--options=value` arg.
+ * @param {string} - the arg to inspect, e.g. `--one`
+ * @returns {string}
+ * @static
+ */
+function getOptionName (arg) {
+ if (re.short.test(arg)) {
+ return arg.match(re.short)[1]
+ } else if (isLongOption(arg)) {
+ return arg.match(re.long)[1]
+ } else if (isOptionEqualsNotation(arg)) {
+ return arg.match(re.optEquals)[1].replace(/^--/, '')
+ } else {
+ return null
+ }
+}
+
+function isValue (arg) {
+ return !(isOption(arg) || re.combinedShort.test(arg) || re.optEquals.test(arg))
+}
+
+function isExecArg (arg) {
+ return ['--eval', '-e'].indexOf(arg) > -1 || arg.startsWith('--eval=')
+}
+
+export {
+ expandCombinedShortArg,
+ re,
+ ArgvArray,
+ getOptionName,
+ isOption,
+ isLongOption,
+ isOptionEqualsNotation,
+ isValue
+}
diff --git a/node_modules/command-line-args/lib/option-definition.mjs b/node_modules/command-line-args/lib/option-definition.mjs
new file mode 100644
index 0000000..eb2e65c
--- /dev/null
+++ b/node_modules/command-line-args/lib/option-definition.mjs
@@ -0,0 +1,265 @@
+import t from '../node_modules/typical/index.mjs'
+
+/**
+ * @module option-definition
+ */
+
+/**
+ * Describes a command-line option. Additionally, if generating a usage guide with [command-line-usage](https://github.com/75lb/command-line-usage) you could optionally add `description` and `typeLabel` properties to each definition.
+ *
+ * @alias module:option-definition
+ * @typicalname option
+ */
+class OptionDefinition {
+ constructor (definition) {
+ /**
+ * The only required definition property is `name`, so the simplest working example is
+ * ```js
+ * const optionDefinitions = [
+ * { name: 'file' },
+ * { name: 'depth' }
+ * ]
+ * ```
+ *
+ * Where a `type` property is not specified it will default to `String`.
+ *
+ * | # | argv input | commandLineArgs() output |
+ * | --- | -------------------- | ------------ |
+ * | 1 | `--file` | `{ file: null }` |
+ * | 2 | `--file lib.js` | `{ file: 'lib.js' }` |
+ * | 3 | `--depth 2` | `{ depth: '2' }` |
+ *
+ * Unicode option names and aliases are valid, for example:
+ * ```js
+ * const optionDefinitions = [
+ * { name: 'один' },
+ * { name: '两' },
+ * { name: 'три', alias: 'т' }
+ * ]
+ * ```
+ * @type {string}
+ */
+ this.name = definition.name
+
+ /**
+ * The `type` value is a setter function (you receive the output from this), enabling you to be specific about the type and value received.
+ *
+ * The most common values used are `String` (the default), `Number` and `Boolean` but you can use a custom function, for example:
+ *
+ * ```js
+ * const fs = require('fs')
+ *
+ * class FileDetails {
+ * constructor (filename) {
+ * this.filename = filename
+ * this.exists = fs.existsSync(filename)
+ * }
+ * }
+ *
+ * const cli = commandLineArgs([
+ * { name: 'file', type: filename => new FileDetails(filename) },
+ * { name: 'depth', type: Number }
+ * ])
+ * ```
+ *
+ * | # | argv input | commandLineArgs() output |
+ * | --- | ----------------- | ------------ |
+ * | 1 | `--file asdf.txt` | `{ file: { filename: 'asdf.txt', exists: false } }` |
+ *
+ * The `--depth` option expects a `Number`. If no value was set, you will receive `null`.
+ *
+ * | # | argv input | commandLineArgs() output |
+ * | --- | ----------------- | ------------ |
+ * | 2 | `--depth` | `{ depth: null }` |
+ * | 3 | `--depth 2` | `{ depth: 2 }` |
+ *
+ * @type {function}
+ * @default String
+ */
+ this.type = definition.type || String
+
+ /**
+ * getopt-style short option names. Can be any single character (unicode included) except a digit or hyphen.
+ *
+ * ```js
+ * const optionDefinitions = [
+ * { name: 'hot', alias: 'h', type: Boolean },
+ * { name: 'discount', alias: 'd', type: Boolean },
+ * { name: 'courses', alias: 'c' , type: Number }
+ * ]
+ * ```
+ *
+ * | # | argv input | commandLineArgs() output |
+ * | --- | ------------ | ------------ |
+ * | 1 | `-hcd` | `{ hot: true, courses: null, discount: true }` |
+ * | 2 | `-hdc 3` | `{ hot: true, discount: true, courses: 3 }` |
+ *
+ * @type {string}
+ */
+ this.alias = definition.alias
+
+ /**
+ * Set this flag if the option takes a list of values. You will receive an array of values, each passed through the `type` function (if specified).
+ *
+ * ```js
+ * const optionDefinitions = [
+ * { name: 'files', type: String, multiple: true }
+ * ]
+ * ```
+ *
+ * Note, examples 1 and 3 below demonstrate "greedy" parsing which can be disabled by using `lazyMultiple`.
+ *
+ * | # | argv input | commandLineArgs() output |
+ * | --- | ------------ | ------------ |
+ * | 1 | `--files one.js two.js` | `{ files: [ 'one.js', 'two.js' ] }` |
+ * | 2 | `--files one.js --files two.js` | `{ files: [ 'one.js', 'two.js' ] }` |
+ * | 3 | `--files *` | `{ files: [ 'one.js', 'two.js' ] }` |
+ *
+ * @type {boolean}
+ */
+ this.multiple = definition.multiple
+
+ /**
+ * Identical to `multiple` but with greedy parsing disabled.
+ *
+ * ```js
+ * const optionDefinitions = [
+ * { name: 'files', lazyMultiple: true },
+ * { name: 'verbose', alias: 'v', type: Boolean, lazyMultiple: true }
+ * ]
+ * ```
+ *
+ * | # | argv input | commandLineArgs() output |
+ * | --- | ------------ | ------------ |
+ * | 1 | `--files one.js --files two.js` | `{ files: [ 'one.js', 'two.js' ] }` |
+ * | 2 | `-vvv` | `{ verbose: [ true, true, true ] }` |
+ *
+ * @type {boolean}
+ */
+ this.lazyMultiple = definition.lazyMultiple
+
+ /**
+ * Any values unaccounted for by an option definition will be set on the `defaultOption`. This flag is typically set on the most commonly-used option to make for more concise usage (i.e. `$ example *.js` instead of `$ example --files *.js`).
+ *
+ * ```js
+ * const optionDefinitions = [
+ * { name: 'files', multiple: true, defaultOption: true }
+ * ]
+ * ```
+ *
+ * | # | argv input | commandLineArgs() output |
+ * | --- | ------------ | ------------ |
+ * | 1 | `--files one.js two.js` | `{ files: [ 'one.js', 'two.js' ] }` |
+ * | 2 | `one.js two.js` | `{ files: [ 'one.js', 'two.js' ] }` |
+ * | 3 | `*` | `{ files: [ 'one.js', 'two.js' ] }` |
+ *
+ * @type {boolean}
+ */
+ this.defaultOption = definition.defaultOption
+
+ /**
+ * An initial value for the option.
+ *
+ * ```js
+ * const optionDefinitions = [
+ * { name: 'files', multiple: true, defaultValue: [ 'one.js' ] },
+ * { name: 'max', type: Number, defaultValue: 3 }
+ * ]
+ * ```
+ *
+ * | # | argv input | commandLineArgs() output |
+ * | --- | ------------ | ------------ |
+ * | 1 | | `{ files: [ 'one.js' ], max: 3 }` |
+ * | 2 | `--files two.js` | `{ files: [ 'two.js' ], max: 3 }` |
+ * | 3 | `--max 4` | `{ files: [ 'one.js' ], max: 4 }` |
+ *
+ * @type {*}
+ */
+ this.defaultValue = definition.defaultValue
+
+ /**
+ * When your app has a large amount of options it makes sense to organise them in groups.
+ *
+ * There are two automatic groups: `_all` (contains all options) and `_none` (contains options without a `group` specified in their definition).
+ *
+ * ```js
+ * const optionDefinitions = [
+ * { name: 'verbose', group: 'standard' },
+ * { name: 'help', group: [ 'standard', 'main' ] },
+ * { name: 'compress', group: [ 'server', 'main' ] },
+ * { name: 'static', group: 'server' },
+ * { name: 'debug' }
+ * ]
+ * ```
+ *
+ *<table>
+ * <tr>
+ * <th>#</th><th>Command Line</th><th>commandLineArgs() output</th>
+ * </tr>
+ * <tr>
+ * <td>1</td><td><code>--verbose</code></td><td><pre><code>
+ *{
+ * _all: { verbose: true },
+ * standard: { verbose: true }
+ *}
+ *</code></pre></td>
+ * </tr>
+ * <tr>
+ * <td>2</td><td><code>--debug</code></td><td><pre><code>
+ *{
+ * _all: { debug: true },
+ * _none: { debug: true }
+ *}
+ *</code></pre></td>
+ * </tr>
+ * <tr>
+ * <td>3</td><td><code>--verbose --debug --compress</code></td><td><pre><code>
+ *{
+ * _all: {
+ * verbose: true,
+ * debug: true,
+ * compress: true
+ * },
+ * standard: { verbose: true },
+ * server: { compress: true },
+ * main: { compress: true },
+ * _none: { debug: true }
+ *}
+ *</code></pre></td>
+ * </tr>
+ * <tr>
+ * <td>4</td><td><code>--compress</code></td><td><pre><code>
+ *{
+ * _all: { compress: true },
+ * server: { compress: true },
+ * main: { compress: true }
+ *}
+ *</code></pre></td>
+ * </tr>
+ *</table>
+ *
+ * @type {string|string[]}
+ */
+ this.group = definition.group
+
+ /* pick up any remaining properties */
+ for (const prop in definition) {
+ if (!this[prop]) this[prop] = definition[prop]
+ }
+ }
+
+ isBoolean () {
+ return this.type === Boolean || (t.isFunction(this.type) && this.type.name === 'Boolean')
+ }
+
+ isMultiple () {
+ return this.multiple || this.lazyMultiple
+ }
+
+ static create (def) {
+ const result = new this(def)
+ return result
+ }
+}
+
+export default OptionDefinition
diff --git a/node_modules/command-line-args/lib/option-definitions.mjs b/node_modules/command-line-args/lib/option-definitions.mjs
new file mode 100644
index 0000000..0bc879c
--- /dev/null
+++ b/node_modules/command-line-args/lib/option-definitions.mjs
@@ -0,0 +1,187 @@
+import arrayify from '../node_modules/array-back/index.mjs'
+import * as argvTools from './argv-tools.mjs'
+import t from '../node_modules/typical/index.mjs'
+import Definition from './option-definition.mjs'
+
+/**
+ * @module option-definitions
+ */
+
+/**
+ * @alias module:option-definitions
+ */
+class Definitions extends Array {
+ /**
+ * validate option definitions
+ * @param {boolean} [caseInsensitive=false] - whether arguments will be parsed in a case insensitive manner
+ * @returns {string}
+ */
+ validate (caseInsensitive) {
+ const someHaveNoName = this.some(def => !def.name)
+ if (someHaveNoName) {
+ halt(
+ 'INVALID_DEFINITIONS',
+ 'Invalid option definitions: the `name` property is required on each definition'
+ )
+ }
+
+ const someDontHaveFunctionType = this.some(def => def.type && typeof def.type !== 'function')
+ if (someDontHaveFunctionType) {
+ halt(
+ 'INVALID_DEFINITIONS',
+ 'Invalid option definitions: the `type` property must be a setter fuction (default: `Boolean`)'
+ )
+ }
+
+ let invalidOption
+
+ const numericAlias = this.some(def => {
+ invalidOption = def
+ return t.isDefined(def.alias) && t.isNumber(def.alias)
+ })
+ if (numericAlias) {
+ halt(
+ 'INVALID_DEFINITIONS',
+ 'Invalid option definition: to avoid ambiguity an alias cannot be numeric [--' + invalidOption.name + ' alias is -' + invalidOption.alias + ']'
+ )
+ }
+
+ const multiCharacterAlias = this.some(def => {
+ invalidOption = def
+ return t.isDefined(def.alias) && def.alias.length !== 1
+ })
+ if (multiCharacterAlias) {
+ halt(
+ 'INVALID_DEFINITIONS',
+ 'Invalid option definition: an alias must be a single character'
+ )
+ }
+
+ const hypenAlias = this.some(def => {
+ invalidOption = def
+ return def.alias === '-'
+ })
+ if (hypenAlias) {
+ halt(
+ 'INVALID_DEFINITIONS',
+ 'Invalid option definition: an alias cannot be "-"'
+ )
+ }
+
+ const duplicateName = hasDuplicates(this.map(def => caseInsensitive ? def.name.toLowerCase() : def.name))
+ if (duplicateName) {
+ halt(
+ 'INVALID_DEFINITIONS',
+ 'Two or more option definitions have the same name'
+ )
+ }
+
+ const duplicateAlias = hasDuplicates(this.map(def => caseInsensitive && t.isDefined(def.alias) ? def.alias.toLowerCase() : def.alias))
+ if (duplicateAlias) {
+ halt(
+ 'INVALID_DEFINITIONS',
+ 'Two or more option definitions have the same alias'
+ )
+ }
+
+ const duplicateDefaultOption = this.filter(def => def.defaultOption === true).length > 1;
+ if (duplicateDefaultOption) {
+ halt(
+ 'INVALID_DEFINITIONS',
+ 'Only one option definition can be the defaultOption'
+ )
+ }
+
+ const defaultBoolean = this.some(def => {
+ invalidOption = def
+ return def.isBoolean() && def.defaultOption
+ })
+ if (defaultBoolean) {
+ halt(
+ 'INVALID_DEFINITIONS',
+ `A boolean option ["${invalidOption.name}"] can not also be the defaultOption.`
+ )
+ }
+ }
+
+ /**
+ * Get definition by option arg (e.g. `--one` or `-o`)
+ * @param {string} [arg] the argument name to get the definition for
+ * @param {boolean} [caseInsensitive] whether to use case insensitive comparisons when finding the appropriate definition
+ * @returns {Definition}
+ */
+ get (arg, caseInsensitive) {
+ if (argvTools.isOption(arg)) {
+ if (argvTools.re.short.test(arg)) {
+ const shortOptionName = argvTools.getOptionName(arg)
+ if (caseInsensitive) {
+ const lowercaseShortOptionName = shortOptionName.toLowerCase()
+ return this.find(def => t.isDefined(def.alias) && def.alias.toLowerCase() === lowercaseShortOptionName)
+ } else {
+ return this.find(def => def.alias === shortOptionName)
+ }
+ } else {
+ const optionName = argvTools.getOptionName(arg)
+ if (caseInsensitive) {
+ const lowercaseOptionName = optionName.toLowerCase()
+ return this.find(def => def.name.toLowerCase() === lowercaseOptionName)
+ } else {
+ return this.find(def => def.name === optionName)
+ }
+ }
+ } else {
+ return this.find(def => def.name === arg)
+ }
+ }
+
+ getDefault () {
+ return this.find(def => def.defaultOption === true)
+ }
+
+ isGrouped () {
+ return this.some(def => def.group)
+ }
+
+ whereGrouped () {
+ return this.filter(containsValidGroup)
+ }
+
+ whereNotGrouped () {
+ return this.filter(def => !containsValidGroup(def))
+ }
+
+ whereDefaultValueSet () {
+ return this.filter(def => t.isDefined(def.defaultValue))
+ }
+
+ static from (definitions, caseInsensitive) {
+ if (definitions instanceof this) return definitions
+ const result = super.from(arrayify(definitions), def => Definition.create(def))
+ result.validate(caseInsensitive)
+ return result
+ }
+}
+
+function halt (name, message) {
+ const err = new Error(message)
+ err.name = name
+ throw err
+}
+
+function containsValidGroup (def) {
+ return arrayify(def.group).some(group => group)
+}
+
+function hasDuplicates (array) {
+ const items = {}
+ for (let i = 0; i < array.length; i++) {
+ const value = array[i]
+ if (items[value]) {
+ return true
+ } else {
+ if (t.isDefined(value)) items[value] = true
+ }
+ }
+}
+
+export default Definitions
diff --git a/node_modules/command-line-args/lib/option-flag.mjs b/node_modules/command-line-args/lib/option-flag.mjs
new file mode 100644
index 0000000..4bbf0c8
--- /dev/null
+++ b/node_modules/command-line-args/lib/option-flag.mjs
@@ -0,0 +1,13 @@
+import Option from './option.mjs'
+
+class FlagOption extends Option {
+ set (val) {
+ super.set(true)
+ }
+
+ static create (def) {
+ return new this(def)
+ }
+}
+
+export default FlagOption
diff --git a/node_modules/command-line-args/lib/option.mjs b/node_modules/command-line-args/lib/option.mjs
new file mode 100644
index 0000000..eca9013
--- /dev/null
+++ b/node_modules/command-line-args/lib/option.mjs
@@ -0,0 +1,92 @@
+import arrayify from '../node_modules/array-back/index.mjs'
+import t from '../node_modules/typical/index.mjs'
+import Definition from './option-definition.mjs'
+const _value = new WeakMap()
+
+/**
+ * Encapsulates behaviour (defined by an OptionDefinition) when setting values
+ */
+class Option {
+ constructor (definition) {
+ this.definition = new Definition(definition)
+ this.state = null /* set or default */
+ this.resetToDefault()
+ }
+
+ get () {
+ return _value.get(this)
+ }
+
+ set (val) {
+ this._set(val, 'set')
+ }
+
+ _set (val, state) {
+ const def = this.definition
+ if (def.isMultiple()) {
+ /* don't add null or undefined to a multiple */
+ if (val !== null && val !== undefined) {
+ const arr = this.get()
+ if (this.state === 'default') arr.length = 0
+ arr.push(def.type(val))
+ this.state = state
+ }
+ } else {
+ /* throw if already set on a singlar defaultOption */
+ if (!def.isMultiple() && this.state === 'set') {
+ const err = new Error(`Singular option already set [${this.definition.name}=${this.get()}]`)
+ err.name = 'ALREADY_SET'
+ err.value = val
+ err.optionName = def.name
+ throw err
+ } else if (val === null || val === undefined) {
+ _value.set(this, val)
+ // /* required to make 'partial: defaultOption with value equal to defaultValue 2' pass */
+ // if (!(def.defaultOption && !def.isMultiple())) {
+ // this.state = state
+ // }
+ } else {
+ _value.set(this, def.type(val))
+ this.state = state
+ }
+ }
+ }
+
+ resetToDefault () {
+ if (t.isDefined(this.definition.defaultValue)) {
+ if (this.definition.isMultiple()) {
+ _value.set(this, arrayify(this.definition.defaultValue).slice())
+ } else {
+ _value.set(this, this.definition.defaultValue)
+ }
+ } else {
+ if (this.definition.isMultiple()) {
+ _value.set(this, [])
+ } else {
+ _value.set(this, null)
+ }
+ }
+ this.state = 'default'
+ }
+
+ static create (definition) {
+ definition = new Definition(definition)
+ if (definition.isBoolean()) {
+ return FlagOption.create(definition)
+ } else {
+ return new this(definition)
+ }
+ }
+}
+
+class FlagOption extends Option {
+ set (val) {
+ super.set(true)
+ }
+
+ static create (def) {
+ return new this(def)
+ }
+}
+
+export default Option
diff --git a/node_modules/command-line-args/lib/output-grouped.mjs b/node_modules/command-line-args/lib/output-grouped.mjs
new file mode 100644
index 0000000..ed78b1d
--- /dev/null
+++ b/node_modules/command-line-args/lib/output-grouped.mjs
@@ -0,0 +1,40 @@
+import Output from './output.mjs'
+import arrayify from '../node_modules/array-back/index.mjs'
+import t from '../node_modules/typical/index.mjs'
+import camelCase from 'lodash.camelcase'
+
+class GroupedOutput extends Output {
+ toObject (options) {
+ const superOutputNoCamel = super.toObject({ skipUnknown: options.skipUnknown })
+ const superOutput = super.toObject(options)
+ const unknown = superOutput._unknown
+ delete superOutput._unknown
+ const grouped = {
+ _all: superOutput
+ }
+ if (unknown && unknown.length) grouped._unknown = unknown
+
+ this.definitions.whereGrouped().forEach(def => {
+ const name = options.camelCase ? camelCase(def.name) : def.name
+ const outputValue = superOutputNoCamel[def.name]
+ for (const groupName of arrayify(def.group)) {
+ grouped[groupName] = grouped[groupName] || {}
+ if (t.isDefined(outputValue)) {
+ grouped[groupName][name] = outputValue
+ }
+ }
+ })
+
+ this.definitions.whereNotGrouped().forEach(def => {
+ const name = options.camelCase ? camelCase(def.name) : def.name
+ const outputValue = superOutputNoCamel[def.name]
+ if (t.isDefined(outputValue)) {
+ if (!grouped._none) grouped._none = {}
+ grouped._none[name] = outputValue
+ }
+ })
+ return grouped
+ }
+}
+
+export default GroupedOutput
diff --git a/node_modules/command-line-args/lib/output.mjs b/node_modules/command-line-args/lib/output.mjs
new file mode 100644
index 0000000..f52a091
--- /dev/null
+++ b/node_modules/command-line-args/lib/output.mjs
@@ -0,0 +1,38 @@
+import Option from './option.mjs'
+import Definitions from './option-definitions.mjs'
+import camelCase from 'lodash.camelcase'
+
+/**
+ * A map of { DefinitionNameString: Option }. By default, an Output has an `_unknown` property and any options with defaultValues.
+ */
+class Output extends Map {
+ constructor (definitions) {
+ super()
+ /**
+ * @type {OptionDefinitions}
+ */
+ this.definitions = Definitions.from(definitions)
+
+ /* by default, an Output has an `_unknown` property and any options with defaultValues */
+ this.set('_unknown', Option.create({ name: '_unknown', multiple: true }))
+ for (const def of this.definitions.whereDefaultValueSet()) {
+ this.set(def.name, Option.create(def))
+ }
+ }
+
+ toObject (options) {
+ options = options || {}
+ const output = {}
+ for (const item of this) {
+ const name = options.camelCase && item[0] !== '_unknown' ? camelCase(item[0]) : item[0]
+ const option = item[1]
+ if (name === '_unknown' && !option.get().length) continue
+ output[name] = option.get()
+ }
+
+ if (options.skipUnknown) delete output._unknown
+ return output
+ }
+}
+
+export default Output
diff --git a/node_modules/command-line-args/package.json b/node_modules/command-line-args/package.json
new file mode 100644
index 0000000..7431e10
--- /dev/null
+++ b/node_modules/command-line-args/package.json
@@ -0,0 +1,58 @@
+{
+ "name": "command-line-args",
+ "version": "5.2.1",
+ "description": "A mature, feature-complete library to parse command-line options.",
+ "repository": "https://github.com/75lb/command-line-args",
+ "scripts": {
+ "test": "npm run dist && npm run test:js && npm run test:mjs",
+ "test:js": "node dist/tests.js",
+ "test:mjs": "node --experimental-modules test/tests.mjs",
+ "test:ci": "npm run test:js",
+ "docs": "jsdoc2md -c jsdoc.conf index.mjs > doc/API.md && jsdoc2md -c jsdoc.conf lib/option-definition.mjs > doc/option-definition.md",
+ "cover": "nyc --reporter=text-lcov test-runner test/*.js test/internals/*.js | coveralls",
+ "dist": "rollup index.mjs -f cjs -e 'lodash.camelcase' -o dist/index.js && rollup index.mjs -f esm -e 'lodash.camelcase' -o dist/index.mjs && rollup test/tests.mjs -f cjs -e 'test-runner,assert,lodash.camelcase' -o dist/tests.js"
+ },
+ "main": "dist/index.js",
+ "keywords": [
+ "argv",
+ "parse",
+ "argument",
+ "args",
+ "option",
+ "options",
+ "parser",
+ "parsing",
+ "cli",
+ "command",
+ "line"
+ ],
+ "author": "Lloyd Brookes <75pound@gmail.com>",
+ "license": "MIT",
+ "engines": {
+ "node": ">=4.0.0"
+ },
+ "files": [
+ "index.mjs",
+ "lib",
+ "dist/index.js",
+ "dist/index.mjs"
+ ],
+ "devDependencies": {
+ "coveralls": "^3.1.1",
+ "jsdoc-to-markdown": "^7.1.1",
+ "rollup": "~1.7.4",
+ "test-runner": "^0.5.1"
+ },
+ "dependencies": {
+ "array-back": "^3.1.0",
+ "find-replace": "^3.0.0",
+ "lodash.camelcase": "^4.3.0",
+ "typical": "^4.0.0"
+ },
+ "standard": {
+ "ignore": [
+ "dist"
+ ],
+ "envs": []
+ }
+}
diff --git a/node_modules/command-line-usage/LICENSE b/node_modules/command-line-usage/LICENSE
new file mode 100644
index 0000000..9263703
--- /dev/null
+++ b/node_modules/command-line-usage/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2015-22 Lloyd Brookes <75pound@gmail.com>
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/node_modules/command-line-usage/README.md b/node_modules/command-line-usage/README.md
new file mode 100644
index 0000000..4192413
--- /dev/null
+++ b/node_modules/command-line-usage/README.md
@@ -0,0 +1,120 @@
+[![view on npm](https://badgen.net/npm/v/command-line-usage)](https://www.npmjs.org/package/command-line-usage)
+[![npm module downloads](https://badgen.net/npm/dt/command-line-usage)](https://www.npmjs.org/package/command-line-usage)
+[![Gihub repo dependents](https://badgen.net/github/dependents-repo/75lb/command-line-usage)](https://github.com/75lb/command-line-usage/network/dependents?dependent_type=REPOSITORY)
+[![Gihub package dependents](https://badgen.net/github/dependents-pkg/75lb/command-line-usage)](https://github.com/75lb/command-line-usage/network/dependents?dependent_type=PACKAGE)
+[![Node.js CI](https://github.com/75lb/command-line-usage/actions/workflows/node.js.yml/badge.svg)](https://github.com/75lb/command-line-usage/actions/workflows/node.js.yml)
+[![Coverage Status](https://coveralls.io/repos/github/75lb/command-line-usage/badge.svg)](https://coveralls.io/github/75lb/command-line-usage)
+[![js-standard-style](https://img.shields.io/badge/code%20style-standard-brightgreen.svg)](https://github.com/feross/standard)
+
+# command-line-usage
+
+***Upgraders, please check the [release notes](https://github.com/75lb/command-line-usage/releases).***
+
+A simple, data-driven module for creating a usage guide.
+
+## Synopsis
+
+A usage guide is created by first defining an arbitrary number of sections, e.g. a description section, synopsis, option list, examples, footer etc. Each section has an optional header, some content and must be of type [`content`](https://github.com/75lb/command-line-usage/blob/master/doc/api.md#module_command-line-usage--commandLineUsage..content) or [`optionList`](https://github.com/75lb/command-line-usage/blob/master/doc/api.md#module_command-line-usage--commandLineUsage..optionList). This section data is passed to [`commandLineUsage()`](https://github.com/75lb/command-line-usage/blob/master/doc/api.md#exp_module_command-line-usage--commandLineUsage) which returns a usage guide.
+
+Inline ansi formatting can be used anywhere within section content using [chalk template literal syntax](https://github.com/chalk/chalk/tree/v2.4.2#tagged-template-literal).
+
+For example, this script:
+```js
+import commandLineUsage from 'command-line-usage'
+
+const sections = [
+ {
+ header: 'A typical app',
+ content: 'Generates something {italic very} important.'
+ },
+ {
+ header: 'Options',
+ optionList: [
+ {
+ name: 'input',
+ typeLabel: '{underline file}',
+ description: 'The input to process.'
+ },
+ {
+ name: 'help',
+ description: 'Print this usage guide.'
+ }
+ ]
+ }
+]
+const usage = commandLineUsage(sections)
+console.log(usage)
+```
+
+Outputs this guide:
+
+<img src="https://raw.githubusercontent.com/75lb/command-line-usage/master/example/screens/synopsis.png" width="90%">
+
+## Some examples
+
+### Typical
+
+A fairly typical usage guide with three sections - description, option list and footer. [Code](https://github.com/75lb/command-line-usage/wiki/How-to-create-a-typical-usage-guide).
+
+<img src="https://raw.githubusercontent.com/75lb/command-line-usage/master/example/screens/simple.png" width="90%">
+
+### Option List groups
+
+Demonstrates breaking the option list up into groups. [Code](https://github.com/75lb/command-line-usage/wiki/How-to-break-the-option-list-up-into-groups).
+
+<img src="https://raw.githubusercontent.com/75lb/command-line-usage/master/example/screens/groups.png" width="90%">
+
+### Banners
+
+A banner is created by adding the `raw: true` property to your `content`. This flag disables any formatting on the content, displaying it raw as supplied.
+
+#### Header
+
+Demonstrates a banner at the top. This example also adds a `synopsis` section. [Code](https://github.com/75lb/command-line-usage/wiki/How-to-add-a-banner-to-your-usage-guide#code).
+
+<img src="https://raw.githubusercontent.com/75lb/command-line-usage/master/example/screens/header.png" width="90%">
+
+#### Footer
+
+Demonstrates a footer banner. [Code](https://github.com/75lb/command-line-usage/wiki/How-to-add-a-banner-to-your-usage-guide#code-1).
+
+<img src="https://raw.githubusercontent.com/75lb/command-line-usage/master/example/screens/footer.png" width="90%">
+
+### Examples section (table layout)
+
+An examples section is added. To achieve this table layout, supply the `content` as an array of objects. The property names of each object are not important, so long as they are consistent throughout the array. [Code](https://github.com/75lb/command-line-usage/wiki/How-to-add-an-examples-section-to-your-usage-guide).
+
+<img src="https://raw.githubusercontent.com/75lb/command-line-usage/master/example/screens/example-columns.png" width="90%">
+
+### Advanced optionList layout
+
+The `optionList` layout is fully configurable by setting the `tableOptions` property with an options object suitable for passing into [table-layout](https://github.com/75lb/table-layout#table-). This example overrides the default column widths and adds flame padding. [Code](https://github.com/75lb/command-line-usage/wiki/How-to-use-advanced-optionList-table-formatting).
+
+<img src="https://raw.githubusercontent.com/75lb/command-line-usage/master/example/screens/option-list-options.png" width="90%">
+
+### Command list
+
+Useful if your app is command-driven, like git or npm. [Code](https://github.com/75lb/command-line-usage/wiki/How-to-add-a-command-list-to-your-usage-guide).
+
+<img src="https://raw.githubusercontent.com/75lb/command-line-usage/master/example/screens/command-list.png" width="90%">
+
+### Description section (table layout)
+
+Demonstrates supplying specific [table layout](https://github.com/75lb/table-layout) options to achieve more advanced layout. In this case the second column (containing the hammer and sickle) has a fixed `width` of 40 and `noWrap` enabled (as the input is already formatted as desired). [Code](https://github.com/75lb/command-line-usage/wiki/How-to-add-a-description-section-to-your-usage-guide).
+
+<img src="https://raw.githubusercontent.com/75lb/command-line-usage/master/example/screens/description-columns.png" width="90%">
+
+### Real-life
+
+The [polymer-cli](https://github.com/Polymer/tools/tree/master/packages/cli) usage guide is a good real-life example.
+
+<img src="https://raw.githubusercontent.com/75lb/command-line-usage/master/example/screens/polymer.png" width="90%">
+
+## Documentation
+
+* [API Reference](https://github.com/75lb/command-line-usage/blob/master/doc/api.md)
+* [The full list of examples](https://github.com/75lb/command-line-usage/wiki)
+
+* * *
+
+&copy; 2015-22 Lloyd Brookes \<75pound@gmail.com\>. Documented by [jsdoc-to-markdown](https://github.com/75lb/jsdoc-to-markdown).
diff --git a/node_modules/command-line-usage/index.js b/node_modules/command-line-usage/index.js
new file mode 100644
index 0000000..d93c6c5
--- /dev/null
+++ b/node_modules/command-line-usage/index.js
@@ -0,0 +1,30 @@
+/**
+ * @module command-line-usage
+ */
+
+/**
+ * Generates a usage guide suitable for a command-line app.
+ * @param {Section|Section[]} - One or more section objects ({@link module:command-line-usage~content} or {@link module:command-line-usage~optionList}).
+ * @returns {string}
+ * @alias module:command-line-usage
+ */
+function commandLineUsage (sections) {
+ const arrayify = require('array-back')
+ sections = arrayify(sections)
+ if (sections.length) {
+ const OptionList = require('./lib/section/option-list')
+ const ContentSection = require('./lib/section/content')
+ const output = sections.map(section => {
+ if (section.optionList) {
+ return new OptionList(section)
+ } else {
+ return new ContentSection(section)
+ }
+ })
+ return '\n' + output.join('\n')
+ } else {
+ return ''
+ }
+}
+
+module.exports = commandLineUsage
diff --git a/node_modules/command-line-usage/lib/chalk-format.js b/node_modules/command-line-usage/lib/chalk-format.js
new file mode 100644
index 0000000..c544cce
--- /dev/null
+++ b/node_modules/command-line-usage/lib/chalk-format.js
@@ -0,0 +1,11 @@
+function chalkFormat (str) {
+ if (str) {
+ str = str.replace(/`/g, '\\`')
+ const chalk = require('chalk')
+ return chalk(Object.assign([], { raw: [str] }))
+ } else {
+ return ''
+ }
+}
+
+module.exports = chalkFormat
diff --git a/node_modules/command-line-usage/lib/section.js b/node_modules/command-line-usage/lib/section.js
new file mode 100644
index 0000000..821a366
--- /dev/null
+++ b/node_modules/command-line-usage/lib/section.js
@@ -0,0 +1,29 @@
+class Section {
+ constructor () {
+ this.lines = []
+ }
+
+ add (lines) {
+ if (lines) {
+ const arrayify = require('array-back')
+ arrayify(lines).forEach(line => this.lines.push(line))
+ } else {
+ this.lines.push('')
+ }
+ }
+
+ toString () {
+ const os = require('os')
+ return this.lines.join(os.EOL)
+ }
+
+ header (text) {
+ const chalk = require('chalk')
+ if (text) {
+ this.add(chalk.underline.bold(text))
+ this.add()
+ }
+ }
+}
+
+module.exports = Section
diff --git a/node_modules/command-line-usage/lib/section/content.js b/node_modules/command-line-usage/lib/section/content.js
new file mode 100644
index 0000000..4287f60
--- /dev/null
+++ b/node_modules/command-line-usage/lib/section/content.js
@@ -0,0 +1,154 @@
+const Section = require('../section')
+const t = require('typical')
+const Table = require('table-layout')
+const chalkFormat = require('../chalk-format')
+
+class ContentSection extends Section {
+ constructor (section) {
+ super()
+ this.header(section.header)
+
+ if (section.content) {
+ /* add content without indentation or wrapping */
+ if (section.raw) {
+ const arrayify = require('array-back')
+ const content = arrayify(section.content).map(line => chalkFormat(line))
+ this.add(content)
+ } else {
+ this.add(getContentLines(section.content))
+ }
+
+ this.add()
+ }
+ }
+}
+
+function getContentLines (content) {
+ const defaultPadding = { left: ' ', right: ' ' }
+
+ if (content) {
+ /* string content */
+ if (t.isString(content)) {
+ const table = new Table({ column: chalkFormat(content) }, {
+ padding: defaultPadding,
+ maxWidth: 80
+ })
+ return table.renderLines()
+
+ /* array of strings */
+ } else if (Array.isArray(content) && content.every(t.isString)) {
+ const rows = content.map(string => ({ column: chalkFormat(string) }))
+ const table = new Table(rows, {
+ padding: defaultPadding,
+ maxWidth: 80
+ })
+ return table.renderLines()
+
+ /* array of objects (use table-layout) */
+ } else if (Array.isArray(content) && content.every(t.isPlainObject)) {
+ const table = new Table(content.map(row => ansiFormatRow(row)), {
+ padding: defaultPadding
+ })
+ return table.renderLines()
+
+ /* { options: object, data: object[] } */
+ } else if (t.isPlainObject(content)) {
+ if (!content.options || !content.data) {
+ throw new Error('must have an "options" or "data" property\n' + JSON.stringify(content))
+ }
+ const options = Object.assign(
+ { padding: defaultPadding },
+ content.options
+ )
+
+ /* convert nowrap to noWrap to avoid breaking compatibility */
+ if (options.columns) {
+ options.columns = options.columns.map(column => {
+ if (column.nowrap) {
+ column.noWrap = column.nowrap
+ delete column.nowrap
+ }
+ return column
+ })
+ }
+
+ const table = new Table(
+ content.data.map(row => ansiFormatRow(row)),
+ options
+ )
+ return table.renderLines()
+ } else {
+ const message = `invalid input - 'content' must be a string, array of strings, or array of plain objects:\n\n${JSON.stringify(content)}`
+ throw new Error(message)
+ }
+ }
+}
+
+function ansiFormatRow (row) {
+ for (const key in row) {
+ row[key] = chalkFormat(row[key])
+ }
+ return row
+}
+
+module.exports = ContentSection
+
+/**
+ * A Content section comprises a header and one or more lines of content.
+ * @typedef module:command-line-usage~content
+ * @property header {string} - The section header, always bold and underlined.
+ * @property content {string|string[]|object[]} - Overloaded property, accepting data in one of four formats:
+ *
+ * 1. A single string (one line of text)
+ * 2. An array of strings (multiple lines of text)
+ * 3. An array of objects (recordset-style data). In this case, the data will be rendered in table format. The property names of each object are not important, so long as they are consistent throughout the array.
+ * 4. An object with two properties - `data` and `options`. In this case, the data and options will be passed directly to the underlying [table layout](https://github.com/75lb/table-layout) module for rendering.
+ *
+ * @property raw {boolean} - Set to true to avoid indentation and wrapping. Useful for banners.
+ * @example
+ * Simple string of content. For ansi formatting, use [chalk template literal syntax](https://github.com/chalk/chalk#tagged-template-literal).
+ * ```js
+ * {
+ * header: 'A typical app',
+ * content: 'Generates something {rgb(255,200,0).italic very {underline.bgRed important}}.'
+ * }
+ * ```
+ *
+ * An array of strings is interpreted as lines, to be joined by the system newline character.
+ * ```js
+ * {
+ * header: 'A typical app',
+ * content: [
+ * 'First line.',
+ * 'Second line.'
+ * ]
+ * }
+ * ```
+ *
+ * An array of recordset-style objects are rendered in table layout.
+ * ```js
+ * {
+ * header: 'A typical app',
+ * content: [
+ * { colA: 'First row, first column.', colB: 'First row, second column.'},
+ * { colA: 'Second row, first column.', colB: 'Second row, second column.'}
+ * ]
+ * }
+ * ```
+ *
+ * An object with `data` and `options` properties will be passed directly to the underlying [table layout](https://github.com/75lb/table-layout) module for rendering.
+ * ```js
+ * {
+ * header: 'A typical app',
+ * content: {
+ * data: [
+ * { colA: 'First row, first column.', colB: 'First row, second column.'},
+ * { colA: 'Second row, first column.', colB: 'Second row, second column.'}
+ * ],
+ * options: {
+ * maxWidth: 60
+ * }
+ * }
+ * }
+ * ```
+ */
diff --git a/node_modules/command-line-usage/lib/section/option-list.js b/node_modules/command-line-usage/lib/section/option-list.js
new file mode 100644
index 0000000..9214c13
--- /dev/null
+++ b/node_modules/command-line-usage/lib/section/option-list.js
@@ -0,0 +1,128 @@
+const Section = require('../section')
+const Table = require('table-layout')
+const chalk = require('../chalk-format')
+const t = require('typical')
+const arrayify = require('array-back')
+
+class OptionList extends Section {
+ constructor (data) {
+ super()
+ let definitions = arrayify(data.optionList)
+ const hide = arrayify(data.hide)
+ const groups = arrayify(data.group)
+
+ /* filter out hidden definitions */
+ if (hide.length) {
+ definitions = definitions.filter(definition => {
+ return hide.indexOf(definition.name) === -1
+ })
+ }
+
+ if (data.header) this.header(data.header)
+
+ if (groups.length) {
+ definitions = definitions.filter(def => {
+ const noGroupMatch = groups.indexOf('_none') > -1 && !t.isDefined(def.group)
+ const groupMatch = intersect(arrayify(def.group), groups)
+ if (noGroupMatch || groupMatch) return def
+ })
+ }
+
+ const rows = definitions.map(def => {
+ return {
+ option: getOptionNames(def, data.reverseNameOrder),
+ description: chalk(def.description)
+ }
+ })
+
+ const tableOptions = data.tableOptions || {
+ padding: { left: ' ', right: ' ' },
+ columns: [
+ { name: 'option', noWrap: true },
+ { name: 'description', maxWidth: 80 }
+ ]
+ }
+ const table = new Table(rows, tableOptions)
+ this.add(table.renderLines())
+
+ this.add()
+ }
+}
+
+function getOptionNames (definition, reverseNameOrder) {
+ let type = definition.type ? definition.type.name.toLowerCase() : 'string'
+ const multiple = (definition.multiple || definition.lazyMultiple) ? '[]' : ''
+ if (type) {
+ type = type === 'boolean' ? '' : `{underline ${type}${multiple}}`
+ }
+ type = chalk(definition.typeLabel || type)
+
+ let result = ''
+ if (definition.alias) {
+ if (definition.name) {
+ if (reverseNameOrder) {
+ result = chalk(`{bold --${definition.name}}, {bold -${definition.alias}} ${type}`)
+ } else {
+ result = chalk(`{bold -${definition.alias}}, {bold --${definition.name}} ${type}`)
+ }
+ } else {
+ if (reverseNameOrder) {
+ result = chalk(`{bold -${definition.alias}} ${type}`)
+ } else {
+ result = chalk(`{bold -${definition.alias}} ${type}`)
+ }
+ }
+ } else {
+ result = chalk(`{bold --${definition.name}} ${type}`)
+ }
+ return result
+}
+
+function intersect (arr1, arr2) {
+ return arr1.some(function (item1) {
+ return arr2.some(function (item2) {
+ return item1 === item2
+ })
+ })
+}
+
+module.exports = OptionList
+
+/**
+ * An OptionList section adds a table displaying the supplied option definitions.
+ * @typedef module:command-line-usage~optionList
+ * @property {string} [header] - The section header, always bold and underlined.
+ * @property optionList {OptionDefinition[]} - An array of [option definition](https://github.com/75lb/command-line-args/blob/master/doc/option-definition.md) objects. In addition to the regular definition properties, command-line-usage will look for:
+ *
+ * - `description` - a string describing the option.
+ * - `typeLabel` - a string to replace the default type string (e.g. `<string>`). It's often more useful to set a more descriptive type label, like `<ms>`, `<files>`, `<command>` etc.
+ * @property {string|string[]} [group] - If specified, only options from this particular group will be printed. [Example](https://github.com/75lb/command-line-usage/blob/master/example/groups.js).
+ * @property {string|string[]} [hide] - The names of one of more option definitions to hide from the option list. [Example](https://github.com/75lb/command-line-usage/blob/master/example/hide.js).
+ * @property {boolean} [reverseNameOrder] - If true, the option alias will be displayed after the name, i.e. `--verbose, -v` instead of `-v, --verbose`).
+ * @property {object} [tableOptions] - An options object suitable for passing into [table-layout](https://github.com/75lb/table-layout#table-). See [here for an example](https://github.com/75lb/command-line-usage/blob/master/example/option-list-options.js).
+ *
+ * @example
+ * {
+ * header: 'Options',
+ * optionList: [
+ * {
+ * name: 'help',
+ * alias: 'h',
+ * description: 'Display this usage guide.'
+ * },
+ * {
+ * name: 'src',
+ * description: 'The input files to process',
+ * multiple: true,
+ * defaultOption: true,
+ * typeLabel: '{underline file} ...'
+ * },
+ * {
+ * name: 'timeout',
+ * description: 'Timeout value in ms.',
+ * alias: 't',
+ * typeLabel: '{underline ms}'
+ * }
+ * ]
+ * }
+ */
diff --git a/node_modules/command-line-usage/node_modules/ansi-styles/index.js b/node_modules/command-line-usage/node_modules/ansi-styles/index.js
new file mode 100644
index 0000000..90a871c
--- /dev/null
+++ b/node_modules/command-line-usage/node_modules/ansi-styles/index.js
@@ -0,0 +1,165 @@
+'use strict';
+const colorConvert = require('color-convert');
+
+const wrapAnsi16 = (fn, offset) => function () {
+ const code = fn.apply(colorConvert, arguments);
+ return `\u001B[${code + offset}m`;
+};
+
+const wrapAnsi256 = (fn, offset) => function () {
+ const code = fn.apply(colorConvert, arguments);
+ return `\u001B[${38 + offset};5;${code}m`;
+};
+
+const wrapAnsi16m = (fn, offset) => function () {
+ const rgb = fn.apply(colorConvert, arguments);
+ return `\u001B[${38 + offset};2;${rgb[0]};${rgb[1]};${rgb[2]}m`;
+};
+
+function assembleStyles() {
+ const codes = new Map();
+ const styles = {
+ modifier: {
+ reset: [0, 0],
+ // 21 isn't widely supported and 22 does the same thing
+ bold: [1, 22],
+ dim: [2, 22],
+ italic: [3, 23],
+ underline: [4, 24],
+ inverse: [7, 27],
+ hidden: [8, 28],
+ strikethrough: [9, 29]
+ },
+ color: {
+ black: [30, 39],
+ red: [31, 39],
+ green: [32, 39],
+ yellow: [33, 39],
+ blue: [34, 39],
+ magenta: [35, 39],
+ cyan: [36, 39],
+ white: [37, 39],
+ gray: [90, 39],
+
+ // Bright color
+ redBright: [91, 39],
+ greenBright: [92, 39],
+ yellowBright: [93, 39],
+ blueBright: [94, 39],
+ magentaBright: [95, 39],
+ cyanBright: [96, 39],
+ whiteBright: [97, 39]
+ },
+ bgColor: {
+ bgBlack: [40, 49],
+ bgRed: [41, 49],
+ bgGreen: [42, 49],
+ bgYellow: [43, 49],
+ bgBlue: [44, 49],
+ bgMagenta: [45, 49],
+ bgCyan: [46, 49],
+ bgWhite: [47, 49],
+
+ // Bright color
+ bgBlackBright: [100, 49],
+ bgRedBright: [101, 49],
+ bgGreenBright: [102, 49],
+ bgYellowBright: [103, 49],
+ bgBlueBright: [104, 49],
+ bgMagentaBright: [105, 49],
+ bgCyanBright: [106, 49],
+ bgWhiteBright: [107, 49]
+ }
+ };
+
+ // Fix humans
+ styles.color.grey = styles.color.gray;
+
+ for (const groupName of Object.keys(styles)) {
+ const group = styles[groupName];
+
+ for (const styleName of Object.keys(group)) {
+ const style = group[styleName];
+
+ styles[styleName] = {
+ open: `\u001B[${style[0]}m`,
+ close: `\u001B[${style[1]}m`
+ };
+
+ group[styleName] = styles[styleName];
+
+ codes.set(style[0], style[1]);
+ }
+
+ Object.defineProperty(styles, groupName, {
+ value: group,
+ enumerable: false
+ });
+
+ Object.defineProperty(styles, 'codes', {
+ value: codes,
+ enumerable: false
+ });
+ }
+
+ const ansi2ansi = n => n;
+ const rgb2rgb = (r, g, b) => [r, g, b];
+
+ styles.color.close = '\u001B[39m';
+ styles.bgColor.close = '\u001B[49m';
+
+ styles.color.ansi = {
+ ansi: wrapAnsi16(ansi2ansi, 0)
+ };
+ styles.color.ansi256 = {
+ ansi256: wrapAnsi256(ansi2ansi, 0)
+ };
+ styles.color.ansi16m = {
+ rgb: wrapAnsi16m(rgb2rgb, 0)
+ };
+
+ styles.bgColor.ansi = {
+ ansi: wrapAnsi16(ansi2ansi, 10)
+ };
+ styles.bgColor.ansi256 = {
+ ansi256: wrapAnsi256(ansi2ansi, 10)
+ };
+ styles.bgColor.ansi16m = {
+ rgb: wrapAnsi16m(rgb2rgb, 10)
+ };
+
+ for (let key of Object.keys(colorConvert)) {
+ if (typeof colorConvert[key] !== 'object') {
+ continue;
+ }
+
+ const suite = colorConvert[key];
+
+ if (key === 'ansi16') {
+ key = 'ansi';
+ }
+
+ if ('ansi16' in suite) {
+ styles.color.ansi[key] = wrapAnsi16(suite.ansi16, 0);
+ styles.bgColor.ansi[key] = wrapAnsi16(suite.ansi16, 10);
+ }
+
+ if ('ansi256' in suite) {
+ styles.color.ansi256[key] = wrapAnsi256(suite.ansi256, 0);
+ styles.bgColor.ansi256[key] = wrapAnsi256(suite.ansi256, 10);
+ }
+
+ if ('rgb' in suite) {
+ styles.color.ansi16m[key] = wrapAnsi16m(suite.rgb, 0);
+ styles.bgColor.ansi16m[key] = wrapAnsi16m(suite.rgb, 10);
+ }
+ }
+
+ return styles;
+}
+
+// Make the export immutable
+Object.defineProperty(module, 'exports', {
+ enumerable: true,
+ get: assembleStyles
+});
diff --git a/node_modules/command-line-usage/node_modules/ansi-styles/license b/node_modules/command-line-usage/node_modules/ansi-styles/license
new file mode 100644
index 0000000..e7af2f7
--- /dev/null
+++ b/node_modules/command-line-usage/node_modules/ansi-styles/license
@@ -0,0 +1,9 @@
+MIT License
+
+Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/node_modules/command-line-usage/node_modules/ansi-styles/package.json b/node_modules/command-line-usage/node_modules/ansi-styles/package.json
new file mode 100644
index 0000000..65edb48
--- /dev/null
+++ b/node_modules/command-line-usage/node_modules/ansi-styles/package.json
@@ -0,0 +1,56 @@
+{
+ "name": "ansi-styles",
+ "version": "3.2.1",
+ "description": "ANSI escape codes for styling strings in the terminal",
+ "license": "MIT",
+ "repository": "chalk/ansi-styles",
+ "author": {
+ "name": "Sindre Sorhus",
+ "email": "sindresorhus@gmail.com",
+ "url": "sindresorhus.com"
+ },
+ "engines": {
+ "node": ">=4"
+ },
+ "scripts": {
+ "test": "xo && ava",
+ "screenshot": "svg-term --command='node screenshot' --out=screenshot.svg --padding=3 --width=55 --height=3 --at=1000 --no-cursor"
+ },
+ "files": [
+ "index.js"
+ ],
+ "keywords": [
+ "ansi",
+ "styles",
+ "color",
+ "colour",
+ "colors",
+ "terminal",
+ "console",
+ "cli",
+ "string",
+ "tty",
+ "escape",
+ "formatting",
+ "rgb",
+ "256",
+ "shell",
+ "xterm",
+ "log",
+ "logging",
+ "command-line",
+ "text"
+ ],
+ "dependencies": {
+ "color-convert": "^1.9.0"
+ },
+ "devDependencies": {
+ "ava": "*",
+ "babel-polyfill": "^6.23.0",
+ "svg-term-cli": "^2.1.1",
+ "xo": "*"
+ },
+ "ava": {
+ "require": "babel-polyfill"
+ }
+}
diff --git a/node_modules/command-line-usage/node_modules/ansi-styles/readme.md b/node_modules/command-line-usage/node_modules/ansi-styles/readme.md
new file mode 100644
index 0000000..3158e2d
--- /dev/null
+++ b/node_modules/command-line-usage/node_modules/ansi-styles/readme.md
@@ -0,0 +1,147 @@
+# ansi-styles [![Build Status](https://travis-ci.org/chalk/ansi-styles.svg?branch=master)](https://travis-ci.org/chalk/ansi-styles)
+
+> [ANSI escape codes](http://en.wikipedia.org/wiki/ANSI_escape_code#Colors_and_Styles) for styling strings in the terminal
+
+You probably want the higher-level [chalk](https://github.com/chalk/chalk) module for styling your strings.
+
+<img src="https://cdn.rawgit.com/chalk/ansi-styles/8261697c95bf34b6c7767e2cbe9941a851d59385/screenshot.svg" width="900">
+
+
+## Install
+
+```
+$ npm install ansi-styles
+```
+
+
+## Usage
+
+```js
+const style = require('ansi-styles');
+
+console.log(`${style.green.open}Hello world!${style.green.close}`);
+
+
+// Color conversion between 16/256/truecolor
+// NOTE: If conversion goes to 16 colors or 256 colors, the original color
+// may be degraded to fit that color palette. This means terminals
+// that do not support 16 million colors will best-match the
+// original color.
+console.log(style.bgColor.ansi.hsl(120, 80, 72) + 'Hello world!' + style.bgColor.close);
+console.log(style.color.ansi256.rgb(199, 20, 250) + 'Hello world!' + style.color.close);
+console.log(style.color.ansi16m.hex('#ABCDEF') + 'Hello world!' + style.color.close);
+```
+
+## API
+
+Each style has an `open` and `close` property.
+
+
+## Styles
+
+### Modifiers
+
+- `reset`
+- `bold`
+- `dim`
+- `italic` *(Not widely supported)*
+- `underline`
+- `inverse`
+- `hidden`
+- `strikethrough` *(Not widely supported)*
+
+### Colors
+
+- `black`
+- `red`
+- `green`
+- `yellow`
+- `blue`
+- `magenta`
+- `cyan`
+- `white`
+- `gray` ("bright black")
+- `redBright`
+- `greenBright`
+- `yellowBright`
+- `blueBright`
+- `magentaBright`
+- `cyanBright`
+- `whiteBright`
+
+### Background colors
+
+- `bgBlack`
+- `bgRed`
+- `bgGreen`
+- `bgYellow`
+- `bgBlue`
+- `bgMagenta`
+- `bgCyan`
+- `bgWhite`
+- `bgBlackBright`
+- `bgRedBright`
+- `bgGreenBright`
+- `bgYellowBright`
+- `bgBlueBright`
+- `bgMagentaBright`
+- `bgCyanBright`
+- `bgWhiteBright`
+
+
+## Advanced usage
+
+By default, you get a map of styles, but the styles are also available as groups. They are non-enumerable so they don't show up unless you access them explicitly. This makes it easier to expose only a subset in a higher-level module.
+
+- `style.modifier`
+- `style.color`
+- `style.bgColor`
+
+###### Example
+
+```js
+console.log(style.color.green.open);
+```
+
+Raw escape codes (i.e. without the CSI escape prefix `\u001B[` and render mode postfix `m`) are available under `style.codes`, which returns a `Map` with the open codes as keys and close codes as values.
+
+###### Example
+
+```js
+console.log(style.codes.get(36));
+//=> 39
+```
+
+
+## [256 / 16 million (TrueColor) support](https://gist.github.com/XVilka/8346728)
+
+`ansi-styles` uses the [`color-convert`](https://github.com/Qix-/color-convert) package to allow for converting between various colors and ANSI escapes, with support for 256 and 16 million colors.
+
+To use these, call the associated conversion function with the intended output, for example:
+
+```js
+style.color.ansi.rgb(100, 200, 15); // RGB to 16 color ansi foreground code
+style.bgColor.ansi.rgb(100, 200, 15); // RGB to 16 color ansi background code
+
+style.color.ansi256.hsl(120, 100, 60); // HSL to 256 color ansi foreground code
+style.bgColor.ansi256.hsl(120, 100, 60); // HSL to 256 color ansi foreground code
+
+style.color.ansi16m.hex('#C0FFEE'); // Hex (RGB) to 16 million color foreground code
+style.bgColor.ansi16m.hex('#C0FFEE'); // Hex (RGB) to 16 million color background code
+```
+
+
+## Related
+
+- [ansi-escapes](https://github.com/sindresorhus/ansi-escapes) - ANSI escape codes for manipulating the terminal
+
+
+## Maintainers
+
+- [Sindre Sorhus](https://github.com/sindresorhus)
+- [Josh Junon](https://github.com/qix-)
+
+
+## License
+
+MIT
diff --git a/node_modules/command-line-usage/node_modules/array-back/LICENSE b/node_modules/command-line-usage/node_modules/array-back/LICENSE
new file mode 100644
index 0000000..203018f
--- /dev/null
+++ b/node_modules/command-line-usage/node_modules/array-back/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2015-19 Lloyd Brookes <75pound@gmail.com>
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/node_modules/command-line-usage/node_modules/array-back/README.hbs b/node_modules/command-line-usage/node_modules/array-back/README.hbs
new file mode 100644
index 0000000..7d84bd2
--- /dev/null
+++ b/node_modules/command-line-usage/node_modules/array-back/README.hbs
@@ -0,0 +1,40 @@
+[![view on npm](https://img.shields.io/npm/v/array-back.svg)](https://www.npmjs.org/package/array-back)
+[![npm module downloads](https://img.shields.io/npm/dt/array-back.svg)](https://www.npmjs.org/package/array-back)
+[![Build Status](https://travis-ci.org/75lb/array-back.svg?branch=master)](https://travis-ci.org/75lb/array-back)
+[![Coverage Status](https://coveralls.io/repos/github/75lb/array-back/badge.svg?branch=master)](https://coveralls.io/github/75lb/array-back?branch=master)
+[![Dependency Status](https://badgen.net/david/dep/75lb/array-back)](https://david-dm.org/75lb/array-back)
+[![js-standard-style](https://img.shields.io/badge/code%20style-standard-brightgreen.svg)](https://github.com/feross/standard)
+
+{{>main}}
+
+### Load anywhere
+
+This library is compatible with Node.js, the Web and any style of module loader. It can be loaded anywhere, natively without transpilation.
+
+Node.js:
+
+```js
+const arrayify = require('array-back')
+```
+
+Within Node.js with ECMAScript Module support enabled:
+
+```js
+import arrayify from 'array-back'
+```
+
+Within an modern browser ECMAScript Module:
+
+```js
+import arrayify from './node_modules/array-back/index.mjs'
+```
+
+Old browser (adds `window.arrayBack`):
+
+```html
+<script nomodule src="./node_modules/array-back/dist/index.js"></script>
+```
+
+* * *
+
+&copy; 2015-19 Lloyd Brookes \<75pound@gmail.com\>. Documented by [jsdoc-to-markdown](https://github.com/75lb/jsdoc-to-markdown).
diff --git a/node_modules/command-line-usage/node_modules/array-back/README.md b/node_modules/command-line-usage/node_modules/array-back/README.md
new file mode 100644
index 0000000..431339e
--- /dev/null
+++ b/node_modules/command-line-usage/node_modules/array-back/README.md
@@ -0,0 +1,81 @@
+[![view on npm](https://img.shields.io/npm/v/array-back.svg)](https://www.npmjs.org/package/array-back)
+[![npm module downloads](https://img.shields.io/npm/dt/array-back.svg)](https://www.npmjs.org/package/array-back)
+[![Build Status](https://travis-ci.org/75lb/array-back.svg?branch=master)](https://travis-ci.org/75lb/array-back)
+[![Coverage Status](https://coveralls.io/repos/github/75lb/array-back/badge.svg?branch=master)](https://coveralls.io/github/75lb/array-back?branch=master)
+[![Dependency Status](https://badgen.net/david/dep/75lb/array-back)](https://david-dm.org/75lb/array-back)
+[![js-standard-style](https://img.shields.io/badge/code%20style-standard-brightgreen.svg)](https://github.com/feross/standard)
+
+<a name="module_array-back"></a>
+
+## array-back
+Takes any input and guarantees an array back.
+
+- Converts array-like objects (e.g. `arguments`, `Set`) to a real array.
+- Converts `undefined` to an empty array.
+- Converts any another other, singular value (including `null`, objects and iterables other than `Set`) into an array containing that value.
+- Ignores input which is already an array.
+
+**Example**
+```js
+> const arrayify = require('array-back')
+
+> arrayify(undefined)
+[]
+
+> arrayify(null)
+[ null ]
+
+> arrayify(0)
+[ 0 ]
+
+> arrayify([ 1, 2 ])
+[ 1, 2 ]
+
+> arrayify(new Set([ 1, 2 ]))
+[ 1, 2 ]
+
+> function f(){ return arrayify(arguments); }
+> f(1,2,3)
+[ 1, 2, 3 ]
+```
+<a name="exp_module_array-back--arrayify"></a>
+
+### arrayify(input) ⇒ <code>Array</code> ⏏
+**Kind**: Exported function
+
+| Param | Type | Description |
+| --- | --- | --- |
+| input | <code>\*</code> | The input value to convert to an array |
+
+
+### Load anywhere
+
+This library is compatible with Node.js, the Web and any style of module loader. It can be loaded anywhere, natively without transpilation.
+
+Node.js:
+
+```js
+const arrayify = require('array-back')
+```
+
+Within Node.js with ECMAScript Module support enabled:
+
+```js
+import arrayify from 'array-back'
+```
+
+Within an modern browser ECMAScript Module:
+
+```js
+import arrayify from './node_modules/array-back/index.mjs'
+```
+
+Old browser (adds `window.arrayBack`):
+
+```html
+<script nomodule src="./node_modules/array-back/dist/index.js"></script>
+```
+
+* * *
+
+&copy; 2015-19 Lloyd Brookes \<75pound@gmail.com\>. Documented by [jsdoc-to-markdown](https://github.com/75lb/jsdoc-to-markdown).
diff --git a/node_modules/command-line-usage/node_modules/array-back/dist/index.js b/node_modules/command-line-usage/node_modules/array-back/dist/index.js
new file mode 100644
index 0000000..3b97b84
--- /dev/null
+++ b/node_modules/command-line-usage/node_modules/array-back/dist/index.js
@@ -0,0 +1,70 @@
+(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
+ typeof define === 'function' && define.amd ? define(factory) :
+ (global = global || self, global.arrayBack = factory());
+}(this, (function () { 'use strict';
+
+ /**
+ * Takes any input and guarantees an array back.
+ *
+ * - Converts array-like objects (e.g. `arguments`, `Set`) to a real array.
+ * - Converts `undefined` to an empty array.
+ * - Converts any another other, singular value (including `null`, objects and iterables other than `Set`) into an array containing that value.
+ * - Ignores input which is already an array.
+ *
+ * @module array-back
+ * @example
+ * > const arrayify = require('array-back')
+ *
+ * > arrayify(undefined)
+ * []
+ *
+ * > arrayify(null)
+ * [ null ]
+ *
+ * > arrayify(0)
+ * [ 0 ]
+ *
+ * > arrayify([ 1, 2 ])
+ * [ 1, 2 ]
+ *
+ * > arrayify(new Set([ 1, 2 ]))
+ * [ 1, 2 ]
+ *
+ * > function f(){ return arrayify(arguments); }
+ * > f(1,2,3)
+ * [ 1, 2, 3 ]
+ */
+
+ function isObject (input) {
+ return typeof input === 'object' && input !== null
+ }
+
+ function isArrayLike (input) {
+ return isObject(input) && typeof input.length === 'number'
+ }
+
+ /**
+ * @param {*} - The input value to convert to an array
+ * @returns {Array}
+ * @alias module:array-back
+ */
+ function arrayify (input) {
+ if (Array.isArray(input)) {
+ return input
+ }
+
+ if (input === undefined) {
+ return []
+ }
+
+ if (isArrayLike(input) || input instanceof Set) {
+ return Array.from(input)
+ }
+
+ return [input]
+ }
+
+ return arrayify;
+
+})));
diff --git a/node_modules/command-line-usage/node_modules/array-back/index.mjs b/node_modules/command-line-usage/node_modules/array-back/index.mjs
new file mode 100644
index 0000000..1090399
--- /dev/null
+++ b/node_modules/command-line-usage/node_modules/array-back/index.mjs
@@ -0,0 +1,62 @@
+/**
+ * Takes any input and guarantees an array back.
+ *
+ * - Converts array-like objects (e.g. `arguments`, `Set`) to a real array.
+ * - Converts `undefined` to an empty array.
+ * - Converts any another other, singular value (including `null`, objects and iterables other than `Set`) into an array containing that value.
+ * - Ignores input which is already an array.
+ *
+ * @module array-back
+ * @example
+ * > const arrayify = require('array-back')
+ *
+ * > arrayify(undefined)
+ * []
+ *
+ * > arrayify(null)
+ * [ null ]
+ *
+ * > arrayify(0)
+ * [ 0 ]
+ *
+ * > arrayify([ 1, 2 ])
+ * [ 1, 2 ]
+ *
+ * > arrayify(new Set([ 1, 2 ]))
+ * [ 1, 2 ]
+ *
+ * > function f(){ return arrayify(arguments); }
+ * > f(1,2,3)
+ * [ 1, 2, 3 ]
+ */
+
+function isObject (input) {
+ return typeof input === 'object' && input !== null
+}
+
+function isArrayLike (input) {
+ return isObject(input) && typeof input.length === 'number'
+}
+
+/**
+ * @param {*} - The input value to convert to an array
+ * @returns {Array}
+ * @alias module:array-back
+ */
+function arrayify (input) {
+ if (Array.isArray(input)) {
+ return input
+ }
+
+ if (input === undefined) {
+ return []
+ }
+
+ if (isArrayLike(input) || input instanceof Set) {
+ return Array.from(input)
+ }
+
+ return [input]
+}
+
+export default arrayify
diff --git a/node_modules/command-line-usage/node_modules/array-back/package.json b/node_modules/command-line-usage/node_modules/array-back/package.json
new file mode 100644
index 0000000..a677a10
--- /dev/null
+++ b/node_modules/command-line-usage/node_modules/array-back/package.json
@@ -0,0 +1,46 @@
+{
+ "name": "array-back",
+ "author": "Lloyd Brookes <75pound@gmail.com>",
+ "version": "4.0.2",
+ "description": "Guarantees an array back",
+ "repository": "https://github.com/75lb/array-back.git",
+ "license": "MIT",
+ "main": "dist/index.js",
+ "keywords": [
+ "to",
+ "convert",
+ "return",
+ "array",
+ "arrayify"
+ ],
+ "engines": {
+ "node": ">=8"
+ },
+ "files": [
+ "index.mjs",
+ "dist/index.js"
+ ],
+ "scripts": {
+ "test": "npm run dist && npm run test:esm && npm run test:web",
+ "test:esm": "esm-runner test.mjs",
+ "test:web": "web-runner test.mjs",
+ "docs": "jsdoc2md -t README.hbs index.mjs -c jsdoc.conf > README.md",
+ "dist": "rollup -f umd -n arrayBack -o dist/index.js index.mjs",
+ "cover": "c8 npm run test:esm && c8 report --reporter=text-lcov | coveralls"
+ },
+ "dependencies": {},
+ "devDependencies": {
+ "@test-runner/web": "^0.2.1",
+ "c8": "^6.0.1",
+ "coveralls": "^3.0.7",
+ "esm-runner": "^0.2.0",
+ "isomorphic-assert": "^0.1.1",
+ "jsdoc-to-markdown": "^5.0.2",
+ "rollup": "^1.26.5"
+ },
+ "standard": {
+ "ignore": [
+ "dist"
+ ]
+ }
+}
diff --git a/node_modules/command-line-usage/node_modules/chalk/index.js b/node_modules/command-line-usage/node_modules/chalk/index.js
new file mode 100644
index 0000000..1cc5fa8
--- /dev/null
+++ b/node_modules/command-line-usage/node_modules/chalk/index.js
@@ -0,0 +1,228 @@
+'use strict';
+const escapeStringRegexp = require('escape-string-regexp');
+const ansiStyles = require('ansi-styles');
+const stdoutColor = require('supports-color').stdout;
+
+const template = require('./templates.js');
+
+const isSimpleWindowsTerm = process.platform === 'win32' && !(process.env.TERM || '').toLowerCase().startsWith('xterm');
+
+// `supportsColor.level` → `ansiStyles.color[name]` mapping
+const levelMapping = ['ansi', 'ansi', 'ansi256', 'ansi16m'];
+
+// `color-convert` models to exclude from the Chalk API due to conflicts and such
+const skipModels = new Set(['gray']);
+
+const styles = Object.create(null);
+
+function applyOptions(obj, options) {
+ options = options || {};
+
+ // Detect level if not set manually
+ const scLevel = stdoutColor ? stdoutColor.level : 0;
+ obj.level = options.level === undefined ? scLevel : options.level;
+ obj.enabled = 'enabled' in options ? options.enabled : obj.level > 0;
+}
+
+function Chalk(options) {
+ // We check for this.template here since calling `chalk.constructor()`
+ // by itself will have a `this` of a previously constructed chalk object
+ if (!this || !(this instanceof Chalk) || this.template) {
+ const chalk = {};
+ applyOptions(chalk, options);
+
+ chalk.template = function () {
+ const args = [].slice.call(arguments);
+ return chalkTag.apply(null, [chalk.template].concat(args));
+ };
+
+ Object.setPrototypeOf(chalk, Chalk.prototype);
+ Object.setPrototypeOf(chalk.template, chalk);
+
+ chalk.template.constructor = Chalk;
+
+ return chalk.template;
+ }
+
+ applyOptions(this, options);
+}
+
+// Use bright blue on Windows as the normal blue color is illegible
+if (isSimpleWindowsTerm) {
+ ansiStyles.blue.open = '\u001B[94m';
+}
+
+for (const key of Object.keys(ansiStyles)) {
+ ansiStyles[key].closeRe = new RegExp(escapeStringRegexp(ansiStyles[key].close), 'g');
+
+ styles[key] = {
+ get() {
+ const codes = ansiStyles[key];
+ return build.call(this, this._styles ? this._styles.concat(codes) : [codes], this._empty, key);
+ }
+ };
+}
+
+styles.visible = {
+ get() {
+ return build.call(this, this._styles || [], true, 'visible');
+ }
+};
+
+ansiStyles.color.closeRe = new RegExp(escapeStringRegexp(ansiStyles.color.close), 'g');
+for (const model of Object.keys(ansiStyles.color.ansi)) {
+ if (skipModels.has(model)) {
+ continue;
+ }
+
+ styles[model] = {
+ get() {
+ const level = this.level;
+ return function () {
+ const open = ansiStyles.color[levelMapping[level]][model].apply(null, arguments);
+ const codes = {
+ open,
+ close: ansiStyles.color.close,
+ closeRe: ansiStyles.color.closeRe
+ };
+ return build.call(this, this._styles ? this._styles.concat(codes) : [codes], this._empty, model);
+ };
+ }
+ };
+}
+
+ansiStyles.bgColor.closeRe = new RegExp(escapeStringRegexp(ansiStyles.bgColor.close), 'g');
+for (const model of Object.keys(ansiStyles.bgColor.ansi)) {
+ if (skipModels.has(model)) {
+ continue;
+ }
+
+ const bgModel = 'bg' + model[0].toUpperCase() + model.slice(1);
+ styles[bgModel] = {
+ get() {
+ const level = this.level;
+ return function () {
+ const open = ansiStyles.bgColor[levelMapping[level]][model].apply(null, arguments);
+ const codes = {
+ open,
+ close: ansiStyles.bgColor.close,
+ closeRe: ansiStyles.bgColor.closeRe
+ };
+ return build.call(this, this._styles ? this._styles.concat(codes) : [codes], this._empty, model);
+ };
+ }
+ };
+}
+
+const proto = Object.defineProperties(() => {}, styles);
+
+function build(_styles, _empty, key) {
+ const builder = function () {
+ return applyStyle.apply(builder, arguments);
+ };
+
+ builder._styles = _styles;
+ builder._empty = _empty;
+
+ const self = this;
+
+ Object.defineProperty(builder, 'level', {
+ enumerable: true,
+ get() {
+ return self.level;
+ },
+ set(level) {
+ self.level = level;
+ }
+ });
+
+ Object.defineProperty(builder, 'enabled', {
+ enumerable: true,
+ get() {
+ return self.enabled;
+ },
+ set(enabled) {
+ self.enabled = enabled;
+ }
+ });
+
+ // See below for fix regarding invisible grey/dim combination on Windows
+ builder.hasGrey = this.hasGrey || key === 'gray' || key === 'grey';
+
+ // `__proto__` is used because we must return a function, but there is
+ // no way to create a function with a different prototype
+ builder.__proto__ = proto; // eslint-disable-line no-proto
+
+ return builder;
+}
+
+function applyStyle() {
+ // Support varags, but simply cast to string in case there's only one arg
+ const args = arguments;
+ const argsLen = args.length;
+ let str = String(arguments[0]);
+
+ if (argsLen === 0) {
+ return '';
+ }
+
+ if (argsLen > 1) {
+ // Don't slice `arguments`, it prevents V8 optimizations
+ for (let a = 1; a < argsLen; a++) {
+ str += ' ' + args[a];
+ }
+ }
+
+ if (!this.enabled || this.level <= 0 || !str) {
+ return this._empty ? '' : str;
+ }
+
+ // Turns out that on Windows dimmed gray text becomes invisible in cmd.exe,
+ // see https://github.com/chalk/chalk/issues/58
+ // If we're on Windows and we're dealing with a gray color, temporarily make 'dim' a noop.
+ const originalDim = ansiStyles.dim.open;
+ if (isSimpleWindowsTerm && this.hasGrey) {
+ ansiStyles.dim.open = '';
+ }
+
+ for (const code of this._styles.slice().reverse()) {
+ // Replace any instances already present with a re-opening code
+ // otherwise only the part of the string until said closing code
+ // will be colored, and the rest will simply be 'plain'.
+ str = code.open + str.replace(code.closeRe, code.open) + code.close;
+
+ // Close the styling before a linebreak and reopen
+ // after next line to fix a bleed issue on macOS
+ // https://github.com/chalk/chalk/pull/92
+ str = str.replace(/\r?\n/g, `${code.close}$&${code.open}`);
+ }
+
+ // Reset the original `dim` if we changed it to work around the Windows dimmed gray issue
+ ansiStyles.dim.open = originalDim;
+
+ return str;
+}
+
+function chalkTag(chalk, strings) {
+ if (!Array.isArray(strings)) {
+ // If chalk() was called by itself or with a string,
+ // return the string itself as a string.
+ return [].slice.call(arguments, 1).join(' ');
+ }
+
+ const args = [].slice.call(arguments, 2);
+ const parts = [strings.raw[0]];
+
+ for (let i = 1; i < strings.length; i++) {
+ parts.push(String(args[i - 1]).replace(/[{}\\]/g, '\\$&'));
+ parts.push(String(strings.raw[i]));
+ }
+
+ return template(chalk, parts.join(''));
+}
+
+Object.defineProperties(Chalk.prototype, styles);
+
+module.exports = Chalk(); // eslint-disable-line new-cap
+module.exports.supportsColor = stdoutColor;
+module.exports.default = module.exports; // For TypeScript
diff --git a/node_modules/command-line-usage/node_modules/chalk/index.js.flow b/node_modules/command-line-usage/node_modules/chalk/index.js.flow
new file mode 100644
index 0000000..622caaa
--- /dev/null
+++ b/node_modules/command-line-usage/node_modules/chalk/index.js.flow
@@ -0,0 +1,93 @@
+// @flow strict
+
+type TemplateStringsArray = $ReadOnlyArray<string>;
+
+export type Level = $Values<{
+ None: 0,
+ Basic: 1,
+ Ansi256: 2,
+ TrueColor: 3
+}>;
+
+export type ChalkOptions = {|
+ enabled?: boolean,
+ level?: Level
+|};
+
+export type ColorSupport = {|
+ level: Level,
+ hasBasic: boolean,
+ has256: boolean,
+ has16m: boolean
+|};
+
+export interface Chalk {
+ (...text: string[]): string,
+ (text: TemplateStringsArray, ...placeholders: string[]): string,
+ constructor(options?: ChalkOptions): Chalk,
+ enabled: boolean,
+ level: Level,
+ rgb(r: number, g: number, b: number): Chalk,
+ hsl(h: number, s: number, l: number): Chalk,
+ hsv(h: number, s: number, v: number): Chalk,
+ hwb(h: number, w: number, b: number): Chalk,
+ bgHex(color: string): Chalk,
+ bgKeyword(color: string): Chalk,
+ bgRgb(r: number, g: number, b: number): Chalk,
+ bgHsl(h: number, s: number, l: number): Chalk,
+ bgHsv(h: number, s: number, v: number): Chalk,
+ bgHwb(h: number, w: number, b: number): Chalk,
+ hex(color: string): Chalk,
+ keyword(color: string): Chalk,
+
+ +reset: Chalk,
+ +bold: Chalk,
+ +dim: Chalk,
+ +italic: Chalk,
+ +underline: Chalk,
+ +inverse: Chalk,
+ +hidden: Chalk,
+ +strikethrough: Chalk,
+
+ +visible: Chalk,
+
+ +black: Chalk,
+ +red: Chalk,
+ +green: Chalk,
+ +yellow: Chalk,
+ +blue: Chalk,
+ +magenta: Chalk,
+ +cyan: Chalk,
+ +white: Chalk,
+ +gray: Chalk,
+ +grey: Chalk,
+ +blackBright: Chalk,
+ +redBright: Chalk,
+ +greenBright: Chalk,
+ +yellowBright: Chalk,
+ +blueBright: Chalk,
+ +magentaBright: Chalk,
+ +cyanBright: Chalk,
+ +whiteBright: Chalk,
+
+ +bgBlack: Chalk,
+ +bgRed: Chalk,
+ +bgGreen: Chalk,
+ +bgYellow: Chalk,
+ +bgBlue: Chalk,
+ +bgMagenta: Chalk,
+ +bgCyan: Chalk,
+ +bgWhite: Chalk,
+ +bgBlackBright: Chalk,
+ +bgRedBright: Chalk,
+ +bgGreenBright: Chalk,
+ +bgYellowBright: Chalk,
+ +bgBlueBright: Chalk,
+ +bgMagentaBright: Chalk,
+ +bgCyanBright: Chalk,
+ +bgWhiteBrigh: Chalk,
+
+ supportsColor: ColorSupport
+};
+
+declare module.exports: Chalk;
diff --git a/node_modules/command-line-usage/node_modules/chalk/license b/node_modules/command-line-usage/node_modules/chalk/license
new file mode 100644
index 0000000..e7af2f7
--- /dev/null
+++ b/node_modules/command-line-usage/node_modules/chalk/license
@@ -0,0 +1,9 @@
+MIT License
+
+Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/node_modules/command-line-usage/node_modules/chalk/package.json b/node_modules/command-line-usage/node_modules/chalk/package.json
new file mode 100644
index 0000000..bc32468
--- /dev/null
+++ b/node_modules/command-line-usage/node_modules/chalk/package.json
@@ -0,0 +1,71 @@
+{
+ "name": "chalk",
+ "version": "2.4.2",
+ "description": "Terminal string styling done right",
+ "license": "MIT",
+ "repository": "chalk/chalk",
+ "engines": {
+ "node": ">=4"
+ },
+ "scripts": {
+ "test": "xo && tsc --project types && flow --max-warnings=0 && nyc ava",
+ "bench": "matcha benchmark.js",
+ "coveralls": "nyc report --reporter=text-lcov | coveralls"
+ },
+ "files": [
+ "index.js",
+ "templates.js",
+ "types/index.d.ts",
+ "index.js.flow"
+ ],
+ "keywords": [
+ "color",
+ "colour",
+ "colors",
+ "terminal",
+ "console",
+ "cli",
+ "string",
+ "str",
+ "ansi",
+ "style",
+ "styles",
+ "tty",
+ "formatting",
+ "rgb",
+ "256",
+ "shell",
+ "xterm",
+ "log",
+ "logging",
+ "command-line",
+ "text"
+ ],
+ "dependencies": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ },
+ "devDependencies": {
+ "ava": "*",
+ "coveralls": "^3.0.0",
+ "execa": "^0.9.0",
+ "flow-bin": "^0.68.0",
+ "import-fresh": "^2.0.0",
+ "matcha": "^0.7.0",
+ "nyc": "^11.0.2",
+ "resolve-from": "^4.0.0",
+ "typescript": "^2.5.3",
+ "xo": "*"
+ },
+ "types": "types/index.d.ts",
+ "xo": {
+ "envs": [
+ "node",
+ "mocha"
+ ],
+ "ignores": [
+ "test/_flow.js"
+ ]
+ }
+}
diff --git a/node_modules/command-line-usage/node_modules/chalk/readme.md b/node_modules/command-line-usage/node_modules/chalk/readme.md
new file mode 100644
index 0000000..d298e2c
--- /dev/null
+++ b/node_modules/command-line-usage/node_modules/chalk/readme.md
@@ -0,0 +1,314 @@
+<h1 align="center">
+ <br>
+ <br>
+ <img width="320" src="media/logo.svg" alt="Chalk">
+ <br>
+ <br>
+ <br>
+</h1>
+
+> Terminal string styling done right
+
+[![Build Status](https://travis-ci.org/chalk/chalk.svg?branch=master)](https://travis-ci.org/chalk/chalk) [![Coverage Status](https://coveralls.io/repos/github/chalk/chalk/badge.svg?branch=master)](https://coveralls.io/github/chalk/chalk?branch=master) [![](https://img.shields.io/badge/unicorn-approved-ff69b4.svg)](https://www.youtube.com/watch?v=9auOCbH5Ns4) [![XO code style](https://img.shields.io/badge/code_style-XO-5ed9c7.svg)](https://github.com/xojs/xo) [![Mentioned in Awesome Node.js](https://awesome.re/mentioned-badge.svg)](https://github.com/sindresorhus/awesome-nodejs)
+
+### [See what's new in Chalk 2](https://github.com/chalk/chalk/releases/tag/v2.0.0)
+
+<img src="https://cdn.rawgit.com/chalk/ansi-styles/8261697c95bf34b6c7767e2cbe9941a851d59385/screenshot.svg" alt="" width="900">
+
+
+## Highlights
+
+- Expressive API
+- Highly performant
+- Ability to nest styles
+- [256/Truecolor color support](#256-and-truecolor-color-support)
+- Auto-detects color support
+- Doesn't extend `String.prototype`
+- Clean and focused
+- Actively maintained
+- [Used by ~23,000 packages](https://www.npmjs.com/browse/depended/chalk) as of December 31, 2017
+
+
+## Install
+
+```console
+$ npm install chalk
+```
+
+<a href="https://www.patreon.com/sindresorhus">
+ <img src="https://c5.patreon.com/external/logo/become_a_patron_button@2x.png" width="160">
+</a>
+
+
+## Usage
+
+```js
+const chalk = require('chalk');
+
+console.log(chalk.blue('Hello world!'));
+```
+
+Chalk comes with an easy to use composable API where you just chain and nest the styles you want.
+
+```js
+const chalk = require('chalk');
+const log = console.log;
+
+// Combine styled and normal strings
+log(chalk.blue('Hello') + ' World' + chalk.red('!'));
+
+// Compose multiple styles using the chainable API
+log(chalk.blue.bgRed.bold('Hello world!'));
+
+// Pass in multiple arguments
+log(chalk.blue('Hello', 'World!', 'Foo', 'bar', 'biz', 'baz'));
+
+// Nest styles
+log(chalk.red('Hello', chalk.underline.bgBlue('world') + '!'));
+
+// Nest styles of the same type even (color, underline, background)
+log(chalk.green(
+ 'I am a green line ' +
+ chalk.blue.underline.bold('with a blue substring') +
+ ' that becomes green again!'
+));
+
+// ES2015 template literal
+log(`
+CPU: ${chalk.red('90%')}
+RAM: ${chalk.green('40%')}
+DISK: ${chalk.yellow('70%')}
+`);
+
+// ES2015 tagged template literal
+log(chalk`
+CPU: {red ${cpu.totalPercent}%}
+RAM: {green ${ram.used / ram.total * 100}%}
+DISK: {rgb(255,131,0) ${disk.used / disk.total * 100}%}
+`);
+
+// Use RGB colors in terminal emulators that support it.
+log(chalk.keyword('orange')('Yay for orange colored text!'));
+log(chalk.rgb(123, 45, 67).underline('Underlined reddish color'));
+log(chalk.hex('#DEADED').bold('Bold gray!'));
+```
+
+Easily define your own themes:
+
+```js
+const chalk = require('chalk');
+
+const error = chalk.bold.red;
+const warning = chalk.keyword('orange');
+
+console.log(error('Error!'));
+console.log(warning('Warning!'));
+```
+
+Take advantage of console.log [string substitution](https://nodejs.org/docs/latest/api/console.html#console_console_log_data_args):
+
+```js
+const name = 'Sindre';
+console.log(chalk.green('Hello %s'), name);
+//=> 'Hello Sindre'
+```
+
+
+## API
+
+### chalk.`<style>[.<style>...](string, [string...])`
+
+Example: `chalk.red.bold.underline('Hello', 'world');`
+
+Chain [styles](#styles) and call the last one as a method with a string argument. Order doesn't matter, and later styles take precedent in case of a conflict. This simply means that `chalk.red.yellow.green` is equivalent to `chalk.green`.
+
+Multiple arguments will be separated by space.
+
+### chalk.enabled
+
+Color support is automatically detected, as is the level (see `chalk.level`). However, if you'd like to simply enable/disable Chalk, you can do so via the `.enabled` property.
+
+Chalk is enabled by default unless explicitly disabled via the constructor or `chalk.level` is `0`.
+
+If you need to change this in a reusable module, create a new instance:
+
+```js
+const ctx = new chalk.constructor({enabled: false});
+```
+
+### chalk.level
+
+Color support is automatically detected, but you can override it by setting the `level` property. You should however only do this in your own code as it applies globally to all Chalk consumers.
+
+If you need to change this in a reusable module, create a new instance:
+
+```js
+const ctx = new chalk.constructor({level: 0});
+```
+
+Levels are as follows:
+
+0. All colors disabled
+1. Basic color support (16 colors)
+2. 256 color support
+3. Truecolor support (16 million colors)
+
+### chalk.supportsColor
+
+Detect whether the terminal [supports color](https://github.com/chalk/supports-color). Used internally and handled for you, but exposed for convenience.
+
+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.
+
+
+## Styles
+
+### Modifiers
+
+- `reset`
+- `bold`
+- `dim`
+- `italic` *(Not widely supported)*
+- `underline`
+- `inverse`
+- `hidden`
+- `strikethrough` *(Not widely supported)*
+- `visible` (Text is emitted only if enabled)
+
+### Colors
+
+- `black`
+- `red`
+- `green`
+- `yellow`
+- `blue` *(On Windows the bright version is used since normal blue is illegible)*
+- `magenta`
+- `cyan`
+- `white`
+- `gray` ("bright black")
+- `redBright`
+- `greenBright`
+- `yellowBright`
+- `blueBright`
+- `magentaBright`
+- `cyanBright`
+- `whiteBright`
+
+### Background colors
+
+- `bgBlack`
+- `bgRed`
+- `bgGreen`
+- `bgYellow`
+- `bgBlue`
+- `bgMagenta`
+- `bgCyan`
+- `bgWhite`
+- `bgBlackBright`
+- `bgRedBright`
+- `bgGreenBright`
+- `bgYellowBright`
+- `bgBlueBright`
+- `bgMagentaBright`
+- `bgCyanBright`
+- `bgWhiteBright`
+
+
+## Tagged template literal
+
+Chalk can be used as a [tagged template literal](http://exploringjs.com/es6/ch_template-literals.html#_tagged-template-literals).
+
+```js
+const chalk = require('chalk');
+
+const miles = 18;
+const calculateFeet = miles => miles * 5280;
+
+console.log(chalk`
+ There are {bold 5280 feet} in a mile.
+ In {bold ${miles} miles}, there are {green.bold ${calculateFeet(miles)} feet}.
+`);
+```
+
+Blocks are delimited by an opening curly brace (`{`), a style, some content, and a closing curly brace (`}`).
+
+Template styles are chained exactly like normal Chalk styles. The following two statements are equivalent:
+
+```js
+console.log(chalk.bold.rgb(10, 100, 200)('Hello!'));
+console.log(chalk`{bold.rgb(10,100,200) Hello!}`);
+```
+
+Note that function styles (`rgb()`, `hsl()`, `keyword()`, etc.) may not contain spaces between parameters.
+
+All interpolated values (`` chalk`${foo}` ``) are converted to strings via the `.toString()` method. All curly braces (`{` and `}`) in interpolated value strings are escaped.
+
+
+## 256 and Truecolor color support
+
+Chalk supports 256 colors and [Truecolor](https://gist.github.com/XVilka/8346728) (16 million colors) on supported terminal apps.
+
+Colors are downsampled from 16 million RGB values to an ANSI color format that is supported by the terminal emulator (or by specifying `{level: n}` as a Chalk option). For example, Chalk configured to run at level 1 (basic color support) will downsample an RGB value of #FF0000 (red) to 31 (ANSI escape for red).
+
+Examples:
+
+- `chalk.hex('#DEADED').underline('Hello, world!')`
+- `chalk.keyword('orange')('Some orange text')`
+- `chalk.rgb(15, 100, 204).inverse('Hello!')`
+
+Background versions of these models are prefixed with `bg` and the first level of the module capitalized (e.g. `keyword` for foreground colors and `bgKeyword` for background colors).
+
+- `chalk.bgHex('#DEADED').underline('Hello, world!')`
+- `chalk.bgKeyword('orange')('Some orange text')`
+- `chalk.bgRgb(15, 100, 204).inverse('Hello!')`
+
+The following color models can be used:
+
+- [`rgb`](https://en.wikipedia.org/wiki/RGB_color_model) - Example: `chalk.rgb(255, 136, 0).bold('Orange!')`
+- [`hex`](https://en.wikipedia.org/wiki/Web_colors#Hex_triplet) - Example: `chalk.hex('#FF8800').bold('Orange!')`
+- [`keyword`](https://www.w3.org/wiki/CSS/Properties/color/keywords) (CSS keywords) - Example: `chalk.keyword('orange').bold('Orange!')`
+- [`hsl`](https://en.wikipedia.org/wiki/HSL_and_HSV) - Example: `chalk.hsl(32, 100, 50).bold('Orange!')`
+- [`hsv`](https://en.wikipedia.org/wiki/HSL_and_HSV) - Example: `chalk.hsv(32, 100, 100).bold('Orange!')`
+- [`hwb`](https://en.wikipedia.org/wiki/HWB_color_model) - Example: `chalk.hwb(32, 0, 50).bold('Orange!')`
+- `ansi16`
+- `ansi256`
+
+
+## Windows
+
+If you're on Windows, do yourself a favor and use [`cmder`](http://cmder.net/) instead of `cmd.exe`.
+
+
+## Origin story
+
+[colors.js](https://github.com/Marak/colors.js) used to be the most popular string styling module, but it has serious deficiencies like extending `String.prototype` which causes all kinds of [problems](https://github.com/yeoman/yo/issues/68) and the package is unmaintained. Although there are other packages, they either do too much or not enough. Chalk is a clean and focused alternative.
+
+
+## Related
+
+- [chalk-cli](https://github.com/chalk/chalk-cli) - CLI for this module
+- [ansi-styles](https://github.com/chalk/ansi-styles) - ANSI escape codes for styling strings in the terminal
+- [supports-color](https://github.com/chalk/supports-color) - Detect whether a terminal supports color
+- [strip-ansi](https://github.com/chalk/strip-ansi) - Strip ANSI escape codes
+- [strip-ansi-stream](https://github.com/chalk/strip-ansi-stream) - Strip ANSI escape codes from a stream
+- [has-ansi](https://github.com/chalk/has-ansi) - Check if a string has ANSI escape codes
+- [ansi-regex](https://github.com/chalk/ansi-regex) - Regular expression for matching ANSI escape codes
+- [wrap-ansi](https://github.com/chalk/wrap-ansi) - Wordwrap a string with ANSI escape codes
+- [slice-ansi](https://github.com/chalk/slice-ansi) - Slice a string with ANSI escape codes
+- [color-convert](https://github.com/qix-/color-convert) - Converts colors between different models
+- [chalk-animation](https://github.com/bokub/chalk-animation) - Animate strings in the terminal
+- [gradient-string](https://github.com/bokub/gradient-string) - Apply color gradients to strings
+- [chalk-pipe](https://github.com/LitoMore/chalk-pipe) - Create chalk style schemes with simpler style strings
+- [terminal-link](https://github.com/sindresorhus/terminal-link) - Create clickable links in the terminal
+
+
+## Maintainers
+
+- [Sindre Sorhus](https://github.com/sindresorhus)
+- [Josh Junon](https://github.com/qix-)
+
+
+## License
+
+MIT
diff --git a/node_modules/command-line-usage/node_modules/chalk/templates.js b/node_modules/command-line-usage/node_modules/chalk/templates.js
new file mode 100644
index 0000000..dbdf9b2
--- /dev/null
+++ b/node_modules/command-line-usage/node_modules/chalk/templates.js
@@ -0,0 +1,128 @@
+'use strict';
+const TEMPLATE_REGEX = /(?:\\(u[a-f\d]{4}|x[a-f\d]{2}|.))|(?:\{(~)?(\w+(?:\([^)]*\))?(?:\.\w+(?:\([^)]*\))?)*)(?:[ \t]|(?=\r?\n)))|(\})|((?:.|[\r\n\f])+?)/gi;
+const STYLE_REGEX = /(?:^|\.)(\w+)(?:\(([^)]*)\))?/g;
+const STRING_REGEX = /^(['"])((?:\\.|(?!\1)[^\\])*)\1$/;
+const ESCAPE_REGEX = /\\(u[a-f\d]{4}|x[a-f\d]{2}|.)|([^\\])/gi;
+
+const ESCAPES = new Map([
+ ['n', '\n'],
+ ['r', '\r'],
+ ['t', '\t'],
+ ['b', '\b'],
+ ['f', '\f'],
+ ['v', '\v'],
+ ['0', '\0'],
+ ['\\', '\\'],
+ ['e', '\u001B'],
+ ['a', '\u0007']
+]);
+
+function unescape(c) {
+ if ((c[0] === 'u' && c.length === 5) || (c[0] === 'x' && c.length === 3)) {
+ return String.fromCharCode(parseInt(c.slice(1), 16));
+ }
+
+ return ESCAPES.get(c) || c;
+}
+
+function parseArguments(name, args) {
+ const results = [];
+ const chunks = args.trim().split(/\s*,\s*/g);
+ let matches;
+
+ for (const chunk of chunks) {
+ if (!isNaN(chunk)) {
+ results.push(Number(chunk));
+ } else if ((matches = chunk.match(STRING_REGEX))) {
+ results.push(matches[2].replace(ESCAPE_REGEX, (m, escape, chr) => escape ? unescape(escape) : chr));
+ } else {
+ throw new Error(`Invalid Chalk template style argument: ${chunk} (in style '${name}')`);
+ }
+ }
+
+ return results;
+}
+
+function parseStyle(style) {
+ STYLE_REGEX.lastIndex = 0;
+
+ const results = [];
+ let matches;
+
+ while ((matches = STYLE_REGEX.exec(style)) !== null) {
+ const name = matches[1];
+
+ if (matches[2]) {
+ const args = parseArguments(name, matches[2]);
+ results.push([name].concat(args));
+ } else {
+ results.push([name]);
+ }
+ }
+
+ return results;
+}
+
+function buildStyle(chalk, styles) {
+ const enabled = {};
+
+ for (const layer of styles) {
+ for (const style of layer.styles) {
+ enabled[style[0]] = layer.inverse ? null : style.slice(1);
+ }
+ }
+
+ let current = chalk;
+ for (const styleName of Object.keys(enabled)) {
+ if (Array.isArray(enabled[styleName])) {
+ if (!(styleName in current)) {
+ throw new Error(`Unknown Chalk style: ${styleName}`);
+ }
+
+ if (enabled[styleName].length > 0) {
+ current = current[styleName].apply(current, enabled[styleName]);
+ } else {
+ current = current[styleName];
+ }
+ }
+ }
+
+ return current;
+}
+
+module.exports = (chalk, tmp) => {
+ const styles = [];
+ const chunks = [];
+ let chunk = [];
+
+ // eslint-disable-next-line max-params
+ tmp.replace(TEMPLATE_REGEX, (m, escapeChar, inverse, style, close, chr) => {
+ if (escapeChar) {
+ chunk.push(unescape(escapeChar));
+ } else if (style) {
+ const str = chunk.join('');
+ chunk = [];
+ chunks.push(styles.length === 0 ? str : buildStyle(chalk, styles)(str));
+ styles.push({inverse, styles: parseStyle(style)});
+ } else if (close) {
+ if (styles.length === 0) {
+ throw new Error('Found extraneous } in Chalk template literal');
+ }
+
+ chunks.push(buildStyle(chalk, styles)(chunk.join('')));
+ chunk = [];
+ styles.pop();
+ } else {
+ chunk.push(chr);
+ }
+ });
+
+ chunks.push(chunk.join(''));
+
+ if (styles.length > 0) {
+ const errMsg = `Chalk template literal is missing ${styles.length} closing bracket${styles.length === 1 ? '' : 's'} (\`}\`)`;
+ throw new Error(errMsg);
+ }
+
+ return chunks.join('');
+};
diff --git a/node_modules/command-line-usage/node_modules/chalk/types/index.d.ts b/node_modules/command-line-usage/node_modules/chalk/types/index.d.ts
new file mode 100644
index 0000000..b4e4dc5
--- /dev/null
+++ b/node_modules/command-line-usage/node_modules/chalk/types/index.d.ts
@@ -0,0 +1,97 @@
+// Type definitions for Chalk
+// Definitions by: Thomas Sauer <https://github.com/t-sauer>
+
+export const enum Level {
+ None = 0,
+ Basic = 1,
+ Ansi256 = 2,
+ TrueColor = 3
+}
+
+export interface ChalkOptions {
+ enabled?: boolean;
+ level?: Level;
+}
+
+export interface ChalkConstructor {
+ new (options?: ChalkOptions): Chalk;
+ (options?: ChalkOptions): Chalk;
+}
+
+export interface ColorSupport {
+ level: Level;
+ hasBasic: boolean;
+ has256: boolean;
+ has16m: boolean;
+}
+
+export interface Chalk {
+ (...text: string[]): string;
+ (text: TemplateStringsArray, ...placeholders: string[]): string;
+ constructor: ChalkConstructor;
+ enabled: boolean;
+ level: Level;
+ rgb(r: number, g: number, b: number): this;
+ hsl(h: number, s: number, l: number): this;
+ hsv(h: number, s: number, v: number): this;
+ hwb(h: number, w: number, b: number): this;
+ bgHex(color: string): this;
+ bgKeyword(color: string): this;
+ bgRgb(r: number, g: number, b: number): this;
+ bgHsl(h: number, s: number, l: number): this;
+ bgHsv(h: number, s: number, v: number): this;
+ bgHwb(h: number, w: number, b: number): this;
+ hex(color: string): this;
+ keyword(color: string): this;
+
+ readonly reset: this;
+ readonly bold: this;
+ readonly dim: this;
+ readonly italic: this;
+ readonly underline: this;
+ readonly inverse: this;
+ readonly hidden: this;
+ readonly strikethrough: this;
+
+ readonly visible: this;
+
+ readonly black: this;
+ readonly red: this;
+ readonly green: this;
+ readonly yellow: this;
+ readonly blue: this;
+ readonly magenta: this;
+ readonly cyan: this;
+ readonly white: this;
+ readonly gray: this;
+ readonly grey: this;
+ readonly blackBright: this;
+ readonly redBright: this;
+ readonly greenBright: this;
+ readonly yellowBright: this;
+ readonly blueBright: this;
+ readonly magentaBright: this;
+ readonly cyanBright: this;
+ readonly whiteBright: this;
+
+ readonly bgBlack: this;
+ readonly bgRed: this;
+ readonly bgGreen: this;
+ readonly bgYellow: this;
+ readonly bgBlue: this;
+ readonly bgMagenta: this;
+ readonly bgCyan: this;
+ readonly bgWhite: this;
+ readonly bgBlackBright: this;
+ readonly bgRedBright: this;
+ readonly bgGreenBright: this;
+ readonly bgYellowBright: this;
+ readonly bgBlueBright: this;
+ readonly bgMagentaBright: this;
+ readonly bgCyanBright: this;
+ readonly bgWhiteBright: this;
+}
+
+declare const chalk: Chalk & { supportsColor: ColorSupport };
+
+export default chalk
diff --git a/node_modules/command-line-usage/node_modules/color-convert/CHANGELOG.md b/node_modules/command-line-usage/node_modules/color-convert/CHANGELOG.md
new file mode 100644
index 0000000..0a7bce4
--- /dev/null
+++ b/node_modules/command-line-usage/node_modules/color-convert/CHANGELOG.md
@@ -0,0 +1,54 @@
+# 1.0.0 - 2016-01-07
+
+- Removed: unused speed test
+- Added: Automatic routing between previously unsupported conversions
+([#27](https://github.com/Qix-/color-convert/pull/27))
+- Removed: `xxx2xxx()` and `xxx2xxxRaw()` functions
+([#27](https://github.com/Qix-/color-convert/pull/27))
+- Removed: `convert()` class
+([#27](https://github.com/Qix-/color-convert/pull/27))
+- Changed: all functions to lookup dictionary
+([#27](https://github.com/Qix-/color-convert/pull/27))
+- Changed: `ansi` to `ansi256`
+([#27](https://github.com/Qix-/color-convert/pull/27))
+- Fixed: argument grouping for functions requiring only one argument
+([#27](https://github.com/Qix-/color-convert/pull/27))
+
+# 0.6.0 - 2015-07-23
+
+- Added: methods to handle
+[ANSI](https://en.wikipedia.org/wiki/ANSI_escape_code#Colors) 16/256 colors:
+ - rgb2ansi16
+ - rgb2ansi
+ - hsl2ansi16
+ - hsl2ansi
+ - hsv2ansi16
+ - hsv2ansi
+ - hwb2ansi16
+ - hwb2ansi
+ - cmyk2ansi16
+ - cmyk2ansi
+ - keyword2ansi16
+ - keyword2ansi
+ - ansi162rgb
+ - ansi162hsl
+ - ansi162hsv
+ - ansi162hwb
+ - ansi162cmyk
+ - ansi162keyword
+ - ansi2rgb
+ - ansi2hsl
+ - ansi2hsv
+ - ansi2hwb
+ - ansi2cmyk
+ - ansi2keyword
+([#18](https://github.com/harthur/color-convert/pull/18))
+
+# 0.5.3 - 2015-06-02
+
+- Fixed: hsl2hsv does not return `NaN` anymore when using `[0,0,0]`
+([#15](https://github.com/harthur/color-convert/issues/15))
+
+---
+
+Check out commit logs for older releases
diff --git a/node_modules/command-line-usage/node_modules/color-convert/LICENSE b/node_modules/command-line-usage/node_modules/color-convert/LICENSE
new file mode 100644
index 0000000..5b4c386
--- /dev/null
+++ b/node_modules/command-line-usage/node_modules/color-convert/LICENSE
@@ -0,0 +1,21 @@
+Copyright (c) 2011-2016 Heather Arthur <fayearthur@gmail.com>
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
diff --git a/node_modules/command-line-usage/node_modules/color-convert/README.md b/node_modules/command-line-usage/node_modules/color-convert/README.md
new file mode 100644
index 0000000..d4b08fc
--- /dev/null
+++ b/node_modules/command-line-usage/node_modules/color-convert/README.md
@@ -0,0 +1,68 @@
+# color-convert
+
+[![Build Status](https://travis-ci.org/Qix-/color-convert.svg?branch=master)](https://travis-ci.org/Qix-/color-convert)
+
+Color-convert is a color conversion library for JavaScript and node.
+It converts all ways between `rgb`, `hsl`, `hsv`, `hwb`, `cmyk`, `ansi`, `ansi16`, `hex` strings, and CSS `keyword`s (will round to closest):
+
+```js
+var convert = require('color-convert');
+
+convert.rgb.hsl(140, 200, 100); // [96, 48, 59]
+convert.keyword.rgb('blue'); // [0, 0, 255]
+
+var rgbChannels = convert.rgb.channels; // 3
+var cmykChannels = convert.cmyk.channels; // 4
+var ansiChannels = convert.ansi16.channels; // 1
+```
+
+# Install
+
+```console
+$ npm install color-convert
+```
+
+# API
+
+Simply get the property of the _from_ and _to_ conversion that you're looking for.
+
+All functions have a rounded and unrounded variant. By default, return values are rounded. To get the unrounded (raw) results, simply tack on `.raw` to the function.
+
+All 'from' functions have a hidden property called `.channels` that indicates the number of channels the function expects (not including alpha).
+
+```js
+var convert = require('color-convert');
+
+// Hex to LAB
+convert.hex.lab('DEADBF'); // [ 76, 21, -2 ]
+convert.hex.lab.raw('DEADBF'); // [ 75.56213190997677, 20.653827952644754, -2.290532499330533 ]
+
+// RGB to CMYK
+convert.rgb.cmyk(167, 255, 4); // [ 35, 0, 98, 0 ]
+convert.rgb.cmyk.raw(167, 255, 4); // [ 34.509803921568626, 0, 98.43137254901961, 0 ]
+```
+
+### Arrays
+All functions that accept multiple arguments also support passing an array.
+
+Note that this does **not** apply to functions that convert from a color that only requires one value (e.g. `keyword`, `ansi256`, `hex`, etc.)
+
+```js
+var convert = require('color-convert');
+
+convert.rgb.hex(123, 45, 67); // '7B2D43'
+convert.rgb.hex([123, 45, 67]); // '7B2D43'
+```
+
+## Routing
+
+Conversions that don't have an _explicitly_ defined conversion (in [conversions.js](conversions.js)), but can be converted by means of sub-conversions (e.g. XYZ -> **RGB** -> CMYK), are automatically routed together. This allows just about any color model supported by `color-convert` to be converted to any other model, so long as a sub-conversion path exists. This is also true for conversions requiring more than one step in between (e.g. LCH -> **LAB** -> **XYZ** -> **RGB** -> Hex).
+
+Keep in mind that extensive conversions _may_ result in a loss of precision, and exist only to be complete. For a list of "direct" (single-step) conversions, see [conversions.js](conversions.js).
+
+# Contribute
+
+If there is a new model you would like to support, or want to add a direct conversion between two existing models, please send us a pull request.
+
+# License
+Copyright &copy; 2011-2016, Heather Arthur and Josh Junon. Licensed under the [MIT License](LICENSE).
diff --git a/node_modules/command-line-usage/node_modules/color-convert/conversions.js b/node_modules/command-line-usage/node_modules/color-convert/conversions.js
new file mode 100644
index 0000000..3217200
--- /dev/null
+++ b/node_modules/command-line-usage/node_modules/color-convert/conversions.js
@@ -0,0 +1,868 @@
+/* MIT license */
+var cssKeywords = require('color-name');
+
+// NOTE: conversions should only return primitive values (i.e. arrays, or
+// values that give correct `typeof` results).
+// do not use box values types (i.e. Number(), String(), etc.)
+
+var reverseKeywords = {};
+for (var key in cssKeywords) {
+ if (cssKeywords.hasOwnProperty(key)) {
+ reverseKeywords[cssKeywords[key]] = key;
+ }
+}
+
+var convert = module.exports = {
+ rgb: {channels: 3, labels: 'rgb'},
+ hsl: {channels: 3, labels: 'hsl'},
+ hsv: {channels: 3, labels: 'hsv'},
+ hwb: {channels: 3, labels: 'hwb'},
+ cmyk: {channels: 4, labels: 'cmyk'},
+ xyz: {channels: 3, labels: 'xyz'},
+ lab: {channels: 3, labels: 'lab'},
+ lch: {channels: 3, labels: 'lch'},
+ hex: {channels: 1, labels: ['hex']},
+ keyword: {channels: 1, labels: ['keyword']},
+ ansi16: {channels: 1, labels: ['ansi16']},
+ ansi256: {channels: 1, labels: ['ansi256']},
+ hcg: {channels: 3, labels: ['h', 'c', 'g']},
+ apple: {channels: 3, labels: ['r16', 'g16', 'b16']},
+ gray: {channels: 1, labels: ['gray']}
+};
+
+// hide .channels and .labels properties
+for (var model in convert) {
+ if (convert.hasOwnProperty(model)) {
+ if (!('channels' in convert[model])) {
+ throw new Error('missing channels property: ' + model);
+ }
+
+ if (!('labels' in convert[model])) {
+ throw new Error('missing channel labels property: ' + model);
+ }
+
+ if (convert[model].labels.length !== convert[model].channels) {
+ throw new Error('channel and label counts mismatch: ' + model);
+ }
+
+ var channels = convert[model].channels;
+ var labels = convert[model].labels;
+ delete convert[model].channels;
+ delete convert[model].labels;
+ Object.defineProperty(convert[model], 'channels', {value: channels});
+ Object.defineProperty(convert[model], 'labels', {value: labels});
+ }
+}
+
+convert.rgb.hsl = function (rgb) {
+ var r = rgb[0] / 255;
+ var g = rgb[1] / 255;
+ var b = rgb[2] / 255;
+ var min = Math.min(r, g, b);
+ var max = Math.max(r, g, b);
+ var delta = max - min;
+ var h;
+ var s;
+ var l;
+
+ if (max === min) {
+ h = 0;
+ } else if (r === max) {
+ h = (g - b) / delta;
+ } else if (g === max) {
+ h = 2 + (b - r) / delta;
+ } else if (b === max) {
+ h = 4 + (r - g) / delta;
+ }
+
+ h = Math.min(h * 60, 360);
+
+ if (h < 0) {
+ h += 360;
+ }
+
+ l = (min + max) / 2;
+
+ if (max === min) {
+ s = 0;
+ } else if (l <= 0.5) {
+ s = delta / (max + min);
+ } else {
+ s = delta / (2 - max - min);
+ }
+
+ return [h, s * 100, l * 100];
+};
+
+convert.rgb.hsv = function (rgb) {
+ var rdif;
+ var gdif;
+ var bdif;
+ var h;
+ var s;
+
+ var r = rgb[0] / 255;
+ var g = rgb[1] / 255;
+ var b = rgb[2] / 255;
+ var v = Math.max(r, g, b);
+ var diff = v - Math.min(r, g, b);
+ var diffc = function (c) {
+ return (v - c) / 6 / diff + 1 / 2;
+ };
+
+ if (diff === 0) {
+ h = s = 0;
+ } else {
+ s = diff / v;
+ rdif = diffc(r);
+ gdif = diffc(g);
+ bdif = diffc(b);
+
+ if (r === v) {
+ h = bdif - gdif;
+ } else if (g === v) {
+ h = (1 / 3) + rdif - bdif;
+ } else if (b === v) {
+ h = (2 / 3) + gdif - rdif;
+ }
+ if (h < 0) {
+ h += 1;
+ } else if (h > 1) {
+ h -= 1;
+ }
+ }
+
+ return [
+ h * 360,
+ s * 100,
+ v * 100
+ ];
+};
+
+convert.rgb.hwb = function (rgb) {
+ var r = rgb[0];
+ var g = rgb[1];
+ var b = rgb[2];
+ var h = convert.rgb.hsl(rgb)[0];
+ var w = 1 / 255 * Math.min(r, Math.min(g, b));
+
+ b = 1 - 1 / 255 * Math.max(r, Math.max(g, b));
+
+ return [h, w * 100, b * 100];
+};
+
+convert.rgb.cmyk = function (rgb) {
+ var r = rgb[0] / 255;
+ var g = rgb[1] / 255;
+ var b = rgb[2] / 255;
+ var c;
+ var m;
+ var y;
+ var k;
+
+ k = Math.min(1 - r, 1 - g, 1 - b);
+ c = (1 - r - k) / (1 - k) || 0;
+ m = (1 - g - k) / (1 - k) || 0;
+ y = (1 - b - k) / (1 - k) || 0;
+
+ return [c * 100, m * 100, y * 100, k * 100];
+};
+
+/**
+ * See https://en.m.wikipedia.org/wiki/Euclidean_distance#Squared_Euclidean_distance
+ * */
+function comparativeDistance(x, y) {
+ return (
+ Math.pow(x[0] - y[0], 2) +
+ Math.pow(x[1] - y[1], 2) +
+ Math.pow(x[2] - y[2], 2)
+ );
+}
+
+convert.rgb.keyword = function (rgb) {
+ var reversed = reverseKeywords[rgb];
+ if (reversed) {
+ return reversed;
+ }
+
+ var currentClosestDistance = Infinity;
+ var currentClosestKeyword;
+
+ for (var keyword in cssKeywords) {
+ if (cssKeywords.hasOwnProperty(keyword)) {
+ var value = cssKeywords[keyword];
+
+ // Compute comparative distance
+ var distance = comparativeDistance(rgb, value);
+
+ // Check if its less, if so set as closest
+ if (distance < currentClosestDistance) {
+ currentClosestDistance = distance;
+ currentClosestKeyword = keyword;
+ }
+ }
+ }
+
+ return currentClosestKeyword;
+};
+
+convert.keyword.rgb = function (keyword) {
+ return cssKeywords[keyword];
+};
+
+convert.rgb.xyz = function (rgb) {
+ var r = rgb[0] / 255;
+ var g = rgb[1] / 255;
+ var b = rgb[2] / 255;
+
+ // assume sRGB
+ r = r > 0.04045 ? Math.pow(((r + 0.055) / 1.055), 2.4) : (r / 12.92);
+ g = g > 0.04045 ? Math.pow(((g + 0.055) / 1.055), 2.4) : (g / 12.92);
+ b = b > 0.04045 ? Math.pow(((b + 0.055) / 1.055), 2.4) : (b / 12.92);
+
+ var x = (r * 0.4124) + (g * 0.3576) + (b * 0.1805);
+ var y = (r * 0.2126) + (g * 0.7152) + (b * 0.0722);
+ var z = (r * 0.0193) + (g * 0.1192) + (b * 0.9505);
+
+ return [x * 100, y * 100, z * 100];
+};
+
+convert.rgb.lab = function (rgb) {
+ var xyz = convert.rgb.xyz(rgb);
+ var x = xyz[0];
+ var y = xyz[1];
+ var z = xyz[2];
+ var l;
+ var a;
+ var b;
+
+ x /= 95.047;
+ y /= 100;
+ z /= 108.883;
+
+ x = x > 0.008856 ? Math.pow(x, 1 / 3) : (7.787 * x) + (16 / 116);
+ y = y > 0.008856 ? Math.pow(y, 1 / 3) : (7.787 * y) + (16 / 116);
+ z = z > 0.008856 ? Math.pow(z, 1 / 3) : (7.787 * z) + (16 / 116);
+
+ l = (116 * y) - 16;
+ a = 500 * (x - y);
+ b = 200 * (y - z);
+
+ return [l, a, b];
+};
+
+convert.hsl.rgb = function (hsl) {
+ var h = hsl[0] / 360;
+ var s = hsl[1] / 100;
+ var l = hsl[2] / 100;
+ var t1;
+ var t2;
+ var t3;
+ var rgb;
+ var val;
+
+ if (s === 0) {
+ val = l * 255;
+ return [val, val, val];
+ }
+
+ if (l < 0.5) {
+ t2 = l * (1 + s);
+ } else {
+ t2 = l + s - l * s;
+ }
+
+ t1 = 2 * l - t2;
+
+ rgb = [0, 0, 0];
+ for (var i = 0; i < 3; i++) {
+ t3 = h + 1 / 3 * -(i - 1);
+ if (t3 < 0) {
+ t3++;
+ }
+ if (t3 > 1) {
+ t3--;
+ }
+
+ if (6 * t3 < 1) {
+ val = t1 + (t2 - t1) * 6 * t3;
+ } else if (2 * t3 < 1) {
+ val = t2;
+ } else if (3 * t3 < 2) {
+ val = t1 + (t2 - t1) * (2 / 3 - t3) * 6;
+ } else {
+ val = t1;
+ }
+
+ rgb[i] = val * 255;
+ }
+
+ return rgb;
+};
+
+convert.hsl.hsv = function (hsl) {
+ var h = hsl[0];
+ var s = hsl[1] / 100;
+ var l = hsl[2] / 100;
+ var smin = s;
+ var lmin = Math.max(l, 0.01);
+ var sv;
+ var v;
+
+ l *= 2;
+ s *= (l <= 1) ? l : 2 - l;
+ smin *= lmin <= 1 ? lmin : 2 - lmin;
+ v = (l + s) / 2;
+ sv = l === 0 ? (2 * smin) / (lmin + smin) : (2 * s) / (l + s);
+
+ return [h, sv * 100, v * 100];
+};
+
+convert.hsv.rgb = function (hsv) {
+ var h = hsv[0] / 60;
+ var s = hsv[1] / 100;
+ var v = hsv[2] / 100;
+ var hi = Math.floor(h) % 6;
+
+ var f = h - Math.floor(h);
+ var p = 255 * v * (1 - s);
+ var q = 255 * v * (1 - (s * f));
+ var t = 255 * v * (1 - (s * (1 - f)));
+ v *= 255;
+
+ switch (hi) {
+ case 0:
+ return [v, t, p];
+ case 1:
+ return [q, v, p];
+ case 2:
+ return [p, v, t];
+ case 3:
+ return [p, q, v];
+ case 4:
+ return [t, p, v];
+ case 5:
+ return [v, p, q];
+ }
+};
+
+convert.hsv.hsl = function (hsv) {
+ var h = hsv[0];
+ var s = hsv[1] / 100;
+ var v = hsv[2] / 100;
+ var vmin = Math.max(v, 0.01);
+ var lmin;
+ var sl;
+ var l;
+
+ l = (2 - s) * v;
+ lmin = (2 - s) * vmin;
+ sl = s * vmin;
+ sl /= (lmin <= 1) ? lmin : 2 - lmin;
+ sl = sl || 0;
+ l /= 2;
+
+ return [h, sl * 100, l * 100];
+};
+
+// http://dev.w3.org/csswg/css-color/#hwb-to-rgb
+convert.hwb.rgb = function (hwb) {
+ var h = hwb[0] / 360;
+ var wh = hwb[1] / 100;
+ var bl = hwb[2] / 100;
+ var ratio = wh + bl;
+ var i;
+ var v;
+ var f;
+ var n;
+
+ // wh + bl cant be > 1
+ if (ratio > 1) {
+ wh /= ratio;
+ bl /= ratio;
+ }
+
+ i = Math.floor(6 * h);
+ v = 1 - bl;
+ f = 6 * h - i;
+
+ if ((i & 0x01) !== 0) {
+ f = 1 - f;
+ }
+
+ n = wh + f * (v - wh); // linear interpolation
+
+ var r;
+ var g;
+ var b;
+ switch (i) {
+ default:
+ case 6:
+ case 0: r = v; g = n; b = wh; break;
+ case 1: r = n; g = v; b = wh; break;
+ case 2: r = wh; g = v; b = n; break;
+ case 3: r = wh; g = n; b = v; break;
+ case 4: r = n; g = wh; b = v; break;
+ case 5: r = v; g = wh; b = n; break;
+ }
+
+ return [r * 255, g * 255, b * 255];
+};
+
+convert.cmyk.rgb = function (cmyk) {
+ var c = cmyk[0] / 100;
+ var m = cmyk[1] / 100;
+ var y = cmyk[2] / 100;
+ var k = cmyk[3] / 100;
+ var r;
+ var g;
+ var b;
+
+ r = 1 - Math.min(1, c * (1 - k) + k);
+ g = 1 - Math.min(1, m * (1 - k) + k);
+ b = 1 - Math.min(1, y * (1 - k) + k);
+
+ return [r * 255, g * 255, b * 255];
+};
+
+convert.xyz.rgb = function (xyz) {
+ var x = xyz[0] / 100;
+ var y = xyz[1] / 100;
+ var z = xyz[2] / 100;
+ var r;
+ var g;
+ var b;
+
+ r = (x * 3.2406) + (y * -1.5372) + (z * -0.4986);
+ g = (x * -0.9689) + (y * 1.8758) + (z * 0.0415);
+ b = (x * 0.0557) + (y * -0.2040) + (z * 1.0570);
+
+ // assume sRGB
+ r = r > 0.0031308
+ ? ((1.055 * Math.pow(r, 1.0 / 2.4)) - 0.055)
+ : r * 12.92;
+
+ g = g > 0.0031308
+ ? ((1.055 * Math.pow(g, 1.0 / 2.4)) - 0.055)
+ : g * 12.92;
+
+ b = b > 0.0031308
+ ? ((1.055 * Math.pow(b, 1.0 / 2.4)) - 0.055)
+ : b * 12.92;
+
+ r = Math.min(Math.max(0, r), 1);
+ g = Math.min(Math.max(0, g), 1);
+ b = Math.min(Math.max(0, b), 1);
+
+ return [r * 255, g * 255, b * 255];
+};
+
+convert.xyz.lab = function (xyz) {
+ var x = xyz[0];
+ var y = xyz[1];
+ var z = xyz[2];
+ var l;
+ var a;
+ var b;
+
+ x /= 95.047;
+ y /= 100;
+ z /= 108.883;
+
+ x = x > 0.008856 ? Math.pow(x, 1 / 3) : (7.787 * x) + (16 / 116);
+ y = y > 0.008856 ? Math.pow(y, 1 / 3) : (7.787 * y) + (16 / 116);
+ z = z > 0.008856 ? Math.pow(z, 1 / 3) : (7.787 * z) + (16 / 116);
+
+ l = (116 * y) - 16;
+ a = 500 * (x - y);
+ b = 200 * (y - z);
+
+ return [l, a, b];
+};
+
+convert.lab.xyz = function (lab) {
+ var l = lab[0];
+ var a = lab[1];
+ var b = lab[2];
+ var x;
+ var y;
+ var z;
+
+ y = (l + 16) / 116;
+ x = a / 500 + y;
+ z = y - b / 200;
+
+ var y2 = Math.pow(y, 3);
+ var x2 = Math.pow(x, 3);
+ var z2 = Math.pow(z, 3);
+ y = y2 > 0.008856 ? y2 : (y - 16 / 116) / 7.787;
+ x = x2 > 0.008856 ? x2 : (x - 16 / 116) / 7.787;
+ z = z2 > 0.008856 ? z2 : (z - 16 / 116) / 7.787;
+
+ x *= 95.047;
+ y *= 100;
+ z *= 108.883;
+
+ return [x, y, z];
+};
+
+convert.lab.lch = function (lab) {
+ var l = lab[0];
+ var a = lab[1];
+ var b = lab[2];
+ var hr;
+ var h;
+ var c;
+
+ hr = Math.atan2(b, a);
+ h = hr * 360 / 2 / Math.PI;
+
+ if (h < 0) {
+ h += 360;
+ }
+
+ c = Math.sqrt(a * a + b * b);
+
+ return [l, c, h];
+};
+
+convert.lch.lab = function (lch) {
+ var l = lch[0];
+ var c = lch[1];
+ var h = lch[2];
+ var a;
+ var b;
+ var hr;
+
+ hr = h / 360 * 2 * Math.PI;
+ a = c * Math.cos(hr);
+ b = c * Math.sin(hr);
+
+ return [l, a, b];
+};
+
+convert.rgb.ansi16 = function (args) {
+ var r = args[0];
+ var g = args[1];
+ var b = args[2];
+ var value = 1 in arguments ? arguments[1] : convert.rgb.hsv(args)[2]; // hsv -> ansi16 optimization
+
+ value = Math.round(value / 50);
+
+ if (value === 0) {
+ return 30;
+ }
+
+ var ansi = 30
+ + ((Math.round(b / 255) << 2)
+ | (Math.round(g / 255) << 1)
+ | Math.round(r / 255));
+
+ if (value === 2) {
+ ansi += 60;
+ }
+
+ return ansi;
+};
+
+convert.hsv.ansi16 = function (args) {
+ // optimization here; we already know the value and don't need to get
+ // it converted for us.
+ return convert.rgb.ansi16(convert.hsv.rgb(args), args[2]);
+};
+
+convert.rgb.ansi256 = function (args) {
+ var r = args[0];
+ var g = args[1];
+ var b = args[2];
+
+ // we use the extended greyscale palette here, with the exception of
+ // black and white. normal palette only has 4 greyscale shades.
+ if (r === g && g === b) {
+ if (r < 8) {
+ return 16;
+ }
+
+ if (r > 248) {
+ return 231;
+ }
+
+ return Math.round(((r - 8) / 247) * 24) + 232;
+ }
+
+ var ansi = 16
+ + (36 * Math.round(r / 255 * 5))
+ + (6 * Math.round(g / 255 * 5))
+ + Math.round(b / 255 * 5);
+
+ return ansi;
+};
+
+convert.ansi16.rgb = function (args) {
+ var color = args % 10;
+
+ // handle greyscale
+ if (color === 0 || color === 7) {
+ if (args > 50) {
+ color += 3.5;
+ }
+
+ color = color / 10.5 * 255;
+
+ return [color, color, color];
+ }
+
+ var mult = (~~(args > 50) + 1) * 0.5;
+ var r = ((color & 1) * mult) * 255;
+ var g = (((color >> 1) & 1) * mult) * 255;
+ var b = (((color >> 2) & 1) * mult) * 255;
+
+ return [r, g, b];
+};
+
+convert.ansi256.rgb = function (args) {
+ // handle greyscale
+ if (args >= 232) {
+ var c = (args - 232) * 10 + 8;
+ return [c, c, c];
+ }
+
+ args -= 16;
+
+ var rem;
+ var r = Math.floor(args / 36) / 5 * 255;
+ var g = Math.floor((rem = args % 36) / 6) / 5 * 255;
+ var b = (rem % 6) / 5 * 255;
+
+ return [r, g, b];
+};
+
+convert.rgb.hex = function (args) {
+ var integer = ((Math.round(args[0]) & 0xFF) << 16)
+ + ((Math.round(args[1]) & 0xFF) << 8)
+ + (Math.round(args[2]) & 0xFF);
+
+ var string = integer.toString(16).toUpperCase();
+ return '000000'.substring(string.length) + string;
+};
+
+convert.hex.rgb = function (args) {
+ var match = args.toString(16).match(/[a-f0-9]{6}|[a-f0-9]{3}/i);
+ if (!match) {
+ return [0, 0, 0];
+ }
+
+ var colorString = match[0];
+
+ if (match[0].length === 3) {
+ colorString = colorString.split('').map(function (char) {
+ return char + char;
+ }).join('');
+ }
+
+ var integer = parseInt(colorString, 16);
+ var r = (integer >> 16) & 0xFF;
+ var g = (integer >> 8) & 0xFF;
+ var b = integer & 0xFF;
+
+ return [r, g, b];
+};
+
+convert.rgb.hcg = function (rgb) {
+ var r = rgb[0] / 255;
+ var g = rgb[1] / 255;
+ var b = rgb[2] / 255;
+ var max = Math.max(Math.max(r, g), b);
+ var min = Math.min(Math.min(r, g), b);
+ var chroma = (max - min);
+ var grayscale;
+ var hue;
+
+ if (chroma < 1) {
+ grayscale = min / (1 - chroma);
+ } else {
+ grayscale = 0;
+ }
+
+ if (chroma <= 0) {
+ hue = 0;
+ } else
+ if (max === r) {
+ hue = ((g - b) / chroma) % 6;
+ } else
+ if (max === g) {
+ hue = 2 + (b - r) / chroma;
+ } else {
+ hue = 4 + (r - g) / chroma + 4;
+ }
+
+ hue /= 6;
+ hue %= 1;
+
+ return [hue * 360, chroma * 100, grayscale * 100];
+};
+
+convert.hsl.hcg = function (hsl) {
+ var s = hsl[1] / 100;
+ var l = hsl[2] / 100;
+ var c = 1;
+ var f = 0;
+
+ if (l < 0.5) {
+ c = 2.0 * s * l;
+ } else {
+ c = 2.0 * s * (1.0 - l);
+ }
+
+ if (c < 1.0) {
+ f = (l - 0.5 * c) / (1.0 - c);
+ }
+
+ return [hsl[0], c * 100, f * 100];
+};
+
+convert.hsv.hcg = function (hsv) {
+ var s = hsv[1] / 100;
+ var v = hsv[2] / 100;
+
+ var c = s * v;
+ var f = 0;
+
+ if (c < 1.0) {
+ f = (v - c) / (1 - c);
+ }
+
+ return [hsv[0], c * 100, f * 100];
+};
+
+convert.hcg.rgb = function (hcg) {
+ var h = hcg[0] / 360;
+ var c = hcg[1] / 100;
+ var g = hcg[2] / 100;
+
+ if (c === 0.0) {
+ return [g * 255, g * 255, g * 255];
+ }
+
+ var pure = [0, 0, 0];
+ var hi = (h % 1) * 6;
+ var v = hi % 1;
+ var w = 1 - v;
+ var mg = 0;
+
+ switch (Math.floor(hi)) {
+ case 0:
+ pure[0] = 1; pure[1] = v; pure[2] = 0; break;
+ case 1:
+ pure[0] = w; pure[1] = 1; pure[2] = 0; break;
+ case 2:
+ pure[0] = 0; pure[1] = 1; pure[2] = v; break;
+ case 3:
+ pure[0] = 0; pure[1] = w; pure[2] = 1; break;
+ case 4:
+ pure[0] = v; pure[1] = 0; pure[2] = 1; break;
+ default:
+ pure[0] = 1; pure[1] = 0; pure[2] = w;
+ }
+
+ mg = (1.0 - c) * g;
+
+ return [
+ (c * pure[0] + mg) * 255,
+ (c * pure[1] + mg) * 255,
+ (c * pure[2] + mg) * 255
+ ];
+};
+
+convert.hcg.hsv = function (hcg) {
+ var c = hcg[1] / 100;
+ var g = hcg[2] / 100;
+
+ var v = c + g * (1.0 - c);
+ var f = 0;
+
+ if (v > 0.0) {
+ f = c / v;
+ }
+
+ return [hcg[0], f * 100, v * 100];
+};
+
+convert.hcg.hsl = function (hcg) {
+ var c = hcg[1] / 100;
+ var g = hcg[2] / 100;
+
+ var l = g * (1.0 - c) + 0.5 * c;
+ var s = 0;
+
+ if (l > 0.0 && l < 0.5) {
+ s = c / (2 * l);
+ } else
+ if (l >= 0.5 && l < 1.0) {
+ s = c / (2 * (1 - l));
+ }
+
+ return [hcg[0], s * 100, l * 100];
+};
+
+convert.hcg.hwb = function (hcg) {
+ var c = hcg[1] / 100;
+ var g = hcg[2] / 100;
+ var v = c + g * (1.0 - c);
+ return [hcg[0], (v - c) * 100, (1 - v) * 100];
+};
+
+convert.hwb.hcg = function (hwb) {
+ var w = hwb[1] / 100;
+ var b = hwb[2] / 100;
+ var v = 1 - b;
+ var c = v - w;
+ var g = 0;
+
+ if (c < 1) {
+ g = (v - c) / (1 - c);
+ }
+
+ return [hwb[0], c * 100, g * 100];
+};
+
+convert.apple.rgb = function (apple) {
+ return [(apple[0] / 65535) * 255, (apple[1] / 65535) * 255, (apple[2] / 65535) * 255];
+};
+
+convert.rgb.apple = function (rgb) {
+ return [(rgb[0] / 255) * 65535, (rgb[1] / 255) * 65535, (rgb[2] / 255) * 65535];
+};
+
+convert.gray.rgb = function (args) {
+ return [args[0] / 100 * 255, args[0] / 100 * 255, args[0] / 100 * 255];
+};
+
+convert.gray.hsl = convert.gray.hsv = function (args) {
+ return [0, 0, args[0]];
+};
+
+convert.gray.hwb = function (gray) {
+ return [0, 100, gray[0]];
+};
+
+convert.gray.cmyk = function (gray) {
+ return [0, 0, 0, gray[0]];
+};
+
+convert.gray.lab = function (gray) {
+ return [gray[0], 0, 0];
+};
+
+convert.gray.hex = function (gray) {
+ var val = Math.round(gray[0] / 100 * 255) & 0xFF;
+ var integer = (val << 16) + (val << 8) + val;
+
+ var string = integer.toString(16).toUpperCase();
+ return '000000'.substring(string.length) + string;
+};
+
+convert.rgb.gray = function (rgb) {
+ var val = (rgb[0] + rgb[1] + rgb[2]) / 3;
+ return [val / 255 * 100];
+};
diff --git a/node_modules/command-line-usage/node_modules/color-convert/index.js b/node_modules/command-line-usage/node_modules/color-convert/index.js
new file mode 100644
index 0000000..e65b5d7
--- /dev/null
+++ b/node_modules/command-line-usage/node_modules/color-convert/index.js
@@ -0,0 +1,78 @@
+var conversions = require('./conversions');
+var route = require('./route');
+
+var convert = {};
+
+var models = Object.keys(conversions);
+
+function wrapRaw(fn) {
+ var wrappedFn = function (args) {
+ if (args === undefined || args === null) {
+ return args;
+ }
+
+ if (arguments.length > 1) {
+ args = Array.prototype.slice.call(arguments);
+ }
+
+ return fn(args);
+ };
+
+ // preserve .conversion property if there is one
+ if ('conversion' in fn) {
+ wrappedFn.conversion = fn.conversion;
+ }
+
+ return wrappedFn;
+}
+
+function wrapRounded(fn) {
+ var wrappedFn = function (args) {
+ if (args === undefined || args === null) {
+ return args;
+ }
+
+ if (arguments.length > 1) {
+ args = Array.prototype.slice.call(arguments);
+ }
+
+ var result = fn(args);
+
+ // we're assuming the result is an array here.
+ // see notice in conversions.js; don't use box types
+ // in conversion functions.
+ if (typeof result === 'object') {
+ for (var len = result.length, i = 0; i < len; i++) {
+ result[i] = Math.round(result[i]);
+ }
+ }
+
+ return result;
+ };
+
+ // preserve .conversion property if there is one
+ if ('conversion' in fn) {
+ wrappedFn.conversion = fn.conversion;
+ }
+
+ return wrappedFn;
+}
+
+models.forEach(function (fromModel) {
+ convert[fromModel] = {};
+
+ Object.defineProperty(convert[fromModel], 'channels', {value: conversions[fromModel].channels});
+ Object.defineProperty(convert[fromModel], 'labels', {value: conversions[fromModel].labels});
+
+ var routes = route(fromModel);
+ var routeModels = Object.keys(routes);
+
+ routeModels.forEach(function (toModel) {
+ var fn = routes[toModel];
+
+ convert[fromModel][toModel] = wrapRounded(fn);
+ convert[fromModel][toModel].raw = wrapRaw(fn);
+ });
+});
+
+module.exports = convert;
diff --git a/node_modules/command-line-usage/node_modules/color-convert/package.json b/node_modules/command-line-usage/node_modules/color-convert/package.json
new file mode 100644
index 0000000..dfbc471
--- /dev/null
+++ b/node_modules/command-line-usage/node_modules/color-convert/package.json
@@ -0,0 +1,46 @@
+{
+ "name": "color-convert",
+ "description": "Plain color conversion functions",
+ "version": "1.9.3",
+ "author": "Heather Arthur <fayearthur@gmail.com>",
+ "license": "MIT",
+ "repository": "Qix-/color-convert",
+ "scripts": {
+ "pretest": "xo",
+ "test": "node test/basic.js"
+ },
+ "keywords": [
+ "color",
+ "colour",
+ "convert",
+ "converter",
+ "conversion",
+ "rgb",
+ "hsl",
+ "hsv",
+ "hwb",
+ "cmyk",
+ "ansi",
+ "ansi16"
+ ],
+ "files": [
+ "index.js",
+ "conversions.js",
+ "css-keywords.js",
+ "route.js"
+ ],
+ "xo": {
+ "rules": {
+ "default-case": 0,
+ "no-inline-comments": 0,
+ "operator-linebreak": 0
+ }
+ },
+ "devDependencies": {
+ "chalk": "1.1.1",
+ "xo": "0.11.2"
+ },
+ "dependencies": {
+ "color-name": "1.1.3"
+ }
+}
diff --git a/node_modules/command-line-usage/node_modules/color-convert/route.js b/node_modules/command-line-usage/node_modules/color-convert/route.js
new file mode 100644
index 0000000..0a1fdea
--- /dev/null
+++ b/node_modules/command-line-usage/node_modules/color-convert/route.js
@@ -0,0 +1,97 @@
+var conversions = require('./conversions');
+
+/*
+ this function routes a model to all other models.
+
+ all functions that are routed have a property `.conversion` attached
+ to the returned synthetic function. This property is an array
+ of strings, each with the steps in between the 'from' and 'to'
+ color models (inclusive).
+
+ conversions that are not possible simply are not included.
+*/
+
+function buildGraph() {
+ var graph = {};
+ // https://jsperf.com/object-keys-vs-for-in-with-closure/3
+ var models = Object.keys(conversions);
+
+ for (var len = models.length, i = 0; i < len; i++) {
+ graph[models[i]] = {
+ // http://jsperf.com/1-vs-infinity
+ // micro-opt, but this is simple.
+ distance: -1,
+ parent: null
+ };
+ }
+
+ return graph;
+}
+
+// https://en.wikipedia.org/wiki/Breadth-first_search
+function deriveBFS(fromModel) {
+ var graph = buildGraph();
+ var queue = [fromModel]; // unshift -> queue -> pop
+
+ graph[fromModel].distance = 0;
+
+ while (queue.length) {
+ var current = queue.pop();
+ var adjacents = Object.keys(conversions[current]);
+
+ for (var len = adjacents.length, i = 0; i < len; i++) {
+ var adjacent = adjacents[i];
+ var node = graph[adjacent];
+
+ if (node.distance === -1) {
+ node.distance = graph[current].distance + 1;
+ node.parent = current;
+ queue.unshift(adjacent);
+ }
+ }
+ }
+
+ return graph;
+}
+
+function link(from, to) {
+ return function (args) {
+ return to(from(args));
+ };
+}
+
+function wrapConversion(toModel, graph) {
+ var path = [graph[toModel].parent, toModel];
+ var fn = conversions[graph[toModel].parent][toModel];
+
+ var cur = graph[toModel].parent;
+ while (graph[cur].parent) {
+ path.unshift(graph[cur].parent);
+ fn = link(conversions[graph[cur].parent][cur], fn);
+ cur = graph[cur].parent;
+ }
+
+ fn.conversion = path;
+ return fn;
+}
+
+module.exports = function (fromModel) {
+ var graph = deriveBFS(fromModel);
+ var conversion = {};
+
+ var models = Object.keys(graph);
+ for (var len = models.length, i = 0; i < len; i++) {
+ var toModel = models[i];
+ var node = graph[toModel];
+
+ if (node.parent === null) {
+ // no possible conversion, or this node is the source model.
+ continue;
+ }
+
+ conversion[toModel] = wrapConversion(toModel, graph);
+ }
+
+ return conversion;
+};
+
diff --git a/node_modules/command-line-usage/node_modules/color-name/.eslintrc.json b/node_modules/command-line-usage/node_modules/color-name/.eslintrc.json
new file mode 100644
index 0000000..c50c250
--- /dev/null
+++ b/node_modules/command-line-usage/node_modules/color-name/.eslintrc.json
@@ -0,0 +1,43 @@
+{
+ "env": {
+ "browser": true,
+ "node": true,
+ "commonjs": true,
+ "es6": true
+ },
+ "extends": "eslint:recommended",
+ "rules": {
+ "strict": 2,
+ "indent": 0,
+ "linebreak-style": 0,
+ "quotes": 0,
+ "semi": 0,
+ "no-cond-assign": 1,
+ "no-constant-condition": 1,
+ "no-duplicate-case": 1,
+ "no-empty": 1,
+ "no-ex-assign": 1,
+ "no-extra-boolean-cast": 1,
+ "no-extra-semi": 1,
+ "no-fallthrough": 1,
+ "no-func-assign": 1,
+ "no-global-assign": 1,
+ "no-implicit-globals": 2,
+ "no-inner-declarations": ["error", "functions"],
+ "no-irregular-whitespace": 2,
+ "no-loop-func": 1,
+ "no-multi-str": 1,
+ "no-mixed-spaces-and-tabs": 1,
+ "no-proto": 1,
+ "no-sequences": 1,
+ "no-throw-literal": 1,
+ "no-unmodified-loop-condition": 1,
+ "no-useless-call": 1,
+ "no-void": 1,
+ "no-with": 2,
+ "wrap-iife": 1,
+ "no-redeclare": 1,
+ "no-unused-vars": ["error", { "vars": "all", "args": "none" }],
+ "no-sparse-arrays": 1
+ }
+}
diff --git a/node_modules/command-line-usage/node_modules/color-name/.npmignore b/node_modules/command-line-usage/node_modules/color-name/.npmignore
new file mode 100644
index 0000000..f9f2816
--- /dev/null
+++ b/node_modules/command-line-usage/node_modules/color-name/.npmignore
@@ -0,0 +1,107 @@
+//this will affect all the git repos
+git config --global core.excludesfile ~/.gitignore
+
+
+//update files since .ignore won't if already tracked
+git rm --cached <file>
+
+# Compiled source #
+###################
+*.com
+*.class
+*.dll
+*.exe
+*.o
+*.so
+
+# Packages #
+############
+# it's better to unpack these files and commit the raw source
+# git has its own built in compression methods
+*.7z
+*.dmg
+*.gz
+*.iso
+*.jar
+*.rar
+*.tar
+*.zip
+
+# Logs and databases #
+######################
+*.log
+*.sql
+*.sqlite
+
+# OS generated files #
+######################
+.DS_Store
+.DS_Store?
+._*
+.Spotlight-V100
+.Trashes
+# Icon?
+ehthumbs.db
+Thumbs.db
+.cache
+.project
+.settings
+.tmproj
+*.esproj
+nbproject
+
+# Numerous always-ignore extensions #
+#####################################
+*.diff
+*.err
+*.orig
+*.rej
+*.swn
+*.swo
+*.swp
+*.vi
+*~
+*.sass-cache
+*.grunt
+*.tmp
+
+# Dreamweaver added files #
+###########################
+_notes
+dwsync.xml
+
+# Komodo #
+###########################
+*.komodoproject
+.komodotools
+
+# Node #
+#####################
+node_modules
+
+# Bower #
+#####################
+bower_components
+
+# Folders to ignore #
+#####################
+.hg
+.svn
+.CVS
+intermediate
+publish
+.idea
+.graphics
+_test
+_archive
+uploads
+tmp
+
+# Vim files to ignore #
+#######################
+.VimballRecord
+.netrwhist
+
+bundle.*
+
+_demo \ No newline at end of file
diff --git a/node_modules/command-line-usage/node_modules/color-name/LICENSE b/node_modules/command-line-usage/node_modules/color-name/LICENSE
new file mode 100644
index 0000000..c6b1001
--- /dev/null
+++ b/node_modules/command-line-usage/node_modules/color-name/LICENSE
@@ -0,0 +1,8 @@
+The MIT License (MIT)
+Copyright (c) 2015 Dmitry Ivanov
+
+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/command-line-usage/node_modules/color-name/README.md b/node_modules/command-line-usage/node_modules/color-name/README.md
new file mode 100644
index 0000000..932b979
--- /dev/null
+++ b/node_modules/command-line-usage/node_modules/color-name/README.md
@@ -0,0 +1,11 @@
+A JSON with color names and its values. Based on http://dev.w3.org/csswg/css-color/#named-colors.
+
+[![NPM](https://nodei.co/npm/color-name.png?mini=true)](https://nodei.co/npm/color-name/)
+
+
+```js
+var colors = require('color-name');
+colors.red //[255,0,0]
+```
+
+<a href="LICENSE"><img src="https://upload.wikimedia.org/wikipedia/commons/0/0c/MIT_logo.svg" width="120"/></a>
diff --git a/node_modules/command-line-usage/node_modules/color-name/index.js b/node_modules/command-line-usage/node_modules/color-name/index.js
new file mode 100644
index 0000000..b7c198a
--- /dev/null
+++ b/node_modules/command-line-usage/node_modules/color-name/index.js
@@ -0,0 +1,152 @@
+'use strict'
+
+module.exports = {
+ "aliceblue": [240, 248, 255],
+ "antiquewhite": [250, 235, 215],
+ "aqua": [0, 255, 255],
+ "aquamarine": [127, 255, 212],
+ "azure": [240, 255, 255],
+ "beige": [245, 245, 220],
+ "bisque": [255, 228, 196],
+ "black": [0, 0, 0],
+ "blanchedalmond": [255, 235, 205],
+ "blue": [0, 0, 255],
+ "blueviolet": [138, 43, 226],
+ "brown": [165, 42, 42],
+ "burlywood": [222, 184, 135],
+ "cadetblue": [95, 158, 160],
+ "chartreuse": [127, 255, 0],
+ "chocolate": [210, 105, 30],
+ "coral": [255, 127, 80],
+ "cornflowerblue": [100, 149, 237],
+ "cornsilk": [255, 248, 220],
+ "crimson": [220, 20, 60],
+ "cyan": [0, 255, 255],
+ "darkblue": [0, 0, 139],
+ "darkcyan": [0, 139, 139],
+ "darkgoldenrod": [184, 134, 11],
+ "darkgray": [169, 169, 169],
+ "darkgreen": [0, 100, 0],
+ "darkgrey": [169, 169, 169],
+ "darkkhaki": [189, 183, 107],
+ "darkmagenta": [139, 0, 139],
+ "darkolivegreen": [85, 107, 47],
+ "darkorange": [255, 140, 0],
+ "darkorchid": [153, 50, 204],
+ "darkred": [139, 0, 0],
+ "darksalmon": [233, 150, 122],
+ "darkseagreen": [143, 188, 143],
+ "darkslateblue": [72, 61, 139],
+ "darkslategray": [47, 79, 79],
+ "darkslategrey": [47, 79, 79],
+ "darkturquoise": [0, 206, 209],
+ "darkviolet": [148, 0, 211],
+ "deeppink": [255, 20, 147],
+ "deepskyblue": [0, 191, 255],
+ "dimgray": [105, 105, 105],
+ "dimgrey": [105, 105, 105],
+ "dodgerblue": [30, 144, 255],
+ "firebrick": [178, 34, 34],
+ "floralwhite": [255, 250, 240],
+ "forestgreen": [34, 139, 34],
+ "fuchsia": [255, 0, 255],
+ "gainsboro": [220, 220, 220],
+ "ghostwhite": [248, 248, 255],
+ "gold": [255, 215, 0],
+ "goldenrod": [218, 165, 32],
+ "gray": [128, 128, 128],
+ "green": [0, 128, 0],
+ "greenyellow": [173, 255, 47],
+ "grey": [128, 128, 128],
+ "honeydew": [240, 255, 240],
+ "hotpink": [255, 105, 180],
+ "indianred": [205, 92, 92],
+ "indigo": [75, 0, 130],
+ "ivory": [255, 255, 240],
+ "khaki": [240, 230, 140],
+ "lavender": [230, 230, 250],
+ "lavenderblush": [255, 240, 245],
+ "lawngreen": [124, 252, 0],
+ "lemonchiffon": [255, 250, 205],
+ "lightblue": [173, 216, 230],
+ "lightcoral": [240, 128, 128],
+ "lightcyan": [224, 255, 255],
+ "lightgoldenrodyellow": [250, 250, 210],
+ "lightgray": [211, 211, 211],
+ "lightgreen": [144, 238, 144],
+ "lightgrey": [211, 211, 211],
+ "lightpink": [255, 182, 193],
+ "lightsalmon": [255, 160, 122],
+ "lightseagreen": [32, 178, 170],
+ "lightskyblue": [135, 206, 250],
+ "lightslategray": [119, 136, 153],
+ "lightslategrey": [119, 136, 153],
+ "lightsteelblue": [176, 196, 222],
+ "lightyellow": [255, 255, 224],
+ "lime": [0, 255, 0],
+ "limegreen": [50, 205, 50],
+ "linen": [250, 240, 230],
+ "magenta": [255, 0, 255],
+ "maroon": [128, 0, 0],
+ "mediumaquamarine": [102, 205, 170],
+ "mediumblue": [0, 0, 205],
+ "mediumorchid": [186, 85, 211],
+ "mediumpurple": [147, 112, 219],
+ "mediumseagreen": [60, 179, 113],
+ "mediumslateblue": [123, 104, 238],
+ "mediumspringgreen": [0, 250, 154],
+ "mediumturquoise": [72, 209, 204],
+ "mediumvioletred": [199, 21, 133],
+ "midnightblue": [25, 25, 112],
+ "mintcream": [245, 255, 250],
+ "mistyrose": [255, 228, 225],
+ "moccasin": [255, 228, 181],
+ "navajowhite": [255, 222, 173],
+ "navy": [0, 0, 128],
+ "oldlace": [253, 245, 230],
+ "olive": [128, 128, 0],
+ "olivedrab": [107, 142, 35],
+ "orange": [255, 165, 0],
+ "orangered": [255, 69, 0],
+ "orchid": [218, 112, 214],
+ "palegoldenrod": [238, 232, 170],
+ "palegreen": [152, 251, 152],
+ "paleturquoise": [175, 238, 238],
+ "palevioletred": [219, 112, 147],
+ "papayawhip": [255, 239, 213],
+ "peachpuff": [255, 218, 185],
+ "peru": [205, 133, 63],
+ "pink": [255, 192, 203],
+ "plum": [221, 160, 221],
+ "powderblue": [176, 224, 230],
+ "purple": [128, 0, 128],
+ "rebeccapurple": [102, 51, 153],
+ "red": [255, 0, 0],
+ "rosybrown": [188, 143, 143],
+ "royalblue": [65, 105, 225],
+ "saddlebrown": [139, 69, 19],
+ "salmon": [250, 128, 114],
+ "sandybrown": [244, 164, 96],
+ "seagreen": [46, 139, 87],
+ "seashell": [255, 245, 238],
+ "sienna": [160, 82, 45],
+ "silver": [192, 192, 192],
+ "skyblue": [135, 206, 235],
+ "slateblue": [106, 90, 205],
+ "slategray": [112, 128, 144],
+ "slategrey": [112, 128, 144],
+ "snow": [255, 250, 250],
+ "springgreen": [0, 255, 127],
+ "steelblue": [70, 130, 180],
+ "tan": [210, 180, 140],
+ "teal": [0, 128, 128],
+ "thistle": [216, 191, 216],
+ "tomato": [255, 99, 71],
+ "turquoise": [64, 224, 208],
+ "violet": [238, 130, 238],
+ "wheat": [245, 222, 179],
+ "white": [255, 255, 255],
+ "whitesmoke": [245, 245, 245],
+ "yellow": [255, 255, 0],
+ "yellowgreen": [154, 205, 50]
+};
diff --git a/node_modules/command-line-usage/node_modules/color-name/package.json b/node_modules/command-line-usage/node_modules/color-name/package.json
new file mode 100644
index 0000000..d061123
--- /dev/null
+++ b/node_modules/command-line-usage/node_modules/color-name/package.json
@@ -0,0 +1,25 @@
+{
+ "name": "color-name",
+ "version": "1.1.3",
+ "description": "A list of color names and its values",
+ "main": "index.js",
+ "scripts": {
+ "test": "node test.js"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git@github.com:dfcreative/color-name.git"
+ },
+ "keywords": [
+ "color-name",
+ "color",
+ "color-keyword",
+ "keyword"
+ ],
+ "author": "DY <dfcreative@gmail.com>",
+ "license": "MIT",
+ "bugs": {
+ "url": "https://github.com/dfcreative/color-name/issues"
+ },
+ "homepage": "https://github.com/dfcreative/color-name"
+}
diff --git a/node_modules/command-line-usage/node_modules/color-name/test.js b/node_modules/command-line-usage/node_modules/color-name/test.js
new file mode 100644
index 0000000..6e6bf30
--- /dev/null
+++ b/node_modules/command-line-usage/node_modules/color-name/test.js
@@ -0,0 +1,7 @@
+'use strict'
+
+var names = require('./');
+var assert = require('assert');
+
+assert.deepEqual(names.red, [255,0,0]);
+assert.deepEqual(names.aliceblue, [240,248,255]);
diff --git a/node_modules/command-line-usage/node_modules/has-flag/index.js b/node_modules/command-line-usage/node_modules/has-flag/index.js
new file mode 100644
index 0000000..5139728
--- /dev/null
+++ b/node_modules/command-line-usage/node_modules/has-flag/index.js
@@ -0,0 +1,8 @@
+'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/command-line-usage/node_modules/has-flag/license b/node_modules/command-line-usage/node_modules/has-flag/license
new file mode 100644
index 0000000..e7af2f7
--- /dev/null
+++ b/node_modules/command-line-usage/node_modules/has-flag/license
@@ -0,0 +1,9 @@
+MIT License
+
+Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/node_modules/command-line-usage/node_modules/has-flag/package.json b/node_modules/command-line-usage/node_modules/has-flag/package.json
new file mode 100644
index 0000000..e1eb17a
--- /dev/null
+++ b/node_modules/command-line-usage/node_modules/has-flag/package.json
@@ -0,0 +1,44 @@
+{
+ "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/command-line-usage/node_modules/has-flag/readme.md b/node_modules/command-line-usage/node_modules/has-flag/readme.md
new file mode 100644
index 0000000..677893c
--- /dev/null
+++ b/node_modules/command-line-usage/node_modules/has-flag/readme.md
@@ -0,0 +1,70 @@
+# 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/command-line-usage/node_modules/supports-color/browser.js b/node_modules/command-line-usage/node_modules/supports-color/browser.js
new file mode 100644
index 0000000..62afa3a
--- /dev/null
+++ b/node_modules/command-line-usage/node_modules/supports-color/browser.js
@@ -0,0 +1,5 @@
+'use strict';
+module.exports = {
+ stdout: false,
+ stderr: false
+};
diff --git a/node_modules/command-line-usage/node_modules/supports-color/index.js b/node_modules/command-line-usage/node_modules/supports-color/index.js
new file mode 100644
index 0000000..1704131
--- /dev/null
+++ b/node_modules/command-line-usage/node_modules/supports-color/index.js
@@ -0,0 +1,131 @@
+'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/command-line-usage/node_modules/supports-color/license b/node_modules/command-line-usage/node_modules/supports-color/license
new file mode 100644
index 0000000..e7af2f7
--- /dev/null
+++ b/node_modules/command-line-usage/node_modules/supports-color/license
@@ -0,0 +1,9 @@
+MIT License
+
+Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/node_modules/command-line-usage/node_modules/supports-color/package.json b/node_modules/command-line-usage/node_modules/supports-color/package.json
new file mode 100644
index 0000000..ad199f5
--- /dev/null
+++ b/node_modules/command-line-usage/node_modules/supports-color/package.json
@@ -0,0 +1,53 @@
+{
+ "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/command-line-usage/node_modules/supports-color/readme.md b/node_modules/command-line-usage/node_modules/supports-color/readme.md
new file mode 100644
index 0000000..f6e4019
--- /dev/null
+++ b/node_modules/command-line-usage/node_modules/supports-color/readme.md
@@ -0,0 +1,66 @@
+# 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/command-line-usage/node_modules/typical/LICENSE b/node_modules/command-line-usage/node_modules/typical/LICENSE
new file mode 100644
index 0000000..700561a
--- /dev/null
+++ b/node_modules/command-line-usage/node_modules/typical/LICENSE
@@ -0,0 +1,22 @@
+The MIT License (MIT)
+
+Copyright (c) 2014-19 Lloyd Brookes <75pound@gmail.com>
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
diff --git a/node_modules/command-line-usage/node_modules/typical/README.hbs b/node_modules/command-line-usage/node_modules/typical/README.hbs
new file mode 100644
index 0000000..bb092a1
--- /dev/null
+++ b/node_modules/command-line-usage/node_modules/typical/README.hbs
@@ -0,0 +1,40 @@
+[![view on npm](http://img.shields.io/npm/v/typical.svg)](https://www.npmjs.org/package/typical)
+[![npm module downloads](http://img.shields.io/npm/dt/typical.svg)](https://www.npmjs.org/package/typical)
+[![Build Status](https://travis-ci.org/75lb/typical.svg?branch=master)](https://travis-ci.org/75lb/typical)
+[![Coverage Status](https://coveralls.io/repos/github/75lb/typical/badge.svg?branch=master)](https://coveralls.io/github/75lb/typical?branch=master)
+[![Dependency Status](https://badgen.net/david/dep/75lb/typical)](https://david-dm.org/75lb/typical)
+[![js-standard-style](https://img.shields.io/badge/code%20style-standard-brightgreen.svg)](https://github.com/feross/standard)
+
+{{>main}}
+
+## Load anywhere
+
+This library is compatible with Node.js, the Web and any style of module loader. It can be loaded anywhere, natively without transpilation.
+
+Node.js:
+
+```js
+const typical = require('typical')
+```
+
+Within Node.js with ECMAScript Module support enabled:
+
+```js
+import typical from 'typical'
+```
+
+Within a modern browser ECMAScript Module:
+
+```js
+import typical from './node_modules/typical/index.mjs'
+```
+
+Old browser (adds `window.typical`):
+
+```html
+<script nomodule src="./node_modules/typical/dist/index.js"></script>
+```
+
+* * *
+
+&copy; 2014-19 Lloyd Brookes \<75pound@gmail.com\>. Documented by [jsdoc-to-markdown](https://github.com/jsdoc2md/jsdoc-to-markdown).
diff --git a/node_modules/command-line-usage/node_modules/typical/README.md b/node_modules/command-line-usage/node_modules/typical/README.md
new file mode 100644
index 0000000..6e3d513
--- /dev/null
+++ b/node_modules/command-line-usage/node_modules/typical/README.md
@@ -0,0 +1,302 @@
+[![view on npm](http://img.shields.io/npm/v/typical.svg)](https://www.npmjs.org/package/typical)
+[![npm module downloads](http://img.shields.io/npm/dt/typical.svg)](https://www.npmjs.org/package/typical)
+[![Build Status](https://travis-ci.org/75lb/typical.svg?branch=master)](https://travis-ci.org/75lb/typical)
+[![Coverage Status](https://coveralls.io/repos/github/75lb/typical/badge.svg?branch=master)](https://coveralls.io/github/75lb/typical?branch=master)
+[![Dependency Status](https://badgen.net/david/dep/75lb/typical)](https://david-dm.org/75lb/typical)
+[![js-standard-style](https://img.shields.io/badge/code%20style-standard-brightgreen.svg)](https://github.com/feross/standard)
+
+<a name="module_typical"></a>
+
+## typical
+Isomorphic, functional type-checking for Javascript.
+
+**Example**
+```js
+const t = require('typical')
+const allDefined = array.every(t.isDefined)
+```
+
+* [typical](#module_typical)
+ * [.isNumber(n)](#module_typical.isNumber) ⇒ <code>boolean</code>
+ * [.isPlainObject(input)](#module_typical.isPlainObject) ⇒ <code>boolean</code>
+ * [.isArrayLike(input)](#module_typical.isArrayLike) ⇒ <code>boolean</code>
+ * [.isObject(input)](#module_typical.isObject) ⇒ <code>boolean</code>
+ * [.isDefined(input)](#module_typical.isDefined) ⇒ <code>boolean</code>
+ * [.isUndefined(input)](#module_typical.isUndefined) ⇒ <code>boolean</code>
+ * [.isNull(input)](#module_typical.isNull) ⇒ <code>boolean</code>
+ * [.isDefinedValue(input)](#module_typical.isDefinedValue) ⇒ <code>boolean</code>
+ * [.isClass(input)](#module_typical.isClass) ⇒ <code>boolean</code>
+ * [.isPrimitive(input)](#module_typical.isPrimitive) ⇒ <code>boolean</code>
+ * [.isPromise(input)](#module_typical.isPromise) ⇒ <code>boolean</code>
+ * [.isIterable(input)](#module_typical.isIterable) ⇒ <code>boolean</code>
+ * [.isString(input)](#module_typical.isString) ⇒ <code>boolean</code>
+ * [.isFunction(input)](#module_typical.isFunction) ⇒ <code>boolean</code>
+
+<a name="module_typical.isNumber"></a>
+
+### t.isNumber(n) ⇒ <code>boolean</code>
+Returns true if input is a number. It is a more reasonable alternative to `typeof n` which returns `number` for `NaN` and `Infinity`.
+
+**Kind**: static method of [<code>typical</code>](#module_typical)
+
+| Param | Type | Description |
+| --- | --- | --- |
+| n | <code>\*</code> | the input to test |
+
+**Example**
+```js
+> t.isNumber(0)
+true
+> t.isNumber(1)
+true
+> t.isNumber(1.1)
+true
+> t.isNumber(0xff)
+true
+> t.isNumber(0644)
+true
+> t.isNumber(6.2e5)
+true
+> t.isNumber(NaN)
+false
+> t.isNumber(Infinity)
+false
+```
+<a name="module_typical.isPlainObject"></a>
+
+### t.isPlainObject(input) ⇒ <code>boolean</code>
+A plain object is a simple object literal, it is not an instance of a class. Returns true if the input `typeof` is `object` and directly decends from `Object`.
+
+**Kind**: static method of [<code>typical</code>](#module_typical)
+
+| Param | Type | Description |
+| --- | --- | --- |
+| input | <code>\*</code> | the input to test |
+
+**Example**
+```js
+> t.isPlainObject({ something: 'one' })
+true
+> t.isPlainObject(new Date())
+false
+> t.isPlainObject([ 0, 1 ])
+false
+> t.isPlainObject(/test/)
+false
+> t.isPlainObject(1)
+false
+> t.isPlainObject('one')
+false
+> t.isPlainObject(null)
+false
+> t.isPlainObject((function * () {})())
+false
+> t.isPlainObject(function * () {})
+false
+```
+<a name="module_typical.isArrayLike"></a>
+
+### t.isArrayLike(input) ⇒ <code>boolean</code>
+An array-like value has all the properties of an array yet is not an array instance. An example is the `arguments` object. Returns `true`` if the input value is an object, not `null`` and has a `length` property set with a numeric value.
+
+**Kind**: static method of [<code>typical</code>](#module_typical)
+
+| Param | Type | Description |
+| --- | --- | --- |
+| input | <code>\*</code> | the input to test |
+
+**Example**
+```js
+function sum(x, y){
+ console.log(t.isArrayLike(arguments))
+ // prints `true`
+}
+```
+<a name="module_typical.isObject"></a>
+
+### t.isObject(input) ⇒ <code>boolean</code>
+Returns true if the typeof input is `'object'` but not null.
+
+**Kind**: static method of [<code>typical</code>](#module_typical)
+
+| Param | Type | Description |
+| --- | --- | --- |
+| input | <code>\*</code> | the input to test |
+
+<a name="module_typical.isDefined"></a>
+
+### t.isDefined(input) ⇒ <code>boolean</code>
+Returns true if the input value is defined.
+
+**Kind**: static method of [<code>typical</code>](#module_typical)
+
+| Param | Type | Description |
+| --- | --- | --- |
+| input | <code>\*</code> | the input to test |
+
+<a name="module_typical.isUndefined"></a>
+
+### t.isUndefined(input) ⇒ <code>boolean</code>
+Returns true if the input value is undefined.
+
+**Kind**: static method of [<code>typical</code>](#module_typical)
+
+| Param | Type | Description |
+| --- | --- | --- |
+| input | <code>\*</code> | the input to test |
+
+<a name="module_typical.isNull"></a>
+
+### t.isNull(input) ⇒ <code>boolean</code>
+Returns true if the input value is null.
+
+**Kind**: static method of [<code>typical</code>](#module_typical)
+
+| Param | Type | Description |
+| --- | --- | --- |
+| input | <code>\*</code> | the input to test |
+
+<a name="module_typical.isDefinedValue"></a>
+
+### t.isDefinedValue(input) ⇒ <code>boolean</code>
+Returns true if the input value is not one of `undefined`, `null`, or `NaN`.
+
+**Kind**: static method of [<code>typical</code>](#module_typical)
+
+| Param | Type | Description |
+| --- | --- | --- |
+| input | <code>\*</code> | the input to test |
+
+<a name="module_typical.isClass"></a>
+
+### t.isClass(input) ⇒ <code>boolean</code>
+Returns true if the input value is an ES2015 `class`.
+
+**Kind**: static method of [<code>typical</code>](#module_typical)
+
+| Param | Type | Description |
+| --- | --- | --- |
+| input | <code>\*</code> | the input to test |
+
+<a name="module_typical.isPrimitive"></a>
+
+### t.isPrimitive(input) ⇒ <code>boolean</code>
+Returns true if the input is a string, number, symbol, boolean, null or undefined value.
+
+**Kind**: static method of [<code>typical</code>](#module_typical)
+
+| Param | Type | Description |
+| --- | --- | --- |
+| input | <code>\*</code> | the input to test |
+
+<a name="module_typical.isPromise"></a>
+
+### t.isPromise(input) ⇒ <code>boolean</code>
+Returns true if the input is a Promise.
+
+**Kind**: static method of [<code>typical</code>](#module_typical)
+
+| Param | Type | Description |
+| --- | --- | --- |
+| input | <code>\*</code> | the input to test |
+
+<a name="module_typical.isIterable"></a>
+
+### t.isIterable(input) ⇒ <code>boolean</code>
+Returns true if the input is an iterable (`Map`, `Set`, `Array`, Generator etc.).
+
+**Kind**: static method of [<code>typical</code>](#module_typical)
+
+| Param | Type | Description |
+| --- | --- | --- |
+| input | <code>\*</code> | the input to test |
+
+**Example**
+```js
+> t.isIterable('string')
+true
+> t.isIterable(new Map())
+true
+> t.isIterable([])
+true
+> t.isIterable((function * () {})())
+true
+> t.isIterable(Promise.resolve())
+false
+> t.isIterable(Promise)
+false
+> t.isIterable(true)
+false
+> t.isIterable({})
+false
+> t.isIterable(0)
+false
+> t.isIterable(1.1)
+false
+> t.isIterable(NaN)
+false
+> t.isIterable(Infinity)
+false
+> t.isIterable(function () {})
+false
+> t.isIterable(Date)
+false
+> t.isIterable()
+false
+> t.isIterable({ then: function () {} })
+false
+```
+<a name="module_typical.isString"></a>
+
+### t.isString(input) ⇒ <code>boolean</code>
+Returns true if the input value is a string. The equivalent of `typeof input === 'string'` for use in funcitonal contexts.
+
+**Kind**: static method of [<code>typical</code>](#module_typical)
+
+| Param | Type | Description |
+| --- | --- | --- |
+| input | <code>\*</code> | the input to test |
+
+<a name="module_typical.isFunction"></a>
+
+### t.isFunction(input) ⇒ <code>boolean</code>
+Returns true if the input value is a function. The equivalent of `typeof input === 'function'` for use in funcitonal contexts.
+
+**Kind**: static method of [<code>typical</code>](#module_typical)
+
+| Param | Type | Description |
+| --- | --- | --- |
+| input | <code>\*</code> | the input to test |
+
+
+## Load anywhere
+
+This library is compatible with Node.js, the Web and any style of module loader. It can be loaded anywhere, natively without transpilation.
+
+Node.js:
+
+```js
+const typical = require('typical')
+```
+
+Within Node.js with ECMAScript Module support enabled:
+
+```js
+import typical from 'typical'
+```
+
+Within a modern browser ECMAScript Module:
+
+```js
+import typical from './node_modules/typical/index.mjs'
+```
+
+Old browser (adds `window.typical`):
+
+```html
+<script nomodule src="./node_modules/typical/dist/index.js"></script>
+```
+
+* * *
+
+&copy; 2014-19 Lloyd Brookes \<75pound@gmail.com\>. Documented by [jsdoc-to-markdown](https://github.com/jsdoc2md/jsdoc-to-markdown).
diff --git a/node_modules/command-line-usage/node_modules/typical/dist/index.js b/node_modules/command-line-usage/node_modules/typical/dist/index.js
new file mode 100644
index 0000000..ed8b168
--- /dev/null
+++ b/node_modules/command-line-usage/node_modules/typical/dist/index.js
@@ -0,0 +1,295 @@
+(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
+ typeof define === 'function' && define.amd ? define(['exports'], factory) :
+ (global = global || self, factory(global.typical = {}));
+}(this, function (exports) { 'use strict';
+
+ /**
+ * Isomorphic, functional type-checking for Javascript.
+ * @module typical
+ * @typicalname t
+ * @example
+ * const t = require('typical')
+ * const allDefined = array.every(t.isDefined)
+ */
+
+ /**
+ * Returns true if input is a number. It is a more reasonable alternative to `typeof n` which returns `number` for `NaN` and `Infinity`.
+ *
+ * @param {*} - the input to test
+ * @returns {boolean}
+ * @static
+ * @example
+ * > t.isNumber(0)
+ * true
+ * > t.isNumber(1)
+ * true
+ * > t.isNumber(1.1)
+ * true
+ * > t.isNumber(0xff)
+ * true
+ * > t.isNumber(0644)
+ * true
+ * > t.isNumber(6.2e5)
+ * true
+ * > t.isNumber(NaN)
+ * false
+ * > t.isNumber(Infinity)
+ * false
+ */
+ function isNumber (n) {
+ return !isNaN(parseFloat(n)) && isFinite(n)
+ }
+
+ /**
+ * A plain object is a simple object literal, it is not an instance of a class. Returns true if the input `typeof` is `object` and directly decends from `Object`.
+ *
+ * @param {*} - the input to test
+ * @returns {boolean}
+ * @static
+ * @example
+ * > t.isPlainObject({ something: 'one' })
+ * true
+ * > t.isPlainObject(new Date())
+ * false
+ * > t.isPlainObject([ 0, 1 ])
+ * false
+ * > t.isPlainObject(/test/)
+ * false
+ * > t.isPlainObject(1)
+ * false
+ * > t.isPlainObject('one')
+ * false
+ * > t.isPlainObject(null)
+ * false
+ * > t.isPlainObject((function * () {})())
+ * false
+ * > t.isPlainObject(function * () {})
+ * false
+ */
+ function isPlainObject (input) {
+ return input !== null && typeof input === 'object' && input.constructor === Object
+ }
+
+ /**
+ * An array-like value has all the properties of an array yet is not an array instance. An example is the `arguments` object. Returns `true`` if the input value is an object, not `null`` and has a `length` property set with a numeric value.
+ *
+ * @param {*} - the input to test
+ * @returns {boolean}
+ * @static
+ * @example
+ * function sum(x, y){
+ * console.log(t.isArrayLike(arguments))
+ * // prints `true`
+ * }
+ */
+ function isArrayLike (input) {
+ return isObject(input) && typeof input.length === 'number'
+ }
+
+ /**
+ * Returns true if the typeof input is `'object'` but not null.
+ * @param {*} - the input to test
+ * @returns {boolean}
+ * @static
+ */
+ function isObject (input) {
+ return typeof input === 'object' && input !== null
+ }
+
+ /**
+ * Returns true if the input value is defined.
+ * @param {*} - the input to test
+ * @returns {boolean}
+ * @static
+ */
+ function isDefined (input) {
+ return typeof input !== 'undefined'
+ }
+
+ /**
+ * Returns true if the input value is undefined.
+ * @param {*} - the input to test
+ * @returns {boolean}
+ * @static
+ */
+ function isUndefined (input) {
+ return !isDefined(input)
+ }
+
+ /**
+ * Returns true if the input value is null.
+ * @param {*} - the input to test
+ * @returns {boolean}
+ * @static
+ */
+ function isNull (input) {
+ return input === null
+ }
+
+ /**
+ * Returns true if the input value is both defined and not null.
+ * @param {*} - the input to test
+ * @returns {boolean}
+ * @static
+ */
+ function isDefinedValue (input) {
+ return isDefined(input) && !isNull(input) && !Number.isNaN(input)
+ }
+
+ /**
+ * Returns true if the input value is an ES2015 `class`.
+ * @param {*} - the input to test
+ * @returns {boolean}
+ * @static
+ */
+ function isClass (input) {
+ if (typeof input === 'function') {
+ return /^class /.test(Function.prototype.toString.call(input))
+ } else {
+ return false
+ }
+ }
+
+ /**
+ * Returns true if the input is a string, number, symbol, boolean, null or undefined value.
+ * @param {*} - the input to test
+ * @returns {boolean}
+ * @static
+ */
+ function isPrimitive (input) {
+ if (input === null) return true
+ switch (typeof input) {
+ case 'string':
+ case 'number':
+ case 'symbol':
+ case 'undefined':
+ case 'boolean':
+ return true
+ default:
+ return false
+ }
+ }
+
+ /**
+ * Returns true if the input is a Promise.
+ * @param {*} - the input to test
+ * @returns {boolean}
+ * @static
+ */
+ function isPromise (input) {
+ if (input) {
+ const isPromise = isDefined(Promise) && input instanceof Promise;
+ const isThenable = input.then && typeof input.then === 'function';
+ return !!(isPromise || isThenable)
+ } else {
+ return false
+ }
+ }
+
+ /**
+ * Returns true if the input is an iterable (`Map`, `Set`, `Array`, Generator etc.).
+ * @param {*} - the input to test
+ * @returns {boolean}
+ * @static
+ * @example
+ * > t.isIterable('string')
+ * true
+ * > t.isIterable(new Map())
+ * true
+ * > t.isIterable([])
+ * true
+ * > t.isIterable((function * () {})())
+ * true
+ * > t.isIterable(Promise.resolve())
+ * false
+ * > t.isIterable(Promise)
+ * false
+ * > t.isIterable(true)
+ * false
+ * > t.isIterable({})
+ * false
+ * > t.isIterable(0)
+ * false
+ * > t.isIterable(1.1)
+ * false
+ * > t.isIterable(NaN)
+ * false
+ * > t.isIterable(Infinity)
+ * false
+ * > t.isIterable(function () {})
+ * false
+ * > t.isIterable(Date)
+ * false
+ * > t.isIterable()
+ * false
+ * > t.isIterable({ then: function () {} })
+ * false
+ */
+ function isIterable (input) {
+ if (input === null || !isDefined(input)) {
+ return false
+ } else {
+ return (
+ typeof input[Symbol.iterator] === 'function' ||
+ typeof input[Symbol.asyncIterator] === 'function'
+ )
+ }
+ }
+
+ /**
+ * Returns true if the input value is a string. The equivalent of `typeof input === 'string'` for use in funcitonal contexts.
+ * @param {*} - the input to test
+ * @returns {boolean}
+ * @static
+ */
+ function isString (input) {
+ return typeof input === 'string'
+ }
+
+ /**
+ * Returns true if the input value is a function. The equivalent of `typeof input === 'function'` for use in funcitonal contexts.
+ * @param {*} - the input to test
+ * @returns {boolean}
+ * @static
+ */
+ function isFunction (input) {
+ return typeof input === 'function'
+ }
+
+ var index = {
+ isNumber,
+ isPlainObject,
+ isArrayLike,
+ isObject,
+ isDefined,
+ isUndefined,
+ isNull,
+ isDefinedValue,
+ isClass,
+ isPrimitive,
+ isPromise,
+ isIterable,
+ isString,
+ isFunction
+ };
+
+ exports.default = index;
+ exports.isArrayLike = isArrayLike;
+ exports.isClass = isClass;
+ exports.isDefined = isDefined;
+ exports.isDefinedValue = isDefinedValue;
+ exports.isFunction = isFunction;
+ exports.isIterable = isIterable;
+ exports.isNull = isNull;
+ exports.isNumber = isNumber;
+ exports.isObject = isObject;
+ exports.isPlainObject = isPlainObject;
+ exports.isPrimitive = isPrimitive;
+ exports.isPromise = isPromise;
+ exports.isString = isString;
+ exports.isUndefined = isUndefined;
+
+ Object.defineProperty(exports, '__esModule', { value: true });
+
+}));
diff --git a/node_modules/command-line-usage/node_modules/typical/index.mjs b/node_modules/command-line-usage/node_modules/typical/index.mjs
new file mode 100644
index 0000000..d3468a9
--- /dev/null
+++ b/node_modules/command-line-usage/node_modules/typical/index.mjs
@@ -0,0 +1,269 @@
+/**
+ * Isomorphic, functional type-checking for Javascript.
+ * @module typical
+ * @typicalname t
+ * @example
+ * const t = require('typical')
+ * const allDefined = array.every(t.isDefined)
+ */
+
+/**
+ * Returns true if input is a number. It is a more reasonable alternative to `typeof n` which returns `number` for `NaN` and `Infinity`.
+ *
+ * @param {*} - the input to test
+ * @returns {boolean}
+ * @static
+ * @example
+ * > t.isNumber(0)
+ * true
+ * > t.isNumber(1)
+ * true
+ * > t.isNumber(1.1)
+ * true
+ * > t.isNumber(0xff)
+ * true
+ * > t.isNumber(0644)
+ * true
+ * > t.isNumber(6.2e5)
+ * true
+ * > t.isNumber(NaN)
+ * false
+ * > t.isNumber(Infinity)
+ * false
+ */
+export function isNumber (n) {
+ return !isNaN(parseFloat(n)) && isFinite(n)
+}
+
+/**
+ * A plain object is a simple object literal, it is not an instance of a class. Returns true if the input `typeof` is `object` and directly decends from `Object`.
+ *
+ * @param {*} - the input to test
+ * @returns {boolean}
+ * @static
+ * @example
+ * > t.isPlainObject({ something: 'one' })
+ * true
+ * > t.isPlainObject(new Date())
+ * false
+ * > t.isPlainObject([ 0, 1 ])
+ * false
+ * > t.isPlainObject(/test/)
+ * false
+ * > t.isPlainObject(1)
+ * false
+ * > t.isPlainObject('one')
+ * false
+ * > t.isPlainObject(null)
+ * false
+ * > t.isPlainObject((function * () {})())
+ * false
+ * > t.isPlainObject(function * () {})
+ * false
+ */
+export function isPlainObject (input) {
+ return input !== null && typeof input === 'object' && input.constructor === Object
+}
+
+/**
+ * An array-like value has all the properties of an array yet is not an array instance. An example is the `arguments` object. Returns `true`` if the input value is an object, not `null`` and has a `length` property set with a numeric value.
+ *
+ * @param {*} - the input to test
+ * @returns {boolean}
+ * @static
+ * @example
+ * function sum(x, y){
+ * console.log(t.isArrayLike(arguments))
+ * // prints `true`
+ * }
+ */
+export function isArrayLike (input) {
+ return isObject(input) && typeof input.length === 'number'
+}
+
+/**
+ * Returns true if the typeof input is `'object'` but not null.
+ * @param {*} - the input to test
+ * @returns {boolean}
+ * @static
+ */
+export function isObject (input) {
+ return typeof input === 'object' && input !== null
+}
+
+/**
+ * Returns true if the input value is defined.
+ * @param {*} - the input to test
+ * @returns {boolean}
+ * @static
+ */
+export function isDefined (input) {
+ return typeof input !== 'undefined'
+}
+
+/**
+ * Returns true if the input value is undefined.
+ * @param {*} - the input to test
+ * @returns {boolean}
+ * @static
+ */
+export function isUndefined (input) {
+ return !isDefined(input)
+}
+
+/**
+ * Returns true if the input value is null.
+ * @param {*} - the input to test
+ * @returns {boolean}
+ * @static
+ */
+export function isNull (input) {
+ return input === null
+}
+
+/**
+ * Returns true if the input value is not one of `undefined`, `null`, or `NaN`.
+ * @param {*} - the input to test
+ * @returns {boolean}
+ * @static
+ */
+export function isDefinedValue (input) {
+ return isDefined(input) && !isNull(input) && !Number.isNaN(input)
+}
+
+/**
+ * Returns true if the input value is an ES2015 `class`.
+ * @param {*} - the input to test
+ * @returns {boolean}
+ * @static
+ */
+export function isClass (input) {
+ if (typeof input === 'function') {
+ return /^class /.test(Function.prototype.toString.call(input))
+ } else {
+ return false
+ }
+}
+
+/**
+ * Returns true if the input is a string, number, symbol, boolean, null or undefined value.
+ * @param {*} - the input to test
+ * @returns {boolean}
+ * @static
+ */
+export function isPrimitive (input) {
+ if (input === null) return true
+ switch (typeof input) {
+ case 'string':
+ case 'number':
+ case 'symbol':
+ case 'undefined':
+ case 'boolean':
+ return true
+ default:
+ return false
+ }
+}
+
+/**
+ * Returns true if the input is a Promise.
+ * @param {*} - the input to test
+ * @returns {boolean}
+ * @static
+ */
+export function isPromise (input) {
+ if (input) {
+ const isPromise = isDefined(Promise) && input instanceof Promise
+ const isThenable = input.then && typeof input.then === 'function'
+ return !!(isPromise || isThenable)
+ } else {
+ return false
+ }
+}
+
+/**
+ * Returns true if the input is an iterable (`Map`, `Set`, `Array`, Generator etc.).
+ * @param {*} - the input to test
+ * @returns {boolean}
+ * @static
+ * @example
+ * > t.isIterable('string')
+ * true
+ * > t.isIterable(new Map())
+ * true
+ * > t.isIterable([])
+ * true
+ * > t.isIterable((function * () {})())
+ * true
+ * > t.isIterable(Promise.resolve())
+ * false
+ * > t.isIterable(Promise)
+ * false
+ * > t.isIterable(true)
+ * false
+ * > t.isIterable({})
+ * false
+ * > t.isIterable(0)
+ * false
+ * > t.isIterable(1.1)
+ * false
+ * > t.isIterable(NaN)
+ * false
+ * > t.isIterable(Infinity)
+ * false
+ * > t.isIterable(function () {})
+ * false
+ * > t.isIterable(Date)
+ * false
+ * > t.isIterable()
+ * false
+ * > t.isIterable({ then: function () {} })
+ * false
+ */
+export function isIterable (input) {
+ if (input === null || !isDefined(input)) {
+ return false
+ } else {
+ return (
+ typeof input[Symbol.iterator] === 'function' ||
+ typeof input[Symbol.asyncIterator] === 'function'
+ )
+ }
+}
+
+/**
+ * Returns true if the input value is a string. The equivalent of `typeof input === 'string'` for use in funcitonal contexts.
+ * @param {*} - the input to test
+ * @returns {boolean}
+ * @static
+ */
+export function isString (input) {
+ return typeof input === 'string'
+}
+
+/**
+ * Returns true if the input value is a function. The equivalent of `typeof input === 'function'` for use in funcitonal contexts.
+ * @param {*} - the input to test
+ * @returns {boolean}
+ * @static
+ */
+export function isFunction (input) {
+ return typeof input === 'function'
+}
+
+export default {
+ isNumber,
+ isPlainObject,
+ isArrayLike,
+ isObject,
+ isDefined,
+ isUndefined,
+ isNull,
+ isDefinedValue,
+ isClass,
+ isPrimitive,
+ isPromise,
+ isIterable,
+ isString,
+ isFunction
+}
diff --git a/node_modules/command-line-usage/node_modules/typical/package.json b/node_modules/command-line-usage/node_modules/typical/package.json
new file mode 100644
index 0000000..d664f1b
--- /dev/null
+++ b/node_modules/command-line-usage/node_modules/typical/package.json
@@ -0,0 +1,63 @@
+{
+ "name": "typical",
+ "author": "Lloyd Brookes <75pound@gmail.com>",
+ "version": "5.2.0",
+ "description": "Isomorphic, functional type-checking for Javascript",
+ "repository": "https://github.com/75lb/typical",
+ "license": "MIT",
+ "main": "dist/index.js",
+ "keywords": [
+ "type",
+ "checking",
+ "check",
+ "value",
+ "valid",
+ "is",
+ "number",
+ "object",
+ "plainobject",
+ "array",
+ "like",
+ "defined",
+ "string",
+ "boolean",
+ "function",
+ "promise",
+ "iterable",
+ "class",
+ "primitive",
+ "isstring",
+ "isclass",
+ "isiterable",
+ "isdefined",
+ "isobject",
+ "isomorphic"
+ ],
+ "engines": {
+ "node": ">=8"
+ },
+ "scripts": {
+ "test": "npm run dist && npm run test:js && npm run test:esm",
+ "test:all": "npm run test:js && npm run test:esm && npm run test:web",
+ "test:js": "rollup test/*.mjs -f cjs -d tmp/test -e assert && test-runner tmp/test/test*.js",
+ "test:esm": "esm-runner test/*.mjs",
+ "test:web": "web-runner test/test.mjs",
+ "test:v8": "rollup test/test.mjs test/test-default.mjs -f cjs -d tmp/testv8 && test-runner tmp/testv8/test*.js",
+ "dist": "rollup index.mjs -f umd -n typical -o dist/index.js --exports named",
+ "docs": "jsdoc2md -c jsdoc.conf -t README.hbs index.mjs > README.md; echo",
+ "cover": "nyc npm test && nyc report --reporter=text-lcov | coveralls"
+ },
+ "devDependencies": {
+ "coveralls": "^3.0.7",
+ "esm-runner": "^0.1.5",
+ "jsdoc-to-markdown": "^5.0.2",
+ "nyc": "^14.1.1",
+ "rollup": "^1.25.1",
+ "test-object-model": "^0.4.4",
+ "test-runner": "^0.6.0"
+ },
+ "files": [
+ "index.mjs",
+ "dist/index.js"
+ ]
+}
diff --git a/node_modules/command-line-usage/package.json b/node_modules/command-line-usage/package.json
new file mode 100644
index 0000000..7ecc6e0
--- /dev/null
+++ b/node_modules/command-line-usage/package.json
@@ -0,0 +1,41 @@
+{
+ "name": "command-line-usage",
+ "author": "Lloyd Brookes <75pound@gmail.com>",
+ "version": "6.1.3",
+ "description": "Generates command-line usage information",
+ "repository": "https://github.com/75lb/command-line-usage",
+ "license": "MIT",
+ "files": [
+ "lib/**/*.js",
+ "index.js"
+ ],
+ "keywords": [
+ "terminal",
+ "command line",
+ "usage",
+ "generator"
+ ],
+ "engines": {
+ "node": ">=8.0.0"
+ },
+ "scripts": {
+ "docs": "jsdoc2md --no-gfm index.js lib/**/*.js > doc/api.md; echo",
+ "test": "test-runner test/*.js",
+ "cover": "nyc npm test && nyc report --reporter=text-lcov | coveralls"
+ },
+ "dependencies": {
+ "array-back": "^4.0.2",
+ "chalk": "^2.4.2",
+ "table-layout": "^1.0.2",
+ "typical": "^5.2.0"
+ },
+ "devDependencies": {
+ "jsdoc-to-markdown": "^7.1.1",
+ "test-runner": "^0.6.3"
+ },
+ "standard": {
+ "ignore": [
+ "example"
+ ]
+ }
+}
diff --git a/node_modules/deep-extend/CHANGELOG.md b/node_modules/deep-extend/CHANGELOG.md
new file mode 100644
index 0000000..dd13ec1
--- /dev/null
+++ b/node_modules/deep-extend/CHANGELOG.md
@@ -0,0 +1,46 @@
+Changelog
+=========
+
+v0.6.0
+------
+
+- Updated "devDependencies" versions to fix vulnerability alerts
+- Dropped support of io.js and node.js v0.12.x and lower since new versions of
+ "devDependencies" couldn't work with those old node.js versions
+ (minimal supported version of node.js now is v4.0.0)
+
+v0.5.1
+------
+
+- Fix prototype pollution vulnerability (thanks to @mwakerman for the PR)
+- Avoid using deprecated Buffer API (thanks to @ChALkeR for the PR)
+
+v0.5.0
+------
+
+- Auto-testing provided by Travis CI;
+- Support older Node.JS versions (`v0.11.x` and `v0.10.x`);
+- Removed tests files from npm package.
+
+v0.4.2
+------
+
+- Fix for `null` as an argument.
+
+v0.4.1
+------
+
+- Removed test code from <b>npm</b> package
+ ([see pull request #21](https://github.com/unclechu/node-deep-extend/pull/21));
+- Increased minimal version of Node from `0.4.0` to `0.12.0`
+ (because can't run tests on lesser version anyway).
+
+v0.4.0
+------
+
+- **WARNING!** Broken backward compatibility with `v0.3.x`;
+- Fixed bug with extending arrays instead of cloning;
+- Deep cloning for arrays;
+- Check for own property;
+- Fixed some documentation issues;
+- Strict JS mode.
diff --git a/node_modules/deep-extend/LICENSE b/node_modules/deep-extend/LICENSE
new file mode 100644
index 0000000..5c58916
--- /dev/null
+++ b/node_modules/deep-extend/LICENSE
@@ -0,0 +1,20 @@
+The MIT License (MIT)
+
+Copyright (c) 2013-2018, Viacheslav Lotsmanov
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software is furnished to do so,
+subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/node_modules/deep-extend/README.md b/node_modules/deep-extend/README.md
new file mode 100644
index 0000000..67c7fc0
--- /dev/null
+++ b/node_modules/deep-extend/README.md
@@ -0,0 +1,91 @@
+Deep Extend
+===========
+
+Recursive object extending.
+
+[![Build Status](https://api.travis-ci.org/unclechu/node-deep-extend.svg?branch=master)](https://travis-ci.org/unclechu/node-deep-extend)
+
+[![NPM](https://nodei.co/npm/deep-extend.png?downloads=true&downloadRank=true&stars=true)](https://nodei.co/npm/deep-extend/)
+
+Install
+-------
+
+```bash
+$ npm install deep-extend
+```
+
+Usage
+-----
+
+```javascript
+var deepExtend = require('deep-extend');
+var obj1 = {
+ a: 1,
+ b: 2,
+ d: {
+ a: 1,
+ b: [],
+ c: { test1: 123, test2: 321 }
+ },
+ f: 5,
+ g: 123,
+ i: 321,
+ j: [1, 2]
+};
+var obj2 = {
+ b: 3,
+ c: 5,
+ d: {
+ b: { first: 'one', second: 'two' },
+ c: { test2: 222 }
+ },
+ e: { one: 1, two: 2 },
+ f: [],
+ g: (void 0),
+ h: /abc/g,
+ i: null,
+ j: [3, 4]
+};
+
+deepExtend(obj1, obj2);
+
+console.log(obj1);
+/*
+{ a: 1,
+ b: 3,
+ d:
+ { a: 1,
+ b: { first: 'one', second: 'two' },
+ c: { test1: 123, test2: 222 } },
+ f: [],
+ g: undefined,
+ c: 5,
+ e: { one: 1, two: 2 },
+ h: /abc/g,
+ i: null,
+ j: [3, 4] }
+*/
+```
+
+Unit testing
+------------
+
+```bash
+$ npm test
+```
+
+Changelog
+---------
+
+[CHANGELOG.md](./CHANGELOG.md)
+
+Any issues?
+-----------
+
+Please, report about issues
+[here](https://github.com/unclechu/node-deep-extend/issues).
+
+License
+-------
+
+[MIT](./LICENSE)
diff --git a/node_modules/deep-extend/index.js b/node_modules/deep-extend/index.js
new file mode 100644
index 0000000..762d81e
--- /dev/null
+++ b/node_modules/deep-extend/index.js
@@ -0,0 +1 @@
+module.exports = require('./lib/deep-extend');
diff --git a/node_modules/deep-extend/lib/deep-extend.js b/node_modules/deep-extend/lib/deep-extend.js
new file mode 100644
index 0000000..651fd8d
--- /dev/null
+++ b/node_modules/deep-extend/lib/deep-extend.js
@@ -0,0 +1,150 @@
+/*!
+ * @description Recursive object extending
+ * @author Viacheslav Lotsmanov <lotsmanov89@gmail.com>
+ * @license MIT
+ *
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2013-2018 Viacheslav Lotsmanov
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ * the Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+'use strict';
+
+function isSpecificValue(val) {
+ return (
+ val instanceof Buffer
+ || val instanceof Date
+ || val instanceof RegExp
+ ) ? true : false;
+}
+
+function cloneSpecificValue(val) {
+ if (val instanceof Buffer) {
+ var x = Buffer.alloc
+ ? Buffer.alloc(val.length)
+ : new Buffer(val.length);
+ val.copy(x);
+ return x;
+ } else if (val instanceof Date) {
+ return new Date(val.getTime());
+ } else if (val instanceof RegExp) {
+ return new RegExp(val);
+ } else {
+ throw new Error('Unexpected situation');
+ }
+}
+
+/**
+ * Recursive cloning array.
+ */
+function deepCloneArray(arr) {
+ var clone = [];
+ arr.forEach(function (item, index) {
+ if (typeof item === 'object' && item !== null) {
+ if (Array.isArray(item)) {
+ clone[index] = deepCloneArray(item);
+ } else if (isSpecificValue(item)) {
+ clone[index] = cloneSpecificValue(item);
+ } else {
+ clone[index] = deepExtend({}, item);
+ }
+ } else {
+ clone[index] = item;
+ }
+ });
+ return clone;
+}
+
+function safeGetProperty(object, property) {
+ return property === '__proto__' ? undefined : object[property];
+}
+
+/**
+ * Extening object that entered in first argument.
+ *
+ * Returns extended object or false if have no target object or incorrect type.
+ *
+ * If you wish to clone source object (without modify it), just use empty new
+ * object as first argument, like this:
+ * deepExtend({}, yourObj_1, [yourObj_N]);
+ */
+var deepExtend = module.exports = function (/*obj_1, [obj_2], [obj_N]*/) {
+ if (arguments.length < 1 || typeof arguments[0] !== 'object') {
+ return false;
+ }
+
+ if (arguments.length < 2) {
+ return arguments[0];
+ }
+
+ var target = arguments[0];
+
+ // convert arguments to array and cut off target object
+ var args = Array.prototype.slice.call(arguments, 1);
+
+ var val, src, clone;
+
+ args.forEach(function (obj) {
+ // skip argument if isn't an object, is null, or is an array
+ if (typeof obj !== 'object' || obj === null || Array.isArray(obj)) {
+ return;
+ }
+
+ Object.keys(obj).forEach(function (key) {
+ src = safeGetProperty(target, key); // source value
+ val = safeGetProperty(obj, key); // new value
+
+ // recursion prevention
+ if (val === target) {
+ return;
+
+ /**
+ * if new value isn't object then just overwrite by new value
+ * instead of extending.
+ */
+ } else if (typeof val !== 'object' || val === null) {
+ target[key] = val;
+ return;
+
+ // just clone arrays (and recursive clone objects inside)
+ } else if (Array.isArray(val)) {
+ target[key] = deepCloneArray(val);
+ return;
+
+ // custom cloning and overwrite for specific objects
+ } else if (isSpecificValue(val)) {
+ target[key] = cloneSpecificValue(val);
+ return;
+
+ // overwrite by new value if source isn't object or array
+ } else if (typeof src !== 'object' || src === null || Array.isArray(src)) {
+ target[key] = deepExtend({}, val);
+ return;
+
+ // source value and new value is objects both, extending...
+ } else {
+ target[key] = deepExtend(src, val);
+ return;
+ }
+ });
+ });
+
+ return target;
+};
diff --git a/node_modules/deep-extend/package.json b/node_modules/deep-extend/package.json
new file mode 100644
index 0000000..5f2195f
--- /dev/null
+++ b/node_modules/deep-extend/package.json
@@ -0,0 +1,62 @@
+{
+ "name": "deep-extend",
+ "description": "Recursive object extending",
+ "license": "MIT",
+ "version": "0.6.0",
+ "homepage": "https://github.com/unclechu/node-deep-extend",
+ "keywords": [
+ "deep-extend",
+ "extend",
+ "deep",
+ "recursive",
+ "xtend",
+ "clone",
+ "merge",
+ "json"
+ ],
+ "licenses": [
+ {
+ "type": "MIT",
+ "url": "https://raw.githubusercontent.com/unclechu/node-deep-extend/master/LICENSE"
+ }
+ ],
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/unclechu/node-deep-extend.git"
+ },
+ "author": "Viacheslav Lotsmanov <lotsmanov89@gmail.com>",
+ "bugs": "https://github.com/unclechu/node-deep-extend/issues",
+ "contributors": [
+ {
+ "name": "Romain Prieto",
+ "url": "https://github.com/rprieto"
+ },
+ {
+ "name": "Max Maximov",
+ "url": "https://github.com/maxmaximov"
+ },
+ {
+ "name": "Marshall Bowers",
+ "url": "https://github.com/maxdeviant"
+ },
+ {
+ "name": "Misha Wakerman",
+ "url": "https://github.com/mwakerman"
+ }
+ ],
+ "main": "lib/deep-extend.js",
+ "engines": {
+ "node": ">=4.0.0"
+ },
+ "scripts": {
+ "test": "./node_modules/.bin/mocha"
+ },
+ "devDependencies": {
+ "mocha": "5.2.0",
+ "should": "13.2.1"
+ },
+ "files": [
+ "index.js",
+ "lib/"
+ ]
+}
diff --git a/node_modules/delayed-stream/.npmignore b/node_modules/delayed-stream/.npmignore
new file mode 100644
index 0000000..9daeafb
--- /dev/null
+++ b/node_modules/delayed-stream/.npmignore
@@ -0,0 +1 @@
+test
diff --git a/node_modules/delayed-stream/License b/node_modules/delayed-stream/License
new file mode 100644
index 0000000..4804b7a
--- /dev/null
+++ b/node_modules/delayed-stream/License
@@ -0,0 +1,19 @@
+Copyright (c) 2011 Debuggable Limited <felix@debuggable.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/delayed-stream/Makefile b/node_modules/delayed-stream/Makefile
new file mode 100644
index 0000000..b4ff85a
--- /dev/null
+++ b/node_modules/delayed-stream/Makefile
@@ -0,0 +1,7 @@
+SHELL := /bin/bash
+
+test:
+ @./test/run.js
+
+.PHONY: test
+
diff --git a/node_modules/delayed-stream/Readme.md b/node_modules/delayed-stream/Readme.md
new file mode 100644
index 0000000..aca36f9
--- /dev/null
+++ b/node_modules/delayed-stream/Readme.md
@@ -0,0 +1,141 @@
+# delayed-stream
+
+Buffers events from a stream until you are ready to handle them.
+
+## Installation
+
+``` bash
+npm install delayed-stream
+```
+
+## Usage
+
+The following example shows how to write a http echo server that delays its
+response by 1000 ms.
+
+``` javascript
+var DelayedStream = require('delayed-stream');
+var http = require('http');
+
+http.createServer(function(req, res) {
+ var delayed = DelayedStream.create(req);
+
+ setTimeout(function() {
+ res.writeHead(200);
+ delayed.pipe(res);
+ }, 1000);
+});
+```
+
+If you are not using `Stream#pipe`, you can also manually release the buffered
+events by calling `delayedStream.resume()`:
+
+``` javascript
+var delayed = DelayedStream.create(req);
+
+setTimeout(function() {
+ // Emit all buffered events and resume underlaying source
+ delayed.resume();
+}, 1000);
+```
+
+## Implementation
+
+In order to use this meta stream properly, here are a few things you should
+know about the implementation.
+
+### Event Buffering / Proxying
+
+All events of the `source` stream are hijacked by overwriting the `source.emit`
+method. Until node implements a catch-all event listener, this is the only way.
+
+However, delayed-stream still continues to emit all events it captures on the
+`source`, regardless of whether you have released the delayed stream yet or
+not.
+
+Upon creation, delayed-stream captures all `source` events and stores them in
+an internal event buffer. Once `delayedStream.release()` is called, all
+buffered events are emitted on the `delayedStream`, and the event buffer is
+cleared. After that, delayed-stream merely acts as a proxy for the underlaying
+source.
+
+### Error handling
+
+Error events on `source` are buffered / proxied just like any other events.
+However, `delayedStream.create` attaches a no-op `'error'` listener to the
+`source`. This way you only have to handle errors on the `delayedStream`
+object, rather than in two places.
+
+### Buffer limits
+
+delayed-stream provides a `maxDataSize` property that can be used to limit
+the amount of data being buffered. In order to protect you from bad `source`
+streams that don't react to `source.pause()`, this feature is enabled by
+default.
+
+## API
+
+### DelayedStream.create(source, [options])
+
+Returns a new `delayedStream`. Available options are:
+
+* `pauseStream`
+* `maxDataSize`
+
+The description for those properties can be found below.
+
+### delayedStream.source
+
+The `source` stream managed by this object. This is useful if you are
+passing your `delayedStream` around, and you still want to access properties
+on the `source` object.
+
+### delayedStream.pauseStream = true
+
+Whether to pause the underlaying `source` when calling
+`DelayedStream.create()`. Modifying this property afterwards has no effect.
+
+### delayedStream.maxDataSize = 1024 * 1024
+
+The amount of data to buffer before emitting an `error`.
+
+If the underlaying source is emitting `Buffer` objects, the `maxDataSize`
+refers to bytes.
+
+If the underlaying source is emitting JavaScript strings, the size refers to
+characters.
+
+If you know what you are doing, you can set this property to `Infinity` to
+disable this feature. You can also modify this property during runtime.
+
+### delayedStream.dataSize = 0
+
+The amount of data buffered so far.
+
+### delayedStream.readable
+
+An ECMA5 getter that returns the value of `source.readable`.
+
+### delayedStream.resume()
+
+If the `delayedStream` has not been released so far, `delayedStream.release()`
+is called.
+
+In either case, `source.resume()` is called.
+
+### delayedStream.pause()
+
+Calls `source.pause()`.
+
+### delayedStream.pipe(dest)
+
+Calls `delayedStream.resume()` and then proxies the arguments to `source.pipe`.
+
+### delayedStream.release()
+
+Emits and clears all events that have been buffered up so far. This does not
+resume the underlaying source, use `delayedStream.resume()` instead.
+
+## License
+
+delayed-stream is licensed under the MIT license.
diff --git a/node_modules/delayed-stream/lib/delayed_stream.js b/node_modules/delayed-stream/lib/delayed_stream.js
new file mode 100644
index 0000000..b38fc85
--- /dev/null
+++ b/node_modules/delayed-stream/lib/delayed_stream.js
@@ -0,0 +1,107 @@
+var Stream = require('stream').Stream;
+var util = require('util');
+
+module.exports = DelayedStream;
+function DelayedStream() {
+ this.source = null;
+ this.dataSize = 0;
+ this.maxDataSize = 1024 * 1024;
+ this.pauseStream = true;
+
+ this._maxDataSizeExceeded = false;
+ this._released = false;
+ this._bufferedEvents = [];
+}
+util.inherits(DelayedStream, Stream);
+
+DelayedStream.create = function(source, options) {
+ var delayedStream = new this();
+
+ options = options || {};
+ for (var option in options) {
+ delayedStream[option] = options[option];
+ }
+
+ delayedStream.source = source;
+
+ var realEmit = source.emit;
+ source.emit = function() {
+ delayedStream._handleEmit(arguments);
+ return realEmit.apply(source, arguments);
+ };
+
+ source.on('error', function() {});
+ if (delayedStream.pauseStream) {
+ source.pause();
+ }
+
+ return delayedStream;
+};
+
+Object.defineProperty(DelayedStream.prototype, 'readable', {
+ configurable: true,
+ enumerable: true,
+ get: function() {
+ return this.source.readable;
+ }
+});
+
+DelayedStream.prototype.setEncoding = function() {
+ return this.source.setEncoding.apply(this.source, arguments);
+};
+
+DelayedStream.prototype.resume = function() {
+ if (!this._released) {
+ this.release();
+ }
+
+ this.source.resume();
+};
+
+DelayedStream.prototype.pause = function() {
+ this.source.pause();
+};
+
+DelayedStream.prototype.release = function() {
+ this._released = true;
+
+ this._bufferedEvents.forEach(function(args) {
+ this.emit.apply(this, args);
+ }.bind(this));
+ this._bufferedEvents = [];
+};
+
+DelayedStream.prototype.pipe = function() {
+ var r = Stream.prototype.pipe.apply(this, arguments);
+ this.resume();
+ return r;
+};
+
+DelayedStream.prototype._handleEmit = function(args) {
+ if (this._released) {
+ this.emit.apply(this, args);
+ return;
+ }
+
+ if (args[0] === 'data') {
+ this.dataSize += args[1].length;
+ this._checkIfMaxDataSizeExceeded();
+ }
+
+ this._bufferedEvents.push(args);
+};
+
+DelayedStream.prototype._checkIfMaxDataSizeExceeded = function() {
+ if (this._maxDataSizeExceeded) {
+ return;
+ }
+
+ if (this.dataSize <= this.maxDataSize) {
+ return;
+ }
+
+ this._maxDataSizeExceeded = true;
+ var message =
+ 'DelayedStream#maxDataSize of ' + this.maxDataSize + ' bytes exceeded.'
+ this.emit('error', new Error(message));
+};
diff --git a/node_modules/delayed-stream/package.json b/node_modules/delayed-stream/package.json
new file mode 100644
index 0000000..eea3291
--- /dev/null
+++ b/node_modules/delayed-stream/package.json
@@ -0,0 +1,27 @@
+{
+ "author": "Felix Geisendörfer <felix@debuggable.com> (http://debuggable.com/)",
+ "contributors": [
+ "Mike Atkins <apeherder@gmail.com>"
+ ],
+ "name": "delayed-stream",
+ "description": "Buffers events from a stream until you are ready to handle them.",
+ "license": "MIT",
+ "version": "1.0.0",
+ "homepage": "https://github.com/felixge/node-delayed-stream",
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/felixge/node-delayed-stream.git"
+ },
+ "main": "./lib/delayed_stream",
+ "engines": {
+ "node": ">=0.4.0"
+ },
+ "scripts": {
+ "test": "make test"
+ },
+ "dependencies": {},
+ "devDependencies": {
+ "fake": "0.2.0",
+ "far": "0.0.1"
+ }
+}
diff --git a/node_modules/escape-string-regexp/index.js b/node_modules/escape-string-regexp/index.js
new file mode 100644
index 0000000..7834bf9
--- /dev/null
+++ b/node_modules/escape-string-regexp/index.js
@@ -0,0 +1,11 @@
+'use strict';
+
+var matchOperatorsRe = /[|\\{}()[\]^$+*?.]/g;
+
+module.exports = function (str) {
+ if (typeof str !== 'string') {
+ throw new TypeError('Expected a string');
+ }
+
+ return str.replace(matchOperatorsRe, '\\$&');
+};
diff --git a/node_modules/escape-string-regexp/license b/node_modules/escape-string-regexp/license
new file mode 100644
index 0000000..654d0bf
--- /dev/null
+++ b/node_modules/escape-string-regexp/license
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/node_modules/escape-string-regexp/package.json b/node_modules/escape-string-regexp/package.json
new file mode 100644
index 0000000..f307df3
--- /dev/null
+++ b/node_modules/escape-string-regexp/package.json
@@ -0,0 +1,41 @@
+{
+ "name": "escape-string-regexp",
+ "version": "1.0.5",
+ "description": "Escape RegExp special characters",
+ "license": "MIT",
+ "repository": "sindresorhus/escape-string-regexp",
+ "author": {
+ "name": "Sindre Sorhus",
+ "email": "sindresorhus@gmail.com",
+ "url": "sindresorhus.com"
+ },
+ "maintainers": [
+ "Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)",
+ "Joshua Boy Nicolai Appelman <joshua@jbna.nl> (jbna.nl)"
+ ],
+ "engines": {
+ "node": ">=0.8.0"
+ },
+ "scripts": {
+ "test": "xo && ava"
+ },
+ "files": [
+ "index.js"
+ ],
+ "keywords": [
+ "escape",
+ "regex",
+ "regexp",
+ "re",
+ "regular",
+ "expression",
+ "string",
+ "str",
+ "special",
+ "characters"
+ ],
+ "devDependencies": {
+ "ava": "*",
+ "xo": "*"
+ }
+}
diff --git a/node_modules/escape-string-regexp/readme.md b/node_modules/escape-string-regexp/readme.md
new file mode 100644
index 0000000..87ac82d
--- /dev/null
+++ b/node_modules/escape-string-regexp/readme.md
@@ -0,0 +1,27 @@
+# escape-string-regexp [![Build Status](https://travis-ci.org/sindresorhus/escape-string-regexp.svg?branch=master)](https://travis-ci.org/sindresorhus/escape-string-regexp)
+
+> Escape RegExp special characters
+
+
+## Install
+
+```
+$ npm install --save escape-string-regexp
+```
+
+
+## Usage
+
+```js
+const escapeStringRegexp = require('escape-string-regexp');
+
+const escapedString = escapeStringRegexp('how much $ for a unicorn?');
+//=> 'how much \$ for a unicorn\?'
+
+new RegExp(escapedString);
+```
+
+
+## License
+
+MIT © [Sindre Sorhus](http://sindresorhus.com)
diff --git a/node_modules/find-replace/LICENSE b/node_modules/find-replace/LICENSE
new file mode 100644
index 0000000..203018f
--- /dev/null
+++ b/node_modules/find-replace/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2015-19 Lloyd Brookes <75pound@gmail.com>
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/node_modules/find-replace/README.hbs b/node_modules/find-replace/README.hbs
new file mode 100644
index 0000000..76bac7c
--- /dev/null
+++ b/node_modules/find-replace/README.hbs
@@ -0,0 +1,11 @@
+[![view on npm](http://img.shields.io/npm/v/find-replace.svg)](https://www.npmjs.org/package/find-replace)
+[![npm module downloads](http://img.shields.io/npm/dt/find-replace.svg)](https://www.npmjs.org/package/find-replace)
+[![Build Status](https://travis-ci.org/75lb/find-replace.svg?branch=master)](https://travis-ci.org/75lb/find-replace)
+[![Dependency Status](https://david-dm.org/75lb/find-replace.svg)](https://david-dm.org/75lb/find-replace)
+[![js-standard-style](https://img.shields.io/badge/code%20style-standard-brightgreen.svg)](https://github.com/feross/standard)
+
+{{>main}}
+
+* * *
+
+&copy; 2015-19 Lloyd Brookes \<75pound@gmail.com\>. Documented by [jsdoc-to-markdown](https://github.com/jsdoc2md/jsdoc-to-markdown).
diff --git a/node_modules/find-replace/README.md b/node_modules/find-replace/README.md
new file mode 100644
index 0000000..b61b4e3
--- /dev/null
+++ b/node_modules/find-replace/README.md
@@ -0,0 +1,43 @@
+[![view on npm](http://img.shields.io/npm/v/find-replace.svg)](https://www.npmjs.org/package/find-replace)
+[![npm module downloads](http://img.shields.io/npm/dt/find-replace.svg)](https://www.npmjs.org/package/find-replace)
+[![Build Status](https://travis-ci.org/75lb/find-replace.svg?branch=master)](https://travis-ci.org/75lb/find-replace)
+[![Dependency Status](https://david-dm.org/75lb/find-replace.svg)](https://david-dm.org/75lb/find-replace)
+[![js-standard-style](https://img.shields.io/badge/code%20style-standard-brightgreen.svg)](https://github.com/feross/standard)
+
+<a name="module_find-replace"></a>
+
+## find-replace
+Find and either replace or remove items in an array.
+
+**Example**
+```js
+> const findReplace = require('find-replace')
+> const numbers = [ 1, 2, 3]
+
+> findReplace(numbers, n => n === 2, 'two')
+[ 1, 'two', 3 ]
+
+> findReplace(numbers, n => n === 2, [ 'two', 'zwei' ])
+[ 1, [ 'two', 'zwei' ], 3 ]
+
+> findReplace(numbers, n => n === 2, 'two', 'zwei')
+[ 1, 'two', 'zwei', 3 ]
+
+> findReplace(numbers, n => n === 2) // no replacement, so remove
+[ 1, 3 ]
+```
+<a name="exp_module_find-replace--findReplace"></a>
+
+### findReplace(array, testFn, [...replaceWith]) ⇒ <code>array</code> ⏏
+**Kind**: Exported function
+
+| Param | Type | Description |
+| --- | --- | --- |
+| array | <code>array</code> | The input array |
+| testFn | <code>testFn</code> | A predicate function which, if returning `true` causes the current item to be operated on. |
+| [...replaceWith] | <code>any</code> | If specified, found values will be replaced with these values, else removed. |
+
+
+* * *
+
+&copy; 2015-19 Lloyd Brookes \<75pound@gmail.com\>. Documented by [jsdoc-to-markdown](https://github.com/jsdoc2md/jsdoc-to-markdown).
diff --git a/node_modules/find-replace/dist/index.js b/node_modules/find-replace/dist/index.js
new file mode 100644
index 0000000..7203b91
--- /dev/null
+++ b/node_modules/find-replace/dist/index.js
@@ -0,0 +1,124 @@
+(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
+ typeof define === 'function' && define.amd ? define(factory) :
+ (global = global || self, global.findReplace = factory());
+}(this, function () { 'use strict';
+
+ /**
+ * Takes any input and guarantees an array back.
+ *
+ * - converts array-like objects (e.g. `arguments`) to a real array
+ * - converts `undefined` to an empty array
+ * - converts any another other, singular value (including `null`) into an array containing that value
+ * - ignores input which is already an array
+ *
+ * @module array-back
+ * @example
+ * > const arrayify = require('array-back')
+ *
+ * > arrayify(undefined)
+ * []
+ *
+ * > arrayify(null)
+ * [ null ]
+ *
+ * > arrayify(0)
+ * [ 0 ]
+ *
+ * > arrayify([ 1, 2 ])
+ * [ 1, 2 ]
+ *
+ * > function f(){ return arrayify(arguments); }
+ * > f(1,2,3)
+ * [ 1, 2, 3 ]
+ */
+
+ function isObject (input) {
+ return typeof input === 'object' && input !== null
+ }
+
+ function isArrayLike (input) {
+ return isObject(input) && typeof input.length === 'number'
+ }
+
+ /**
+ * @param {*} - the input value to convert to an array
+ * @returns {Array}
+ * @alias module:array-back
+ */
+ function arrayify (input) {
+ if (Array.isArray(input)) {
+ return input
+ } else {
+ if (input === undefined) {
+ return []
+ } else if (isArrayLike(input)) {
+ return Array.prototype.slice.call(input)
+ } else {
+ return [ input ]
+ }
+ }
+ }
+
+ /**
+ * Find and either replace or remove items in an array.
+ *
+ * @module find-replace
+ * @example
+ * > const findReplace = require('find-replace')
+ * > const numbers = [ 1, 2, 3]
+ *
+ * > findReplace(numbers, n => n === 2, 'two')
+ * [ 1, 'two', 3 ]
+ *
+ * > findReplace(numbers, n => n === 2, [ 'two', 'zwei' ])
+ * [ 1, [ 'two', 'zwei' ], 3 ]
+ *
+ * > findReplace(numbers, n => n === 2, 'two', 'zwei')
+ * [ 1, 'two', 'zwei', 3 ]
+ *
+ * > findReplace(numbers, n => n === 2) // no replacement, so remove
+ * [ 1, 3 ]
+ */
+
+ /**
+ * @param {array} - The input array
+ * @param {testFn} - A predicate function which, if returning `true` causes the current item to be operated on.
+ * @param [replaceWith] {...any} - If specified, found values will be replaced with these values, else removed.
+ * @returns {array}
+ * @alias module:find-replace
+ */
+ function findReplace (array, testFn) {
+ const found = [];
+ const replaceWiths = arrayify(arguments);
+ replaceWiths.splice(0, 2);
+
+ arrayify(array).forEach((value, index) => {
+ let expanded = [];
+ replaceWiths.forEach(replaceWith => {
+ if (typeof replaceWith === 'function') {
+ expanded = expanded.concat(replaceWith(value));
+ } else {
+ expanded.push(replaceWith);
+ }
+ });
+
+ if (testFn(value)) {
+ found.push({
+ index: index,
+ replaceWithValue: expanded
+ });
+ }
+ });
+
+ found.reverse().forEach(item => {
+ const spliceArgs = [ item.index, 1 ].concat(item.replaceWithValue);
+ array.splice.apply(array, spliceArgs);
+ });
+
+ return array
+ }
+
+ return findReplace;
+
+}));
diff --git a/node_modules/find-replace/dist/index.mjs b/node_modules/find-replace/dist/index.mjs
new file mode 100644
index 0000000..715c1dd
--- /dev/null
+++ b/node_modules/find-replace/dist/index.mjs
@@ -0,0 +1,116 @@
+/**
+ * Takes any input and guarantees an array back.
+ *
+ * - converts array-like objects (e.g. `arguments`) to a real array
+ * - converts `undefined` to an empty array
+ * - converts any another other, singular value (including `null`) into an array containing that value
+ * - ignores input which is already an array
+ *
+ * @module array-back
+ * @example
+ * > const arrayify = require('array-back')
+ *
+ * > arrayify(undefined)
+ * []
+ *
+ * > arrayify(null)
+ * [ null ]
+ *
+ * > arrayify(0)
+ * [ 0 ]
+ *
+ * > arrayify([ 1, 2 ])
+ * [ 1, 2 ]
+ *
+ * > function f(){ return arrayify(arguments); }
+ * > f(1,2,3)
+ * [ 1, 2, 3 ]
+ */
+
+function isObject (input) {
+ return typeof input === 'object' && input !== null
+}
+
+function isArrayLike (input) {
+ return isObject(input) && typeof input.length === 'number'
+}
+
+/**
+ * @param {*} - the input value to convert to an array
+ * @returns {Array}
+ * @alias module:array-back
+ */
+function arrayify (input) {
+ if (Array.isArray(input)) {
+ return input
+ } else {
+ if (input === undefined) {
+ return []
+ } else if (isArrayLike(input)) {
+ return Array.prototype.slice.call(input)
+ } else {
+ return [ input ]
+ }
+ }
+}
+
+/**
+ * Find and either replace or remove items in an array.
+ *
+ * @module find-replace
+ * @example
+ * > const findReplace = require('find-replace')
+ * > const numbers = [ 1, 2, 3]
+ *
+ * > findReplace(numbers, n => n === 2, 'two')
+ * [ 1, 'two', 3 ]
+ *
+ * > findReplace(numbers, n => n === 2, [ 'two', 'zwei' ])
+ * [ 1, [ 'two', 'zwei' ], 3 ]
+ *
+ * > findReplace(numbers, n => n === 2, 'two', 'zwei')
+ * [ 1, 'two', 'zwei', 3 ]
+ *
+ * > findReplace(numbers, n => n === 2) // no replacement, so remove
+ * [ 1, 3 ]
+ */
+
+/**
+ * @param {array} - The input array
+ * @param {testFn} - A predicate function which, if returning `true` causes the current item to be operated on.
+ * @param [replaceWith] {...any} - If specified, found values will be replaced with these values, else removed.
+ * @returns {array}
+ * @alias module:find-replace
+ */
+function findReplace (array, testFn) {
+ const found = [];
+ const replaceWiths = arrayify(arguments);
+ replaceWiths.splice(0, 2);
+
+ arrayify(array).forEach((value, index) => {
+ let expanded = [];
+ replaceWiths.forEach(replaceWith => {
+ if (typeof replaceWith === 'function') {
+ expanded = expanded.concat(replaceWith(value));
+ } else {
+ expanded.push(replaceWith);
+ }
+ });
+
+ if (testFn(value)) {
+ found.push({
+ index: index,
+ replaceWithValue: expanded
+ });
+ }
+ });
+
+ found.reverse().forEach(item => {
+ const spliceArgs = [ item.index, 1 ].concat(item.replaceWithValue);
+ array.splice.apply(array, spliceArgs);
+ });
+
+ return array
+}
+
+export default findReplace;
diff --git a/node_modules/find-replace/index.mjs b/node_modules/find-replace/index.mjs
new file mode 100644
index 0000000..dde6bd0
--- /dev/null
+++ b/node_modules/find-replace/index.mjs
@@ -0,0 +1,62 @@
+import arrayify from './node_modules/array-back/index.mjs'
+
+/**
+ * Find and either replace or remove items in an array.
+ *
+ * @module find-replace
+ * @example
+ * > const findReplace = require('find-replace')
+ * > const numbers = [ 1, 2, 3]
+ *
+ * > findReplace(numbers, n => n === 2, 'two')
+ * [ 1, 'two', 3 ]
+ *
+ * > findReplace(numbers, n => n === 2, [ 'two', 'zwei' ])
+ * [ 1, [ 'two', 'zwei' ], 3 ]
+ *
+ * > findReplace(numbers, n => n === 2, 'two', 'zwei')
+ * [ 1, 'two', 'zwei', 3 ]
+ *
+ * > findReplace(numbers, n => n === 2) // no replacement, so remove
+ * [ 1, 3 ]
+ */
+
+/**
+ * @param {array} - The input array
+ * @param {testFn} - A predicate function which, if returning `true` causes the current item to be operated on.
+ * @param [replaceWith] {...any} - If specified, found values will be replaced with these values, else removed.
+ * @returns {array}
+ * @alias module:find-replace
+ */
+function findReplace (array, testFn) {
+ const found = []
+ const replaceWiths = arrayify(arguments)
+ replaceWiths.splice(0, 2)
+
+ arrayify(array).forEach((value, index) => {
+ let expanded = []
+ replaceWiths.forEach(replaceWith => {
+ if (typeof replaceWith === 'function') {
+ expanded = expanded.concat(replaceWith(value))
+ } else {
+ expanded.push(replaceWith)
+ }
+ })
+
+ if (testFn(value)) {
+ found.push({
+ index: index,
+ replaceWithValue: expanded
+ })
+ }
+ })
+
+ found.reverse().forEach(item => {
+ const spliceArgs = [ item.index, 1 ].concat(item.replaceWithValue)
+ array.splice.apply(array, spliceArgs)
+ })
+
+ return array
+}
+
+export default findReplace
diff --git a/node_modules/find-replace/package.json b/node_modules/find-replace/package.json
new file mode 100644
index 0000000..4bebb38
--- /dev/null
+++ b/node_modules/find-replace/package.json
@@ -0,0 +1,36 @@
+{
+ "name": "find-replace",
+ "author": "Lloyd Brookes <75pound@gmail.com>",
+ "version": "3.0.0",
+ "description": "Find and either replace or remove items in an array",
+ "repository": "https://github.com/75lb/find-replace.git",
+ "license": "MIT",
+ "main": "dist/index.js",
+ "keywords": [
+ "find",
+ "replace",
+ "array",
+ "remove",
+ "splice"
+ ],
+ "engines": {
+ "node": ">=4.0.0"
+ },
+ "scripts": {
+ "test": "test-runner test.js",
+ "docs": "jsdoc2md -c jsdoc.conf -t README.hbs index.mjs > README.md; echo",
+ "dist": "rollup index.mjs -f umd -n findReplace -o dist/index.js && rollup index.mjs -f esm -o dist/index.mjs"
+ },
+ "devDependencies": {
+ "jsdoc-to-markdown": "^4.0.1",
+ "rollup": "^1.7.0",
+ "test-runner": "^0.5.1"
+ },
+ "dependencies": {
+ "array-back": "^3.0.1"
+ },
+ "files": [
+ "index.mjs",
+ "dist"
+ ]
+}
diff --git a/node_modules/follow-redirects/LICENSE b/node_modules/follow-redirects/LICENSE
new file mode 100644
index 0000000..742cbad
--- /dev/null
+++ b/node_modules/follow-redirects/LICENSE
@@ -0,0 +1,18 @@
+Copyright 2014–present Olivier Lalonde <olalonde@gmail.com>, James Talmage <james@talmage.io>, Ruben Verborgh
+
+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/follow-redirects/README.md b/node_modules/follow-redirects/README.md
new file mode 100644
index 0000000..eb869a6
--- /dev/null
+++ b/node_modules/follow-redirects/README.md
@@ -0,0 +1,155 @@
+## Follow Redirects
+
+Drop-in replacement for Node's `http` and `https` modules that automatically follows redirects.
+
+[![npm version](https://img.shields.io/npm/v/follow-redirects.svg)](https://www.npmjs.com/package/follow-redirects)
+[![Build Status](https://github.com/follow-redirects/follow-redirects/workflows/CI/badge.svg)](https://github.com/follow-redirects/follow-redirects/actions)
+[![Coverage Status](https://coveralls.io/repos/follow-redirects/follow-redirects/badge.svg?branch=master)](https://coveralls.io/r/follow-redirects/follow-redirects?branch=master)
+[![npm downloads](https://img.shields.io/npm/dm/follow-redirects.svg)](https://www.npmjs.com/package/follow-redirects)
+[![Sponsor on GitHub](https://img.shields.io/static/v1?label=Sponsor&message=%F0%9F%92%96&logo=GitHub)](https://github.com/sponsors/RubenVerborgh)
+
+`follow-redirects` provides [request](https://nodejs.org/api/http.html#http_http_request_options_callback) and [get](https://nodejs.org/api/http.html#http_http_get_options_callback)
+ methods that behave identically to those found on the native [http](https://nodejs.org/api/http.html#http_http_request_options_callback) and [https](https://nodejs.org/api/https.html#https_https_request_options_callback)
+ modules, with the exception that they will seamlessly follow redirects.
+
+```javascript
+const { http, https } = require('follow-redirects');
+
+http.get('http://bit.ly/900913', response => {
+ response.on('data', chunk => {
+ console.log(chunk);
+ });
+}).on('error', err => {
+ console.error(err);
+});
+```
+
+You can inspect the final redirected URL through the `responseUrl` property on the `response`.
+If no redirection happened, `responseUrl` is the original request URL.
+
+```javascript
+const request = https.request({
+ host: 'bitly.com',
+ path: '/UHfDGO',
+}, response => {
+ console.log(response.responseUrl);
+ // 'http://duckduckgo.com/robots.txt'
+});
+request.end();
+```
+
+## Options
+### Global options
+Global options are set directly on the `follow-redirects` module:
+
+```javascript
+const followRedirects = require('follow-redirects');
+followRedirects.maxRedirects = 10;
+followRedirects.maxBodyLength = 20 * 1024 * 1024; // 20 MB
+```
+
+The following global options are supported:
+
+- `maxRedirects` (default: `21`) – sets the maximum number of allowed redirects; if exceeded, an error will be emitted.
+
+- `maxBodyLength` (default: 10MB) – sets the maximum size of the request body; if exceeded, an error will be emitted.
+
+### Per-request options
+Per-request options are set by passing an `options` object:
+
+```javascript
+const url = require('url');
+const { http, https } = require('follow-redirects');
+
+const options = url.parse('http://bit.ly/900913');
+options.maxRedirects = 10;
+options.beforeRedirect = (options, response, request) => {
+ // Use this to adjust the request options upon redirecting,
+ // to inspect the latest response headers,
+ // or to cancel the request by throwing an error
+
+ // response.headers = the redirect response headers
+ // response.statusCode = the redirect response code (eg. 301, 307, etc.)
+
+ // request.url = the requested URL that resulted in a redirect
+ // request.headers = the headers in the request that resulted in a redirect
+ // request.method = the method of the request that resulted in a redirect
+ if (options.hostname === "example.com") {
+ options.auth = "user:password";
+ }
+};
+http.request(options);
+```
+
+In addition to the [standard HTTP](https://nodejs.org/api/http.html#http_http_request_options_callback) and [HTTPS options](https://nodejs.org/api/https.html#https_https_request_options_callback),
+the following per-request options are supported:
+- `followRedirects` (default: `true`) – whether redirects should be followed.
+
+- `maxRedirects` (default: `21`) – sets the maximum number of allowed redirects; if exceeded, an error will be emitted.
+
+- `maxBodyLength` (default: 10MB) – sets the maximum size of the request body; if exceeded, an error will be emitted.
+
+- `beforeRedirect` (default: `undefined`) – optionally change the request `options` on redirects, or abort the request by throwing an error.
+
+- `agents` (default: `undefined`) – sets the `agent` option per protocol, since HTTP and HTTPS use different agents. Example value: `{ http: new http.Agent(), https: new https.Agent() }`
+
+- `trackRedirects` (default: `false`) – whether to store the redirected response details into the `redirects` array on the response object.
+
+
+### Advanced usage
+By default, `follow-redirects` will use the Node.js default implementations
+of [`http`](https://nodejs.org/api/http.html)
+and [`https`](https://nodejs.org/api/https.html).
+To enable features such as caching and/or intermediate request tracking,
+you might instead want to wrap `follow-redirects` around custom protocol implementations:
+
+```javascript
+const { http, https } = require('follow-redirects').wrap({
+ http: require('your-custom-http'),
+ https: require('your-custom-https'),
+});
+```
+
+Such custom protocols only need an implementation of the `request` method.
+
+## Browser Usage
+
+Due to the way the browser works,
+the `http` and `https` browser equivalents perform redirects by default.
+
+By requiring `follow-redirects` this way:
+```javascript
+const http = require('follow-redirects/http');
+const https = require('follow-redirects/https');
+```
+you can easily tell webpack and friends to replace
+`follow-redirect` by the built-in versions:
+
+```json
+{
+ "follow-redirects/http" : "http",
+ "follow-redirects/https" : "https"
+}
+```
+
+## Contributing
+
+Pull Requests are always welcome. Please [file an issue](https://github.com/follow-redirects/follow-redirects/issues)
+ detailing your proposal before you invest your valuable time. Additional features and bug fixes should be accompanied
+ by tests. You can run the test suite locally with a simple `npm test` command.
+
+## Debug Logging
+
+`follow-redirects` uses the excellent [debug](https://www.npmjs.com/package/debug) for logging. To turn on logging
+ set the environment variable `DEBUG=follow-redirects` for debug output from just this module. When running the test
+ suite it is sometimes advantageous to set `DEBUG=*` to see output from the express server as well.
+
+## Authors
+
+- [Ruben Verborgh](https://ruben.verborgh.org/)
+- [Olivier Lalonde](mailto:olalonde@gmail.com)
+- [James Talmage](mailto:james@talmage.io)
+
+## License
+
+[MIT License](https://github.com/follow-redirects/follow-redirects/blob/master/LICENSE)
diff --git a/node_modules/follow-redirects/debug.js b/node_modules/follow-redirects/debug.js
new file mode 100644
index 0000000..decb77d
--- /dev/null
+++ b/node_modules/follow-redirects/debug.js
@@ -0,0 +1,15 @@
+var debug;
+
+module.exports = function () {
+ if (!debug) {
+ try {
+ /* eslint global-require: off */
+ debug = require("debug")("follow-redirects");
+ }
+ catch (error) { /* */ }
+ if (typeof debug !== "function") {
+ debug = function () { /* */ };
+ }
+ }
+ debug.apply(null, arguments);
+};
diff --git a/node_modules/follow-redirects/http.js b/node_modules/follow-redirects/http.js
new file mode 100644
index 0000000..695e356
--- /dev/null
+++ b/node_modules/follow-redirects/http.js
@@ -0,0 +1 @@
+module.exports = require("./").http;
diff --git a/node_modules/follow-redirects/https.js b/node_modules/follow-redirects/https.js
new file mode 100644
index 0000000..d21c921
--- /dev/null
+++ b/node_modules/follow-redirects/https.js
@@ -0,0 +1 @@
+module.exports = require("./").https;
diff --git a/node_modules/follow-redirects/index.js b/node_modules/follow-redirects/index.js
new file mode 100644
index 0000000..3e199c1
--- /dev/null
+++ b/node_modules/follow-redirects/index.js
@@ -0,0 +1,621 @@
+var url = require("url");
+var URL = url.URL;
+var http = require("http");
+var https = require("https");
+var Writable = require("stream").Writable;
+var assert = require("assert");
+var debug = require("./debug");
+
+// Create handlers that pass events from native requests
+var events = ["abort", "aborted", "connect", "error", "socket", "timeout"];
+var eventHandlers = Object.create(null);
+events.forEach(function (event) {
+ eventHandlers[event] = function (arg1, arg2, arg3) {
+ this._redirectable.emit(event, arg1, arg2, arg3);
+ };
+});
+
+var InvalidUrlError = createErrorType(
+ "ERR_INVALID_URL",
+ "Invalid URL",
+ TypeError
+);
+// Error types with codes
+var RedirectionError = createErrorType(
+ "ERR_FR_REDIRECTION_FAILURE",
+ "Redirected request failed"
+);
+var TooManyRedirectsError = createErrorType(
+ "ERR_FR_TOO_MANY_REDIRECTS",
+ "Maximum number of redirects exceeded"
+);
+var MaxBodyLengthExceededError = createErrorType(
+ "ERR_FR_MAX_BODY_LENGTH_EXCEEDED",
+ "Request body larger than maxBodyLength limit"
+);
+var WriteAfterEndError = createErrorType(
+ "ERR_STREAM_WRITE_AFTER_END",
+ "write after end"
+);
+
+// An HTTP(S) request that can be redirected
+function RedirectableRequest(options, responseCallback) {
+ // Initialize the request
+ Writable.call(this);
+ this._sanitizeOptions(options);
+ this._options = options;
+ this._ended = false;
+ this._ending = false;
+ this._redirectCount = 0;
+ this._redirects = [];
+ this._requestBodyLength = 0;
+ this._requestBodyBuffers = [];
+
+ // Attach a callback if passed
+ if (responseCallback) {
+ this.on("response", responseCallback);
+ }
+
+ // React to responses of native requests
+ var self = this;
+ this._onNativeResponse = function (response) {
+ self._processResponse(response);
+ };
+
+ // Perform the first request
+ this._performRequest();
+}
+RedirectableRequest.prototype = Object.create(Writable.prototype);
+
+RedirectableRequest.prototype.abort = function () {
+ abortRequest(this._currentRequest);
+ this.emit("abort");
+};
+
+// Writes buffered data to the current native request
+RedirectableRequest.prototype.write = function (data, encoding, callback) {
+ // Writing is not allowed if end has been called
+ if (this._ending) {
+ throw new WriteAfterEndError();
+ }
+
+ // Validate input and shift parameters if necessary
+ if (!isString(data) && !isBuffer(data)) {
+ throw new TypeError("data should be a string, Buffer or Uint8Array");
+ }
+ if (isFunction(encoding)) {
+ callback = encoding;
+ encoding = null;
+ }
+
+ // Ignore empty buffers, since writing them doesn't invoke the callback
+ // https://github.com/nodejs/node/issues/22066
+ if (data.length === 0) {
+ if (callback) {
+ callback();
+ }
+ return;
+ }
+ // Only write when we don't exceed the maximum body length
+ if (this._requestBodyLength + data.length <= this._options.maxBodyLength) {
+ this._requestBodyLength += data.length;
+ this._requestBodyBuffers.push({ data: data, encoding: encoding });
+ this._currentRequest.write(data, encoding, callback);
+ }
+ // Error when we exceed the maximum body length
+ else {
+ this.emit("error", new MaxBodyLengthExceededError());
+ this.abort();
+ }
+};
+
+// Ends the current native request
+RedirectableRequest.prototype.end = function (data, encoding, callback) {
+ // Shift parameters if necessary
+ if (isFunction(data)) {
+ callback = data;
+ data = encoding = null;
+ }
+ else if (isFunction(encoding)) {
+ callback = encoding;
+ encoding = null;
+ }
+
+ // Write data if needed and end
+ if (!data) {
+ this._ended = this._ending = true;
+ this._currentRequest.end(null, null, callback);
+ }
+ else {
+ var self = this;
+ var currentRequest = this._currentRequest;
+ this.write(data, encoding, function () {
+ self._ended = true;
+ currentRequest.end(null, null, callback);
+ });
+ this._ending = true;
+ }
+};
+
+// Sets a header value on the current native request
+RedirectableRequest.prototype.setHeader = function (name, value) {
+ this._options.headers[name] = value;
+ this._currentRequest.setHeader(name, value);
+};
+
+// Clears a header value on the current native request
+RedirectableRequest.prototype.removeHeader = function (name) {
+ delete this._options.headers[name];
+ this._currentRequest.removeHeader(name);
+};
+
+// Global timeout for all underlying requests
+RedirectableRequest.prototype.setTimeout = function (msecs, callback) {
+ var self = this;
+
+ // Destroys the socket on timeout
+ function destroyOnTimeout(socket) {
+ socket.setTimeout(msecs);
+ socket.removeListener("timeout", socket.destroy);
+ socket.addListener("timeout", socket.destroy);
+ }
+
+ // Sets up a timer to trigger a timeout event
+ function startTimer(socket) {
+ if (self._timeout) {
+ clearTimeout(self._timeout);
+ }
+ self._timeout = setTimeout(function () {
+ self.emit("timeout");
+ clearTimer();
+ }, msecs);
+ destroyOnTimeout(socket);
+ }
+
+ // Stops a timeout from triggering
+ function clearTimer() {
+ // Clear the timeout
+ if (self._timeout) {
+ clearTimeout(self._timeout);
+ self._timeout = null;
+ }
+
+ // Clean up all attached listeners
+ self.removeListener("abort", clearTimer);
+ self.removeListener("error", clearTimer);
+ self.removeListener("response", clearTimer);
+ if (callback) {
+ self.removeListener("timeout", callback);
+ }
+ if (!self.socket) {
+ self._currentRequest.removeListener("socket", startTimer);
+ }
+ }
+
+ // Attach callback if passed
+ if (callback) {
+ this.on("timeout", callback);
+ }
+
+ // Start the timer if or when the socket is opened
+ if (this.socket) {
+ startTimer(this.socket);
+ }
+ else {
+ this._currentRequest.once("socket", startTimer);
+ }
+
+ // Clean up on events
+ this.on("socket", destroyOnTimeout);
+ this.on("abort", clearTimer);
+ this.on("error", clearTimer);
+ this.on("response", clearTimer);
+
+ return this;
+};
+
+// Proxy all other public ClientRequest methods
+[
+ "flushHeaders", "getHeader",
+ "setNoDelay", "setSocketKeepAlive",
+].forEach(function (method) {
+ RedirectableRequest.prototype[method] = function (a, b) {
+ return this._currentRequest[method](a, b);
+ };
+});
+
+// Proxy all public ClientRequest properties
+["aborted", "connection", "socket"].forEach(function (property) {
+ Object.defineProperty(RedirectableRequest.prototype, property, {
+ get: function () { return this._currentRequest[property]; },
+ });
+});
+
+RedirectableRequest.prototype._sanitizeOptions = function (options) {
+ // Ensure headers are always present
+ if (!options.headers) {
+ options.headers = {};
+ }
+
+ // Since http.request treats host as an alias of hostname,
+ // but the url module interprets host as hostname plus port,
+ // eliminate the host property to avoid confusion.
+ if (options.host) {
+ // Use hostname if set, because it has precedence
+ if (!options.hostname) {
+ options.hostname = options.host;
+ }
+ delete options.host;
+ }
+
+ // Complete the URL object when necessary
+ if (!options.pathname && options.path) {
+ var searchPos = options.path.indexOf("?");
+ if (searchPos < 0) {
+ options.pathname = options.path;
+ }
+ else {
+ options.pathname = options.path.substring(0, searchPos);
+ options.search = options.path.substring(searchPos);
+ }
+ }
+};
+
+
+// Executes the next native request (initial or redirect)
+RedirectableRequest.prototype._performRequest = function () {
+ // Load the native protocol
+ var protocol = this._options.protocol;
+ var nativeProtocol = this._options.nativeProtocols[protocol];
+ if (!nativeProtocol) {
+ this.emit("error", new TypeError("Unsupported protocol " + protocol));
+ return;
+ }
+
+ // If specified, use the agent corresponding to the protocol
+ // (HTTP and HTTPS use different types of agents)
+ if (this._options.agents) {
+ var scheme = protocol.slice(0, -1);
+ this._options.agent = this._options.agents[scheme];
+ }
+
+ // Create the native request and set up its event handlers
+ var request = this._currentRequest =
+ nativeProtocol.request(this._options, this._onNativeResponse);
+ request._redirectable = this;
+ for (var event of events) {
+ request.on(event, eventHandlers[event]);
+ }
+
+ // RFC7230§5.3.1: When making a request directly to an origin server, […]
+ // a client MUST send only the absolute path […] as the request-target.
+ this._currentUrl = /^\//.test(this._options.path) ?
+ url.format(this._options) :
+ // When making a request to a proxy, […]
+ // a client MUST send the target URI in absolute-form […].
+ this._options.path;
+
+ // End a redirected request
+ // (The first request must be ended explicitly with RedirectableRequest#end)
+ if (this._isRedirect) {
+ // Write the request entity and end
+ var i = 0;
+ var self = this;
+ var buffers = this._requestBodyBuffers;
+ (function writeNext(error) {
+ // Only write if this request has not been redirected yet
+ /* istanbul ignore else */
+ if (request === self._currentRequest) {
+ // Report any write errors
+ /* istanbul ignore if */
+ if (error) {
+ self.emit("error", error);
+ }
+ // Write the next buffer if there are still left
+ else if (i < buffers.length) {
+ var buffer = buffers[i++];
+ /* istanbul ignore else */
+ if (!request.finished) {
+ request.write(buffer.data, buffer.encoding, writeNext);
+ }
+ }
+ // End the request if `end` has been called on us
+ else if (self._ended) {
+ request.end();
+ }
+ }
+ }());
+ }
+};
+
+// Processes a response from the current native request
+RedirectableRequest.prototype._processResponse = function (response) {
+ // Store the redirected response
+ var statusCode = response.statusCode;
+ if (this._options.trackRedirects) {
+ this._redirects.push({
+ url: this._currentUrl,
+ headers: response.headers,
+ statusCode: statusCode,
+ });
+ }
+
+ // RFC7231§6.4: The 3xx (Redirection) class of status code indicates
+ // that further action needs to be taken by the user agent in order to
+ // fulfill the request. If a Location header field is provided,
+ // the user agent MAY automatically redirect its request to the URI
+ // referenced by the Location field value,
+ // even if the specific status code is not understood.
+
+ // If the response is not a redirect; return it as-is
+ var location = response.headers.location;
+ if (!location || this._options.followRedirects === false ||
+ statusCode < 300 || statusCode >= 400) {
+ response.responseUrl = this._currentUrl;
+ response.redirects = this._redirects;
+ this.emit("response", response);
+
+ // Clean up
+ this._requestBodyBuffers = [];
+ return;
+ }
+
+ // The response is a redirect, so abort the current request
+ abortRequest(this._currentRequest);
+ // Discard the remainder of the response to avoid waiting for data
+ response.destroy();
+
+ // RFC7231§6.4: A client SHOULD detect and intervene
+ // in cyclical redirections (i.e., "infinite" redirection loops).
+ if (++this._redirectCount > this._options.maxRedirects) {
+ this.emit("error", new TooManyRedirectsError());
+ return;
+ }
+
+ // Store the request headers if applicable
+ var requestHeaders;
+ var beforeRedirect = this._options.beforeRedirect;
+ if (beforeRedirect) {
+ requestHeaders = Object.assign({
+ // The Host header was set by nativeProtocol.request
+ Host: response.req.getHeader("host"),
+ }, this._options.headers);
+ }
+
+ // RFC7231§6.4: Automatic redirection needs to done with
+ // care for methods not known to be safe, […]
+ // RFC7231§6.4.2–3: For historical reasons, a user agent MAY change
+ // the request method from POST to GET for the subsequent request.
+ var method = this._options.method;
+ if ((statusCode === 301 || statusCode === 302) && this._options.method === "POST" ||
+ // RFC7231§6.4.4: The 303 (See Other) status code indicates that
+ // the server is redirecting the user agent to a different resource […]
+ // A user agent can perform a retrieval request targeting that URI
+ // (a GET or HEAD request if using HTTP) […]
+ (statusCode === 303) && !/^(?:GET|HEAD)$/.test(this._options.method)) {
+ this._options.method = "GET";
+ // Drop a possible entity and headers related to it
+ this._requestBodyBuffers = [];
+ removeMatchingHeaders(/^content-/i, this._options.headers);
+ }
+
+ // Drop the Host header, as the redirect might lead to a different host
+ var currentHostHeader = removeMatchingHeaders(/^host$/i, this._options.headers);
+
+ // If the redirect is relative, carry over the host of the last request
+ var currentUrlParts = url.parse(this._currentUrl);
+ var currentHost = currentHostHeader || currentUrlParts.host;
+ var currentUrl = /^\w+:/.test(location) ? this._currentUrl :
+ url.format(Object.assign(currentUrlParts, { host: currentHost }));
+
+ // Determine the URL of the redirection
+ var redirectUrl;
+ try {
+ redirectUrl = url.resolve(currentUrl, location);
+ }
+ catch (cause) {
+ this.emit("error", new RedirectionError({ cause: cause }));
+ return;
+ }
+
+ // Create the redirected request
+ debug("redirecting to", redirectUrl);
+ this._isRedirect = true;
+ var redirectUrlParts = url.parse(redirectUrl);
+ Object.assign(this._options, redirectUrlParts);
+
+ // Drop confidential headers when redirecting to a less secure protocol
+ // or to a different domain that is not a superdomain
+ if (redirectUrlParts.protocol !== currentUrlParts.protocol &&
+ redirectUrlParts.protocol !== "https:" ||
+ redirectUrlParts.host !== currentHost &&
+ !isSubdomain(redirectUrlParts.host, currentHost)) {
+ removeMatchingHeaders(/^(?:authorization|cookie)$/i, this._options.headers);
+ }
+
+ // Evaluate the beforeRedirect callback
+ if (isFunction(beforeRedirect)) {
+ var responseDetails = {
+ headers: response.headers,
+ statusCode: statusCode,
+ };
+ var requestDetails = {
+ url: currentUrl,
+ method: method,
+ headers: requestHeaders,
+ };
+ try {
+ beforeRedirect(this._options, responseDetails, requestDetails);
+ }
+ catch (err) {
+ this.emit("error", err);
+ return;
+ }
+ this._sanitizeOptions(this._options);
+ }
+
+ // Perform the redirected request
+ try {
+ this._performRequest();
+ }
+ catch (cause) {
+ this.emit("error", new RedirectionError({ cause: cause }));
+ }
+};
+
+// Wraps the key/value object of protocols with redirect functionality
+function wrap(protocols) {
+ // Default settings
+ var exports = {
+ maxRedirects: 21,
+ maxBodyLength: 10 * 1024 * 1024,
+ };
+
+ // Wrap each protocol
+ var nativeProtocols = {};
+ Object.keys(protocols).forEach(function (scheme) {
+ var protocol = scheme + ":";
+ var nativeProtocol = nativeProtocols[protocol] = protocols[scheme];
+ var wrappedProtocol = exports[scheme] = Object.create(nativeProtocol);
+
+ // Executes a request, following redirects
+ function request(input, options, callback) {
+ // Parse parameters
+ if (isString(input)) {
+ var parsed;
+ try {
+ parsed = urlToOptions(new URL(input));
+ }
+ catch (err) {
+ /* istanbul ignore next */
+ parsed = url.parse(input);
+ }
+ if (!isString(parsed.protocol)) {
+ throw new InvalidUrlError({ input });
+ }
+ input = parsed;
+ }
+ else if (URL && (input instanceof URL)) {
+ input = urlToOptions(input);
+ }
+ else {
+ callback = options;
+ options = input;
+ input = { protocol: protocol };
+ }
+ if (isFunction(options)) {
+ callback = options;
+ options = null;
+ }
+
+ // Set defaults
+ options = Object.assign({
+ maxRedirects: exports.maxRedirects,
+ maxBodyLength: exports.maxBodyLength,
+ }, input, options);
+ options.nativeProtocols = nativeProtocols;
+ if (!isString(options.host) && !isString(options.hostname)) {
+ options.hostname = "::1";
+ }
+
+ assert.equal(options.protocol, protocol, "protocol mismatch");
+ debug("options", options);
+ return new RedirectableRequest(options, callback);
+ }
+
+ // Executes a GET request, following redirects
+ function get(input, options, callback) {
+ var wrappedRequest = wrappedProtocol.request(input, options, callback);
+ wrappedRequest.end();
+ return wrappedRequest;
+ }
+
+ // Expose the properties on the wrapped protocol
+ Object.defineProperties(wrappedProtocol, {
+ request: { value: request, configurable: true, enumerable: true, writable: true },
+ get: { value: get, configurable: true, enumerable: true, writable: true },
+ });
+ });
+ return exports;
+}
+
+/* istanbul ignore next */
+function noop() { /* empty */ }
+
+// from https://github.com/nodejs/node/blob/master/lib/internal/url.js
+function urlToOptions(urlObject) {
+ var options = {
+ protocol: urlObject.protocol,
+ hostname: urlObject.hostname.startsWith("[") ?
+ /* istanbul ignore next */
+ urlObject.hostname.slice(1, -1) :
+ urlObject.hostname,
+ hash: urlObject.hash,
+ search: urlObject.search,
+ pathname: urlObject.pathname,
+ path: urlObject.pathname + urlObject.search,
+ href: urlObject.href,
+ };
+ if (urlObject.port !== "") {
+ options.port = Number(urlObject.port);
+ }
+ return options;
+}
+
+function removeMatchingHeaders(regex, headers) {
+ var lastValue;
+ for (var header in headers) {
+ if (regex.test(header)) {
+ lastValue = headers[header];
+ delete headers[header];
+ }
+ }
+ return (lastValue === null || typeof lastValue === "undefined") ?
+ undefined : String(lastValue).trim();
+}
+
+function createErrorType(code, message, baseClass) {
+ // Create constructor
+ function CustomError(properties) {
+ Error.captureStackTrace(this, this.constructor);
+ Object.assign(this, properties || {});
+ this.code = code;
+ this.message = this.cause ? message + ": " + this.cause.message : message;
+ }
+
+ // Attach constructor and set default properties
+ CustomError.prototype = new (baseClass || Error)();
+ CustomError.prototype.constructor = CustomError;
+ CustomError.prototype.name = "Error [" + code + "]";
+ return CustomError;
+}
+
+function abortRequest(request) {
+ for (var event of events) {
+ request.removeListener(event, eventHandlers[event]);
+ }
+ request.on("error", noop);
+ request.abort();
+}
+
+function isSubdomain(subdomain, domain) {
+ assert(isString(subdomain) && isString(domain));
+ var dot = subdomain.length - domain.length - 1;
+ return dot > 0 && subdomain[dot] === "." && subdomain.endsWith(domain);
+}
+
+function isString(value) {
+ return typeof value === "string" || value instanceof String;
+}
+
+function isFunction(value) {
+ return typeof value === "function";
+}
+
+function isBuffer(value) {
+ return typeof value === "object" && ("length" in value);
+}
+
+// Exports
+module.exports = wrap({ http: http, https: https });
+module.exports.wrap = wrap;
diff --git a/node_modules/follow-redirects/package.json b/node_modules/follow-redirects/package.json
new file mode 100644
index 0000000..97717c5
--- /dev/null
+++ b/node_modules/follow-redirects/package.json
@@ -0,0 +1,59 @@
+{
+ "name": "follow-redirects",
+ "version": "1.15.2",
+ "description": "HTTP and HTTPS modules that follow redirects.",
+ "license": "MIT",
+ "main": "index.js",
+ "files": [
+ "*.js"
+ ],
+ "engines": {
+ "node": ">=4.0"
+ },
+ "scripts": {
+ "test": "npm run lint && npm run mocha",
+ "lint": "eslint *.js test",
+ "mocha": "nyc mocha"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git@github.com:follow-redirects/follow-redirects.git"
+ },
+ "homepage": "https://github.com/follow-redirects/follow-redirects",
+ "bugs": {
+ "url": "https://github.com/follow-redirects/follow-redirects/issues"
+ },
+ "keywords": [
+ "http",
+ "https",
+ "url",
+ "redirect",
+ "client",
+ "location",
+ "utility"
+ ],
+ "author": "Ruben Verborgh <ruben@verborgh.org> (https://ruben.verborgh.org/)",
+ "contributors": [
+ "Olivier Lalonde <olalonde@gmail.com> (http://www.syskall.com)",
+ "James Talmage <james@talmage.io>"
+ ],
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://github.com/sponsors/RubenVerborgh"
+ }
+ ],
+ "peerDependenciesMeta": {
+ "debug": {
+ "optional": true
+ }
+ },
+ "devDependencies": {
+ "concat-stream": "^2.0.0",
+ "eslint": "^5.16.0",
+ "express": "^4.16.4",
+ "lolex": "^3.1.0",
+ "mocha": "^6.0.2",
+ "nyc": "^14.1.1"
+ }
+}
diff --git a/node_modules/form-data/License b/node_modules/form-data/License
new file mode 100644
index 0000000..c7ff12a
--- /dev/null
+++ b/node_modules/form-data/License
@@ -0,0 +1,19 @@
+Copyright (c) 2012 Felix Geisendörfer (felix@debuggable.com) 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/form-data/README.md.bak b/node_modules/form-data/README.md.bak
new file mode 100644
index 0000000..298a1a2
--- /dev/null
+++ b/node_modules/form-data/README.md.bak
@@ -0,0 +1,358 @@
+# Form-Data [![NPM Module](https://img.shields.io/npm/v/form-data.svg)](https://www.npmjs.com/package/form-data) [![Join the chat at https://gitter.im/form-data/form-data](http://form-data.github.io/images/gitterbadge.svg)](https://gitter.im/form-data/form-data)
+
+A library to create readable ```"multipart/form-data"``` streams. Can be used to submit forms and file uploads to other web applications.
+
+The API of this library is inspired by the [XMLHttpRequest-2 FormData Interface][xhr2-fd].
+
+[xhr2-fd]: http://dev.w3.org/2006/webapi/XMLHttpRequest-2/Overview.html#the-formdata-interface
+
+[![Linux Build](https://img.shields.io/travis/form-data/form-data/v4.0.0.svg?label=linux:6.x-12.x)](https://travis-ci.org/form-data/form-data)
+[![MacOS Build](https://img.shields.io/travis/form-data/form-data/v4.0.0.svg?label=macos:6.x-12.x)](https://travis-ci.org/form-data/form-data)
+[![Windows Build](https://img.shields.io/travis/form-data/form-data/v4.0.0.svg?label=windows:6.x-12.x)](https://travis-ci.org/form-data/form-data)
+
+[![Coverage Status](https://img.shields.io/coveralls/form-data/form-data/v4.0.0.svg?label=code+coverage)](https://coveralls.io/github/form-data/form-data?branch=master)
+[![Dependency Status](https://img.shields.io/david/form-data/form-data.svg)](https://david-dm.org/form-data/form-data)
+
+## Install
+
+```
+npm install --save form-data
+```
+
+## Usage
+
+In this example we are constructing a form with 3 fields that contain a string,
+a buffer and a file stream.
+
+``` javascript
+var FormData = require('form-data');
+var fs = require('fs');
+
+var form = new FormData();
+form.append('my_field', 'my value');
+form.append('my_buffer', new Buffer(10));
+form.append('my_file', fs.createReadStream('/foo/bar.jpg'));
+```
+
+Also you can use http-response stream:
+
+``` javascript
+var FormData = require('form-data');
+var http = require('http');
+
+var form = new FormData();
+
+http.request('http://nodejs.org/images/logo.png', function(response) {
+ form.append('my_field', 'my value');
+ form.append('my_buffer', new Buffer(10));
+ form.append('my_logo', response);
+});
+```
+
+Or @mikeal's [request](https://github.com/request/request) stream:
+
+``` javascript
+var FormData = require('form-data');
+var request = require('request');
+
+var form = new FormData();
+
+form.append('my_field', 'my value');
+form.append('my_buffer', new Buffer(10));
+form.append('my_logo', request('http://nodejs.org/images/logo.png'));
+```
+
+In order to submit this form to a web application, call ```submit(url, [callback])``` method:
+
+``` javascript
+form.submit('http://example.org/', function(err, res) {
+ // res – response object (http.IncomingMessage) //
+ res.resume();
+});
+
+```
+
+For more advanced request manipulations ```submit()``` method returns ```http.ClientRequest``` object, or you can choose from one of the alternative submission methods.
+
+### Custom options
+
+You can provide custom options, such as `maxDataSize`:
+
+``` javascript
+var FormData = require('form-data');
+
+var form = new FormData({ maxDataSize: 20971520 });
+form.append('my_field', 'my value');
+form.append('my_buffer', /* something big */);
+```
+
+List of available options could be found in [combined-stream](https://github.com/felixge/node-combined-stream/blob/master/lib/combined_stream.js#L7-L15)
+
+### Alternative submission methods
+
+You can use node's http client interface:
+
+``` javascript
+var http = require('http');
+
+var request = http.request({
+ method: 'post',
+ host: 'example.org',
+ path: '/upload',
+ headers: form.getHeaders()
+});
+
+form.pipe(request);
+
+request.on('response', function(res) {
+ console.log(res.statusCode);
+});
+```
+
+Or if you would prefer the `'Content-Length'` header to be set for you:
+
+``` javascript
+form.submit('example.org/upload', function(err, res) {
+ console.log(res.statusCode);
+});
+```
+
+To use custom headers and pre-known length in parts:
+
+``` javascript
+var CRLF = '\r\n';
+var form = new FormData();
+
+var options = {
+ header: CRLF + '--' + form.getBoundary() + CRLF + 'X-Custom-Header: 123' + CRLF + CRLF,
+ knownLength: 1
+};
+
+form.append('my_buffer', buffer, options);
+
+form.submit('http://example.com/', function(err, res) {
+ if (err) throw err;
+ console.log('Done');
+});
+```
+
+Form-Data can recognize and fetch all the required information from common types of streams (```fs.readStream```, ```http.response``` and ```mikeal's request```), for some other types of streams you'd need to provide "file"-related information manually:
+
+``` javascript
+someModule.stream(function(err, stdout, stderr) {
+ if (err) throw err;
+
+ var form = new FormData();
+
+ form.append('file', stdout, {
+ filename: 'unicycle.jpg', // ... or:
+ filepath: 'photos/toys/unicycle.jpg',
+ contentType: 'image/jpeg',
+ knownLength: 19806
+ });
+
+ form.submit('http://example.com/', function(err, res) {
+ if (err) throw err;
+ console.log('Done');
+ });
+});
+```
+
+The `filepath` property overrides `filename` and may contain a relative path. This is typically used when uploading [multiple files from a directory](https://wicg.github.io/entries-api/#dom-htmlinputelement-webkitdirectory).
+
+For edge cases, like POST request to URL with query string or to pass HTTP auth credentials, object can be passed to `form.submit()` as first parameter:
+
+``` javascript
+form.submit({
+ host: 'example.com',
+ path: '/probably.php?extra=params',
+ auth: 'username:password'
+}, function(err, res) {
+ console.log(res.statusCode);
+});
+```
+
+In case you need to also send custom HTTP headers with the POST request, you can use the `headers` key in first parameter of `form.submit()`:
+
+``` javascript
+form.submit({
+ host: 'example.com',
+ path: '/surelynot.php',
+ headers: {'x-test-header': 'test-header-value'}
+}, function(err, res) {
+ console.log(res.statusCode);
+});
+```
+
+### Methods
+
+- [_Void_ append( **String** _field_, **Mixed** _value_ [, **Mixed** _options_] )](https://github.com/form-data/form-data#void-append-string-field-mixed-value--mixed-options-).
+- [_Headers_ getHeaders( [**Headers** _userHeaders_] )](https://github.com/form-data/form-data#array-getheaders-array-userheaders-)
+- [_String_ getBoundary()](https://github.com/form-data/form-data#string-getboundary)
+- [_Void_ setBoundary()](https://github.com/form-data/form-data#void-setboundary)
+- [_Buffer_ getBuffer()](https://github.com/form-data/form-data#buffer-getbuffer)
+- [_Integer_ getLengthSync()](https://github.com/form-data/form-data#integer-getlengthsync)
+- [_Integer_ getLength( **function** _callback_ )](https://github.com/form-data/form-data#integer-getlength-function-callback-)
+- [_Boolean_ hasKnownLength()](https://github.com/form-data/form-data#boolean-hasknownlength)
+- [_Request_ submit( _params_, **function** _callback_ )](https://github.com/form-data/form-data#request-submit-params-function-callback-)
+- [_String_ toString()](https://github.com/form-data/form-data#string-tostring)
+
+#### _Void_ append( **String** _field_, **Mixed** _value_ [, **Mixed** _options_] )
+Append data to the form. You can submit about any format (string, integer, boolean, buffer, etc.). However, Arrays are not supported and need to be turned into strings by the user.
+```javascript
+var form = new FormData();
+form.append( 'my_string', 'my value' );
+form.append( 'my_integer', 1 );
+form.append( 'my_boolean', true );
+form.append( 'my_buffer', new Buffer(10) );
+form.append( 'my_array_as_json', JSON.stringify( ['bird','cute'] ) )
+```
+
+You may provide a string for options, or an object.
+```javascript
+// Set filename by providing a string for options
+form.append( 'my_file', fs.createReadStream('/foo/bar.jpg'), 'bar.jpg' );
+
+// provide an object.
+form.append( 'my_file', fs.createReadStream('/foo/bar.jpg'), {filename: 'bar.jpg', contentType: 'image/jpeg', knownLength: 19806} );
+```
+
+#### _Headers_ getHeaders( [**Headers** _userHeaders_] )
+This method adds the correct `content-type` header to the provided array of `userHeaders`.
+
+#### _String_ getBoundary()
+Return the boundary of the formData. By default, the boundary consists of 26 `-` followed by 24 numbers
+for example:
+```javascript
+--------------------------515890814546601021194782
+```
+
+#### _Void_ setBoundary(String _boundary_)
+Set the boundary string, overriding the default behavior described above.
+
+_Note: The boundary must be unique and may not appear in the data._
+
+#### _Buffer_ getBuffer()
+Return the full formdata request package, as a Buffer. You can insert this Buffer in e.g. Axios to send multipart data.
+```javascript
+var form = new FormData();
+form.append( 'my_buffer', Buffer.from([0x4a,0x42,0x20,0x52,0x6f,0x63,0x6b,0x73]) );
+form.append( 'my_file', fs.readFileSync('/foo/bar.jpg') );
+
+axios.post( 'https://example.com/path/to/api',
+ form.getBuffer(),
+ form.getHeaders()
+ )
+```
+**Note:** Because the output is of type Buffer, you can only append types that are accepted by Buffer: *string, Buffer, ArrayBuffer, Array, or Array-like Object*. A ReadStream for example will result in an error.
+
+#### _Integer_ getLengthSync()
+Same as `getLength` but synchronous.
+
+_Note: getLengthSync __doesn't__ calculate streams length._
+
+#### _Integer_ getLength( **function** _callback_ )
+Returns the `Content-Length` async. The callback is used to handle errors and continue once the length has been calculated
+```javascript
+this.getLength(function(err, length) {
+ if (err) {
+ this._error(err);
+ return;
+ }
+
+ // add content length
+ request.setHeader('Content-Length', length);
+
+ ...
+}.bind(this));
+```
+
+#### _Boolean_ hasKnownLength()
+Checks if the length of added values is known.
+
+#### _Request_ submit( _params_, **function** _callback_ )
+Submit the form to a web application.
+```javascript
+var form = new FormData();
+form.append( 'my_string', 'Hello World' );
+
+form.submit( 'http://example.com/', function(err, res) {
+ // res – response object (http.IncomingMessage) //
+ res.resume();
+} );
+```
+
+#### _String_ toString()
+Returns the form data as a string. Don't use this if you are sending files or buffers, use `getBuffer()` instead.
+
+### Integration with other libraries
+
+#### Request
+
+Form submission using [request](https://github.com/request/request):
+
+```javascript
+var formData = {
+ my_field: 'my_value',
+ my_file: fs.createReadStream(__dirname + '/unicycle.jpg'),
+};
+
+request.post({url:'http://service.com/upload', formData: formData}, function(err, httpResponse, body) {
+ if (err) {
+ return console.error('upload failed:', err);
+ }
+ console.log('Upload successful! Server responded with:', body);
+});
+```
+
+For more details see [request readme](https://github.com/request/request#multipartform-data-multipart-form-uploads).
+
+#### node-fetch
+
+You can also submit a form using [node-fetch](https://github.com/bitinn/node-fetch):
+
+```javascript
+var form = new FormData();
+
+form.append('a', 1);
+
+fetch('http://example.com', { method: 'POST', body: form })
+ .then(function(res) {
+ return res.json();
+ }).then(function(json) {
+ console.log(json);
+ });
+```
+
+#### axios
+
+In Node.js you can post a file using [axios](https://github.com/axios/axios):
+```javascript
+const form = new FormData();
+const stream = fs.createReadStream(PATH_TO_FILE);
+
+form.append('image', stream);
+
+// In Node.js environment you need to set boundary in the header field 'Content-Type' by calling method `getHeaders`
+const formHeaders = form.getHeaders();
+
+axios.post('http://example.com', form, {
+ headers: {
+ ...formHeaders,
+ },
+})
+.then(response => response)
+.catch(error => error)
+```
+
+## Notes
+
+- ```getLengthSync()``` method DOESN'T calculate length for streams, use ```knownLength``` options as workaround.
+- ```getLength(cb)``` will send an error as first parameter of callback if stream length cannot be calculated (e.g. send in custom streams w/o using ```knownLength```).
+- ```submit``` will not add `content-length` if form length is unknown or not calculable.
+- Starting version `2.x` FormData has dropped support for `node@0.10.x`.
+- Starting version `3.x` FormData has dropped support for `node@4.x`.
+
+## License
+
+Form-Data is released under the [MIT](License) license.
diff --git a/node_modules/form-data/Readme.md b/node_modules/form-data/Readme.md
new file mode 100644
index 0000000..298a1a2
--- /dev/null
+++ b/node_modules/form-data/Readme.md
@@ -0,0 +1,358 @@
+# Form-Data [![NPM Module](https://img.shields.io/npm/v/form-data.svg)](https://www.npmjs.com/package/form-data) [![Join the chat at https://gitter.im/form-data/form-data](http://form-data.github.io/images/gitterbadge.svg)](https://gitter.im/form-data/form-data)
+
+A library to create readable ```"multipart/form-data"``` streams. Can be used to submit forms and file uploads to other web applications.
+
+The API of this library is inspired by the [XMLHttpRequest-2 FormData Interface][xhr2-fd].
+
+[xhr2-fd]: http://dev.w3.org/2006/webapi/XMLHttpRequest-2/Overview.html#the-formdata-interface
+
+[![Linux Build](https://img.shields.io/travis/form-data/form-data/v4.0.0.svg?label=linux:6.x-12.x)](https://travis-ci.org/form-data/form-data)
+[![MacOS Build](https://img.shields.io/travis/form-data/form-data/v4.0.0.svg?label=macos:6.x-12.x)](https://travis-ci.org/form-data/form-data)
+[![Windows Build](https://img.shields.io/travis/form-data/form-data/v4.0.0.svg?label=windows:6.x-12.x)](https://travis-ci.org/form-data/form-data)
+
+[![Coverage Status](https://img.shields.io/coveralls/form-data/form-data/v4.0.0.svg?label=code+coverage)](https://coveralls.io/github/form-data/form-data?branch=master)
+[![Dependency Status](https://img.shields.io/david/form-data/form-data.svg)](https://david-dm.org/form-data/form-data)
+
+## Install
+
+```
+npm install --save form-data
+```
+
+## Usage
+
+In this example we are constructing a form with 3 fields that contain a string,
+a buffer and a file stream.
+
+``` javascript
+var FormData = require('form-data');
+var fs = require('fs');
+
+var form = new FormData();
+form.append('my_field', 'my value');
+form.append('my_buffer', new Buffer(10));
+form.append('my_file', fs.createReadStream('/foo/bar.jpg'));
+```
+
+Also you can use http-response stream:
+
+``` javascript
+var FormData = require('form-data');
+var http = require('http');
+
+var form = new FormData();
+
+http.request('http://nodejs.org/images/logo.png', function(response) {
+ form.append('my_field', 'my value');
+ form.append('my_buffer', new Buffer(10));
+ form.append('my_logo', response);
+});
+```
+
+Or @mikeal's [request](https://github.com/request/request) stream:
+
+``` javascript
+var FormData = require('form-data');
+var request = require('request');
+
+var form = new FormData();
+
+form.append('my_field', 'my value');
+form.append('my_buffer', new Buffer(10));
+form.append('my_logo', request('http://nodejs.org/images/logo.png'));
+```
+
+In order to submit this form to a web application, call ```submit(url, [callback])``` method:
+
+``` javascript
+form.submit('http://example.org/', function(err, res) {
+ // res – response object (http.IncomingMessage) //
+ res.resume();
+});
+
+```
+
+For more advanced request manipulations ```submit()``` method returns ```http.ClientRequest``` object, or you can choose from one of the alternative submission methods.
+
+### Custom options
+
+You can provide custom options, such as `maxDataSize`:
+
+``` javascript
+var FormData = require('form-data');
+
+var form = new FormData({ maxDataSize: 20971520 });
+form.append('my_field', 'my value');
+form.append('my_buffer', /* something big */);
+```
+
+List of available options could be found in [combined-stream](https://github.com/felixge/node-combined-stream/blob/master/lib/combined_stream.js#L7-L15)
+
+### Alternative submission methods
+
+You can use node's http client interface:
+
+``` javascript
+var http = require('http');
+
+var request = http.request({
+ method: 'post',
+ host: 'example.org',
+ path: '/upload',
+ headers: form.getHeaders()
+});
+
+form.pipe(request);
+
+request.on('response', function(res) {
+ console.log(res.statusCode);
+});
+```
+
+Or if you would prefer the `'Content-Length'` header to be set for you:
+
+``` javascript
+form.submit('example.org/upload', function(err, res) {
+ console.log(res.statusCode);
+});
+```
+
+To use custom headers and pre-known length in parts:
+
+``` javascript
+var CRLF = '\r\n';
+var form = new FormData();
+
+var options = {
+ header: CRLF + '--' + form.getBoundary() + CRLF + 'X-Custom-Header: 123' + CRLF + CRLF,
+ knownLength: 1
+};
+
+form.append('my_buffer', buffer, options);
+
+form.submit('http://example.com/', function(err, res) {
+ if (err) throw err;
+ console.log('Done');
+});
+```
+
+Form-Data can recognize and fetch all the required information from common types of streams (```fs.readStream```, ```http.response``` and ```mikeal's request```), for some other types of streams you'd need to provide "file"-related information manually:
+
+``` javascript
+someModule.stream(function(err, stdout, stderr) {
+ if (err) throw err;
+
+ var form = new FormData();
+
+ form.append('file', stdout, {
+ filename: 'unicycle.jpg', // ... or:
+ filepath: 'photos/toys/unicycle.jpg',
+ contentType: 'image/jpeg',
+ knownLength: 19806
+ });
+
+ form.submit('http://example.com/', function(err, res) {
+ if (err) throw err;
+ console.log('Done');
+ });
+});
+```
+
+The `filepath` property overrides `filename` and may contain a relative path. This is typically used when uploading [multiple files from a directory](https://wicg.github.io/entries-api/#dom-htmlinputelement-webkitdirectory).
+
+For edge cases, like POST request to URL with query string or to pass HTTP auth credentials, object can be passed to `form.submit()` as first parameter:
+
+``` javascript
+form.submit({
+ host: 'example.com',
+ path: '/probably.php?extra=params',
+ auth: 'username:password'
+}, function(err, res) {
+ console.log(res.statusCode);
+});
+```
+
+In case you need to also send custom HTTP headers with the POST request, you can use the `headers` key in first parameter of `form.submit()`:
+
+``` javascript
+form.submit({
+ host: 'example.com',
+ path: '/surelynot.php',
+ headers: {'x-test-header': 'test-header-value'}
+}, function(err, res) {
+ console.log(res.statusCode);
+});
+```
+
+### Methods
+
+- [_Void_ append( **String** _field_, **Mixed** _value_ [, **Mixed** _options_] )](https://github.com/form-data/form-data#void-append-string-field-mixed-value--mixed-options-).
+- [_Headers_ getHeaders( [**Headers** _userHeaders_] )](https://github.com/form-data/form-data#array-getheaders-array-userheaders-)
+- [_String_ getBoundary()](https://github.com/form-data/form-data#string-getboundary)
+- [_Void_ setBoundary()](https://github.com/form-data/form-data#void-setboundary)
+- [_Buffer_ getBuffer()](https://github.com/form-data/form-data#buffer-getbuffer)
+- [_Integer_ getLengthSync()](https://github.com/form-data/form-data#integer-getlengthsync)
+- [_Integer_ getLength( **function** _callback_ )](https://github.com/form-data/form-data#integer-getlength-function-callback-)
+- [_Boolean_ hasKnownLength()](https://github.com/form-data/form-data#boolean-hasknownlength)
+- [_Request_ submit( _params_, **function** _callback_ )](https://github.com/form-data/form-data#request-submit-params-function-callback-)
+- [_String_ toString()](https://github.com/form-data/form-data#string-tostring)
+
+#### _Void_ append( **String** _field_, **Mixed** _value_ [, **Mixed** _options_] )
+Append data to the form. You can submit about any format (string, integer, boolean, buffer, etc.). However, Arrays are not supported and need to be turned into strings by the user.
+```javascript
+var form = new FormData();
+form.append( 'my_string', 'my value' );
+form.append( 'my_integer', 1 );
+form.append( 'my_boolean', true );
+form.append( 'my_buffer', new Buffer(10) );
+form.append( 'my_array_as_json', JSON.stringify( ['bird','cute'] ) )
+```
+
+You may provide a string for options, or an object.
+```javascript
+// Set filename by providing a string for options
+form.append( 'my_file', fs.createReadStream('/foo/bar.jpg'), 'bar.jpg' );
+
+// provide an object.
+form.append( 'my_file', fs.createReadStream('/foo/bar.jpg'), {filename: 'bar.jpg', contentType: 'image/jpeg', knownLength: 19806} );
+```
+
+#### _Headers_ getHeaders( [**Headers** _userHeaders_] )
+This method adds the correct `content-type` header to the provided array of `userHeaders`.
+
+#### _String_ getBoundary()
+Return the boundary of the formData. By default, the boundary consists of 26 `-` followed by 24 numbers
+for example:
+```javascript
+--------------------------515890814546601021194782
+```
+
+#### _Void_ setBoundary(String _boundary_)
+Set the boundary string, overriding the default behavior described above.
+
+_Note: The boundary must be unique and may not appear in the data._
+
+#### _Buffer_ getBuffer()
+Return the full formdata request package, as a Buffer. You can insert this Buffer in e.g. Axios to send multipart data.
+```javascript
+var form = new FormData();
+form.append( 'my_buffer', Buffer.from([0x4a,0x42,0x20,0x52,0x6f,0x63,0x6b,0x73]) );
+form.append( 'my_file', fs.readFileSync('/foo/bar.jpg') );
+
+axios.post( 'https://example.com/path/to/api',
+ form.getBuffer(),
+ form.getHeaders()
+ )
+```
+**Note:** Because the output is of type Buffer, you can only append types that are accepted by Buffer: *string, Buffer, ArrayBuffer, Array, or Array-like Object*. A ReadStream for example will result in an error.
+
+#### _Integer_ getLengthSync()
+Same as `getLength` but synchronous.
+
+_Note: getLengthSync __doesn't__ calculate streams length._
+
+#### _Integer_ getLength( **function** _callback_ )
+Returns the `Content-Length` async. The callback is used to handle errors and continue once the length has been calculated
+```javascript
+this.getLength(function(err, length) {
+ if (err) {
+ this._error(err);
+ return;
+ }
+
+ // add content length
+ request.setHeader('Content-Length', length);
+
+ ...
+}.bind(this));
+```
+
+#### _Boolean_ hasKnownLength()
+Checks if the length of added values is known.
+
+#### _Request_ submit( _params_, **function** _callback_ )
+Submit the form to a web application.
+```javascript
+var form = new FormData();
+form.append( 'my_string', 'Hello World' );
+
+form.submit( 'http://example.com/', function(err, res) {
+ // res – response object (http.IncomingMessage) //
+ res.resume();
+} );
+```
+
+#### _String_ toString()
+Returns the form data as a string. Don't use this if you are sending files or buffers, use `getBuffer()` instead.
+
+### Integration with other libraries
+
+#### Request
+
+Form submission using [request](https://github.com/request/request):
+
+```javascript
+var formData = {
+ my_field: 'my_value',
+ my_file: fs.createReadStream(__dirname + '/unicycle.jpg'),
+};
+
+request.post({url:'http://service.com/upload', formData: formData}, function(err, httpResponse, body) {
+ if (err) {
+ return console.error('upload failed:', err);
+ }
+ console.log('Upload successful! Server responded with:', body);
+});
+```
+
+For more details see [request readme](https://github.com/request/request#multipartform-data-multipart-form-uploads).
+
+#### node-fetch
+
+You can also submit a form using [node-fetch](https://github.com/bitinn/node-fetch):
+
+```javascript
+var form = new FormData();
+
+form.append('a', 1);
+
+fetch('http://example.com', { method: 'POST', body: form })
+ .then(function(res) {
+ return res.json();
+ }).then(function(json) {
+ console.log(json);
+ });
+```
+
+#### axios
+
+In Node.js you can post a file using [axios](https://github.com/axios/axios):
+```javascript
+const form = new FormData();
+const stream = fs.createReadStream(PATH_TO_FILE);
+
+form.append('image', stream);
+
+// In Node.js environment you need to set boundary in the header field 'Content-Type' by calling method `getHeaders`
+const formHeaders = form.getHeaders();
+
+axios.post('http://example.com', form, {
+ headers: {
+ ...formHeaders,
+ },
+})
+.then(response => response)
+.catch(error => error)
+```
+
+## Notes
+
+- ```getLengthSync()``` method DOESN'T calculate length for streams, use ```knownLength``` options as workaround.
+- ```getLength(cb)``` will send an error as first parameter of callback if stream length cannot be calculated (e.g. send in custom streams w/o using ```knownLength```).
+- ```submit``` will not add `content-length` if form length is unknown or not calculable.
+- Starting version `2.x` FormData has dropped support for `node@0.10.x`.
+- Starting version `3.x` FormData has dropped support for `node@4.x`.
+
+## License
+
+Form-Data is released under the [MIT](License) license.
diff --git a/node_modules/form-data/index.d.ts b/node_modules/form-data/index.d.ts
new file mode 100644
index 0000000..295e9e9
--- /dev/null
+++ b/node_modules/form-data/index.d.ts
@@ -0,0 +1,62 @@
+// Definitions by: Carlos Ballesteros Velasco <https://github.com/soywiz>
+// Leon Yu <https://github.com/leonyu>
+// BendingBender <https://github.com/BendingBender>
+// Maple Miao <https://github.com/mapleeit>
+
+/// <reference types="node" />
+import * as stream from 'stream';
+import * as http from 'http';
+
+export = FormData;
+
+// Extracted because @types/node doesn't export interfaces.
+interface ReadableOptions {
+ highWaterMark?: number;
+ encoding?: string;
+ objectMode?: boolean;
+ read?(this: stream.Readable, size: number): void;
+ destroy?(this: stream.Readable, error: Error | null, callback: (error: Error | null) => void): void;
+ autoDestroy?: boolean;
+}
+
+interface Options extends ReadableOptions {
+ writable?: boolean;
+ readable?: boolean;
+ dataSize?: number;
+ maxDataSize?: number;
+ pauseStreams?: boolean;
+}
+
+declare class FormData extends stream.Readable {
+ constructor(options?: Options);
+ append(key: string, value: any, options?: FormData.AppendOptions | string): void;
+ getHeaders(userHeaders?: FormData.Headers): FormData.Headers;
+ submit(
+ params: string | FormData.SubmitOptions,
+ callback?: (error: Error | null, response: http.IncomingMessage) => void
+ ): http.ClientRequest;
+ getBuffer(): Buffer;
+ setBoundary(boundary: string): void;
+ getBoundary(): string;
+ getLength(callback: (err: Error | null, length: number) => void): void;
+ getLengthSync(): number;
+ hasKnownLength(): boolean;
+}
+
+declare namespace FormData {
+ interface Headers {
+ [key: string]: any;
+ }
+
+ interface AppendOptions {
+ header?: string | Headers;
+ knownLength?: number;
+ filename?: string;
+ filepath?: string;
+ contentType?: string;
+ }
+
+ interface SubmitOptions extends http.RequestOptions {
+ protocol?: 'https:' | 'http:';
+ }
+}
diff --git a/node_modules/form-data/lib/browser.js b/node_modules/form-data/lib/browser.js
new file mode 100644
index 0000000..09e7c70
--- /dev/null
+++ b/node_modules/form-data/lib/browser.js
@@ -0,0 +1,2 @@
+/* eslint-env browser */
+module.exports = typeof self == 'object' ? self.FormData : window.FormData;
diff --git a/node_modules/form-data/lib/form_data.js b/node_modules/form-data/lib/form_data.js
new file mode 100644
index 0000000..18dc819
--- /dev/null
+++ b/node_modules/form-data/lib/form_data.js
@@ -0,0 +1,501 @@
+var CombinedStream = require('combined-stream');
+var util = require('util');
+var path = require('path');
+var http = require('http');
+var https = require('https');
+var parseUrl = require('url').parse;
+var fs = require('fs');
+var Stream = require('stream').Stream;
+var mime = require('mime-types');
+var asynckit = require('asynckit');
+var populate = require('./populate.js');
+
+// Public API
+module.exports = FormData;
+
+// make it a Stream
+util.inherits(FormData, CombinedStream);
+
+/**
+ * Create readable "multipart/form-data" streams.
+ * Can be used to submit forms
+ * and file uploads to other web applications.
+ *
+ * @constructor
+ * @param {Object} options - Properties to be added/overriden for FormData and CombinedStream
+ */
+function FormData(options) {
+ if (!(this instanceof FormData)) {
+ return new FormData(options);
+ }
+
+ this._overheadLength = 0;
+ this._valueLength = 0;
+ this._valuesToMeasure = [];
+
+ CombinedStream.call(this);
+
+ options = options || {};
+ for (var option in options) {
+ this[option] = options[option];
+ }
+}
+
+FormData.LINE_BREAK = '\r\n';
+FormData.DEFAULT_CONTENT_TYPE = 'application/octet-stream';
+
+FormData.prototype.append = function(field, value, options) {
+
+ options = options || {};
+
+ // allow filename as single option
+ if (typeof options == 'string') {
+ options = {filename: options};
+ }
+
+ var append = CombinedStream.prototype.append.bind(this);
+
+ // all that streamy business can't handle numbers
+ if (typeof value == 'number') {
+ value = '' + value;
+ }
+
+ // https://github.com/felixge/node-form-data/issues/38
+ if (util.isArray(value)) {
+ // Please convert your array into string
+ // the way web server expects it
+ this._error(new Error('Arrays are not supported.'));
+ return;
+ }
+
+ var header = this._multiPartHeader(field, value, options);
+ var footer = this._multiPartFooter();
+
+ append(header);
+ append(value);
+ append(footer);
+
+ // pass along options.knownLength
+ this._trackLength(header, value, options);
+};
+
+FormData.prototype._trackLength = function(header, value, options) {
+ var valueLength = 0;
+
+ // used w/ getLengthSync(), when length is known.
+ // e.g. for streaming directly from a remote server,
+ // w/ a known file a size, and not wanting to wait for
+ // incoming file to finish to get its size.
+ if (options.knownLength != null) {
+ valueLength += +options.knownLength;
+ } else if (Buffer.isBuffer(value)) {
+ valueLength = value.length;
+ } else if (typeof value === 'string') {
+ valueLength = Buffer.byteLength(value);
+ }
+
+ this._valueLength += valueLength;
+
+ // @check why add CRLF? does this account for custom/multiple CRLFs?
+ this._overheadLength +=
+ Buffer.byteLength(header) +
+ FormData.LINE_BREAK.length;
+
+ // empty or either doesn't have path or not an http response or not a stream
+ if (!value || ( !value.path && !(value.readable && value.hasOwnProperty('httpVersion')) && !(value instanceof Stream))) {
+ return;
+ }
+
+ // no need to bother with the length
+ if (!options.knownLength) {
+ this._valuesToMeasure.push(value);
+ }
+};
+
+FormData.prototype._lengthRetriever = function(value, callback) {
+
+ if (value.hasOwnProperty('fd')) {
+
+ // take read range into a account
+ // `end` = Infinity –> read file till the end
+ //
+ // TODO: Looks like there is bug in Node fs.createReadStream
+ // it doesn't respect `end` options without `start` options
+ // Fix it when node fixes it.
+ // https://github.com/joyent/node/issues/7819
+ if (value.end != undefined && value.end != Infinity && value.start != undefined) {
+
+ // when end specified
+ // no need to calculate range
+ // inclusive, starts with 0
+ callback(null, value.end + 1 - (value.start ? value.start : 0));
+
+ // not that fast snoopy
+ } else {
+ // still need to fetch file size from fs
+ fs.stat(value.path, function(err, stat) {
+
+ var fileSize;
+
+ if (err) {
+ callback(err);
+ return;
+ }
+
+ // update final size based on the range options
+ fileSize = stat.size - (value.start ? value.start : 0);
+ callback(null, fileSize);
+ });
+ }
+
+ // or http response
+ } else if (value.hasOwnProperty('httpVersion')) {
+ callback(null, +value.headers['content-length']);
+
+ // or request stream http://github.com/mikeal/request
+ } else if (value.hasOwnProperty('httpModule')) {
+ // wait till response come back
+ value.on('response', function(response) {
+ value.pause();
+ callback(null, +response.headers['content-length']);
+ });
+ value.resume();
+
+ // something else
+ } else {
+ callback('Unknown stream');
+ }
+};
+
+FormData.prototype._multiPartHeader = function(field, value, options) {
+ // custom header specified (as string)?
+ // it becomes responsible for boundary
+ // (e.g. to handle extra CRLFs on .NET servers)
+ if (typeof options.header == 'string') {
+ return options.header;
+ }
+
+ var contentDisposition = this._getContentDisposition(value, options);
+ var contentType = this._getContentType(value, options);
+
+ var contents = '';
+ var headers = {
+ // add custom disposition as third element or keep it two elements if not
+ 'Content-Disposition': ['form-data', 'name="' + field + '"'].concat(contentDisposition || []),
+ // if no content type. allow it to be empty array
+ 'Content-Type': [].concat(contentType || [])
+ };
+
+ // allow custom headers.
+ if (typeof options.header == 'object') {
+ populate(headers, options.header);
+ }
+
+ var header;
+ for (var prop in headers) {
+ if (!headers.hasOwnProperty(prop)) continue;
+ header = headers[prop];
+
+ // skip nullish headers.
+ if (header == null) {
+ continue;
+ }
+
+ // convert all headers to arrays.
+ if (!Array.isArray(header)) {
+ header = [header];
+ }
+
+ // add non-empty headers.
+ if (header.length) {
+ contents += prop + ': ' + header.join('; ') + FormData.LINE_BREAK;
+ }
+ }
+
+ return '--' + this.getBoundary() + FormData.LINE_BREAK + contents + FormData.LINE_BREAK;
+};
+
+FormData.prototype._getContentDisposition = function(value, options) {
+
+ var filename
+ , contentDisposition
+ ;
+
+ if (typeof options.filepath === 'string') {
+ // custom filepath for relative paths
+ filename = path.normalize(options.filepath).replace(/\\/g, '/');
+ } else if (options.filename || value.name || value.path) {
+ // custom filename take precedence
+ // formidable and the browser add a name property
+ // fs- and request- streams have path property
+ filename = path.basename(options.filename || value.name || value.path);
+ } else if (value.readable && value.hasOwnProperty('httpVersion')) {
+ // or try http response
+ filename = path.basename(value.client._httpMessage.path || '');
+ }
+
+ if (filename) {
+ contentDisposition = 'filename="' + filename + '"';
+ }
+
+ return contentDisposition;
+};
+
+FormData.prototype._getContentType = function(value, options) {
+
+ // use custom content-type above all
+ var contentType = options.contentType;
+
+ // or try `name` from formidable, browser
+ if (!contentType && value.name) {
+ contentType = mime.lookup(value.name);
+ }
+
+ // or try `path` from fs-, request- streams
+ if (!contentType && value.path) {
+ contentType = mime.lookup(value.path);
+ }
+
+ // or if it's http-reponse
+ if (!contentType && value.readable && value.hasOwnProperty('httpVersion')) {
+ contentType = value.headers['content-type'];
+ }
+
+ // or guess it from the filepath or filename
+ if (!contentType && (options.filepath || options.filename)) {
+ contentType = mime.lookup(options.filepath || options.filename);
+ }
+
+ // fallback to the default content type if `value` is not simple value
+ if (!contentType && typeof value == 'object') {
+ contentType = FormData.DEFAULT_CONTENT_TYPE;
+ }
+
+ return contentType;
+};
+
+FormData.prototype._multiPartFooter = function() {
+ return function(next) {
+ var footer = FormData.LINE_BREAK;
+
+ var lastPart = (this._streams.length === 0);
+ if (lastPart) {
+ footer += this._lastBoundary();
+ }
+
+ next(footer);
+ }.bind(this);
+};
+
+FormData.prototype._lastBoundary = function() {
+ return '--' + this.getBoundary() + '--' + FormData.LINE_BREAK;
+};
+
+FormData.prototype.getHeaders = function(userHeaders) {
+ var header;
+ var formHeaders = {
+ 'content-type': 'multipart/form-data; boundary=' + this.getBoundary()
+ };
+
+ for (header in userHeaders) {
+ if (userHeaders.hasOwnProperty(header)) {
+ formHeaders[header.toLowerCase()] = userHeaders[header];
+ }
+ }
+
+ return formHeaders;
+};
+
+FormData.prototype.setBoundary = function(boundary) {
+ this._boundary = boundary;
+};
+
+FormData.prototype.getBoundary = function() {
+ if (!this._boundary) {
+ this._generateBoundary();
+ }
+
+ return this._boundary;
+};
+
+FormData.prototype.getBuffer = function() {
+ var dataBuffer = new Buffer.alloc( 0 );
+ var boundary = this.getBoundary();
+
+ // Create the form content. Add Line breaks to the end of data.
+ for (var i = 0, len = this._streams.length; i < len; i++) {
+ if (typeof this._streams[i] !== 'function') {
+
+ // Add content to the buffer.
+ if(Buffer.isBuffer(this._streams[i])) {
+ dataBuffer = Buffer.concat( [dataBuffer, this._streams[i]]);
+ }else {
+ dataBuffer = Buffer.concat( [dataBuffer, Buffer.from(this._streams[i])]);
+ }
+
+ // Add break after content.
+ if (typeof this._streams[i] !== 'string' || this._streams[i].substring( 2, boundary.length + 2 ) !== boundary) {
+ dataBuffer = Buffer.concat( [dataBuffer, Buffer.from(FormData.LINE_BREAK)] );
+ }
+ }
+ }
+
+ // Add the footer and return the Buffer object.
+ return Buffer.concat( [dataBuffer, Buffer.from(this._lastBoundary())] );
+};
+
+FormData.prototype._generateBoundary = function() {
+ // This generates a 50 character boundary similar to those used by Firefox.
+ // They are optimized for boyer-moore parsing.
+ var boundary = '--------------------------';
+ for (var i = 0; i < 24; i++) {
+ boundary += Math.floor(Math.random() * 10).toString(16);
+ }
+
+ this._boundary = boundary;
+};
+
+// Note: getLengthSync DOESN'T calculate streams length
+// As workaround one can calculate file size manually
+// and add it as knownLength option
+FormData.prototype.getLengthSync = function() {
+ var knownLength = this._overheadLength + this._valueLength;
+
+ // Don't get confused, there are 3 "internal" streams for each keyval pair
+ // so it basically checks if there is any value added to the form
+ if (this._streams.length) {
+ knownLength += this._lastBoundary().length;
+ }
+
+ // https://github.com/form-data/form-data/issues/40
+ if (!this.hasKnownLength()) {
+ // Some async length retrievers are present
+ // therefore synchronous length calculation is false.
+ // Please use getLength(callback) to get proper length
+ this._error(new Error('Cannot calculate proper length in synchronous way.'));
+ }
+
+ return knownLength;
+};
+
+// Public API to check if length of added values is known
+// https://github.com/form-data/form-data/issues/196
+// https://github.com/form-data/form-data/issues/262
+FormData.prototype.hasKnownLength = function() {
+ var hasKnownLength = true;
+
+ if (this._valuesToMeasure.length) {
+ hasKnownLength = false;
+ }
+
+ return hasKnownLength;
+};
+
+FormData.prototype.getLength = function(cb) {
+ var knownLength = this._overheadLength + this._valueLength;
+
+ if (this._streams.length) {
+ knownLength += this._lastBoundary().length;
+ }
+
+ if (!this._valuesToMeasure.length) {
+ process.nextTick(cb.bind(this, null, knownLength));
+ return;
+ }
+
+ asynckit.parallel(this._valuesToMeasure, this._lengthRetriever, function(err, values) {
+ if (err) {
+ cb(err);
+ return;
+ }
+
+ values.forEach(function(length) {
+ knownLength += length;
+ });
+
+ cb(null, knownLength);
+ });
+};
+
+FormData.prototype.submit = function(params, cb) {
+ var request
+ , options
+ , defaults = {method: 'post'}
+ ;
+
+ // parse provided url if it's string
+ // or treat it as options object
+ if (typeof params == 'string') {
+
+ params = parseUrl(params);
+ options = populate({
+ port: params.port,
+ path: params.pathname,
+ host: params.hostname,
+ protocol: params.protocol
+ }, defaults);
+
+ // use custom params
+ } else {
+
+ options = populate(params, defaults);
+ // if no port provided use default one
+ if (!options.port) {
+ options.port = options.protocol == 'https:' ? 443 : 80;
+ }
+ }
+
+ // put that good code in getHeaders to some use
+ options.headers = this.getHeaders(params.headers);
+
+ // https if specified, fallback to http in any other case
+ if (options.protocol == 'https:') {
+ request = https.request(options);
+ } else {
+ request = http.request(options);
+ }
+
+ // get content length and fire away
+ this.getLength(function(err, length) {
+ if (err && err !== 'Unknown stream') {
+ this._error(err);
+ return;
+ }
+
+ // add content length
+ if (length) {
+ request.setHeader('Content-Length', length);
+ }
+
+ this.pipe(request);
+ if (cb) {
+ var onResponse;
+
+ var callback = function (error, responce) {
+ request.removeListener('error', callback);
+ request.removeListener('response', onResponse);
+
+ return cb.call(this, error, responce);
+ };
+
+ onResponse = callback.bind(this, null);
+
+ request.on('error', callback);
+ request.on('response', onResponse);
+ }
+ }.bind(this));
+
+ return request;
+};
+
+FormData.prototype._error = function(err) {
+ if (!this.error) {
+ this.error = err;
+ this.pause();
+ this.emit('error', err);
+ }
+};
+
+FormData.prototype.toString = function () {
+ return '[object FormData]';
+};
diff --git a/node_modules/form-data/lib/populate.js b/node_modules/form-data/lib/populate.js
new file mode 100644
index 0000000..4d35738
--- /dev/null
+++ b/node_modules/form-data/lib/populate.js
@@ -0,0 +1,10 @@
+// populates missing values
+module.exports = function(dst, src) {
+
+ Object.keys(src).forEach(function(prop)
+ {
+ dst[prop] = dst[prop] || src[prop];
+ });
+
+ return dst;
+};
diff --git a/node_modules/form-data/package.json b/node_modules/form-data/package.json
new file mode 100644
index 0000000..0f20240
--- /dev/null
+++ b/node_modules/form-data/package.json
@@ -0,0 +1,68 @@
+{
+ "author": "Felix Geisendörfer <felix@debuggable.com> (http://debuggable.com/)",
+ "name": "form-data",
+ "description": "A library to create readable \"multipart/form-data\" streams. Can be used to submit forms and file uploads to other web applications.",
+ "version": "4.0.0",
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/form-data/form-data.git"
+ },
+ "main": "./lib/form_data",
+ "browser": "./lib/browser",
+ "typings": "./index.d.ts",
+ "scripts": {
+ "pretest": "rimraf coverage test/tmp",
+ "test": "istanbul cover test/run.js",
+ "posttest": "istanbul report lcov text",
+ "lint": "eslint lib/*.js test/*.js test/integration/*.js",
+ "report": "istanbul report lcov text",
+ "ci-lint": "is-node-modern 8 && npm run lint || is-node-not-modern 8",
+ "ci-test": "npm run test && npm run browser && npm run report",
+ "predebug": "rimraf coverage test/tmp",
+ "debug": "verbose=1 ./test/run.js",
+ "browser": "browserify -t browserify-istanbul test/run-browser.js | obake --coverage",
+ "check": "istanbul check-coverage coverage/coverage*.json",
+ "files": "pkgfiles --sort=name",
+ "get-version": "node -e \"console.log(require('./package.json').version)\"",
+ "update-readme": "sed -i.bak 's/\\/master\\.svg/\\/v'$(npm --silent run get-version)'.svg/g' README.md",
+ "restore-readme": "mv README.md.bak README.md",
+ "prepublish": "in-publish && npm run update-readme || not-in-publish",
+ "postpublish": "npm run restore-readme"
+ },
+ "pre-commit": [
+ "lint",
+ "ci-test",
+ "check"
+ ],
+ "engines": {
+ "node": ">= 6"
+ },
+ "dependencies": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.8",
+ "mime-types": "^2.1.12"
+ },
+ "devDependencies": {
+ "@types/node": "^12.0.10",
+ "browserify": "^13.1.1",
+ "browserify-istanbul": "^2.0.0",
+ "coveralls": "^3.0.4",
+ "cross-spawn": "^6.0.5",
+ "eslint": "^6.0.1",
+ "fake": "^0.2.2",
+ "far": "^0.0.7",
+ "formidable": "^1.0.17",
+ "in-publish": "^2.0.0",
+ "is-node-modern": "^1.0.0",
+ "istanbul": "^0.4.5",
+ "obake": "^0.1.2",
+ "puppeteer": "^1.19.0",
+ "pkgfiles": "^2.3.0",
+ "pre-commit": "^1.1.3",
+ "request": "^2.88.0",
+ "rimraf": "^2.7.1",
+ "tape": "^4.6.2",
+ "typescript": "^3.5.2"
+ },
+ "license": "MIT"
+}
diff --git a/node_modules/has-flag/index.d.ts b/node_modules/has-flag/index.d.ts
new file mode 100644
index 0000000..a0a48c8
--- /dev/null
+++ b/node_modules/has-flag/index.d.ts
@@ -0,0 +1,39 @@
+/**
+Check if [`argv`](https://nodejs.org/docs/latest/api/process.html#process_process_argv) has a specific flag.
+
+@param flag - CLI flag to look for. The `--` prefix is optional.
+@param argv - CLI arguments. Default: `process.argv`.
+@returns Whether the flag exists.
+
+@example
+```
+// $ ts-node foo.ts -f --unicorn --foo=bar -- --rainbow
+
+// foo.ts
+import 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
+```
+*/
+declare function hasFlag(flag: string, argv?: string[]): boolean;
+
+export = hasFlag;
diff --git a/node_modules/has-flag/index.js b/node_modules/has-flag/index.js
new file mode 100644
index 0000000..b6f80b1
--- /dev/null
+++ b/node_modules/has-flag/index.js
@@ -0,0 +1,8 @@
+'use strict';
+
+module.exports = (flag, argv = process.argv) => {
+ const prefix = flag.startsWith('-') ? '' : (flag.length === 1 ? '-' : '--');
+ const position = argv.indexOf(prefix + flag);
+ const terminatorPosition = argv.indexOf('--');
+ return position !== -1 && (terminatorPosition === -1 || position < terminatorPosition);
+};
diff --git a/node_modules/has-flag/license b/node_modules/has-flag/license
new file mode 100644
index 0000000..e7af2f7
--- /dev/null
+++ b/node_modules/has-flag/license
@@ -0,0 +1,9 @@
+MIT License
+
+Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/node_modules/has-flag/package.json b/node_modules/has-flag/package.json
new file mode 100644
index 0000000..a9cba4b
--- /dev/null
+++ b/node_modules/has-flag/package.json
@@ -0,0 +1,46 @@
+{
+ "name": "has-flag",
+ "version": "4.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": ">=8"
+ },
+ "scripts": {
+ "test": "xo && ava && tsd"
+ },
+ "files": [
+ "index.js",
+ "index.d.ts"
+ ],
+ "keywords": [
+ "has",
+ "check",
+ "detect",
+ "contains",
+ "find",
+ "flag",
+ "cli",
+ "command-line",
+ "argv",
+ "process",
+ "arg",
+ "args",
+ "argument",
+ "arguments",
+ "getopt",
+ "minimist",
+ "optimist"
+ ],
+ "devDependencies": {
+ "ava": "^1.4.1",
+ "tsd": "^0.7.2",
+ "xo": "^0.24.0"
+ }
+}
diff --git a/node_modules/has-flag/readme.md b/node_modules/has-flag/readme.md
new file mode 100644
index 0000000..3f72dff
--- /dev/null
+++ b/node_modules/has-flag/readme.md
@@ -0,0 +1,89 @@
+# 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.
+
+---
+
+<div align="center">
+ <b>
+ <a href="https://tidelift.com/subscription/pkg/npm-has-flag?utm_source=npm-has-flag&utm_medium=referral&utm_campaign=readme">Get professional support for this package with a Tidelift subscription</a>
+ </b>
+ <br>
+ <sub>
+ Tidelift helps make open source sustainable for maintainers while giving companies<br>assurances about security, maintenance, and licensing for their dependencies.
+ </sub>
+</div>
+
+---
+
+
+## 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.
+
+
+## Security
+
+To report a security vulnerability, please use the [Tidelift security contact](https://tidelift.com/security). Tidelift will coordinate the fix and disclosure.
+
+
+## License
+
+MIT © [Sindre Sorhus](https://sindresorhus.com)
diff --git a/node_modules/kleur/index.js b/node_modules/kleur/index.js
new file mode 100644
index 0000000..0bc6ec9
--- /dev/null
+++ b/node_modules/kleur/index.js
@@ -0,0 +1,104 @@
+'use strict';
+
+const { FORCE_COLOR, NODE_DISABLE_COLORS, TERM } = process.env;
+
+const $ = {
+ enabled: !NODE_DISABLE_COLORS && TERM !== 'dumb' && FORCE_COLOR !== '0',
+
+ // modifiers
+ reset: init(0, 0),
+ bold: init(1, 22),
+ dim: init(2, 22),
+ italic: init(3, 23),
+ underline: init(4, 24),
+ inverse: init(7, 27),
+ hidden: init(8, 28),
+ strikethrough: init(9, 29),
+
+ // colors
+ black: init(30, 39),
+ red: init(31, 39),
+ green: init(32, 39),
+ yellow: init(33, 39),
+ blue: init(34, 39),
+ magenta: init(35, 39),
+ cyan: init(36, 39),
+ white: init(37, 39),
+ gray: init(90, 39),
+ grey: init(90, 39),
+
+ // background colors
+ bgBlack: init(40, 49),
+ bgRed: init(41, 49),
+ bgGreen: init(42, 49),
+ bgYellow: init(43, 49),
+ bgBlue: init(44, 49),
+ bgMagenta: init(45, 49),
+ bgCyan: init(46, 49),
+ bgWhite: init(47, 49)
+};
+
+function run(arr, str) {
+ let i=0, tmp, beg='', end='';
+ for (; i < arr.length; i++) {
+ tmp = arr[i];
+ beg += tmp.open;
+ end += tmp.close;
+ if (str.includes(tmp.close)) {
+ str = str.replace(tmp.rgx, tmp.close + tmp.open);
+ }
+ }
+ return beg + str + end;
+}
+
+function chain(has, keys) {
+ let ctx = { has, keys };
+
+ ctx.reset = $.reset.bind(ctx);
+ ctx.bold = $.bold.bind(ctx);
+ ctx.dim = $.dim.bind(ctx);
+ ctx.italic = $.italic.bind(ctx);
+ ctx.underline = $.underline.bind(ctx);
+ ctx.inverse = $.inverse.bind(ctx);
+ ctx.hidden = $.hidden.bind(ctx);
+ ctx.strikethrough = $.strikethrough.bind(ctx);
+
+ ctx.black = $.black.bind(ctx);
+ ctx.red = $.red.bind(ctx);
+ ctx.green = $.green.bind(ctx);
+ ctx.yellow = $.yellow.bind(ctx);
+ ctx.blue = $.blue.bind(ctx);
+ ctx.magenta = $.magenta.bind(ctx);
+ ctx.cyan = $.cyan.bind(ctx);
+ ctx.white = $.white.bind(ctx);
+ ctx.gray = $.gray.bind(ctx);
+ ctx.grey = $.grey.bind(ctx);
+
+ ctx.bgBlack = $.bgBlack.bind(ctx);
+ ctx.bgRed = $.bgRed.bind(ctx);
+ ctx.bgGreen = $.bgGreen.bind(ctx);
+ ctx.bgYellow = $.bgYellow.bind(ctx);
+ ctx.bgBlue = $.bgBlue.bind(ctx);
+ ctx.bgMagenta = $.bgMagenta.bind(ctx);
+ ctx.bgCyan = $.bgCyan.bind(ctx);
+ ctx.bgWhite = $.bgWhite.bind(ctx);
+
+ return ctx;
+}
+
+function init(open, close) {
+ let blk = {
+ open: `\x1b[${open}m`,
+ close: `\x1b[${close}m`,
+ rgx: new RegExp(`\\x1b\\[${close}m`, 'g')
+ };
+ return function (txt) {
+ if (this !== void 0 && this.has !== void 0) {
+ this.has.includes(open) || (this.has.push(open),this.keys.push(blk));
+ return txt === void 0 ? this : $.enabled ? run(this.keys, txt+'') : txt+'';
+ }
+ return txt === void 0 ? chain([open], [blk]) : $.enabled ? run([blk], txt+'') : txt+'';
+ };
+}
+
+module.exports = $;
diff --git a/node_modules/kleur/kleur.d.ts b/node_modules/kleur/kleur.d.ts
new file mode 100644
index 0000000..fdc26ca
--- /dev/null
+++ b/node_modules/kleur/kleur.d.ts
@@ -0,0 +1,45 @@
+// Originally by: Rogier Schouten <https://github.com/rogierschouten>
+// Adapted by: Madhav Varshney <https://github.com/madhavarshney>
+declare namespace kleur {
+ interface Color {
+ (x: string | number): string;
+ (): Kleur;
+ }
+
+ interface Kleur {
+ // Colors
+ black: Color;
+ red: Color;
+ green: Color;
+ yellow: Color;
+ blue: Color;
+ magenta: Color;
+ cyan: Color;
+ white: Color;
+ gray: Color;
+ grey: Color;
+
+ // Backgrounds
+ bgBlack: Color;
+ bgRed: Color;
+ bgGreen: Color;
+ bgYellow: Color;
+ bgBlue: Color;
+ bgMagenta: Color;
+ bgCyan: Color;
+ bgWhite: Color;
+
+ // Modifiers
+ reset: Color;
+ bold: Color;
+ dim: Color;
+ italic: Color;
+ underline: Color;
+ inverse: Color;
+ hidden: Color;
+ strikethrough: Color;
+ }
+}
+
+declare let kleur: kleur.Kleur & { enabled: boolean };
+export = kleur;
diff --git a/node_modules/kleur/license b/node_modules/kleur/license
new file mode 100644
index 0000000..a3f96f8
--- /dev/null
+++ b/node_modules/kleur/license
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) Luke Edwards <luke.edwards05@gmail.com> (lukeed.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/kleur/package.json b/node_modules/kleur/package.json
new file mode 100644
index 0000000..a81931e
--- /dev/null
+++ b/node_modules/kleur/package.json
@@ -0,0 +1,35 @@
+{
+ "name": "kleur",
+ "version": "3.0.3",
+ "repository": "lukeed/kleur",
+ "description": "The fastest Node.js library for formatting terminal text with ANSI colors~!",
+ "license": "MIT",
+ "files": [
+ "*.js",
+ "*.d.ts"
+ ],
+ "author": {
+ "name": "Luke Edwards",
+ "email": "luke.edwards05@gmail.com",
+ "url": "lukeed.com"
+ },
+ "scripts": {
+ "test": "tape test/*.js | tap-spec"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "keywords": [
+ "ansi",
+ "cli",
+ "color",
+ "colors",
+ "console",
+ "terminal"
+ ],
+ "types": "kleur.d.ts",
+ "devDependencies": {
+ "tap-spec": "^5.0.0",
+ "tape": "^4.9.1"
+ }
+}
diff --git a/node_modules/kleur/readme.md b/node_modules/kleur/readme.md
new file mode 100644
index 0000000..6926f1e
--- /dev/null
+++ b/node_modules/kleur/readme.md
@@ -0,0 +1,172 @@
+<div align="center">
+ <img src="shots/logo.png" alt="kleur" height="120" />
+</div>
+
+<div align="center">
+ <a href="https://npmjs.org/package/kleur">
+ <img src="https://badgen.now.sh/npm/v/kleur" alt="version" />
+ </a>
+ <a href="https://travis-ci.org/lukeed/kleur">
+ <img src="https://badgen.now.sh/travis/lukeed/kleur" alt="travis" />
+ </a>
+ <a href="https://npmjs.org/package/kleur">
+ <img src="https://badgen.now.sh/npm/dm/kleur" alt="downloads" />
+ </a>
+ <a href="https://packagephobia.now.sh/result?p=kleur">
+ <img src="https://packagephobia.now.sh/badge?p=kleur" alt="install size" />
+ </a>
+</div>
+
+<div align="center">The fastest Node.js library for formatting terminal text with ANSI colors~!</div>
+
+## Features
+
+* No dependencies
+* Super [lightweight](#load-time) & [performant](#performance)
+* Supports [nested](#nested-methods) & [chained](#chained-methods) colors
+* No `String.prototype` modifications
+* Conditional [color support](#conditional-support)
+* Familiar [API](#api)
+
+---
+
+As of `v3.0` the Chalk-style syntax (magical getter) is no longer used.<br>If you need or require that syntax, consider using [`ansi-colors`](https://github.com/doowb/ansi-colors), which maintains `chalk` parity.
+
+---
+
+
+## Install
+
+```
+$ npm install --save kleur
+```
+
+
+## Usage
+
+```js
+const { red, white, blue, bold } = require('kleur');
+
+// basic usage
+red('red text');
+
+// chained methods
+blue().bold().underline('howdy partner');
+
+// nested methods
+bold(`${ white().bgRed('[ERROR]') } ${ red().italic('Something happened')}`);
+```
+
+### Chained Methods
+
+```js
+console.log(bold().red('this is a bold red message'));
+console.log(bold().italic('this is a bold italicized message'));
+console.log(bold().yellow().bgRed().italic('this is a bold yellow italicized message'));
+console.log(green().bold().underline('this is a bold green underlined message'));
+```
+
+<img src="shots/1.png" width="300" />
+
+### Nested Methods
+
+```js
+const { yellow, red, cyan } = require('kleur');
+
+console.log(yellow(`foo ${red().bold('red')} bar ${cyan('cyan')} baz`));
+console.log(yellow('foo ' + red().bold('red') + ' bar ' + cyan('cyan') + ' baz'));
+```
+
+<img src="shots/2.png" width="300" />
+
+
+### Conditional Support
+
+Toggle color support as needed; `kleur` includes simple auto-detection which may not cover all cases.
+
+```js
+const kleur = require('kleur');
+
+// manually disable
+kleur.enabled = false;
+
+// or use another library to detect support
+kleur.enabled = require('color-support').level;
+
+console.log(kleur.red('I will only be colored red if the terminal supports colors'));
+```
+
+
+## API
+
+Any `kleur` method returns a `String` when invoked with input; otherwise chaining is expected.
+
+> It's up to the developer to pass the output to destinations like `console.log`, `process.stdout.write`, etc.
+
+The methods below are grouped by type for legibility purposes only. They each can be [chained](#chained-methods) or [nested](#nested-methods) with one another.
+
+***Colors:***
+> black &mdash; red &mdash; green &mdash; yellow &mdash; blue &mdash; magenta &mdash; cyan &mdash; white &mdash; gray &mdash; grey
+
+***Backgrounds:***
+> bgBlack &mdash; bgRed &mdash; bgGreen &mdash; bgYellow &mdash; bgBlue &mdash; bgMagenta &mdash; bgCyan &mdash; bgWhite
+
+***Modifiers:***
+> reset &mdash; bold &mdash; dim &mdash; italic* &mdash; underline &mdash; inverse &mdash; hidden &mdash; strikethrough*
+
+<sup>* <em>Not widely supported</em></sup>
+
+
+## Benchmarks
+
+> Using Node v10.13.0
+
+### Load time
+
+```
+chalk :: 14.543ms
+kleur :: 0.474ms
+ansi-colors :: 1.923ms
+```
+
+### Performance
+
+```
+# All Colors
+ ansi-colors x 199,381 ops/sec ±1.04% (96 runs sampled)
+ chalk x 12,107 ops/sec ±2.07% (87 runs sampled)
+ kleur x 715,334 ops/sec ±0.30% (93 runs sampled)
+
+# Stacked colors
+ ansi-colors x 24,494 ops/sec ±1.03% (93 runs sampled)
+ chalk x 2,650 ops/sec ±2.06% (85 runs sampled)
+ kleur x 75,798 ops/sec ±0.19% (97 runs sampled)
+
+# Nested colors
+ ansi-colors x 77,766 ops/sec ±0.32% (94 runs sampled)
+ chalk x 5,596 ops/sec ±1.85% (86 runs sampled)
+ kleur x 137,660 ops/sec ±0.31% (93 runs sampled)
+```
+
+
+## Credits
+
+This project originally forked [Brian Woodward](https://github.com/doowb)'s awesome [`ansi-colors`](https://github.com/doowb/ansi-colors) library.
+
+Beginning with `kleur@3.0`, the Chalk-style syntax (magical getter) has been replaced with function calls per key:
+
+```js
+// Old:
+c.red.bold.underline('old');
+
+// New:
+c.red().bold().underline('new');
+```
+> <sup><em>As I work more with Rust, the newer syntax feels so much better & more natural!</em></sup>
+
+If you prefer the old syntax, you may migrate to `ansi-colors`. Versions below `kleur@3.0` have been deprecated.
+
+
+## License
+
+MIT © [Luke Edwards](https://lukeed.com)
diff --git a/node_modules/lodash.camelcase/LICENSE b/node_modules/lodash.camelcase/LICENSE
new file mode 100644
index 0000000..e0c69d5
--- /dev/null
+++ b/node_modules/lodash.camelcase/LICENSE
@@ -0,0 +1,47 @@
+Copyright jQuery Foundation and other contributors <https://jquery.org/>
+
+Based on Underscore.js, copyright Jeremy Ashkenas,
+DocumentCloud and Investigative Reporters & Editors <http://underscorejs.org/>
+
+This software consists of voluntary contributions made by many
+individuals. For exact contribution history, see the revision history
+available at https://github.com/lodash/lodash
+
+The following license applies to all parts of this software except as
+documented below:
+
+====
+
+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.
+
+====
+
+Copyright and related rights for sample code are waived via CC0. Sample
+code is defined as all source code displayed within the prose of the
+documentation.
+
+CC0: http://creativecommons.org/publicdomain/zero/1.0/
+
+====
+
+Files located in the node_modules and vendor directories are externally
+maintained libraries used by this software which have their own
+licenses; we recommend you read them, as their terms may differ from the
+terms above.
diff --git a/node_modules/lodash.camelcase/README.md b/node_modules/lodash.camelcase/README.md
new file mode 100644
index 0000000..333d437
--- /dev/null
+++ b/node_modules/lodash.camelcase/README.md
@@ -0,0 +1,18 @@
+# lodash.camelcase v4.3.0
+
+The [lodash](https://lodash.com/) method `_.camelCase` exported as a [Node.js](https://nodejs.org/) module.
+
+## Installation
+
+Using npm:
+```bash
+$ {sudo -H} npm i -g npm
+$ npm i --save lodash.camelcase
+```
+
+In Node.js:
+```js
+var camelCase = require('lodash.camelcase');
+```
+
+See the [documentation](https://lodash.com/docs#camelCase) or [package source](https://github.com/lodash/lodash/blob/4.3.0-npm-packages/lodash.camelcase) for more details.
diff --git a/node_modules/lodash.camelcase/index.js b/node_modules/lodash.camelcase/index.js
new file mode 100644
index 0000000..b6d8b3c
--- /dev/null
+++ b/node_modules/lodash.camelcase/index.js
@@ -0,0 +1,599 @@
+/**
+ * lodash (Custom Build) <https://lodash.com/>
+ * Build: `lodash modularize exports="npm" -o ./`
+ * Copyright jQuery Foundation and other contributors <https://jquery.org/>
+ * Released under MIT license <https://lodash.com/license>
+ * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>
+ * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
+ */
+
+/** Used as references for various `Number` constants. */
+var INFINITY = 1 / 0;
+
+/** `Object#toString` result references. */
+var symbolTag = '[object Symbol]';
+
+/** Used to match words composed of alphanumeric characters. */
+var reAsciiWord = /[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g;
+
+/** Used to match Latin Unicode letters (excluding mathematical operators). */
+var reLatin = /[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g;
+
+/** Used to compose unicode character classes. */
+var rsAstralRange = '\\ud800-\\udfff',
+ rsComboMarksRange = '\\u0300-\\u036f\\ufe20-\\ufe23',
+ rsComboSymbolsRange = '\\u20d0-\\u20f0',
+ rsDingbatRange = '\\u2700-\\u27bf',
+ rsLowerRange = 'a-z\\xdf-\\xf6\\xf8-\\xff',
+ rsMathOpRange = '\\xac\\xb1\\xd7\\xf7',
+ rsNonCharRange = '\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf',
+ rsPunctuationRange = '\\u2000-\\u206f',
+ rsSpaceRange = ' \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000',
+ rsUpperRange = 'A-Z\\xc0-\\xd6\\xd8-\\xde',
+ rsVarRange = '\\ufe0e\\ufe0f',
+ rsBreakRange = rsMathOpRange + rsNonCharRange + rsPunctuationRange + rsSpaceRange;
+
+/** Used to compose unicode capture groups. */
+var rsApos = "['\u2019]",
+ rsAstral = '[' + rsAstralRange + ']',
+ rsBreak = '[' + rsBreakRange + ']',
+ rsCombo = '[' + rsComboMarksRange + rsComboSymbolsRange + ']',
+ rsDigits = '\\d+',
+ rsDingbat = '[' + rsDingbatRange + ']',
+ rsLower = '[' + rsLowerRange + ']',
+ rsMisc = '[^' + rsAstralRange + rsBreakRange + rsDigits + rsDingbatRange + rsLowerRange + rsUpperRange + ']',
+ rsFitz = '\\ud83c[\\udffb-\\udfff]',
+ rsModifier = '(?:' + rsCombo + '|' + rsFitz + ')',
+ rsNonAstral = '[^' + rsAstralRange + ']',
+ rsRegional = '(?:\\ud83c[\\udde6-\\uddff]){2}',
+ rsSurrPair = '[\\ud800-\\udbff][\\udc00-\\udfff]',
+ rsUpper = '[' + rsUpperRange + ']',
+ rsZWJ = '\\u200d';
+
+/** Used to compose unicode regexes. */
+var rsLowerMisc = '(?:' + rsLower + '|' + rsMisc + ')',
+ rsUpperMisc = '(?:' + rsUpper + '|' + rsMisc + ')',
+ rsOptLowerContr = '(?:' + rsApos + '(?:d|ll|m|re|s|t|ve))?',
+ rsOptUpperContr = '(?:' + rsApos + '(?:D|LL|M|RE|S|T|VE))?',
+ reOptMod = rsModifier + '?',
+ rsOptVar = '[' + rsVarRange + ']?',
+ rsOptJoin = '(?:' + rsZWJ + '(?:' + [rsNonAstral, rsRegional, rsSurrPair].join('|') + ')' + rsOptVar + reOptMod + ')*',
+ rsSeq = rsOptVar + reOptMod + rsOptJoin,
+ rsEmoji = '(?:' + [rsDingbat, rsRegional, rsSurrPair].join('|') + ')' + rsSeq,
+ rsSymbol = '(?:' + [rsNonAstral + rsCombo + '?', rsCombo, rsRegional, rsSurrPair, rsAstral].join('|') + ')';
+
+/** Used to match apostrophes. */
+var reApos = RegExp(rsApos, 'g');
+
+/**
+ * Used to match [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks) and
+ * [combining diacritical marks for symbols](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks_for_Symbols).
+ */
+var reComboMark = RegExp(rsCombo, 'g');
+
+/** Used to match [string symbols](https://mathiasbynens.be/notes/javascript-unicode). */
+var reUnicode = RegExp(rsFitz + '(?=' + rsFitz + ')|' + rsSymbol + rsSeq, 'g');
+
+/** Used to match complex or compound words. */
+var reUnicodeWord = RegExp([
+ rsUpper + '?' + rsLower + '+' + rsOptLowerContr + '(?=' + [rsBreak, rsUpper, '$'].join('|') + ')',
+ rsUpperMisc + '+' + rsOptUpperContr + '(?=' + [rsBreak, rsUpper + rsLowerMisc, '$'].join('|') + ')',
+ rsUpper + '?' + rsLowerMisc + '+' + rsOptLowerContr,
+ rsUpper + '+' + rsOptUpperContr,
+ rsDigits,
+ rsEmoji
+].join('|'), 'g');
+
+/** Used to detect strings with [zero-width joiners or code points from the astral planes](http://eev.ee/blog/2015/09/12/dark-corners-of-unicode/). */
+var reHasUnicode = RegExp('[' + rsZWJ + rsAstralRange + rsComboMarksRange + rsComboSymbolsRange + rsVarRange + ']');
+
+/** Used to detect strings that need a more robust regexp to match words. */
+var reHasUnicodeWord = /[a-z][A-Z]|[A-Z]{2,}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/;
+
+/** Used to map Latin Unicode letters to basic Latin letters. */
+var deburredLetters = {
+ // Latin-1 Supplement block.
+ '\xc0': 'A', '\xc1': 'A', '\xc2': 'A', '\xc3': 'A', '\xc4': 'A', '\xc5': 'A',
+ '\xe0': 'a', '\xe1': 'a', '\xe2': 'a', '\xe3': 'a', '\xe4': 'a', '\xe5': 'a',
+ '\xc7': 'C', '\xe7': 'c',
+ '\xd0': 'D', '\xf0': 'd',
+ '\xc8': 'E', '\xc9': 'E', '\xca': 'E', '\xcb': 'E',
+ '\xe8': 'e', '\xe9': 'e', '\xea': 'e', '\xeb': 'e',
+ '\xcc': 'I', '\xcd': 'I', '\xce': 'I', '\xcf': 'I',
+ '\xec': 'i', '\xed': 'i', '\xee': 'i', '\xef': 'i',
+ '\xd1': 'N', '\xf1': 'n',
+ '\xd2': 'O', '\xd3': 'O', '\xd4': 'O', '\xd5': 'O', '\xd6': 'O', '\xd8': 'O',
+ '\xf2': 'o', '\xf3': 'o', '\xf4': 'o', '\xf5': 'o', '\xf6': 'o', '\xf8': 'o',
+ '\xd9': 'U', '\xda': 'U', '\xdb': 'U', '\xdc': 'U',
+ '\xf9': 'u', '\xfa': 'u', '\xfb': 'u', '\xfc': 'u',
+ '\xdd': 'Y', '\xfd': 'y', '\xff': 'y',
+ '\xc6': 'Ae', '\xe6': 'ae',
+ '\xde': 'Th', '\xfe': 'th',
+ '\xdf': 'ss',
+ // Latin Extended-A block.
+ '\u0100': 'A', '\u0102': 'A', '\u0104': 'A',
+ '\u0101': 'a', '\u0103': 'a', '\u0105': 'a',
+ '\u0106': 'C', '\u0108': 'C', '\u010a': 'C', '\u010c': 'C',
+ '\u0107': 'c', '\u0109': 'c', '\u010b': 'c', '\u010d': 'c',
+ '\u010e': 'D', '\u0110': 'D', '\u010f': 'd', '\u0111': 'd',
+ '\u0112': 'E', '\u0114': 'E', '\u0116': 'E', '\u0118': 'E', '\u011a': 'E',
+ '\u0113': 'e', '\u0115': 'e', '\u0117': 'e', '\u0119': 'e', '\u011b': 'e',
+ '\u011c': 'G', '\u011e': 'G', '\u0120': 'G', '\u0122': 'G',
+ '\u011d': 'g', '\u011f': 'g', '\u0121': 'g', '\u0123': 'g',
+ '\u0124': 'H', '\u0126': 'H', '\u0125': 'h', '\u0127': 'h',
+ '\u0128': 'I', '\u012a': 'I', '\u012c': 'I', '\u012e': 'I', '\u0130': 'I',
+ '\u0129': 'i', '\u012b': 'i', '\u012d': 'i', '\u012f': 'i', '\u0131': 'i',
+ '\u0134': 'J', '\u0135': 'j',
+ '\u0136': 'K', '\u0137': 'k', '\u0138': 'k',
+ '\u0139': 'L', '\u013b': 'L', '\u013d': 'L', '\u013f': 'L', '\u0141': 'L',
+ '\u013a': 'l', '\u013c': 'l', '\u013e': 'l', '\u0140': 'l', '\u0142': 'l',
+ '\u0143': 'N', '\u0145': 'N', '\u0147': 'N', '\u014a': 'N',
+ '\u0144': 'n', '\u0146': 'n', '\u0148': 'n', '\u014b': 'n',
+ '\u014c': 'O', '\u014e': 'O', '\u0150': 'O',
+ '\u014d': 'o', '\u014f': 'o', '\u0151': 'o',
+ '\u0154': 'R', '\u0156': 'R', '\u0158': 'R',
+ '\u0155': 'r', '\u0157': 'r', '\u0159': 'r',
+ '\u015a': 'S', '\u015c': 'S', '\u015e': 'S', '\u0160': 'S',
+ '\u015b': 's', '\u015d': 's', '\u015f': 's', '\u0161': 's',
+ '\u0162': 'T', '\u0164': 'T', '\u0166': 'T',
+ '\u0163': 't', '\u0165': 't', '\u0167': 't',
+ '\u0168': 'U', '\u016a': 'U', '\u016c': 'U', '\u016e': 'U', '\u0170': 'U', '\u0172': 'U',
+ '\u0169': 'u', '\u016b': 'u', '\u016d': 'u', '\u016f': 'u', '\u0171': 'u', '\u0173': 'u',
+ '\u0174': 'W', '\u0175': 'w',
+ '\u0176': 'Y', '\u0177': 'y', '\u0178': 'Y',
+ '\u0179': 'Z', '\u017b': 'Z', '\u017d': 'Z',
+ '\u017a': 'z', '\u017c': 'z', '\u017e': 'z',
+ '\u0132': 'IJ', '\u0133': 'ij',
+ '\u0152': 'Oe', '\u0153': 'oe',
+ '\u0149': "'n", '\u017f': 'ss'
+};
+
+/** Detect free variable `global` from Node.js. */
+var freeGlobal = typeof global == 'object' && global && global.Object === Object && global;
+
+/** Detect free variable `self`. */
+var freeSelf = typeof self == 'object' && self && self.Object === Object && self;
+
+/** Used as a reference to the global object. */
+var root = freeGlobal || freeSelf || Function('return this')();
+
+/**
+ * A specialized version of `_.reduce` for arrays without support for
+ * iteratee shorthands.
+ *
+ * @private
+ * @param {Array} [array] The array to iterate over.
+ * @param {Function} iteratee The function invoked per iteration.
+ * @param {*} [accumulator] The initial value.
+ * @param {boolean} [initAccum] Specify using the first element of `array` as
+ * the initial value.
+ * @returns {*} Returns the accumulated value.
+ */
+function arrayReduce(array, iteratee, accumulator, initAccum) {
+ var index = -1,
+ length = array ? array.length : 0;
+
+ if (initAccum && length) {
+ accumulator = array[++index];
+ }
+ while (++index < length) {
+ accumulator = iteratee(accumulator, array[index], index, array);
+ }
+ return accumulator;
+}
+
+/**
+ * Converts an ASCII `string` to an array.
+ *
+ * @private
+ * @param {string} string The string to convert.
+ * @returns {Array} Returns the converted array.
+ */
+function asciiToArray(string) {
+ return string.split('');
+}
+
+/**
+ * Splits an ASCII `string` into an array of its words.
+ *
+ * @private
+ * @param {string} The string to inspect.
+ * @returns {Array} Returns the words of `string`.
+ */
+function asciiWords(string) {
+ return string.match(reAsciiWord) || [];
+}
+
+/**
+ * The base implementation of `_.propertyOf` without support for deep paths.
+ *
+ * @private
+ * @param {Object} object The object to query.
+ * @returns {Function} Returns the new accessor function.
+ */
+function basePropertyOf(object) {
+ return function(key) {
+ return object == null ? undefined : object[key];
+ };
+}
+
+/**
+ * Used by `_.deburr` to convert Latin-1 Supplement and Latin Extended-A
+ * letters to basic Latin letters.
+ *
+ * @private
+ * @param {string} letter The matched letter to deburr.
+ * @returns {string} Returns the deburred letter.
+ */
+var deburrLetter = basePropertyOf(deburredLetters);
+
+/**
+ * Checks if `string` contains Unicode symbols.
+ *
+ * @private
+ * @param {string} string The string to inspect.
+ * @returns {boolean} Returns `true` if a symbol is found, else `false`.
+ */
+function hasUnicode(string) {
+ return reHasUnicode.test(string);
+}
+
+/**
+ * Checks if `string` contains a word composed of Unicode symbols.
+ *
+ * @private
+ * @param {string} string The string to inspect.
+ * @returns {boolean} Returns `true` if a word is found, else `false`.
+ */
+function hasUnicodeWord(string) {
+ return reHasUnicodeWord.test(string);
+}
+
+/**
+ * Converts `string` to an array.
+ *
+ * @private
+ * @param {string} string The string to convert.
+ * @returns {Array} Returns the converted array.
+ */
+function stringToArray(string) {
+ return hasUnicode(string)
+ ? unicodeToArray(string)
+ : asciiToArray(string);
+}
+
+/**
+ * Converts a Unicode `string` to an array.
+ *
+ * @private
+ * @param {string} string The string to convert.
+ * @returns {Array} Returns the converted array.
+ */
+function unicodeToArray(string) {
+ return string.match(reUnicode) || [];
+}
+
+/**
+ * Splits a Unicode `string` into an array of its words.
+ *
+ * @private
+ * @param {string} The string to inspect.
+ * @returns {Array} Returns the words of `string`.
+ */
+function unicodeWords(string) {
+ return string.match(reUnicodeWord) || [];
+}
+
+/** Used for built-in method references. */
+var objectProto = Object.prototype;
+
+/**
+ * Used to resolve the
+ * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
+ * of values.
+ */
+var objectToString = objectProto.toString;
+
+/** Built-in value references. */
+var Symbol = root.Symbol;
+
+/** Used to convert symbols to primitives and strings. */
+var symbolProto = Symbol ? Symbol.prototype : undefined,
+ symbolToString = symbolProto ? symbolProto.toString : undefined;
+
+/**
+ * The base implementation of `_.slice` without an iteratee call guard.
+ *
+ * @private
+ * @param {Array} array The array to slice.
+ * @param {number} [start=0] The start position.
+ * @param {number} [end=array.length] The end position.
+ * @returns {Array} Returns the slice of `array`.
+ */
+function baseSlice(array, start, end) {
+ var index = -1,
+ length = array.length;
+
+ if (start < 0) {
+ start = -start > length ? 0 : (length + start);
+ }
+ end = end > length ? length : end;
+ if (end < 0) {
+ end += length;
+ }
+ length = start > end ? 0 : ((end - start) >>> 0);
+ start >>>= 0;
+
+ var result = Array(length);
+ while (++index < length) {
+ result[index] = array[index + start];
+ }
+ return result;
+}
+
+/**
+ * The base implementation of `_.toString` which doesn't convert nullish
+ * values to empty strings.
+ *
+ * @private
+ * @param {*} value The value to process.
+ * @returns {string} Returns the string.
+ */
+function baseToString(value) {
+ // Exit early for strings to avoid a performance hit in some environments.
+ if (typeof value == 'string') {
+ return value;
+ }
+ if (isSymbol(value)) {
+ return symbolToString ? symbolToString.call(value) : '';
+ }
+ var result = (value + '');
+ return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;
+}
+
+/**
+ * Casts `array` to a slice if it's needed.
+ *
+ * @private
+ * @param {Array} array The array to inspect.
+ * @param {number} start The start position.
+ * @param {number} [end=array.length] The end position.
+ * @returns {Array} Returns the cast slice.
+ */
+function castSlice(array, start, end) {
+ var length = array.length;
+ end = end === undefined ? length : end;
+ return (!start && end >= length) ? array : baseSlice(array, start, end);
+}
+
+/**
+ * Creates a function like `_.lowerFirst`.
+ *
+ * @private
+ * @param {string} methodName The name of the `String` case method to use.
+ * @returns {Function} Returns the new case function.
+ */
+function createCaseFirst(methodName) {
+ return function(string) {
+ string = toString(string);
+
+ var strSymbols = hasUnicode(string)
+ ? stringToArray(string)
+ : undefined;
+
+ var chr = strSymbols
+ ? strSymbols[0]
+ : string.charAt(0);
+
+ var trailing = strSymbols
+ ? castSlice(strSymbols, 1).join('')
+ : string.slice(1);
+
+ return chr[methodName]() + trailing;
+ };
+}
+
+/**
+ * Creates a function like `_.camelCase`.
+ *
+ * @private
+ * @param {Function} callback The function to combine each word.
+ * @returns {Function} Returns the new compounder function.
+ */
+function createCompounder(callback) {
+ return function(string) {
+ return arrayReduce(words(deburr(string).replace(reApos, '')), callback, '');
+ };
+}
+
+/**
+ * Checks if `value` is object-like. A value is object-like if it's not `null`
+ * and has a `typeof` result of "object".
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is object-like, else `false`.
+ * @example
+ *
+ * _.isObjectLike({});
+ * // => true
+ *
+ * _.isObjectLike([1, 2, 3]);
+ * // => true
+ *
+ * _.isObjectLike(_.noop);
+ * // => false
+ *
+ * _.isObjectLike(null);
+ * // => false
+ */
+function isObjectLike(value) {
+ return !!value && typeof value == 'object';
+}
+
+/**
+ * Checks if `value` is classified as a `Symbol` primitive or object.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.
+ * @example
+ *
+ * _.isSymbol(Symbol.iterator);
+ * // => true
+ *
+ * _.isSymbol('abc');
+ * // => false
+ */
+function isSymbol(value) {
+ return typeof value == 'symbol' ||
+ (isObjectLike(value) && objectToString.call(value) == symbolTag);
+}
+
+/**
+ * Converts `value` to a string. An empty string is returned for `null`
+ * and `undefined` values. The sign of `-0` is preserved.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Lang
+ * @param {*} value The value to process.
+ * @returns {string} Returns the string.
+ * @example
+ *
+ * _.toString(null);
+ * // => ''
+ *
+ * _.toString(-0);
+ * // => '-0'
+ *
+ * _.toString([1, 2, 3]);
+ * // => '1,2,3'
+ */
+function toString(value) {
+ return value == null ? '' : baseToString(value);
+}
+
+/**
+ * Converts `string` to [camel case](https://en.wikipedia.org/wiki/CamelCase).
+ *
+ * @static
+ * @memberOf _
+ * @since 3.0.0
+ * @category String
+ * @param {string} [string=''] The string to convert.
+ * @returns {string} Returns the camel cased string.
+ * @example
+ *
+ * _.camelCase('Foo Bar');
+ * // => 'fooBar'
+ *
+ * _.camelCase('--foo-bar--');
+ * // => 'fooBar'
+ *
+ * _.camelCase('__FOO_BAR__');
+ * // => 'fooBar'
+ */
+var camelCase = createCompounder(function(result, word, index) {
+ word = word.toLowerCase();
+ return result + (index ? capitalize(word) : word);
+});
+
+/**
+ * Converts the first character of `string` to upper case and the remaining
+ * to lower case.
+ *
+ * @static
+ * @memberOf _
+ * @since 3.0.0
+ * @category String
+ * @param {string} [string=''] The string to capitalize.
+ * @returns {string} Returns the capitalized string.
+ * @example
+ *
+ * _.capitalize('FRED');
+ * // => 'Fred'
+ */
+function capitalize(string) {
+ return upperFirst(toString(string).toLowerCase());
+}
+
+/**
+ * Deburrs `string` by converting
+ * [Latin-1 Supplement](https://en.wikipedia.org/wiki/Latin-1_Supplement_(Unicode_block)#Character_table)
+ * and [Latin Extended-A](https://en.wikipedia.org/wiki/Latin_Extended-A)
+ * letters to basic Latin letters and removing
+ * [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks).
+ *
+ * @static
+ * @memberOf _
+ * @since 3.0.0
+ * @category String
+ * @param {string} [string=''] The string to deburr.
+ * @returns {string} Returns the deburred string.
+ * @example
+ *
+ * _.deburr('déjà vu');
+ * // => 'deja vu'
+ */
+function deburr(string) {
+ string = toString(string);
+ return string && string.replace(reLatin, deburrLetter).replace(reComboMark, '');
+}
+
+/**
+ * Converts the first character of `string` to upper case.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category String
+ * @param {string} [string=''] The string to convert.
+ * @returns {string} Returns the converted string.
+ * @example
+ *
+ * _.upperFirst('fred');
+ * // => 'Fred'
+ *
+ * _.upperFirst('FRED');
+ * // => 'FRED'
+ */
+var upperFirst = createCaseFirst('toUpperCase');
+
+/**
+ * Splits `string` into an array of its words.
+ *
+ * @static
+ * @memberOf _
+ * @since 3.0.0
+ * @category String
+ * @param {string} [string=''] The string to inspect.
+ * @param {RegExp|string} [pattern] The pattern to match words.
+ * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
+ * @returns {Array} Returns the words of `string`.
+ * @example
+ *
+ * _.words('fred, barney, & pebbles');
+ * // => ['fred', 'barney', 'pebbles']
+ *
+ * _.words('fred, barney, & pebbles', /[^, ]+/g);
+ * // => ['fred', 'barney', '&', 'pebbles']
+ */
+function words(string, pattern, guard) {
+ string = toString(string);
+ pattern = guard ? undefined : pattern;
+
+ if (pattern === undefined) {
+ return hasUnicodeWord(string) ? unicodeWords(string) : asciiWords(string);
+ }
+ return string.match(pattern) || [];
+}
+
+module.exports = camelCase;
diff --git a/node_modules/lodash.camelcase/package.json b/node_modules/lodash.camelcase/package.json
new file mode 100644
index 0000000..aca63e0
--- /dev/null
+++ b/node_modules/lodash.camelcase/package.json
@@ -0,0 +1,17 @@
+{
+ "name": "lodash.camelcase",
+ "version": "4.3.0",
+ "description": "The lodash method `_.camelCase` exported as a module.",
+ "homepage": "https://lodash.com/",
+ "icon": "https://lodash.com/icon.svg",
+ "license": "MIT",
+ "keywords": "lodash-modularized, camelcase",
+ "author": "John-David Dalton <john.david.dalton@gmail.com> (http://allyoucanleet.com/)",
+ "contributors": [
+ "John-David Dalton <john.david.dalton@gmail.com> (http://allyoucanleet.com/)",
+ "Blaine Bublitz <blaine.bublitz@gmail.com> (https://github.com/phated)",
+ "Mathias Bynens <mathias@qiwi.be> (https://mathiasbynens.be/)"
+ ],
+ "repository": "lodash/lodash",
+ "scripts": { "test": "echo \"See https://travis-ci.org/lodash/lodash-cli for testing details.\"" }
+}
diff --git a/node_modules/mime-db/HISTORY.md b/node_modules/mime-db/HISTORY.md
new file mode 100644
index 0000000..7436f64
--- /dev/null
+++ b/node_modules/mime-db/HISTORY.md
@@ -0,0 +1,507 @@
+1.52.0 / 2022-02-21
+===================
+
+ * Add extensions from IANA for more `image/*` types
+ * Add extension `.asc` to `application/pgp-keys`
+ * Add extensions to various XML types
+ * Add new upstream MIME types
+
+1.51.0 / 2021-11-08
+===================
+
+ * Add new upstream MIME types
+ * Mark `image/vnd.microsoft.icon` as compressible
+ * Mark `image/vnd.ms-dds` as compressible
+
+1.50.0 / 2021-09-15
+===================
+
+ * Add deprecated iWorks mime types and extensions
+ * Add new upstream MIME types
+
+1.49.0 / 2021-07-26
+===================
+
+ * Add extension `.trig` to `application/trig`
+ * Add new upstream MIME types
+
+1.48.0 / 2021-05-30
+===================
+
+ * Add extension `.mvt` to `application/vnd.mapbox-vector-tile`
+ * Add new upstream MIME types
+ * Mark `text/yaml` as compressible
+
+1.47.0 / 2021-04-01
+===================
+
+ * Add new upstream MIME types
+ * Remove ambigious extensions from IANA for `application/*+xml` types
+ * Update primary extension to `.es` for `application/ecmascript`
+
+1.46.0 / 2021-02-13
+===================
+
+ * Add extension `.amr` to `audio/amr`
+ * Add extension `.m4s` to `video/iso.segment`
+ * Add extension `.opus` to `audio/ogg`
+ * Add new upstream MIME types
+
+1.45.0 / 2020-09-22
+===================
+
+ * Add `application/ubjson` with extension `.ubj`
+ * Add `image/avif` with extension `.avif`
+ * Add `image/ktx2` with extension `.ktx2`
+ * Add extension `.dbf` to `application/vnd.dbf`
+ * Add extension `.rar` to `application/vnd.rar`
+ * Add extension `.td` to `application/urc-targetdesc+xml`
+ * Add new upstream MIME types
+ * Fix extension of `application/vnd.apple.keynote` to be `.key`
+
+1.44.0 / 2020-04-22
+===================
+
+ * Add charsets from IANA
+ * Add extension `.cjs` to `application/node`
+ * Add new upstream MIME types
+
+1.43.0 / 2020-01-05
+===================
+
+ * Add `application/x-keepass2` with extension `.kdbx`
+ * Add extension `.mxmf` to `audio/mobile-xmf`
+ * Add extensions from IANA for `application/*+xml` types
+ * Add new upstream MIME types
+
+1.42.0 / 2019-09-25
+===================
+
+ * Add `image/vnd.ms-dds` with extension `.dds`
+ * Add new upstream MIME types
+ * Remove compressible from `multipart/mixed`
+
+1.41.0 / 2019-08-30
+===================
+
+ * Add new upstream MIME types
+ * Add `application/toml` with extension `.toml`
+ * Mark `font/ttf` as compressible
+
+1.40.0 / 2019-04-20
+===================
+
+ * Add extensions from IANA for `model/*` types
+ * Add `text/mdx` with extension `.mdx`
+
+1.39.0 / 2019-04-04
+===================
+
+ * Add extensions `.siv` and `.sieve` to `application/sieve`
+ * Add new upstream MIME types
+
+1.38.0 / 2019-02-04
+===================
+
+ * Add extension `.nq` to `application/n-quads`
+ * Add extension `.nt` to `application/n-triples`
+ * Add new upstream MIME types
+ * Mark `text/less` as compressible
+
+1.37.0 / 2018-10-19
+===================
+
+ * Add extensions to HEIC image types
+ * Add new upstream MIME types
+
+1.36.0 / 2018-08-20
+===================
+
+ * Add Apple file extensions from IANA
+ * Add extensions from IANA for `image/*` types
+ * Add new upstream MIME types
+
+1.35.0 / 2018-07-15
+===================
+
+ * Add extension `.owl` to `application/rdf+xml`
+ * Add new upstream MIME types
+ - Removes extension `.woff` from `application/font-woff`
+
+1.34.0 / 2018-06-03
+===================
+
+ * Add extension `.csl` to `application/vnd.citationstyles.style+xml`
+ * Add extension `.es` to `application/ecmascript`
+ * Add new upstream MIME types
+ * Add `UTF-8` as default charset for `text/turtle`
+ * Mark all XML-derived types as compressible
+
+1.33.0 / 2018-02-15
+===================
+
+ * Add extensions from IANA for `message/*` types
+ * Add new upstream MIME types
+ * Fix some incorrect OOXML types
+ * Remove `application/font-woff2`
+
+1.32.0 / 2017-11-29
+===================
+
+ * Add new upstream MIME types
+ * Update `text/hjson` to registered `application/hjson`
+ * Add `text/shex` with extension `.shex`
+
+1.31.0 / 2017-10-25
+===================
+
+ * Add `application/raml+yaml` with extension `.raml`
+ * Add `application/wasm` with extension `.wasm`
+ * Add new `font` type from IANA
+ * Add new upstream font extensions
+ * Add new upstream MIME types
+ * Add extensions for JPEG-2000 images
+
+1.30.0 / 2017-08-27
+===================
+
+ * Add `application/vnd.ms-outlook`
+ * Add `application/x-arj`
+ * Add extension `.mjs` to `application/javascript`
+ * Add glTF types and extensions
+ * Add new upstream MIME types
+ * Add `text/x-org`
+ * Add VirtualBox MIME types
+ * Fix `source` records for `video/*` types that are IANA
+ * Update `font/opentype` to registered `font/otf`
+
+1.29.0 / 2017-07-10
+===================
+
+ * Add `application/fido.trusted-apps+json`
+ * Add extension `.wadl` to `application/vnd.sun.wadl+xml`
+ * Add new upstream MIME types
+ * Add `UTF-8` as default charset for `text/css`
+
+1.28.0 / 2017-05-14
+===================
+
+ * Add new upstream MIME types
+ * Add extension `.gz` to `application/gzip`
+ * Update extensions `.md` and `.markdown` to be `text/markdown`
+
+1.27.0 / 2017-03-16
+===================
+
+ * Add new upstream MIME types
+ * Add `image/apng` with extension `.apng`
+
+1.26.0 / 2017-01-14
+===================
+
+ * Add new upstream MIME types
+ * Add extension `.geojson` to `application/geo+json`
+
+1.25.0 / 2016-11-11
+===================
+
+ * Add new upstream MIME types
+
+1.24.0 / 2016-09-18
+===================
+
+ * Add `audio/mp3`
+ * Add new upstream MIME types
+
+1.23.0 / 2016-05-01
+===================
+
+ * Add new upstream MIME types
+ * Add extension `.3gpp` to `audio/3gpp`
+
+1.22.0 / 2016-02-15
+===================
+
+ * Add `text/slim`
+ * Add extension `.rng` to `application/xml`
+ * Add new upstream MIME types
+ * Fix extension of `application/dash+xml` to be `.mpd`
+ * Update primary extension to `.m4a` for `audio/mp4`
+
+1.21.0 / 2016-01-06
+===================
+
+ * Add Google document types
+ * Add new upstream MIME types
+
+1.20.0 / 2015-11-10
+===================
+
+ * Add `text/x-suse-ymp`
+ * Add new upstream MIME types
+
+1.19.0 / 2015-09-17
+===================
+
+ * Add `application/vnd.apple.pkpass`
+ * Add new upstream MIME types
+
+1.18.0 / 2015-09-03
+===================
+
+ * Add new upstream MIME types
+
+1.17.0 / 2015-08-13
+===================
+
+ * Add `application/x-msdos-program`
+ * Add `audio/g711-0`
+ * Add `image/vnd.mozilla.apng`
+ * Add extension `.exe` to `application/x-msdos-program`
+
+1.16.0 / 2015-07-29
+===================
+
+ * Add `application/vnd.uri-map`
+
+1.15.0 / 2015-07-13
+===================
+
+ * Add `application/x-httpd-php`
+
+1.14.0 / 2015-06-25
+===================
+
+ * Add `application/scim+json`
+ * Add `application/vnd.3gpp.ussd+xml`
+ * Add `application/vnd.biopax.rdf+xml`
+ * Add `text/x-processing`
+
+1.13.0 / 2015-06-07
+===================
+
+ * Add nginx as a source
+ * Add `application/x-cocoa`
+ * Add `application/x-java-archive-diff`
+ * Add `application/x-makeself`
+ * Add `application/x-perl`
+ * Add `application/x-pilot`
+ * Add `application/x-redhat-package-manager`
+ * Add `application/x-sea`
+ * Add `audio/x-m4a`
+ * Add `audio/x-realaudio`
+ * Add `image/x-jng`
+ * Add `text/mathml`
+
+1.12.0 / 2015-06-05
+===================
+
+ * Add `application/bdoc`
+ * Add `application/vnd.hyperdrive+json`
+ * Add `application/x-bdoc`
+ * Add extension `.rtf` to `text/rtf`
+
+1.11.0 / 2015-05-31
+===================
+
+ * Add `audio/wav`
+ * Add `audio/wave`
+ * Add extension `.litcoffee` to `text/coffeescript`
+ * Add extension `.sfd-hdstx` to `application/vnd.hydrostatix.sof-data`
+ * Add extension `.n-gage` to `application/vnd.nokia.n-gage.symbian.install`
+
+1.10.0 / 2015-05-19
+===================
+
+ * Add `application/vnd.balsamiq.bmpr`
+ * Add `application/vnd.microsoft.portable-executable`
+ * Add `application/x-ns-proxy-autoconfig`
+
+1.9.1 / 2015-04-19
+==================
+
+ * Remove `.json` extension from `application/manifest+json`
+ - This is causing bugs downstream
+
+1.9.0 / 2015-04-19
+==================
+
+ * Add `application/manifest+json`
+ * Add `application/vnd.micro+json`
+ * Add `image/vnd.zbrush.pcx`
+ * Add `image/x-ms-bmp`
+
+1.8.0 / 2015-03-13
+==================
+
+ * Add `application/vnd.citationstyles.style+xml`
+ * Add `application/vnd.fastcopy-disk-image`
+ * Add `application/vnd.gov.sk.xmldatacontainer+xml`
+ * Add extension `.jsonld` to `application/ld+json`
+
+1.7.0 / 2015-02-08
+==================
+
+ * Add `application/vnd.gerber`
+ * Add `application/vnd.msa-disk-image`
+
+1.6.1 / 2015-02-05
+==================
+
+ * Community extensions ownership transferred from `node-mime`
+
+1.6.0 / 2015-01-29
+==================
+
+ * Add `application/jose`
+ * Add `application/jose+json`
+ * Add `application/json-seq`
+ * Add `application/jwk+json`
+ * Add `application/jwk-set+json`
+ * Add `application/jwt`
+ * Add `application/rdap+json`
+ * Add `application/vnd.gov.sk.e-form+xml`
+ * Add `application/vnd.ims.imsccv1p3`
+
+1.5.0 / 2014-12-30
+==================
+
+ * Add `application/vnd.oracle.resource+json`
+ * Fix various invalid MIME type entries
+ - `application/mbox+xml`
+ - `application/oscp-response`
+ - `application/vwg-multiplexed`
+ - `audio/g721`
+
+1.4.0 / 2014-12-21
+==================
+
+ * Add `application/vnd.ims.imsccv1p2`
+ * Fix various invalid MIME type entries
+ - `application/vnd-acucobol`
+ - `application/vnd-curl`
+ - `application/vnd-dart`
+ - `application/vnd-dxr`
+ - `application/vnd-fdf`
+ - `application/vnd-mif`
+ - `application/vnd-sema`
+ - `application/vnd-wap-wmlc`
+ - `application/vnd.adobe.flash-movie`
+ - `application/vnd.dece-zip`
+ - `application/vnd.dvb_service`
+ - `application/vnd.micrografx-igx`
+ - `application/vnd.sealed-doc`
+ - `application/vnd.sealed-eml`
+ - `application/vnd.sealed-mht`
+ - `application/vnd.sealed-ppt`
+ - `application/vnd.sealed-tiff`
+ - `application/vnd.sealed-xls`
+ - `application/vnd.sealedmedia.softseal-html`
+ - `application/vnd.sealedmedia.softseal-pdf`
+ - `application/vnd.wap-slc`
+ - `application/vnd.wap-wbxml`
+ - `audio/vnd.sealedmedia.softseal-mpeg`
+ - `image/vnd-djvu`
+ - `image/vnd-svf`
+ - `image/vnd-wap-wbmp`
+ - `image/vnd.sealed-png`
+ - `image/vnd.sealedmedia.softseal-gif`
+ - `image/vnd.sealedmedia.softseal-jpg`
+ - `model/vnd-dwf`
+ - `model/vnd.parasolid.transmit-binary`
+ - `model/vnd.parasolid.transmit-text`
+ - `text/vnd-a`
+ - `text/vnd-curl`
+ - `text/vnd.wap-wml`
+ * Remove example template MIME types
+ - `application/example`
+ - `audio/example`
+ - `image/example`
+ - `message/example`
+ - `model/example`
+ - `multipart/example`
+ - `text/example`
+ - `video/example`
+
+1.3.1 / 2014-12-16
+==================
+
+ * Fix missing extensions
+ - `application/json5`
+ - `text/hjson`
+
+1.3.0 / 2014-12-07
+==================
+
+ * Add `application/a2l`
+ * Add `application/aml`
+ * Add `application/atfx`
+ * Add `application/atxml`
+ * Add `application/cdfx+xml`
+ * Add `application/dii`
+ * Add `application/json5`
+ * Add `application/lxf`
+ * Add `application/mf4`
+ * Add `application/vnd.apache.thrift.compact`
+ * Add `application/vnd.apache.thrift.json`
+ * Add `application/vnd.coffeescript`
+ * Add `application/vnd.enphase.envoy`
+ * Add `application/vnd.ims.imsccv1p1`
+ * Add `text/csv-schema`
+ * Add `text/hjson`
+ * Add `text/markdown`
+ * Add `text/yaml`
+
+1.2.0 / 2014-11-09
+==================
+
+ * Add `application/cea`
+ * Add `application/dit`
+ * Add `application/vnd.gov.sk.e-form+zip`
+ * Add `application/vnd.tmd.mediaflex.api+xml`
+ * Type `application/epub+zip` is now IANA-registered
+
+1.1.2 / 2014-10-23
+==================
+
+ * Rebuild database for `application/x-www-form-urlencoded` change
+
+1.1.1 / 2014-10-20
+==================
+
+ * Mark `application/x-www-form-urlencoded` as compressible.
+
+1.1.0 / 2014-09-28
+==================
+
+ * Add `application/font-woff2`
+
+1.0.3 / 2014-09-25
+==================
+
+ * Fix engine requirement in package
+
+1.0.2 / 2014-09-25
+==================
+
+ * Add `application/coap-group+json`
+ * Add `application/dcd`
+ * Add `application/vnd.apache.thrift.binary`
+ * Add `image/vnd.tencent.tap`
+ * Mark all JSON-derived types as compressible
+ * Update `text/vtt` data
+
+1.0.1 / 2014-08-30
+==================
+
+ * Fix extension ordering
+
+1.0.0 / 2014-08-30
+==================
+
+ * Add `application/atf`
+ * Add `application/merge-patch+json`
+ * Add `multipart/x-mixed-replace`
+ * Add `source: 'apache'` metadata
+ * Add `source: 'iana'` metadata
+ * Remove badly-assumed charset data
diff --git a/node_modules/mime-db/LICENSE b/node_modules/mime-db/LICENSE
new file mode 100644
index 0000000..0751cb1
--- /dev/null
+++ b/node_modules/mime-db/LICENSE
@@ -0,0 +1,23 @@
+(The MIT License)
+
+Copyright (c) 2014 Jonathan Ong <me@jongleberry.com>
+Copyright (c) 2015-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/mime-db/README.md b/node_modules/mime-db/README.md
new file mode 100644
index 0000000..5a8fcfe
--- /dev/null
+++ b/node_modules/mime-db/README.md
@@ -0,0 +1,100 @@
+# mime-db
+
+[![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]
+
+This is a large database of mime types and information about them.
+It consists of a single, public JSON file and does not include any logic,
+allowing it to remain as un-opinionated as possible with an API.
+It aggregates data from the following sources:
+
+- http://www.iana.org/assignments/media-types/media-types.xhtml
+- http://svn.apache.org/repos/asf/httpd/httpd/trunk/docs/conf/mime.types
+- http://hg.nginx.org/nginx/raw-file/default/conf/mime.types
+
+## Installation
+
+```bash
+npm install mime-db
+```
+
+### Database Download
+
+If you're crazy enough to use this in the browser, you can just grab the
+JSON file using [jsDelivr](https://www.jsdelivr.com/). It is recommended to
+replace `master` with [a release tag](https://github.com/jshttp/mime-db/tags)
+as the JSON format may change in the future.
+
+```
+https://cdn.jsdelivr.net/gh/jshttp/mime-db@master/db.json
+```
+
+## Usage
+
+```js
+var db = require('mime-db')
+
+// grab data on .js files
+var data = db['application/javascript']
+```
+
+## Data Structure
+
+The JSON file is a map lookup for lowercased mime types.
+Each mime type has the following properties:
+
+- `.source` - where the mime type is defined.
+ If not set, it's probably a custom media type.
+ - `apache` - [Apache common media types](http://svn.apache.org/repos/asf/httpd/httpd/trunk/docs/conf/mime.types)
+ - `iana` - [IANA-defined media types](http://www.iana.org/assignments/media-types/media-types.xhtml)
+ - `nginx` - [nginx media types](http://hg.nginx.org/nginx/raw-file/default/conf/mime.types)
+- `.extensions[]` - known extensions associated with this mime type.
+- `.compressible` - whether a file of this type can be gzipped.
+- `.charset` - the default charset associated with this type, if any.
+
+If unknown, every property could be `undefined`.
+
+## Contributing
+
+To edit the database, only make PRs against `src/custom-types.json` or
+`src/custom-suffix.json`.
+
+The `src/custom-types.json` file is a JSON object with the MIME type as the
+keys and the values being an object with the following keys:
+
+- `compressible` - leave out if you don't know, otherwise `true`/`false` to
+ indicate whether the data represented by the type is typically compressible.
+- `extensions` - include an array of file extensions that are associated with
+ the type.
+- `notes` - human-readable notes about the type, typically what the type is.
+- `sources` - include an array of URLs of where the MIME type and the associated
+ extensions are sourced from. This needs to be a [primary source](https://en.wikipedia.org/wiki/Primary_source);
+ links to type aggregating sites and Wikipedia are _not acceptable_.
+
+To update the build, run `npm run build`.
+
+### Adding Custom Media Types
+
+The best way to get new media types included in this library is to register
+them with the IANA. The community registration procedure is outlined in
+[RFC 6838 section 5](http://tools.ietf.org/html/rfc6838#section-5). Types
+registered with the IANA are automatically pulled into this library.
+
+If that is not possible / feasible, they can be added directly here as a
+"custom" type. To do this, it is required to have a primary source that
+definitively lists the media type. If an extension is going to be listed as
+associateed with this media type, the source must definitively link the
+media type and extension as well.
+
+[ci-image]: https://badgen.net/github/checks/jshttp/mime-db/master?label=ci
+[ci-url]: https://github.com/jshttp/mime-db/actions?query=workflow%3Aci
+[coveralls-image]: https://badgen.net/coveralls/c/github/jshttp/mime-db/master
+[coveralls-url]: https://coveralls.io/r/jshttp/mime-db?branch=master
+[node-image]: https://badgen.net/npm/node/mime-db
+[node-url]: https://nodejs.org/en/download
+[npm-downloads-image]: https://badgen.net/npm/dm/mime-db
+[npm-url]: https://npmjs.org/package/mime-db
+[npm-version-image]: https://badgen.net/npm/v/mime-db
diff --git a/node_modules/mime-db/db.json b/node_modules/mime-db/db.json
new file mode 100644
index 0000000..eb9c42c
--- /dev/null
+++ b/node_modules/mime-db/db.json
@@ -0,0 +1,8519 @@
+{
+ "application/1d-interleaved-parityfec": {
+ "source": "iana"
+ },
+ "application/3gpdash-qoe-report+xml": {
+ "source": "iana",
+ "charset": "UTF-8",
+ "compressible": true
+ },
+ "application/3gpp-ims+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/3gpphal+json": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/3gpphalforms+json": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/a2l": {
+ "source": "iana"
+ },
+ "application/ace+cbor": {
+ "source": "iana"
+ },
+ "application/activemessage": {
+ "source": "iana"
+ },
+ "application/activity+json": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/alto-costmap+json": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/alto-costmapfilter+json": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/alto-directory+json": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/alto-endpointcost+json": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/alto-endpointcostparams+json": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/alto-endpointprop+json": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/alto-endpointpropparams+json": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/alto-error+json": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/alto-networkmap+json": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/alto-networkmapfilter+json": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/alto-updatestreamcontrol+json": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/alto-updatestreamparams+json": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/aml": {
+ "source": "iana"
+ },
+ "application/andrew-inset": {
+ "source": "iana",
+ "extensions": ["ez"]
+ },
+ "application/applefile": {
+ "source": "iana"
+ },
+ "application/applixware": {
+ "source": "apache",
+ "extensions": ["aw"]
+ },
+ "application/at+jwt": {
+ "source": "iana"
+ },
+ "application/atf": {
+ "source": "iana"
+ },
+ "application/atfx": {
+ "source": "iana"
+ },
+ "application/atom+xml": {
+ "source": "iana",
+ "compressible": true,
+ "extensions": ["atom"]
+ },
+ "application/atomcat+xml": {
+ "source": "iana",
+ "compressible": true,
+ "extensions": ["atomcat"]
+ },
+ "application/atomdeleted+xml": {
+ "source": "iana",
+ "compressible": true,
+ "extensions": ["atomdeleted"]
+ },
+ "application/atomicmail": {
+ "source": "iana"
+ },
+ "application/atomsvc+xml": {
+ "source": "iana",
+ "compressible": true,
+ "extensions": ["atomsvc"]
+ },
+ "application/atsc-dwd+xml": {
+ "source": "iana",
+ "compressible": true,
+ "extensions": ["dwd"]
+ },
+ "application/atsc-dynamic-event-message": {
+ "source": "iana"
+ },
+ "application/atsc-held+xml": {
+ "source": "iana",
+ "compressible": true,
+ "extensions": ["held"]
+ },
+ "application/atsc-rdt+json": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/atsc-rsat+xml": {
+ "source": "iana",
+ "compressible": true,
+ "extensions": ["rsat"]
+ },
+ "application/atxml": {
+ "source": "iana"
+ },
+ "application/auth-policy+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/bacnet-xdd+zip": {
+ "source": "iana",
+ "compressible": false
+ },
+ "application/batch-smtp": {
+ "source": "iana"
+ },
+ "application/bdoc": {
+ "compressible": false,
+ "extensions": ["bdoc"]
+ },
+ "application/beep+xml": {
+ "source": "iana",
+ "charset": "UTF-8",
+ "compressible": true
+ },
+ "application/calendar+json": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/calendar+xml": {
+ "source": "iana",
+ "compressible": true,
+ "extensions": ["xcs"]
+ },
+ "application/call-completion": {
+ "source": "iana"
+ },
+ "application/cals-1840": {
+ "source": "iana"
+ },
+ "application/captive+json": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/cbor": {
+ "source": "iana"
+ },
+ "application/cbor-seq": {
+ "source": "iana"
+ },
+ "application/cccex": {
+ "source": "iana"
+ },
+ "application/ccmp+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/ccxml+xml": {
+ "source": "iana",
+ "compressible": true,
+ "extensions": ["ccxml"]
+ },
+ "application/cdfx+xml": {
+ "source": "iana",
+ "compressible": true,
+ "extensions": ["cdfx"]
+ },
+ "application/cdmi-capability": {
+ "source": "iana",
+ "extensions": ["cdmia"]
+ },
+ "application/cdmi-container": {
+ "source": "iana",
+ "extensions": ["cdmic"]
+ },
+ "application/cdmi-domain": {
+ "source": "iana",
+ "extensions": ["cdmid"]
+ },
+ "application/cdmi-object": {
+ "source": "iana",
+ "extensions": ["cdmio"]
+ },
+ "application/cdmi-queue": {
+ "source": "iana",
+ "extensions": ["cdmiq"]
+ },
+ "application/cdni": {
+ "source": "iana"
+ },
+ "application/cea": {
+ "source": "iana"
+ },
+ "application/cea-2018+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/cellml+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/cfw": {
+ "source": "iana"
+ },
+ "application/city+json": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/clr": {
+ "source": "iana"
+ },
+ "application/clue+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/clue_info+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/cms": {
+ "source": "iana"
+ },
+ "application/cnrp+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/coap-group+json": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/coap-payload": {
+ "source": "iana"
+ },
+ "application/commonground": {
+ "source": "iana"
+ },
+ "application/conference-info+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/cose": {
+ "source": "iana"
+ },
+ "application/cose-key": {
+ "source": "iana"
+ },
+ "application/cose-key-set": {
+ "source": "iana"
+ },
+ "application/cpl+xml": {
+ "source": "iana",
+ "compressible": true,
+ "extensions": ["cpl"]
+ },
+ "application/csrattrs": {
+ "source": "iana"
+ },
+ "application/csta+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/cstadata+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/csvm+json": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/cu-seeme": {
+ "source": "apache",
+ "extensions": ["cu"]
+ },
+ "application/cwt": {
+ "source": "iana"
+ },
+ "application/cybercash": {
+ "source": "iana"
+ },
+ "application/dart": {
+ "compressible": true
+ },
+ "application/dash+xml": {
+ "source": "iana",
+ "compressible": true,
+ "extensions": ["mpd"]
+ },
+ "application/dash-patch+xml": {
+ "source": "iana",
+ "compressible": true,
+ "extensions": ["mpp"]
+ },
+ "application/dashdelta": {
+ "source": "iana"
+ },
+ "application/davmount+xml": {
+ "source": "iana",
+ "compressible": true,
+ "extensions": ["davmount"]
+ },
+ "application/dca-rft": {
+ "source": "iana"
+ },
+ "application/dcd": {
+ "source": "iana"
+ },
+ "application/dec-dx": {
+ "source": "iana"
+ },
+ "application/dialog-info+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/dicom": {
+ "source": "iana"
+ },
+ "application/dicom+json": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/dicom+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/dii": {
+ "source": "iana"
+ },
+ "application/dit": {
+ "source": "iana"
+ },
+ "application/dns": {
+ "source": "iana"
+ },
+ "application/dns+json": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/dns-message": {
+ "source": "iana"
+ },
+ "application/docbook+xml": {
+ "source": "apache",
+ "compressible": true,
+ "extensions": ["dbk"]
+ },
+ "application/dots+cbor": {
+ "source": "iana"
+ },
+ "application/dskpp+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/dssc+der": {
+ "source": "iana",
+ "extensions": ["dssc"]
+ },
+ "application/dssc+xml": {
+ "source": "iana",
+ "compressible": true,
+ "extensions": ["xdssc"]
+ },
+ "application/dvcs": {
+ "source": "iana"
+ },
+ "application/ecmascript": {
+ "source": "iana",
+ "compressible": true,
+ "extensions": ["es","ecma"]
+ },
+ "application/edi-consent": {
+ "source": "iana"
+ },
+ "application/edi-x12": {
+ "source": "iana",
+ "compressible": false
+ },
+ "application/edifact": {
+ "source": "iana",
+ "compressible": false
+ },
+ "application/efi": {
+ "source": "iana"
+ },
+ "application/elm+json": {
+ "source": "iana",
+ "charset": "UTF-8",
+ "compressible": true
+ },
+ "application/elm+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/emergencycalldata.cap+xml": {
+ "source": "iana",
+ "charset": "UTF-8",
+ "compressible": true
+ },
+ "application/emergencycalldata.comment+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/emergencycalldata.control+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/emergencycalldata.deviceinfo+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/emergencycalldata.ecall.msd": {
+ "source": "iana"
+ },
+ "application/emergencycalldata.providerinfo+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/emergencycalldata.serviceinfo+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/emergencycalldata.subscriberinfo+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/emergencycalldata.veds+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/emma+xml": {
+ "source": "iana",
+ "compressible": true,
+ "extensions": ["emma"]
+ },
+ "application/emotionml+xml": {
+ "source": "iana",
+ "compressible": true,
+ "extensions": ["emotionml"]
+ },
+ "application/encaprtp": {
+ "source": "iana"
+ },
+ "application/epp+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/epub+zip": {
+ "source": "iana",
+ "compressible": false,
+ "extensions": ["epub"]
+ },
+ "application/eshop": {
+ "source": "iana"
+ },
+ "application/exi": {
+ "source": "iana",
+ "extensions": ["exi"]
+ },
+ "application/expect-ct-report+json": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/express": {
+ "source": "iana",
+ "extensions": ["exp"]
+ },
+ "application/fastinfoset": {
+ "source": "iana"
+ },
+ "application/fastsoap": {
+ "source": "iana"
+ },
+ "application/fdt+xml": {
+ "source": "iana",
+ "compressible": true,
+ "extensions": ["fdt"]
+ },
+ "application/fhir+json": {
+ "source": "iana",
+ "charset": "UTF-8",
+ "compressible": true
+ },
+ "application/fhir+xml": {
+ "source": "iana",
+ "charset": "UTF-8",
+ "compressible": true
+ },
+ "application/fido.trusted-apps+json": {
+ "compressible": true
+ },
+ "application/fits": {
+ "source": "iana"
+ },
+ "application/flexfec": {
+ "source": "iana"
+ },
+ "application/font-sfnt": {
+ "source": "iana"
+ },
+ "application/font-tdpfr": {
+ "source": "iana",
+ "extensions": ["pfr"]
+ },
+ "application/font-woff": {
+ "source": "iana",
+ "compressible": false
+ },
+ "application/framework-attributes+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/geo+json": {
+ "source": "iana",
+ "compressible": true,
+ "extensions": ["geojson"]
+ },
+ "application/geo+json-seq": {
+ "source": "iana"
+ },
+ "application/geopackage+sqlite3": {
+ "source": "iana"
+ },
+ "application/geoxacml+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/gltf-buffer": {
+ "source": "iana"
+ },
+ "application/gml+xml": {
+ "source": "iana",
+ "compressible": true,
+ "extensions": ["gml"]
+ },
+ "application/gpx+xml": {
+ "source": "apache",
+ "compressible": true,
+ "extensions": ["gpx"]
+ },
+ "application/gxf": {
+ "source": "apache",
+ "extensions": ["gxf"]
+ },
+ "application/gzip": {
+ "source": "iana",
+ "compressible": false,
+ "extensions": ["gz"]
+ },
+ "application/h224": {
+ "source": "iana"
+ },
+ "application/held+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/hjson": {
+ "extensions": ["hjson"]
+ },
+ "application/http": {
+ "source": "iana"
+ },
+ "application/hyperstudio": {
+ "source": "iana",
+ "extensions": ["stk"]
+ },
+ "application/ibe-key-request+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/ibe-pkg-reply+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/ibe-pp-data": {
+ "source": "iana"
+ },
+ "application/iges": {
+ "source": "iana"
+ },
+ "application/im-iscomposing+xml": {
+ "source": "iana",
+ "charset": "UTF-8",
+ "compressible": true
+ },
+ "application/index": {
+ "source": "iana"
+ },
+ "application/index.cmd": {
+ "source": "iana"
+ },
+ "application/index.obj": {
+ "source": "iana"
+ },
+ "application/index.response": {
+ "source": "iana"
+ },
+ "application/index.vnd": {
+ "source": "iana"
+ },
+ "application/inkml+xml": {
+ "source": "iana",
+ "compressible": true,
+ "extensions": ["ink","inkml"]
+ },
+ "application/iotp": {
+ "source": "iana"
+ },
+ "application/ipfix": {
+ "source": "iana",
+ "extensions": ["ipfix"]
+ },
+ "application/ipp": {
+ "source": "iana"
+ },
+ "application/isup": {
+ "source": "iana"
+ },
+ "application/its+xml": {
+ "source": "iana",
+ "compressible": true,
+ "extensions": ["its"]
+ },
+ "application/java-archive": {
+ "source": "apache",
+ "compressible": false,
+ "extensions": ["jar","war","ear"]
+ },
+ "application/java-serialized-object": {
+ "source": "apache",
+ "compressible": false,
+ "extensions": ["ser"]
+ },
+ "application/java-vm": {
+ "source": "apache",
+ "compressible": false,
+ "extensions": ["class"]
+ },
+ "application/javascript": {
+ "source": "iana",
+ "charset": "UTF-8",
+ "compressible": true,
+ "extensions": ["js","mjs"]
+ },
+ "application/jf2feed+json": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/jose": {
+ "source": "iana"
+ },
+ "application/jose+json": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/jrd+json": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/jscalendar+json": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/json": {
+ "source": "iana",
+ "charset": "UTF-8",
+ "compressible": true,
+ "extensions": ["json","map"]
+ },
+ "application/json-patch+json": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/json-seq": {
+ "source": "iana"
+ },
+ "application/json5": {
+ "extensions": ["json5"]
+ },
+ "application/jsonml+json": {
+ "source": "apache",
+ "compressible": true,
+ "extensions": ["jsonml"]
+ },
+ "application/jwk+json": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/jwk-set+json": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/jwt": {
+ "source": "iana"
+ },
+ "application/kpml-request+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/kpml-response+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/ld+json": {
+ "source": "iana",
+ "compressible": true,
+ "extensions": ["jsonld"]
+ },
+ "application/lgr+xml": {
+ "source": "iana",
+ "compressible": true,
+ "extensions": ["lgr"]
+ },
+ "application/link-format": {
+ "source": "iana"
+ },
+ "application/load-control+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/lost+xml": {
+ "source": "iana",
+ "compressible": true,
+ "extensions": ["lostxml"]
+ },
+ "application/lostsync+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/lpf+zip": {
+ "source": "iana",
+ "compressible": false
+ },
+ "application/lxf": {
+ "source": "iana"
+ },
+ "application/mac-binhex40": {
+ "source": "iana",
+ "extensions": ["hqx"]
+ },
+ "application/mac-compactpro": {
+ "source": "apache",
+ "extensions": ["cpt"]
+ },
+ "application/macwriteii": {
+ "source": "iana"
+ },
+ "application/mads+xml": {
+ "source": "iana",
+ "compressible": true,
+ "extensions": ["mads"]
+ },
+ "application/manifest+json": {
+ "source": "iana",
+ "charset": "UTF-8",
+ "compressible": true,
+ "extensions": ["webmanifest"]
+ },
+ "application/marc": {
+ "source": "iana",
+ "extensions": ["mrc"]
+ },
+ "application/marcxml+xml": {
+ "source": "iana",
+ "compressible": true,
+ "extensions": ["mrcx"]
+ },
+ "application/mathematica": {
+ "source": "iana",
+ "extensions": ["ma","nb","mb"]
+ },
+ "application/mathml+xml": {
+ "source": "iana",
+ "compressible": true,
+ "extensions": ["mathml"]
+ },
+ "application/mathml-content+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/mathml-presentation+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/mbms-associated-procedure-description+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/mbms-deregister+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/mbms-envelope+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/mbms-msk+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/mbms-msk-response+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/mbms-protection-description+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/mbms-reception-report+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/mbms-register+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/mbms-register-response+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/mbms-schedule+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/mbms-user-service-description+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/mbox": {
+ "source": "iana",
+ "extensions": ["mbox"]
+ },
+ "application/media-policy-dataset+xml": {
+ "source": "iana",
+ "compressible": true,
+ "extensions": ["mpf"]
+ },
+ "application/media_control+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/mediaservercontrol+xml": {
+ "source": "iana",
+ "compressible": true,
+ "extensions": ["mscml"]
+ },
+ "application/merge-patch+json": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/metalink+xml": {
+ "source": "apache",
+ "compressible": true,
+ "extensions": ["metalink"]
+ },
+ "application/metalink4+xml": {
+ "source": "iana",
+ "compressible": true,
+ "extensions": ["meta4"]
+ },
+ "application/mets+xml": {
+ "source": "iana",
+ "compressible": true,
+ "extensions": ["mets"]
+ },
+ "application/mf4": {
+ "source": "iana"
+ },
+ "application/mikey": {
+ "source": "iana"
+ },
+ "application/mipc": {
+ "source": "iana"
+ },
+ "application/missing-blocks+cbor-seq": {
+ "source": "iana"
+ },
+ "application/mmt-aei+xml": {
+ "source": "iana",
+ "compressible": true,
+ "extensions": ["maei"]
+ },
+ "application/mmt-usd+xml": {
+ "source": "iana",
+ "compressible": true,
+ "extensions": ["musd"]
+ },
+ "application/mods+xml": {
+ "source": "iana",
+ "compressible": true,
+ "extensions": ["mods"]
+ },
+ "application/moss-keys": {
+ "source": "iana"
+ },
+ "application/moss-signature": {
+ "source": "iana"
+ },
+ "application/mosskey-data": {
+ "source": "iana"
+ },
+ "application/mosskey-request": {
+ "source": "iana"
+ },
+ "application/mp21": {
+ "source": "iana",
+ "extensions": ["m21","mp21"]
+ },
+ "application/mp4": {
+ "source": "iana",
+ "extensions": ["mp4s","m4p"]
+ },
+ "application/mpeg4-generic": {
+ "source": "iana"
+ },
+ "application/mpeg4-iod": {
+ "source": "iana"
+ },
+ "application/mpeg4-iod-xmt": {
+ "source": "iana"
+ },
+ "application/mrb-consumer+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/mrb-publish+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/msc-ivr+xml": {
+ "source": "iana",
+ "charset": "UTF-8",
+ "compressible": true
+ },
+ "application/msc-mixer+xml": {
+ "source": "iana",
+ "charset": "UTF-8",
+ "compressible": true
+ },
+ "application/msword": {
+ "source": "iana",
+ "compressible": false,
+ "extensions": ["doc","dot"]
+ },
+ "application/mud+json": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/multipart-core": {
+ "source": "iana"
+ },
+ "application/mxf": {
+ "source": "iana",
+ "extensions": ["mxf"]
+ },
+ "application/n-quads": {
+ "source": "iana",
+ "extensions": ["nq"]
+ },
+ "application/n-triples": {
+ "source": "iana",
+ "extensions": ["nt"]
+ },
+ "application/nasdata": {
+ "source": "iana"
+ },
+ "application/news-checkgroups": {
+ "source": "iana",
+ "charset": "US-ASCII"
+ },
+ "application/news-groupinfo": {
+ "source": "iana",
+ "charset": "US-ASCII"
+ },
+ "application/news-transmission": {
+ "source": "iana"
+ },
+ "application/nlsml+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/node": {
+ "source": "iana",
+ "extensions": ["cjs"]
+ },
+ "application/nss": {
+ "source": "iana"
+ },
+ "application/oauth-authz-req+jwt": {
+ "source": "iana"
+ },
+ "application/oblivious-dns-message": {
+ "source": "iana"
+ },
+ "application/ocsp-request": {
+ "source": "iana"
+ },
+ "application/ocsp-response": {
+ "source": "iana"
+ },
+ "application/octet-stream": {
+ "source": "iana",
+ "compressible": false,
+ "extensions": ["bin","dms","lrf","mar","so","dist","distz","pkg","bpk","dump","elc","deploy","exe","dll","deb","dmg","iso","img","msi","msp","msm","buffer"]
+ },
+ "application/oda": {
+ "source": "iana",
+ "extensions": ["oda"]
+ },
+ "application/odm+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/odx": {
+ "source": "iana"
+ },
+ "application/oebps-package+xml": {
+ "source": "iana",
+ "compressible": true,
+ "extensions": ["opf"]
+ },
+ "application/ogg": {
+ "source": "iana",
+ "compressible": false,
+ "extensions": ["ogx"]
+ },
+ "application/omdoc+xml": {
+ "source": "apache",
+ "compressible": true,
+ "extensions": ["omdoc"]
+ },
+ "application/onenote": {
+ "source": "apache",
+ "extensions": ["onetoc","onetoc2","onetmp","onepkg"]
+ },
+ "application/opc-nodeset+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/oscore": {
+ "source": "iana"
+ },
+ "application/oxps": {
+ "source": "iana",
+ "extensions": ["oxps"]
+ },
+ "application/p21": {
+ "source": "iana"
+ },
+ "application/p21+zip": {
+ "source": "iana",
+ "compressible": false
+ },
+ "application/p2p-overlay+xml": {
+ "source": "iana",
+ "compressible": true,
+ "extensions": ["relo"]
+ },
+ "application/parityfec": {
+ "source": "iana"
+ },
+ "application/passport": {
+ "source": "iana"
+ },
+ "application/patch-ops-error+xml": {
+ "source": "iana",
+ "compressible": true,
+ "extensions": ["xer"]
+ },
+ "application/pdf": {
+ "source": "iana",
+ "compressible": false,
+ "extensions": ["pdf"]
+ },
+ "application/pdx": {
+ "source": "iana"
+ },
+ "application/pem-certificate-chain": {
+ "source": "iana"
+ },
+ "application/pgp-encrypted": {
+ "source": "iana",
+ "compressible": false,
+ "extensions": ["pgp"]
+ },
+ "application/pgp-keys": {
+ "source": "iana",
+ "extensions": ["asc"]
+ },
+ "application/pgp-signature": {
+ "source": "iana",
+ "extensions": ["asc","sig"]
+ },
+ "application/pics-rules": {
+ "source": "apache",
+ "extensions": ["prf"]
+ },
+ "application/pidf+xml": {
+ "source": "iana",
+ "charset": "UTF-8",
+ "compressible": true
+ },
+ "application/pidf-diff+xml": {
+ "source": "iana",
+ "charset": "UTF-8",
+ "compressible": true
+ },
+ "application/pkcs10": {
+ "source": "iana",
+ "extensions": ["p10"]
+ },
+ "application/pkcs12": {
+ "source": "iana"
+ },
+ "application/pkcs7-mime": {
+ "source": "iana",
+ "extensions": ["p7m","p7c"]
+ },
+ "application/pkcs7-signature": {
+ "source": "iana",
+ "extensions": ["p7s"]
+ },
+ "application/pkcs8": {
+ "source": "iana",
+ "extensions": ["p8"]
+ },
+ "application/pkcs8-encrypted": {
+ "source": "iana"
+ },
+ "application/pkix-attr-cert": {
+ "source": "iana",
+ "extensions": ["ac"]
+ },
+ "application/pkix-cert": {
+ "source": "iana",
+ "extensions": ["cer"]
+ },
+ "application/pkix-crl": {
+ "source": "iana",
+ "extensions": ["crl"]
+ },
+ "application/pkix-pkipath": {
+ "source": "iana",
+ "extensions": ["pkipath"]
+ },
+ "application/pkixcmp": {
+ "source": "iana",
+ "extensions": ["pki"]
+ },
+ "application/pls+xml": {
+ "source": "iana",
+ "compressible": true,
+ "extensions": ["pls"]
+ },
+ "application/poc-settings+xml": {
+ "source": "iana",
+ "charset": "UTF-8",
+ "compressible": true
+ },
+ "application/postscript": {
+ "source": "iana",
+ "compressible": true,
+ "extensions": ["ai","eps","ps"]
+ },
+ "application/ppsp-tracker+json": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/problem+json": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/problem+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/provenance+xml": {
+ "source": "iana",
+ "compressible": true,
+ "extensions": ["provx"]
+ },
+ "application/prs.alvestrand.titrax-sheet": {
+ "source": "iana"
+ },
+ "application/prs.cww": {
+ "source": "iana",
+ "extensions": ["cww"]
+ },
+ "application/prs.cyn": {
+ "source": "iana",
+ "charset": "7-BIT"
+ },
+ "application/prs.hpub+zip": {
+ "source": "iana",
+ "compressible": false
+ },
+ "application/prs.nprend": {
+ "source": "iana"
+ },
+ "application/prs.plucker": {
+ "source": "iana"
+ },
+ "application/prs.rdf-xml-crypt": {
+ "source": "iana"
+ },
+ "application/prs.xsf+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/pskc+xml": {
+ "source": "iana",
+ "compressible": true,
+ "extensions": ["pskcxml"]
+ },
+ "application/pvd+json": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/qsig": {
+ "source": "iana"
+ },
+ "application/raml+yaml": {
+ "compressible": true,
+ "extensions": ["raml"]
+ },
+ "application/raptorfec": {
+ "source": "iana"
+ },
+ "application/rdap+json": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/rdf+xml": {
+ "source": "iana",
+ "compressible": true,
+ "extensions": ["rdf","owl"]
+ },
+ "application/reginfo+xml": {
+ "source": "iana",
+ "compressible": true,
+ "extensions": ["rif"]
+ },
+ "application/relax-ng-compact-syntax": {
+ "source": "iana",
+ "extensions": ["rnc"]
+ },
+ "application/remote-printing": {
+ "source": "iana"
+ },
+ "application/reputon+json": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/resource-lists+xml": {
+ "source": "iana",
+ "compressible": true,
+ "extensions": ["rl"]
+ },
+ "application/resource-lists-diff+xml": {
+ "source": "iana",
+ "compressible": true,
+ "extensions": ["rld"]
+ },
+ "application/rfc+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/riscos": {
+ "source": "iana"
+ },
+ "application/rlmi+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/rls-services+xml": {
+ "source": "iana",
+ "compressible": true,
+ "extensions": ["rs"]
+ },
+ "application/route-apd+xml": {
+ "source": "iana",
+ "compressible": true,
+ "extensions": ["rapd"]
+ },
+ "application/route-s-tsid+xml": {
+ "source": "iana",
+ "compressible": true,
+ "extensions": ["sls"]
+ },
+ "application/route-usd+xml": {
+ "source": "iana",
+ "compressible": true,
+ "extensions": ["rusd"]
+ },
+ "application/rpki-ghostbusters": {
+ "source": "iana",
+ "extensions": ["gbr"]
+ },
+ "application/rpki-manifest": {
+ "source": "iana",
+ "extensions": ["mft"]
+ },
+ "application/rpki-publication": {
+ "source": "iana"
+ },
+ "application/rpki-roa": {
+ "source": "iana",
+ "extensions": ["roa"]
+ },
+ "application/rpki-updown": {
+ "source": "iana"
+ },
+ "application/rsd+xml": {
+ "source": "apache",
+ "compressible": true,
+ "extensions": ["rsd"]
+ },
+ "application/rss+xml": {
+ "source": "apache",
+ "compressible": true,
+ "extensions": ["rss"]
+ },
+ "application/rtf": {
+ "source": "iana",
+ "compressible": true,
+ "extensions": ["rtf"]
+ },
+ "application/rtploopback": {
+ "source": "iana"
+ },
+ "application/rtx": {
+ "source": "iana"
+ },
+ "application/samlassertion+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/samlmetadata+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/sarif+json": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/sarif-external-properties+json": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/sbe": {
+ "source": "iana"
+ },
+ "application/sbml+xml": {
+ "source": "iana",
+ "compressible": true,
+ "extensions": ["sbml"]
+ },
+ "application/scaip+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/scim+json": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/scvp-cv-request": {
+ "source": "iana",
+ "extensions": ["scq"]
+ },
+ "application/scvp-cv-response": {
+ "source": "iana",
+ "extensions": ["scs"]
+ },
+ "application/scvp-vp-request": {
+ "source": "iana",
+ "extensions": ["spq"]
+ },
+ "application/scvp-vp-response": {
+ "source": "iana",
+ "extensions": ["spp"]
+ },
+ "application/sdp": {
+ "source": "iana",
+ "extensions": ["sdp"]
+ },
+ "application/secevent+jwt": {
+ "source": "iana"
+ },
+ "application/senml+cbor": {
+ "source": "iana"
+ },
+ "application/senml+json": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/senml+xml": {
+ "source": "iana",
+ "compressible": true,
+ "extensions": ["senmlx"]
+ },
+ "application/senml-etch+cbor": {
+ "source": "iana"
+ },
+ "application/senml-etch+json": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/senml-exi": {
+ "source": "iana"
+ },
+ "application/sensml+cbor": {
+ "source": "iana"
+ },
+ "application/sensml+json": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/sensml+xml": {
+ "source": "iana",
+ "compressible": true,
+ "extensions": ["sensmlx"]
+ },
+ "application/sensml-exi": {
+ "source": "iana"
+ },
+ "application/sep+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/sep-exi": {
+ "source": "iana"
+ },
+ "application/session-info": {
+ "source": "iana"
+ },
+ "application/set-payment": {
+ "source": "iana"
+ },
+ "application/set-payment-initiation": {
+ "source": "iana",
+ "extensions": ["setpay"]
+ },
+ "application/set-registration": {
+ "source": "iana"
+ },
+ "application/set-registration-initiation": {
+ "source": "iana",
+ "extensions": ["setreg"]
+ },
+ "application/sgml": {
+ "source": "iana"
+ },
+ "application/sgml-open-catalog": {
+ "source": "iana"
+ },
+ "application/shf+xml": {
+ "source": "iana",
+ "compressible": true,
+ "extensions": ["shf"]
+ },
+ "application/sieve": {
+ "source": "iana",
+ "extensions": ["siv","sieve"]
+ },
+ "application/simple-filter+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/simple-message-summary": {
+ "source": "iana"
+ },
+ "application/simplesymbolcontainer": {
+ "source": "iana"
+ },
+ "application/sipc": {
+ "source": "iana"
+ },
+ "application/slate": {
+ "source": "iana"
+ },
+ "application/smil": {
+ "source": "iana"
+ },
+ "application/smil+xml": {
+ "source": "iana",
+ "compressible": true,
+ "extensions": ["smi","smil"]
+ },
+ "application/smpte336m": {
+ "source": "iana"
+ },
+ "application/soap+fastinfoset": {
+ "source": "iana"
+ },
+ "application/soap+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/sparql-query": {
+ "source": "iana",
+ "extensions": ["rq"]
+ },
+ "application/sparql-results+xml": {
+ "source": "iana",
+ "compressible": true,
+ "extensions": ["srx"]
+ },
+ "application/spdx+json": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/spirits-event+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/sql": {
+ "source": "iana"
+ },
+ "application/srgs": {
+ "source": "iana",
+ "extensions": ["gram"]
+ },
+ "application/srgs+xml": {
+ "source": "iana",
+ "compressible": true,
+ "extensions": ["grxml"]
+ },
+ "application/sru+xml": {
+ "source": "iana",
+ "compressible": true,
+ "extensions": ["sru"]
+ },
+ "application/ssdl+xml": {
+ "source": "apache",
+ "compressible": true,
+ "extensions": ["ssdl"]
+ },
+ "application/ssml+xml": {
+ "source": "iana",
+ "compressible": true,
+ "extensions": ["ssml"]
+ },
+ "application/stix+json": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/swid+xml": {
+ "source": "iana",
+ "compressible": true,
+ "extensions": ["swidtag"]
+ },
+ "application/tamp-apex-update": {
+ "source": "iana"
+ },
+ "application/tamp-apex-update-confirm": {
+ "source": "iana"
+ },
+ "application/tamp-community-update": {
+ "source": "iana"
+ },
+ "application/tamp-community-update-confirm": {
+ "source": "iana"
+ },
+ "application/tamp-error": {
+ "source": "iana"
+ },
+ "application/tamp-sequence-adjust": {
+ "source": "iana"
+ },
+ "application/tamp-sequence-adjust-confirm": {
+ "source": "iana"
+ },
+ "application/tamp-status-query": {
+ "source": "iana"
+ },
+ "application/tamp-status-response": {
+ "source": "iana"
+ },
+ "application/tamp-update": {
+ "source": "iana"
+ },
+ "application/tamp-update-confirm": {
+ "source": "iana"
+ },
+ "application/tar": {
+ "compressible": true
+ },
+ "application/taxii+json": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/td+json": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/tei+xml": {
+ "source": "iana",
+ "compressible": true,
+ "extensions": ["tei","teicorpus"]
+ },
+ "application/tetra_isi": {
+ "source": "iana"
+ },
+ "application/thraud+xml": {
+ "source": "iana",
+ "compressible": true,
+ "extensions": ["tfi"]
+ },
+ "application/timestamp-query": {
+ "source": "iana"
+ },
+ "application/timestamp-reply": {
+ "source": "iana"
+ },
+ "application/timestamped-data": {
+ "source": "iana",
+ "extensions": ["tsd"]
+ },
+ "application/tlsrpt+gzip": {
+ "source": "iana"
+ },
+ "application/tlsrpt+json": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/tnauthlist": {
+ "source": "iana"
+ },
+ "application/token-introspection+jwt": {
+ "source": "iana"
+ },
+ "application/toml": {
+ "compressible": true,
+ "extensions": ["toml"]
+ },
+ "application/trickle-ice-sdpfrag": {
+ "source": "iana"
+ },
+ "application/trig": {
+ "source": "iana",
+ "extensions": ["trig"]
+ },
+ "application/ttml+xml": {
+ "source": "iana",
+ "compressible": true,
+ "extensions": ["ttml"]
+ },
+ "application/tve-trigger": {
+ "source": "iana"
+ },
+ "application/tzif": {
+ "source": "iana"
+ },
+ "application/tzif-leap": {
+ "source": "iana"
+ },
+ "application/ubjson": {
+ "compressible": false,
+ "extensions": ["ubj"]
+ },
+ "application/ulpfec": {
+ "source": "iana"
+ },
+ "application/urc-grpsheet+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/urc-ressheet+xml": {
+ "source": "iana",
+ "compressible": true,
+ "extensions": ["rsheet"]
+ },
+ "application/urc-targetdesc+xml": {
+ "source": "iana",
+ "compressible": true,
+ "extensions": ["td"]
+ },
+ "application/urc-uisocketdesc+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vcard+json": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vcard+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vemmi": {
+ "source": "iana"
+ },
+ "application/vividence.scriptfile": {
+ "source": "apache"
+ },
+ "application/vnd.1000minds.decision-model+xml": {
+ "source": "iana",
+ "compressible": true,
+ "extensions": ["1km"]
+ },
+ "application/vnd.3gpp-prose+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.3gpp-prose-pc3ch+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.3gpp-v2x-local-service-information": {
+ "source": "iana"
+ },
+ "application/vnd.3gpp.5gnas": {
+ "source": "iana"
+ },
+ "application/vnd.3gpp.access-transfer-events+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.3gpp.bsf+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.3gpp.gmop+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.3gpp.gtpc": {
+ "source": "iana"
+ },
+ "application/vnd.3gpp.interworking-data": {
+ "source": "iana"
+ },
+ "application/vnd.3gpp.lpp": {
+ "source": "iana"
+ },
+ "application/vnd.3gpp.mc-signalling-ear": {
+ "source": "iana"
+ },
+ "application/vnd.3gpp.mcdata-affiliation-command+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.3gpp.mcdata-info+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.3gpp.mcdata-payload": {
+ "source": "iana"
+ },
+ "application/vnd.3gpp.mcdata-service-config+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.3gpp.mcdata-signalling": {
+ "source": "iana"
+ },
+ "application/vnd.3gpp.mcdata-ue-config+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.3gpp.mcdata-user-profile+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.3gpp.mcptt-affiliation-command+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.3gpp.mcptt-floor-request+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.3gpp.mcptt-info+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.3gpp.mcptt-location-info+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.3gpp.mcptt-mbms-usage-info+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.3gpp.mcptt-service-config+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.3gpp.mcptt-signed+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.3gpp.mcptt-ue-config+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.3gpp.mcptt-ue-init-config+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.3gpp.mcptt-user-profile+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.3gpp.mcvideo-affiliation-command+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.3gpp.mcvideo-affiliation-info+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.3gpp.mcvideo-info+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.3gpp.mcvideo-location-info+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.3gpp.mcvideo-mbms-usage-info+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.3gpp.mcvideo-service-config+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.3gpp.mcvideo-transmission-request+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.3gpp.mcvideo-ue-config+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.3gpp.mcvideo-user-profile+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.3gpp.mid-call+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.3gpp.ngap": {
+ "source": "iana"
+ },
+ "application/vnd.3gpp.pfcp": {
+ "source": "iana"
+ },
+ "application/vnd.3gpp.pic-bw-large": {
+ "source": "iana",
+ "extensions": ["plb"]
+ },
+ "application/vnd.3gpp.pic-bw-small": {
+ "source": "iana",
+ "extensions": ["psb"]
+ },
+ "application/vnd.3gpp.pic-bw-var": {
+ "source": "iana",
+ "extensions": ["pvb"]
+ },
+ "application/vnd.3gpp.s1ap": {
+ "source": "iana"
+ },
+ "application/vnd.3gpp.sms": {
+ "source": "iana"
+ },
+ "application/vnd.3gpp.sms+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.3gpp.srvcc-ext+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.3gpp.srvcc-info+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.3gpp.state-and-event-info+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.3gpp.ussd+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.3gpp2.bcmcsinfo+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.3gpp2.sms": {
+ "source": "iana"
+ },
+ "application/vnd.3gpp2.tcap": {
+ "source": "iana",
+ "extensions": ["tcap"]
+ },
+ "application/vnd.3lightssoftware.imagescal": {
+ "source": "iana"
+ },
+ "application/vnd.3m.post-it-notes": {
+ "source": "iana",
+ "extensions": ["pwn"]
+ },
+ "application/vnd.accpac.simply.aso": {
+ "source": "iana",
+ "extensions": ["aso"]
+ },
+ "application/vnd.accpac.simply.imp": {
+ "source": "iana",
+ "extensions": ["imp"]
+ },
+ "application/vnd.acucobol": {
+ "source": "iana",
+ "extensions": ["acu"]
+ },
+ "application/vnd.acucorp": {
+ "source": "iana",
+ "extensions": ["atc","acutc"]
+ },
+ "application/vnd.adobe.air-application-installer-package+zip": {
+ "source": "apache",
+ "compressible": false,
+ "extensions": ["air"]
+ },
+ "application/vnd.adobe.flash.movie": {
+ "source": "iana"
+ },
+ "application/vnd.adobe.formscentral.fcdt": {
+ "source": "iana",
+ "extensions": ["fcdt"]
+ },
+ "application/vnd.adobe.fxp": {
+ "source": "iana",
+ "extensions": ["fxp","fxpl"]
+ },
+ "application/vnd.adobe.partial-upload": {
+ "source": "iana"
+ },
+ "application/vnd.adobe.xdp+xml": {
+ "source": "iana",
+ "compressible": true,
+ "extensions": ["xdp"]
+ },
+ "application/vnd.adobe.xfdf": {
+ "source": "iana",
+ "extensions": ["xfdf"]
+ },
+ "application/vnd.aether.imp": {
+ "source": "iana"
+ },
+ "application/vnd.afpc.afplinedata": {
+ "source": "iana"
+ },
+ "application/vnd.afpc.afplinedata-pagedef": {
+ "source": "iana"
+ },
+ "application/vnd.afpc.cmoca-cmresource": {
+ "source": "iana"
+ },
+ "application/vnd.afpc.foca-charset": {
+ "source": "iana"
+ },
+ "application/vnd.afpc.foca-codedfont": {
+ "source": "iana"
+ },
+ "application/vnd.afpc.foca-codepage": {
+ "source": "iana"
+ },
+ "application/vnd.afpc.modca": {
+ "source": "iana"
+ },
+ "application/vnd.afpc.modca-cmtable": {
+ "source": "iana"
+ },
+ "application/vnd.afpc.modca-formdef": {
+ "source": "iana"
+ },
+ "application/vnd.afpc.modca-mediummap": {
+ "source": "iana"
+ },
+ "application/vnd.afpc.modca-objectcontainer": {
+ "source": "iana"
+ },
+ "application/vnd.afpc.modca-overlay": {
+ "source": "iana"
+ },
+ "application/vnd.afpc.modca-pagesegment": {
+ "source": "iana"
+ },
+ "application/vnd.age": {
+ "source": "iana",
+ "extensions": ["age"]
+ },
+ "application/vnd.ah-barcode": {
+ "source": "iana"
+ },
+ "application/vnd.ahead.space": {
+ "source": "iana",
+ "extensions": ["ahead"]
+ },
+ "application/vnd.airzip.filesecure.azf": {
+ "source": "iana",
+ "extensions": ["azf"]
+ },
+ "application/vnd.airzip.filesecure.azs": {
+ "source": "iana",
+ "extensions": ["azs"]
+ },
+ "application/vnd.amadeus+json": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.amazon.ebook": {
+ "source": "apache",
+ "extensions": ["azw"]
+ },
+ "application/vnd.amazon.mobi8-ebook": {
+ "source": "iana"
+ },
+ "application/vnd.americandynamics.acc": {
+ "source": "iana",
+ "extensions": ["acc"]
+ },
+ "application/vnd.amiga.ami": {
+ "source": "iana",
+ "extensions": ["ami"]
+ },
+ "application/vnd.amundsen.maze+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.android.ota": {
+ "source": "iana"
+ },
+ "application/vnd.android.package-archive": {
+ "source": "apache",
+ "compressible": false,
+ "extensions": ["apk"]
+ },
+ "application/vnd.anki": {
+ "source": "iana"
+ },
+ "application/vnd.anser-web-certificate-issue-initiation": {
+ "source": "iana",
+ "extensions": ["cii"]
+ },
+ "application/vnd.anser-web-funds-transfer-initiation": {
+ "source": "apache",
+ "extensions": ["fti"]
+ },
+ "application/vnd.antix.game-component": {
+ "source": "iana",
+ "extensions": ["atx"]
+ },
+ "application/vnd.apache.arrow.file": {
+ "source": "iana"
+ },
+ "application/vnd.apache.arrow.stream": {
+ "source": "iana"
+ },
+ "application/vnd.apache.thrift.binary": {
+ "source": "iana"
+ },
+ "application/vnd.apache.thrift.compact": {
+ "source": "iana"
+ },
+ "application/vnd.apache.thrift.json": {
+ "source": "iana"
+ },
+ "application/vnd.api+json": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.aplextor.warrp+json": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.apothekende.reservation+json": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.apple.installer+xml": {
+ "source": "iana",
+ "compressible": true,
+ "extensions": ["mpkg"]
+ },
+ "application/vnd.apple.keynote": {
+ "source": "iana",
+ "extensions": ["key"]
+ },
+ "application/vnd.apple.mpegurl": {
+ "source": "iana",
+ "extensions": ["m3u8"]
+ },
+ "application/vnd.apple.numbers": {
+ "source": "iana",
+ "extensions": ["numbers"]
+ },
+ "application/vnd.apple.pages": {
+ "source": "iana",
+ "extensions": ["pages"]
+ },
+ "application/vnd.apple.pkpass": {
+ "compressible": false,
+ "extensions": ["pkpass"]
+ },
+ "application/vnd.arastra.swi": {
+ "source": "iana"
+ },
+ "application/vnd.aristanetworks.swi": {
+ "source": "iana",
+ "extensions": ["swi"]
+ },
+ "application/vnd.artisan+json": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.artsquare": {
+ "source": "iana"
+ },
+ "application/vnd.astraea-software.iota": {
+ "source": "iana",
+ "extensions": ["iota"]
+ },
+ "application/vnd.audiograph": {
+ "source": "iana",
+ "extensions": ["aep"]
+ },
+ "application/vnd.autopackage": {
+ "source": "iana"
+ },
+ "application/vnd.avalon+json": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.avistar+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.balsamiq.bmml+xml": {
+ "source": "iana",
+ "compressible": true,
+ "extensions": ["bmml"]
+ },
+ "application/vnd.balsamiq.bmpr": {
+ "source": "iana"
+ },
+ "application/vnd.banana-accounting": {
+ "source": "iana"
+ },
+ "application/vnd.bbf.usp.error": {
+ "source": "iana"
+ },
+ "application/vnd.bbf.usp.msg": {
+ "source": "iana"
+ },
+ "application/vnd.bbf.usp.msg+json": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.bekitzur-stech+json": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.bint.med-content": {
+ "source": "iana"
+ },
+ "application/vnd.biopax.rdf+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.blink-idb-value-wrapper": {
+ "source": "iana"
+ },
+ "application/vnd.blueice.multipass": {
+ "source": "iana",
+ "extensions": ["mpm"]
+ },
+ "application/vnd.bluetooth.ep.oob": {
+ "source": "iana"
+ },
+ "application/vnd.bluetooth.le.oob": {
+ "source": "iana"
+ },
+ "application/vnd.bmi": {
+ "source": "iana",
+ "extensions": ["bmi"]
+ },
+ "application/vnd.bpf": {
+ "source": "iana"
+ },
+ "application/vnd.bpf3": {
+ "source": "iana"
+ },
+ "application/vnd.businessobjects": {
+ "source": "iana",
+ "extensions": ["rep"]
+ },
+ "application/vnd.byu.uapi+json": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.cab-jscript": {
+ "source": "iana"
+ },
+ "application/vnd.canon-cpdl": {
+ "source": "iana"
+ },
+ "application/vnd.canon-lips": {
+ "source": "iana"
+ },
+ "application/vnd.capasystems-pg+json": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.cendio.thinlinc.clientconf": {
+ "source": "iana"
+ },
+ "application/vnd.century-systems.tcp_stream": {
+ "source": "iana"
+ },
+ "application/vnd.chemdraw+xml": {
+ "source": "iana",
+ "compressible": true,
+ "extensions": ["cdxml"]
+ },
+ "application/vnd.chess-pgn": {
+ "source": "iana"
+ },
+ "application/vnd.chipnuts.karaoke-mmd": {
+ "source": "iana",
+ "extensions": ["mmd"]
+ },
+ "application/vnd.ciedi": {
+ "source": "iana"
+ },
+ "application/vnd.cinderella": {
+ "source": "iana",
+ "extensions": ["cdy"]
+ },
+ "application/vnd.cirpack.isdn-ext": {
+ "source": "iana"
+ },
+ "application/vnd.citationstyles.style+xml": {
+ "source": "iana",
+ "compressible": true,
+ "extensions": ["csl"]
+ },
+ "application/vnd.claymore": {
+ "source": "iana",
+ "extensions": ["cla"]
+ },
+ "application/vnd.cloanto.rp9": {
+ "source": "iana",
+ "extensions": ["rp9"]
+ },
+ "application/vnd.clonk.c4group": {
+ "source": "iana",
+ "extensions": ["c4g","c4d","c4f","c4p","c4u"]
+ },
+ "application/vnd.cluetrust.cartomobile-config": {
+ "source": "iana",
+ "extensions": ["c11amc"]
+ },
+ "application/vnd.cluetrust.cartomobile-config-pkg": {
+ "source": "iana",
+ "extensions": ["c11amz"]
+ },
+ "application/vnd.coffeescript": {
+ "source": "iana"
+ },
+ "application/vnd.collabio.xodocuments.document": {
+ "source": "iana"
+ },
+ "application/vnd.collabio.xodocuments.document-template": {
+ "source": "iana"
+ },
+ "application/vnd.collabio.xodocuments.presentation": {
+ "source": "iana"
+ },
+ "application/vnd.collabio.xodocuments.presentation-template": {
+ "source": "iana"
+ },
+ "application/vnd.collabio.xodocuments.spreadsheet": {
+ "source": "iana"
+ },
+ "application/vnd.collabio.xodocuments.spreadsheet-template": {
+ "source": "iana"
+ },
+ "application/vnd.collection+json": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.collection.doc+json": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.collection.next+json": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.comicbook+zip": {
+ "source": "iana",
+ "compressible": false
+ },
+ "application/vnd.comicbook-rar": {
+ "source": "iana"
+ },
+ "application/vnd.commerce-battelle": {
+ "source": "iana"
+ },
+ "application/vnd.commonspace": {
+ "source": "iana",
+ "extensions": ["csp"]
+ },
+ "application/vnd.contact.cmsg": {
+ "source": "iana",
+ "extensions": ["cdbcmsg"]
+ },
+ "application/vnd.coreos.ignition+json": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.cosmocaller": {
+ "source": "iana",
+ "extensions": ["cmc"]
+ },
+ "application/vnd.crick.clicker": {
+ "source": "iana",
+ "extensions": ["clkx"]
+ },
+ "application/vnd.crick.clicker.keyboard": {
+ "source": "iana",
+ "extensions": ["clkk"]
+ },
+ "application/vnd.crick.clicker.palette": {
+ "source": "iana",
+ "extensions": ["clkp"]
+ },
+ "application/vnd.crick.clicker.template": {
+ "source": "iana",
+ "extensions": ["clkt"]
+ },
+ "application/vnd.crick.clicker.wordbank": {
+ "source": "iana",
+ "extensions": ["clkw"]
+ },
+ "application/vnd.criticaltools.wbs+xml": {
+ "source": "iana",
+ "compressible": true,
+ "extensions": ["wbs"]
+ },
+ "application/vnd.cryptii.pipe+json": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.crypto-shade-file": {
+ "source": "iana"
+ },
+ "application/vnd.cryptomator.encrypted": {
+ "source": "iana"
+ },
+ "application/vnd.cryptomator.vault": {
+ "source": "iana"
+ },
+ "application/vnd.ctc-posml": {
+ "source": "iana",
+ "extensions": ["pml"]
+ },
+ "application/vnd.ctct.ws+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.cups-pdf": {
+ "source": "iana"
+ },
+ "application/vnd.cups-postscript": {
+ "source": "iana"
+ },
+ "application/vnd.cups-ppd": {
+ "source": "iana",
+ "extensions": ["ppd"]
+ },
+ "application/vnd.cups-raster": {
+ "source": "iana"
+ },
+ "application/vnd.cups-raw": {
+ "source": "iana"
+ },
+ "application/vnd.curl": {
+ "source": "iana"
+ },
+ "application/vnd.curl.car": {
+ "source": "apache",
+ "extensions": ["car"]
+ },
+ "application/vnd.curl.pcurl": {
+ "source": "apache",
+ "extensions": ["pcurl"]
+ },
+ "application/vnd.cyan.dean.root+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.cybank": {
+ "source": "iana"
+ },
+ "application/vnd.cyclonedx+json": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.cyclonedx+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.d2l.coursepackage1p0+zip": {
+ "source": "iana",
+ "compressible": false
+ },
+ "application/vnd.d3m-dataset": {
+ "source": "iana"
+ },
+ "application/vnd.d3m-problem": {
+ "source": "iana"
+ },
+ "application/vnd.dart": {
+ "source": "iana",
+ "compressible": true,
+ "extensions": ["dart"]
+ },
+ "application/vnd.data-vision.rdz": {
+ "source": "iana",
+ "extensions": ["rdz"]
+ },
+ "application/vnd.datapackage+json": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.dataresource+json": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.dbf": {
+ "source": "iana",
+ "extensions": ["dbf"]
+ },
+ "application/vnd.debian.binary-package": {
+ "source": "iana"
+ },
+ "application/vnd.dece.data": {
+ "source": "iana",
+ "extensions": ["uvf","uvvf","uvd","uvvd"]
+ },
+ "application/vnd.dece.ttml+xml": {
+ "source": "iana",
+ "compressible": true,
+ "extensions": ["uvt","uvvt"]
+ },
+ "application/vnd.dece.unspecified": {
+ "source": "iana",
+ "extensions": ["uvx","uvvx"]
+ },
+ "application/vnd.dece.zip": {
+ "source": "iana",
+ "extensions": ["uvz","uvvz"]
+ },
+ "application/vnd.denovo.fcselayout-link": {
+ "source": "iana",
+ "extensions": ["fe_launch"]
+ },
+ "application/vnd.desmume.movie": {
+ "source": "iana"
+ },
+ "application/vnd.dir-bi.plate-dl-nosuffix": {
+ "source": "iana"
+ },
+ "application/vnd.dm.delegation+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.dna": {
+ "source": "iana",
+ "extensions": ["dna"]
+ },
+ "application/vnd.document+json": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.dolby.mlp": {
+ "source": "apache",
+ "extensions": ["mlp"]
+ },
+ "application/vnd.dolby.mobile.1": {
+ "source": "iana"
+ },
+ "application/vnd.dolby.mobile.2": {
+ "source": "iana"
+ },
+ "application/vnd.doremir.scorecloud-binary-document": {
+ "source": "iana"
+ },
+ "application/vnd.dpgraph": {
+ "source": "iana",
+ "extensions": ["dpg"]
+ },
+ "application/vnd.dreamfactory": {
+ "source": "iana",
+ "extensions": ["dfac"]
+ },
+ "application/vnd.drive+json": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.ds-keypoint": {
+ "source": "apache",
+ "extensions": ["kpxx"]
+ },
+ "application/vnd.dtg.local": {
+ "source": "iana"
+ },
+ "application/vnd.dtg.local.flash": {
+ "source": "iana"
+ },
+ "application/vnd.dtg.local.html": {
+ "source": "iana"
+ },
+ "application/vnd.dvb.ait": {
+ "source": "iana",
+ "extensions": ["ait"]
+ },
+ "application/vnd.dvb.dvbisl+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.dvb.dvbj": {
+ "source": "iana"
+ },
+ "application/vnd.dvb.esgcontainer": {
+ "source": "iana"
+ },
+ "application/vnd.dvb.ipdcdftnotifaccess": {
+ "source": "iana"
+ },
+ "application/vnd.dvb.ipdcesgaccess": {
+ "source": "iana"
+ },
+ "application/vnd.dvb.ipdcesgaccess2": {
+ "source": "iana"
+ },
+ "application/vnd.dvb.ipdcesgpdd": {
+ "source": "iana"
+ },
+ "application/vnd.dvb.ipdcroaming": {
+ "source": "iana"
+ },
+ "application/vnd.dvb.iptv.alfec-base": {
+ "source": "iana"
+ },
+ "application/vnd.dvb.iptv.alfec-enhancement": {
+ "source": "iana"
+ },
+ "application/vnd.dvb.notif-aggregate-root+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.dvb.notif-container+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.dvb.notif-generic+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.dvb.notif-ia-msglist+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.dvb.notif-ia-registration-request+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.dvb.notif-ia-registration-response+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.dvb.notif-init+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.dvb.pfr": {
+ "source": "iana"
+ },
+ "application/vnd.dvb.service": {
+ "source": "iana",
+ "extensions": ["svc"]
+ },
+ "application/vnd.dxr": {
+ "source": "iana"
+ },
+ "application/vnd.dynageo": {
+ "source": "iana",
+ "extensions": ["geo"]
+ },
+ "application/vnd.dzr": {
+ "source": "iana"
+ },
+ "application/vnd.easykaraoke.cdgdownload": {
+ "source": "iana"
+ },
+ "application/vnd.ecdis-update": {
+ "source": "iana"
+ },
+ "application/vnd.ecip.rlp": {
+ "source": "iana"
+ },
+ "application/vnd.eclipse.ditto+json": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.ecowin.chart": {
+ "source": "iana",
+ "extensions": ["mag"]
+ },
+ "application/vnd.ecowin.filerequest": {
+ "source": "iana"
+ },
+ "application/vnd.ecowin.fileupdate": {
+ "source": "iana"
+ },
+ "application/vnd.ecowin.series": {
+ "source": "iana"
+ },
+ "application/vnd.ecowin.seriesrequest": {
+ "source": "iana"
+ },
+ "application/vnd.ecowin.seriesupdate": {
+ "source": "iana"
+ },
+ "application/vnd.efi.img": {
+ "source": "iana"
+ },
+ "application/vnd.efi.iso": {
+ "source": "iana"
+ },
+ "application/vnd.emclient.accessrequest+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.enliven": {
+ "source": "iana",
+ "extensions": ["nml"]
+ },
+ "application/vnd.enphase.envoy": {
+ "source": "iana"
+ },
+ "application/vnd.eprints.data+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.epson.esf": {
+ "source": "iana",
+ "extensions": ["esf"]
+ },
+ "application/vnd.epson.msf": {
+ "source": "iana",
+ "extensions": ["msf"]
+ },
+ "application/vnd.epson.quickanime": {
+ "source": "iana",
+ "extensions": ["qam"]
+ },
+ "application/vnd.epson.salt": {
+ "source": "iana",
+ "extensions": ["slt"]
+ },
+ "application/vnd.epson.ssf": {
+ "source": "iana",
+ "extensions": ["ssf"]
+ },
+ "application/vnd.ericsson.quickcall": {
+ "source": "iana"
+ },
+ "application/vnd.espass-espass+zip": {
+ "source": "iana",
+ "compressible": false
+ },
+ "application/vnd.eszigno3+xml": {
+ "source": "iana",
+ "compressible": true,
+ "extensions": ["es3","et3"]
+ },
+ "application/vnd.etsi.aoc+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.etsi.asic-e+zip": {
+ "source": "iana",
+ "compressible": false
+ },
+ "application/vnd.etsi.asic-s+zip": {
+ "source": "iana",
+ "compressible": false
+ },
+ "application/vnd.etsi.cug+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.etsi.iptvcommand+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.etsi.iptvdiscovery+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.etsi.iptvprofile+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.etsi.iptvsad-bc+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.etsi.iptvsad-cod+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.etsi.iptvsad-npvr+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.etsi.iptvservice+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.etsi.iptvsync+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.etsi.iptvueprofile+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.etsi.mcid+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.etsi.mheg5": {
+ "source": "iana"
+ },
+ "application/vnd.etsi.overload-control-policy-dataset+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.etsi.pstn+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.etsi.sci+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.etsi.simservs+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.etsi.timestamp-token": {
+ "source": "iana"
+ },
+ "application/vnd.etsi.tsl+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.etsi.tsl.der": {
+ "source": "iana"
+ },
+ "application/vnd.eu.kasparian.car+json": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.eudora.data": {
+ "source": "iana"
+ },
+ "application/vnd.evolv.ecig.profile": {
+ "source": "iana"
+ },
+ "application/vnd.evolv.ecig.settings": {
+ "source": "iana"
+ },
+ "application/vnd.evolv.ecig.theme": {
+ "source": "iana"
+ },
+ "application/vnd.exstream-empower+zip": {
+ "source": "iana",
+ "compressible": false
+ },
+ "application/vnd.exstream-package": {
+ "source": "iana"
+ },
+ "application/vnd.ezpix-album": {
+ "source": "iana",
+ "extensions": ["ez2"]
+ },
+ "application/vnd.ezpix-package": {
+ "source": "iana",
+ "extensions": ["ez3"]
+ },
+ "application/vnd.f-secure.mobile": {
+ "source": "iana"
+ },
+ "application/vnd.familysearch.gedcom+zip": {
+ "source": "iana",
+ "compressible": false
+ },
+ "application/vnd.fastcopy-disk-image": {
+ "source": "iana"
+ },
+ "application/vnd.fdf": {
+ "source": "iana",
+ "extensions": ["fdf"]
+ },
+ "application/vnd.fdsn.mseed": {
+ "source": "iana",
+ "extensions": ["mseed"]
+ },
+ "application/vnd.fdsn.seed": {
+ "source": "iana",
+ "extensions": ["seed","dataless"]
+ },
+ "application/vnd.ffsns": {
+ "source": "iana"
+ },
+ "application/vnd.ficlab.flb+zip": {
+ "source": "iana",
+ "compressible": false
+ },
+ "application/vnd.filmit.zfc": {
+ "source": "iana"
+ },
+ "application/vnd.fints": {
+ "source": "iana"
+ },
+ "application/vnd.firemonkeys.cloudcell": {
+ "source": "iana"
+ },
+ "application/vnd.flographit": {
+ "source": "iana",
+ "extensions": ["gph"]
+ },
+ "application/vnd.fluxtime.clip": {
+ "source": "iana",
+ "extensions": ["ftc"]
+ },
+ "application/vnd.font-fontforge-sfd": {
+ "source": "iana"
+ },
+ "application/vnd.framemaker": {
+ "source": "iana",
+ "extensions": ["fm","frame","maker","book"]
+ },
+ "application/vnd.frogans.fnc": {
+ "source": "iana",
+ "extensions": ["fnc"]
+ },
+ "application/vnd.frogans.ltf": {
+ "source": "iana",
+ "extensions": ["ltf"]
+ },
+ "application/vnd.fsc.weblaunch": {
+ "source": "iana",
+ "extensions": ["fsc"]
+ },
+ "application/vnd.fujifilm.fb.docuworks": {
+ "source": "iana"
+ },
+ "application/vnd.fujifilm.fb.docuworks.binder": {
+ "source": "iana"
+ },
+ "application/vnd.fujifilm.fb.docuworks.container": {
+ "source": "iana"
+ },
+ "application/vnd.fujifilm.fb.jfi+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.fujitsu.oasys": {
+ "source": "iana",
+ "extensions": ["oas"]
+ },
+ "application/vnd.fujitsu.oasys2": {
+ "source": "iana",
+ "extensions": ["oa2"]
+ },
+ "application/vnd.fujitsu.oasys3": {
+ "source": "iana",
+ "extensions": ["oa3"]
+ },
+ "application/vnd.fujitsu.oasysgp": {
+ "source": "iana",
+ "extensions": ["fg5"]
+ },
+ "application/vnd.fujitsu.oasysprs": {
+ "source": "iana",
+ "extensions": ["bh2"]
+ },
+ "application/vnd.fujixerox.art-ex": {
+ "source": "iana"
+ },
+ "application/vnd.fujixerox.art4": {
+ "source": "iana"
+ },
+ "application/vnd.fujixerox.ddd": {
+ "source": "iana",
+ "extensions": ["ddd"]
+ },
+ "application/vnd.fujixerox.docuworks": {
+ "source": "iana",
+ "extensions": ["xdw"]
+ },
+ "application/vnd.fujixerox.docuworks.binder": {
+ "source": "iana",
+ "extensions": ["xbd"]
+ },
+ "application/vnd.fujixerox.docuworks.container": {
+ "source": "iana"
+ },
+ "application/vnd.fujixerox.hbpl": {
+ "source": "iana"
+ },
+ "application/vnd.fut-misnet": {
+ "source": "iana"
+ },
+ "application/vnd.futoin+cbor": {
+ "source": "iana"
+ },
+ "application/vnd.futoin+json": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.fuzzysheet": {
+ "source": "iana",
+ "extensions": ["fzs"]
+ },
+ "application/vnd.genomatix.tuxedo": {
+ "source": "iana",
+ "extensions": ["txd"]
+ },
+ "application/vnd.gentics.grd+json": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.geo+json": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.geocube+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.geogebra.file": {
+ "source": "iana",
+ "extensions": ["ggb"]
+ },
+ "application/vnd.geogebra.slides": {
+ "source": "iana"
+ },
+ "application/vnd.geogebra.tool": {
+ "source": "iana",
+ "extensions": ["ggt"]
+ },
+ "application/vnd.geometry-explorer": {
+ "source": "iana",
+ "extensions": ["gex","gre"]
+ },
+ "application/vnd.geonext": {
+ "source": "iana",
+ "extensions": ["gxt"]
+ },
+ "application/vnd.geoplan": {
+ "source": "iana",
+ "extensions": ["g2w"]
+ },
+ "application/vnd.geospace": {
+ "source": "iana",
+ "extensions": ["g3w"]
+ },
+ "application/vnd.gerber": {
+ "source": "iana"
+ },
+ "application/vnd.globalplatform.card-content-mgt": {
+ "source": "iana"
+ },
+ "application/vnd.globalplatform.card-content-mgt-response": {
+ "source": "iana"
+ },
+ "application/vnd.gmx": {
+ "source": "iana",
+ "extensions": ["gmx"]
+ },
+ "application/vnd.google-apps.document": {
+ "compressible": false,
+ "extensions": ["gdoc"]
+ },
+ "application/vnd.google-apps.presentation": {
+ "compressible": false,
+ "extensions": ["gslides"]
+ },
+ "application/vnd.google-apps.spreadsheet": {
+ "compressible": false,
+ "extensions": ["gsheet"]
+ },
+ "application/vnd.google-earth.kml+xml": {
+ "source": "iana",
+ "compressible": true,
+ "extensions": ["kml"]
+ },
+ "application/vnd.google-earth.kmz": {
+ "source": "iana",
+ "compressible": false,
+ "extensions": ["kmz"]
+ },
+ "application/vnd.gov.sk.e-form+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.gov.sk.e-form+zip": {
+ "source": "iana",
+ "compressible": false
+ },
+ "application/vnd.gov.sk.xmldatacontainer+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.grafeq": {
+ "source": "iana",
+ "extensions": ["gqf","gqs"]
+ },
+ "application/vnd.gridmp": {
+ "source": "iana"
+ },
+ "application/vnd.groove-account": {
+ "source": "iana",
+ "extensions": ["gac"]
+ },
+ "application/vnd.groove-help": {
+ "source": "iana",
+ "extensions": ["ghf"]
+ },
+ "application/vnd.groove-identity-message": {
+ "source": "iana",
+ "extensions": ["gim"]
+ },
+ "application/vnd.groove-injector": {
+ "source": "iana",
+ "extensions": ["grv"]
+ },
+ "application/vnd.groove-tool-message": {
+ "source": "iana",
+ "extensions": ["gtm"]
+ },
+ "application/vnd.groove-tool-template": {
+ "source": "iana",
+ "extensions": ["tpl"]
+ },
+ "application/vnd.groove-vcard": {
+ "source": "iana",
+ "extensions": ["vcg"]
+ },
+ "application/vnd.hal+json": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.hal+xml": {
+ "source": "iana",
+ "compressible": true,
+ "extensions": ["hal"]
+ },
+ "application/vnd.handheld-entertainment+xml": {
+ "source": "iana",
+ "compressible": true,
+ "extensions": ["zmm"]
+ },
+ "application/vnd.hbci": {
+ "source": "iana",
+ "extensions": ["hbci"]
+ },
+ "application/vnd.hc+json": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.hcl-bireports": {
+ "source": "iana"
+ },
+ "application/vnd.hdt": {
+ "source": "iana"
+ },
+ "application/vnd.heroku+json": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.hhe.lesson-player": {
+ "source": "iana",
+ "extensions": ["les"]
+ },
+ "application/vnd.hl7cda+xml": {
+ "source": "iana",
+ "charset": "UTF-8",
+ "compressible": true
+ },
+ "application/vnd.hl7v2+xml": {
+ "source": "iana",
+ "charset": "UTF-8",
+ "compressible": true
+ },
+ "application/vnd.hp-hpgl": {
+ "source": "iana",
+ "extensions": ["hpgl"]
+ },
+ "application/vnd.hp-hpid": {
+ "source": "iana",
+ "extensions": ["hpid"]
+ },
+ "application/vnd.hp-hps": {
+ "source": "iana",
+ "extensions": ["hps"]
+ },
+ "application/vnd.hp-jlyt": {
+ "source": "iana",
+ "extensions": ["jlt"]
+ },
+ "application/vnd.hp-pcl": {
+ "source": "iana",
+ "extensions": ["pcl"]
+ },
+ "application/vnd.hp-pclxl": {
+ "source": "iana",
+ "extensions": ["pclxl"]
+ },
+ "application/vnd.httphone": {
+ "source": "iana"
+ },
+ "application/vnd.hydrostatix.sof-data": {
+ "source": "iana",
+ "extensions": ["sfd-hdstx"]
+ },
+ "application/vnd.hyper+json": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.hyper-item+json": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.hyperdrive+json": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.hzn-3d-crossword": {
+ "source": "iana"
+ },
+ "application/vnd.ibm.afplinedata": {
+ "source": "iana"
+ },
+ "application/vnd.ibm.electronic-media": {
+ "source": "iana"
+ },
+ "application/vnd.ibm.minipay": {
+ "source": "iana",
+ "extensions": ["mpy"]
+ },
+ "application/vnd.ibm.modcap": {
+ "source": "iana",
+ "extensions": ["afp","listafp","list3820"]
+ },
+ "application/vnd.ibm.rights-management": {
+ "source": "iana",
+ "extensions": ["irm"]
+ },
+ "application/vnd.ibm.secure-container": {
+ "source": "iana",
+ "extensions": ["sc"]
+ },
+ "application/vnd.iccprofile": {
+ "source": "iana",
+ "extensions": ["icc","icm"]
+ },
+ "application/vnd.ieee.1905": {
+ "source": "iana"
+ },
+ "application/vnd.igloader": {
+ "source": "iana",
+ "extensions": ["igl"]
+ },
+ "application/vnd.imagemeter.folder+zip": {
+ "source": "iana",
+ "compressible": false
+ },
+ "application/vnd.imagemeter.image+zip": {
+ "source": "iana",
+ "compressible": false
+ },
+ "application/vnd.immervision-ivp": {
+ "source": "iana",
+ "extensions": ["ivp"]
+ },
+ "application/vnd.immervision-ivu": {
+ "source": "iana",
+ "extensions": ["ivu"]
+ },
+ "application/vnd.ims.imsccv1p1": {
+ "source": "iana"
+ },
+ "application/vnd.ims.imsccv1p2": {
+ "source": "iana"
+ },
+ "application/vnd.ims.imsccv1p3": {
+ "source": "iana"
+ },
+ "application/vnd.ims.lis.v2.result+json": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.ims.lti.v2.toolconsumerprofile+json": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.ims.lti.v2.toolproxy+json": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.ims.lti.v2.toolproxy.id+json": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.ims.lti.v2.toolsettings+json": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.ims.lti.v2.toolsettings.simple+json": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.informedcontrol.rms+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.informix-visionary": {
+ "source": "iana"
+ },
+ "application/vnd.infotech.project": {
+ "source": "iana"
+ },
+ "application/vnd.infotech.project+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.innopath.wamp.notification": {
+ "source": "iana"
+ },
+ "application/vnd.insors.igm": {
+ "source": "iana",
+ "extensions": ["igm"]
+ },
+ "application/vnd.intercon.formnet": {
+ "source": "iana",
+ "extensions": ["xpw","xpx"]
+ },
+ "application/vnd.intergeo": {
+ "source": "iana",
+ "extensions": ["i2g"]
+ },
+ "application/vnd.intertrust.digibox": {
+ "source": "iana"
+ },
+ "application/vnd.intertrust.nncp": {
+ "source": "iana"
+ },
+ "application/vnd.intu.qbo": {
+ "source": "iana",
+ "extensions": ["qbo"]
+ },
+ "application/vnd.intu.qfx": {
+ "source": "iana",
+ "extensions": ["qfx"]
+ },
+ "application/vnd.iptc.g2.catalogitem+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.iptc.g2.conceptitem+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.iptc.g2.knowledgeitem+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.iptc.g2.newsitem+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.iptc.g2.newsmessage+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.iptc.g2.packageitem+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.iptc.g2.planningitem+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.ipunplugged.rcprofile": {
+ "source": "iana",
+ "extensions": ["rcprofile"]
+ },
+ "application/vnd.irepository.package+xml": {
+ "source": "iana",
+ "compressible": true,
+ "extensions": ["irp"]
+ },
+ "application/vnd.is-xpr": {
+ "source": "iana",
+ "extensions": ["xpr"]
+ },
+ "application/vnd.isac.fcs": {
+ "source": "iana",
+ "extensions": ["fcs"]
+ },
+ "application/vnd.iso11783-10+zip": {
+ "source": "iana",
+ "compressible": false
+ },
+ "application/vnd.jam": {
+ "source": "iana",
+ "extensions": ["jam"]
+ },
+ "application/vnd.japannet-directory-service": {
+ "source": "iana"
+ },
+ "application/vnd.japannet-jpnstore-wakeup": {
+ "source": "iana"
+ },
+ "application/vnd.japannet-payment-wakeup": {
+ "source": "iana"
+ },
+ "application/vnd.japannet-registration": {
+ "source": "iana"
+ },
+ "application/vnd.japannet-registration-wakeup": {
+ "source": "iana"
+ },
+ "application/vnd.japannet-setstore-wakeup": {
+ "source": "iana"
+ },
+ "application/vnd.japannet-verification": {
+ "source": "iana"
+ },
+ "application/vnd.japannet-verification-wakeup": {
+ "source": "iana"
+ },
+ "application/vnd.jcp.javame.midlet-rms": {
+ "source": "iana",
+ "extensions": ["rms"]
+ },
+ "application/vnd.jisp": {
+ "source": "iana",
+ "extensions": ["jisp"]
+ },
+ "application/vnd.joost.joda-archive": {
+ "source": "iana",
+ "extensions": ["joda"]
+ },
+ "application/vnd.jsk.isdn-ngn": {
+ "source": "iana"
+ },
+ "application/vnd.kahootz": {
+ "source": "iana",
+ "extensions": ["ktz","ktr"]
+ },
+ "application/vnd.kde.karbon": {
+ "source": "iana",
+ "extensions": ["karbon"]
+ },
+ "application/vnd.kde.kchart": {
+ "source": "iana",
+ "extensions": ["chrt"]
+ },
+ "application/vnd.kde.kformula": {
+ "source": "iana",
+ "extensions": ["kfo"]
+ },
+ "application/vnd.kde.kivio": {
+ "source": "iana",
+ "extensions": ["flw"]
+ },
+ "application/vnd.kde.kontour": {
+ "source": "iana",
+ "extensions": ["kon"]
+ },
+ "application/vnd.kde.kpresenter": {
+ "source": "iana",
+ "extensions": ["kpr","kpt"]
+ },
+ "application/vnd.kde.kspread": {
+ "source": "iana",
+ "extensions": ["ksp"]
+ },
+ "application/vnd.kde.kword": {
+ "source": "iana",
+ "extensions": ["kwd","kwt"]
+ },
+ "application/vnd.kenameaapp": {
+ "source": "iana",
+ "extensions": ["htke"]
+ },
+ "application/vnd.kidspiration": {
+ "source": "iana",
+ "extensions": ["kia"]
+ },
+ "application/vnd.kinar": {
+ "source": "iana",
+ "extensions": ["kne","knp"]
+ },
+ "application/vnd.koan": {
+ "source": "iana",
+ "extensions": ["skp","skd","skt","skm"]
+ },
+ "application/vnd.kodak-descriptor": {
+ "source": "iana",
+ "extensions": ["sse"]
+ },
+ "application/vnd.las": {
+ "source": "iana"
+ },
+ "application/vnd.las.las+json": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.las.las+xml": {
+ "source": "iana",
+ "compressible": true,
+ "extensions": ["lasxml"]
+ },
+ "application/vnd.laszip": {
+ "source": "iana"
+ },
+ "application/vnd.leap+json": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.liberty-request+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.llamagraphics.life-balance.desktop": {
+ "source": "iana",
+ "extensions": ["lbd"]
+ },
+ "application/vnd.llamagraphics.life-balance.exchange+xml": {
+ "source": "iana",
+ "compressible": true,
+ "extensions": ["lbe"]
+ },
+ "application/vnd.logipipe.circuit+zip": {
+ "source": "iana",
+ "compressible": false
+ },
+ "application/vnd.loom": {
+ "source": "iana"
+ },
+ "application/vnd.lotus-1-2-3": {
+ "source": "iana",
+ "extensions": ["123"]
+ },
+ "application/vnd.lotus-approach": {
+ "source": "iana",
+ "extensions": ["apr"]
+ },
+ "application/vnd.lotus-freelance": {
+ "source": "iana",
+ "extensions": ["pre"]
+ },
+ "application/vnd.lotus-notes": {
+ "source": "iana",
+ "extensions": ["nsf"]
+ },
+ "application/vnd.lotus-organizer": {
+ "source": "iana",
+ "extensions": ["org"]
+ },
+ "application/vnd.lotus-screencam": {
+ "source": "iana",
+ "extensions": ["scm"]
+ },
+ "application/vnd.lotus-wordpro": {
+ "source": "iana",
+ "extensions": ["lwp"]
+ },
+ "application/vnd.macports.portpkg": {
+ "source": "iana",
+ "extensions": ["portpkg"]
+ },
+ "application/vnd.mapbox-vector-tile": {
+ "source": "iana",
+ "extensions": ["mvt"]
+ },
+ "application/vnd.marlin.drm.actiontoken+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.marlin.drm.conftoken+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.marlin.drm.license+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.marlin.drm.mdcf": {
+ "source": "iana"
+ },
+ "application/vnd.mason+json": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.maxar.archive.3tz+zip": {
+ "source": "iana",
+ "compressible": false
+ },
+ "application/vnd.maxmind.maxmind-db": {
+ "source": "iana"
+ },
+ "application/vnd.mcd": {
+ "source": "iana",
+ "extensions": ["mcd"]
+ },
+ "application/vnd.medcalcdata": {
+ "source": "iana",
+ "extensions": ["mc1"]
+ },
+ "application/vnd.mediastation.cdkey": {
+ "source": "iana",
+ "extensions": ["cdkey"]
+ },
+ "application/vnd.meridian-slingshot": {
+ "source": "iana"
+ },
+ "application/vnd.mfer": {
+ "source": "iana",
+ "extensions": ["mwf"]
+ },
+ "application/vnd.mfmp": {
+ "source": "iana",
+ "extensions": ["mfm"]
+ },
+ "application/vnd.micro+json": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.micrografx.flo": {
+ "source": "iana",
+ "extensions": ["flo"]
+ },
+ "application/vnd.micrografx.igx": {
+ "source": "iana",
+ "extensions": ["igx"]
+ },
+ "application/vnd.microsoft.portable-executable": {
+ "source": "iana"
+ },
+ "application/vnd.microsoft.windows.thumbnail-cache": {
+ "source": "iana"
+ },
+ "application/vnd.miele+json": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.mif": {
+ "source": "iana",
+ "extensions": ["mif"]
+ },
+ "application/vnd.minisoft-hp3000-save": {
+ "source": "iana"
+ },
+ "application/vnd.mitsubishi.misty-guard.trustweb": {
+ "source": "iana"
+ },
+ "application/vnd.mobius.daf": {
+ "source": "iana",
+ "extensions": ["daf"]
+ },
+ "application/vnd.mobius.dis": {
+ "source": "iana",
+ "extensions": ["dis"]
+ },
+ "application/vnd.mobius.mbk": {
+ "source": "iana",
+ "extensions": ["mbk"]
+ },
+ "application/vnd.mobius.mqy": {
+ "source": "iana",
+ "extensions": ["mqy"]
+ },
+ "application/vnd.mobius.msl": {
+ "source": "iana",
+ "extensions": ["msl"]
+ },
+ "application/vnd.mobius.plc": {
+ "source": "iana",
+ "extensions": ["plc"]
+ },
+ "application/vnd.mobius.txf": {
+ "source": "iana",
+ "extensions": ["txf"]
+ },
+ "application/vnd.mophun.application": {
+ "source": "iana",
+ "extensions": ["mpn"]
+ },
+ "application/vnd.mophun.certificate": {
+ "source": "iana",
+ "extensions": ["mpc"]
+ },
+ "application/vnd.motorola.flexsuite": {
+ "source": "iana"
+ },
+ "application/vnd.motorola.flexsuite.adsi": {
+ "source": "iana"
+ },
+ "application/vnd.motorola.flexsuite.fis": {
+ "source": "iana"
+ },
+ "application/vnd.motorola.flexsuite.gotap": {
+ "source": "iana"
+ },
+ "application/vnd.motorola.flexsuite.kmr": {
+ "source": "iana"
+ },
+ "application/vnd.motorola.flexsuite.ttc": {
+ "source": "iana"
+ },
+ "application/vnd.motorola.flexsuite.wem": {
+ "source": "iana"
+ },
+ "application/vnd.motorola.iprm": {
+ "source": "iana"
+ },
+ "application/vnd.mozilla.xul+xml": {
+ "source": "iana",
+ "compressible": true,
+ "extensions": ["xul"]
+ },
+ "application/vnd.ms-3mfdocument": {
+ "source": "iana"
+ },
+ "application/vnd.ms-artgalry": {
+ "source": "iana",
+ "extensions": ["cil"]
+ },
+ "application/vnd.ms-asf": {
+ "source": "iana"
+ },
+ "application/vnd.ms-cab-compressed": {
+ "source": "iana",
+ "extensions": ["cab"]
+ },
+ "application/vnd.ms-color.iccprofile": {
+ "source": "apache"
+ },
+ "application/vnd.ms-excel": {
+ "source": "iana",
+ "compressible": false,
+ "extensions": ["xls","xlm","xla","xlc","xlt","xlw"]
+ },
+ "application/vnd.ms-excel.addin.macroenabled.12": {
+ "source": "iana",
+ "extensions": ["xlam"]
+ },
+ "application/vnd.ms-excel.sheet.binary.macroenabled.12": {
+ "source": "iana",
+ "extensions": ["xlsb"]
+ },
+ "application/vnd.ms-excel.sheet.macroenabled.12": {
+ "source": "iana",
+ "extensions": ["xlsm"]
+ },
+ "application/vnd.ms-excel.template.macroenabled.12": {
+ "source": "iana",
+ "extensions": ["xltm"]
+ },
+ "application/vnd.ms-fontobject": {
+ "source": "iana",
+ "compressible": true,
+ "extensions": ["eot"]
+ },
+ "application/vnd.ms-htmlhelp": {
+ "source": "iana",
+ "extensions": ["chm"]
+ },
+ "application/vnd.ms-ims": {
+ "source": "iana",
+ "extensions": ["ims"]
+ },
+ "application/vnd.ms-lrm": {
+ "source": "iana",
+ "extensions": ["lrm"]
+ },
+ "application/vnd.ms-office.activex+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.ms-officetheme": {
+ "source": "iana",
+ "extensions": ["thmx"]
+ },
+ "application/vnd.ms-opentype": {
+ "source": "apache",
+ "compressible": true
+ },
+ "application/vnd.ms-outlook": {
+ "compressible": false,
+ "extensions": ["msg"]
+ },
+ "application/vnd.ms-package.obfuscated-opentype": {
+ "source": "apache"
+ },
+ "application/vnd.ms-pki.seccat": {
+ "source": "apache",
+ "extensions": ["cat"]
+ },
+ "application/vnd.ms-pki.stl": {
+ "source": "apache",
+ "extensions": ["stl"]
+ },
+ "application/vnd.ms-playready.initiator+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.ms-powerpoint": {
+ "source": "iana",
+ "compressible": false,
+ "extensions": ["ppt","pps","pot"]
+ },
+ "application/vnd.ms-powerpoint.addin.macroenabled.12": {
+ "source": "iana",
+ "extensions": ["ppam"]
+ },
+ "application/vnd.ms-powerpoint.presentation.macroenabled.12": {
+ "source": "iana",
+ "extensions": ["pptm"]
+ },
+ "application/vnd.ms-powerpoint.slide.macroenabled.12": {
+ "source": "iana",
+ "extensions": ["sldm"]
+ },
+ "application/vnd.ms-powerpoint.slideshow.macroenabled.12": {
+ "source": "iana",
+ "extensions": ["ppsm"]
+ },
+ "application/vnd.ms-powerpoint.template.macroenabled.12": {
+ "source": "iana",
+ "extensions": ["potm"]
+ },
+ "application/vnd.ms-printdevicecapabilities+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.ms-printing.printticket+xml": {
+ "source": "apache",
+ "compressible": true
+ },
+ "application/vnd.ms-printschematicket+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.ms-project": {
+ "source": "iana",
+ "extensions": ["mpp","mpt"]
+ },
+ "application/vnd.ms-tnef": {
+ "source": "iana"
+ },
+ "application/vnd.ms-windows.devicepairing": {
+ "source": "iana"
+ },
+ "application/vnd.ms-windows.nwprinting.oob": {
+ "source": "iana"
+ },
+ "application/vnd.ms-windows.printerpairing": {
+ "source": "iana"
+ },
+ "application/vnd.ms-windows.wsd.oob": {
+ "source": "iana"
+ },
+ "application/vnd.ms-wmdrm.lic-chlg-req": {
+ "source": "iana"
+ },
+ "application/vnd.ms-wmdrm.lic-resp": {
+ "source": "iana"
+ },
+ "application/vnd.ms-wmdrm.meter-chlg-req": {
+ "source": "iana"
+ },
+ "application/vnd.ms-wmdrm.meter-resp": {
+ "source": "iana"
+ },
+ "application/vnd.ms-word.document.macroenabled.12": {
+ "source": "iana",
+ "extensions": ["docm"]
+ },
+ "application/vnd.ms-word.template.macroenabled.12": {
+ "source": "iana",
+ "extensions": ["dotm"]
+ },
+ "application/vnd.ms-works": {
+ "source": "iana",
+ "extensions": ["wps","wks","wcm","wdb"]
+ },
+ "application/vnd.ms-wpl": {
+ "source": "iana",
+ "extensions": ["wpl"]
+ },
+ "application/vnd.ms-xpsdocument": {
+ "source": "iana",
+ "compressible": false,
+ "extensions": ["xps"]
+ },
+ "application/vnd.msa-disk-image": {
+ "source": "iana"
+ },
+ "application/vnd.mseq": {
+ "source": "iana",
+ "extensions": ["mseq"]
+ },
+ "application/vnd.msign": {
+ "source": "iana"
+ },
+ "application/vnd.multiad.creator": {
+ "source": "iana"
+ },
+ "application/vnd.multiad.creator.cif": {
+ "source": "iana"
+ },
+ "application/vnd.music-niff": {
+ "source": "iana"
+ },
+ "application/vnd.musician": {
+ "source": "iana",
+ "extensions": ["mus"]
+ },
+ "application/vnd.muvee.style": {
+ "source": "iana",
+ "extensions": ["msty"]
+ },
+ "application/vnd.mynfc": {
+ "source": "iana",
+ "extensions": ["taglet"]
+ },
+ "application/vnd.nacamar.ybrid+json": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.ncd.control": {
+ "source": "iana"
+ },
+ "application/vnd.ncd.reference": {
+ "source": "iana"
+ },
+ "application/vnd.nearst.inv+json": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.nebumind.line": {
+ "source": "iana"
+ },
+ "application/vnd.nervana": {
+ "source": "iana"
+ },
+ "application/vnd.netfpx": {
+ "source": "iana"
+ },
+ "application/vnd.neurolanguage.nlu": {
+ "source": "iana",
+ "extensions": ["nlu"]
+ },
+ "application/vnd.nimn": {
+ "source": "iana"
+ },
+ "application/vnd.nintendo.nitro.rom": {
+ "source": "iana"
+ },
+ "application/vnd.nintendo.snes.rom": {
+ "source": "iana"
+ },
+ "application/vnd.nitf": {
+ "source": "iana",
+ "extensions": ["ntf","nitf"]
+ },
+ "application/vnd.noblenet-directory": {
+ "source": "iana",
+ "extensions": ["nnd"]
+ },
+ "application/vnd.noblenet-sealer": {
+ "source": "iana",
+ "extensions": ["nns"]
+ },
+ "application/vnd.noblenet-web": {
+ "source": "iana",
+ "extensions": ["nnw"]
+ },
+ "application/vnd.nokia.catalogs": {
+ "source": "iana"
+ },
+ "application/vnd.nokia.conml+wbxml": {
+ "source": "iana"
+ },
+ "application/vnd.nokia.conml+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.nokia.iptv.config+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.nokia.isds-radio-presets": {
+ "source": "iana"
+ },
+ "application/vnd.nokia.landmark+wbxml": {
+ "source": "iana"
+ },
+ "application/vnd.nokia.landmark+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.nokia.landmarkcollection+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.nokia.n-gage.ac+xml": {
+ "source": "iana",
+ "compressible": true,
+ "extensions": ["ac"]
+ },
+ "application/vnd.nokia.n-gage.data": {
+ "source": "iana",
+ "extensions": ["ngdat"]
+ },
+ "application/vnd.nokia.n-gage.symbian.install": {
+ "source": "iana",
+ "extensions": ["n-gage"]
+ },
+ "application/vnd.nokia.ncd": {
+ "source": "iana"
+ },
+ "application/vnd.nokia.pcd+wbxml": {
+ "source": "iana"
+ },
+ "application/vnd.nokia.pcd+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.nokia.radio-preset": {
+ "source": "iana",
+ "extensions": ["rpst"]
+ },
+ "application/vnd.nokia.radio-presets": {
+ "source": "iana",
+ "extensions": ["rpss"]
+ },
+ "application/vnd.novadigm.edm": {
+ "source": "iana",
+ "extensions": ["edm"]
+ },
+ "application/vnd.novadigm.edx": {
+ "source": "iana",
+ "extensions": ["edx"]
+ },
+ "application/vnd.novadigm.ext": {
+ "source": "iana",
+ "extensions": ["ext"]
+ },
+ "application/vnd.ntt-local.content-share": {
+ "source": "iana"
+ },
+ "application/vnd.ntt-local.file-transfer": {
+ "source": "iana"
+ },
+ "application/vnd.ntt-local.ogw_remote-access": {
+ "source": "iana"
+ },
+ "application/vnd.ntt-local.sip-ta_remote": {
+ "source": "iana"
+ },
+ "application/vnd.ntt-local.sip-ta_tcp_stream": {
+ "source": "iana"
+ },
+ "application/vnd.oasis.opendocument.chart": {
+ "source": "iana",
+ "extensions": ["odc"]
+ },
+ "application/vnd.oasis.opendocument.chart-template": {
+ "source": "iana",
+ "extensions": ["otc"]
+ },
+ "application/vnd.oasis.opendocument.database": {
+ "source": "iana",
+ "extensions": ["odb"]
+ },
+ "application/vnd.oasis.opendocument.formula": {
+ "source": "iana",
+ "extensions": ["odf"]
+ },
+ "application/vnd.oasis.opendocument.formula-template": {
+ "source": "iana",
+ "extensions": ["odft"]
+ },
+ "application/vnd.oasis.opendocument.graphics": {
+ "source": "iana",
+ "compressible": false,
+ "extensions": ["odg"]
+ },
+ "application/vnd.oasis.opendocument.graphics-template": {
+ "source": "iana",
+ "extensions": ["otg"]
+ },
+ "application/vnd.oasis.opendocument.image": {
+ "source": "iana",
+ "extensions": ["odi"]
+ },
+ "application/vnd.oasis.opendocument.image-template": {
+ "source": "iana",
+ "extensions": ["oti"]
+ },
+ "application/vnd.oasis.opendocument.presentation": {
+ "source": "iana",
+ "compressible": false,
+ "extensions": ["odp"]
+ },
+ "application/vnd.oasis.opendocument.presentation-template": {
+ "source": "iana",
+ "extensions": ["otp"]
+ },
+ "application/vnd.oasis.opendocument.spreadsheet": {
+ "source": "iana",
+ "compressible": false,
+ "extensions": ["ods"]
+ },
+ "application/vnd.oasis.opendocument.spreadsheet-template": {
+ "source": "iana",
+ "extensions": ["ots"]
+ },
+ "application/vnd.oasis.opendocument.text": {
+ "source": "iana",
+ "compressible": false,
+ "extensions": ["odt"]
+ },
+ "application/vnd.oasis.opendocument.text-master": {
+ "source": "iana",
+ "extensions": ["odm"]
+ },
+ "application/vnd.oasis.opendocument.text-template": {
+ "source": "iana",
+ "extensions": ["ott"]
+ },
+ "application/vnd.oasis.opendocument.text-web": {
+ "source": "iana",
+ "extensions": ["oth"]
+ },
+ "application/vnd.obn": {
+ "source": "iana"
+ },
+ "application/vnd.ocf+cbor": {
+ "source": "iana"
+ },
+ "application/vnd.oci.image.manifest.v1+json": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.oftn.l10n+json": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.oipf.contentaccessdownload+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.oipf.contentaccessstreaming+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.oipf.cspg-hexbinary": {
+ "source": "iana"
+ },
+ "application/vnd.oipf.dae.svg+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.oipf.dae.xhtml+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.oipf.mippvcontrolmessage+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.oipf.pae.gem": {
+ "source": "iana"
+ },
+ "application/vnd.oipf.spdiscovery+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.oipf.spdlist+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.oipf.ueprofile+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.oipf.userprofile+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.olpc-sugar": {
+ "source": "iana",
+ "extensions": ["xo"]
+ },
+ "application/vnd.oma-scws-config": {
+ "source": "iana"
+ },
+ "application/vnd.oma-scws-http-request": {
+ "source": "iana"
+ },
+ "application/vnd.oma-scws-http-response": {
+ "source": "iana"
+ },
+ "application/vnd.oma.bcast.associated-procedure-parameter+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.oma.bcast.drm-trigger+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.oma.bcast.imd+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.oma.bcast.ltkm": {
+ "source": "iana"
+ },
+ "application/vnd.oma.bcast.notification+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.oma.bcast.provisioningtrigger": {
+ "source": "iana"
+ },
+ "application/vnd.oma.bcast.sgboot": {
+ "source": "iana"
+ },
+ "application/vnd.oma.bcast.sgdd+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.oma.bcast.sgdu": {
+ "source": "iana"
+ },
+ "application/vnd.oma.bcast.simple-symbol-container": {
+ "source": "iana"
+ },
+ "application/vnd.oma.bcast.smartcard-trigger+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.oma.bcast.sprov+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.oma.bcast.stkm": {
+ "source": "iana"
+ },
+ "application/vnd.oma.cab-address-book+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.oma.cab-feature-handler+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.oma.cab-pcc+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.oma.cab-subs-invite+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.oma.cab-user-prefs+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.oma.dcd": {
+ "source": "iana"
+ },
+ "application/vnd.oma.dcdc": {
+ "source": "iana"
+ },
+ "application/vnd.oma.dd2+xml": {
+ "source": "iana",
+ "compressible": true,
+ "extensions": ["dd2"]
+ },
+ "application/vnd.oma.drm.risd+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.oma.group-usage-list+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.oma.lwm2m+cbor": {
+ "source": "iana"
+ },
+ "application/vnd.oma.lwm2m+json": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.oma.lwm2m+tlv": {
+ "source": "iana"
+ },
+ "application/vnd.oma.pal+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.oma.poc.detailed-progress-report+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.oma.poc.final-report+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.oma.poc.groups+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.oma.poc.invocation-descriptor+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.oma.poc.optimized-progress-report+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.oma.push": {
+ "source": "iana"
+ },
+ "application/vnd.oma.scidm.messages+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.oma.xcap-directory+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.omads-email+xml": {
+ "source": "iana",
+ "charset": "UTF-8",
+ "compressible": true
+ },
+ "application/vnd.omads-file+xml": {
+ "source": "iana",
+ "charset": "UTF-8",
+ "compressible": true
+ },
+ "application/vnd.omads-folder+xml": {
+ "source": "iana",
+ "charset": "UTF-8",
+ "compressible": true
+ },
+ "application/vnd.omaloc-supl-init": {
+ "source": "iana"
+ },
+ "application/vnd.onepager": {
+ "source": "iana"
+ },
+ "application/vnd.onepagertamp": {
+ "source": "iana"
+ },
+ "application/vnd.onepagertamx": {
+ "source": "iana"
+ },
+ "application/vnd.onepagertat": {
+ "source": "iana"
+ },
+ "application/vnd.onepagertatp": {
+ "source": "iana"
+ },
+ "application/vnd.onepagertatx": {
+ "source": "iana"
+ },
+ "application/vnd.openblox.game+xml": {
+ "source": "iana",
+ "compressible": true,
+ "extensions": ["obgx"]
+ },
+ "application/vnd.openblox.game-binary": {
+ "source": "iana"
+ },
+ "application/vnd.openeye.oeb": {
+ "source": "iana"
+ },
+ "application/vnd.openofficeorg.extension": {
+ "source": "apache",
+ "extensions": ["oxt"]
+ },
+ "application/vnd.openstreetmap.data+xml": {
+ "source": "iana",
+ "compressible": true,
+ "extensions": ["osm"]
+ },
+ "application/vnd.opentimestamps.ots": {
+ "source": "iana"
+ },
+ "application/vnd.openxmlformats-officedocument.custom-properties+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.openxmlformats-officedocument.customxmlproperties+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.openxmlformats-officedocument.drawing+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.openxmlformats-officedocument.drawingml.chart+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.openxmlformats-officedocument.drawingml.chartshapes+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.openxmlformats-officedocument.drawingml.diagramcolors+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.openxmlformats-officedocument.drawingml.diagramdata+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.openxmlformats-officedocument.drawingml.diagramlayout+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.openxmlformats-officedocument.drawingml.diagramstyle+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.openxmlformats-officedocument.extended-properties+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.openxmlformats-officedocument.presentationml.commentauthors+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.openxmlformats-officedocument.presentationml.comments+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.openxmlformats-officedocument.presentationml.handoutmaster+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.openxmlformats-officedocument.presentationml.notesmaster+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.openxmlformats-officedocument.presentationml.notesslide+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.openxmlformats-officedocument.presentationml.presentation": {
+ "source": "iana",
+ "compressible": false,
+ "extensions": ["pptx"]
+ },
+ "application/vnd.openxmlformats-officedocument.presentationml.presentation.main+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.openxmlformats-officedocument.presentationml.presprops+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.openxmlformats-officedocument.presentationml.slide": {
+ "source": "iana",
+ "extensions": ["sldx"]
+ },
+ "application/vnd.openxmlformats-officedocument.presentationml.slide+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.openxmlformats-officedocument.presentationml.slidelayout+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.openxmlformats-officedocument.presentationml.slidemaster+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.openxmlformats-officedocument.presentationml.slideshow": {
+ "source": "iana",
+ "extensions": ["ppsx"]
+ },
+ "application/vnd.openxmlformats-officedocument.presentationml.slideshow.main+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.openxmlformats-officedocument.presentationml.slideupdateinfo+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.openxmlformats-officedocument.presentationml.tablestyles+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.openxmlformats-officedocument.presentationml.tags+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.openxmlformats-officedocument.presentationml.template": {
+ "source": "iana",
+ "extensions": ["potx"]
+ },
+ "application/vnd.openxmlformats-officedocument.presentationml.template.main+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.openxmlformats-officedocument.presentationml.viewprops+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.openxmlformats-officedocument.spreadsheetml.calcchain+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.openxmlformats-officedocument.spreadsheetml.chartsheet+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.openxmlformats-officedocument.spreadsheetml.connections+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.openxmlformats-officedocument.spreadsheetml.dialogsheet+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.openxmlformats-officedocument.spreadsheetml.externallink+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcachedefinition+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcacherecords+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.openxmlformats-officedocument.spreadsheetml.pivottable+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.openxmlformats-officedocument.spreadsheetml.querytable+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.openxmlformats-officedocument.spreadsheetml.revisionheaders+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.openxmlformats-officedocument.spreadsheetml.revisionlog+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.openxmlformats-officedocument.spreadsheetml.sharedstrings+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet": {
+ "source": "iana",
+ "compressible": false,
+ "extensions": ["xlsx"]
+ },
+ "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.openxmlformats-officedocument.spreadsheetml.sheetmetadata+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.openxmlformats-officedocument.spreadsheetml.table+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.openxmlformats-officedocument.spreadsheetml.tablesinglecells+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.openxmlformats-officedocument.spreadsheetml.template": {
+ "source": "iana",
+ "extensions": ["xltx"]
+ },
+ "application/vnd.openxmlformats-officedocument.spreadsheetml.template.main+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.openxmlformats-officedocument.spreadsheetml.usernames+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.openxmlformats-officedocument.spreadsheetml.volatiledependencies+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.openxmlformats-officedocument.theme+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.openxmlformats-officedocument.themeoverride+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.openxmlformats-officedocument.vmldrawing": {
+ "source": "iana"
+ },
+ "application/vnd.openxmlformats-officedocument.wordprocessingml.comments+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.openxmlformats-officedocument.wordprocessingml.document": {
+ "source": "iana",
+ "compressible": false,
+ "extensions": ["docx"]
+ },
+ "application/vnd.openxmlformats-officedocument.wordprocessingml.document.glossary+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.openxmlformats-officedocument.wordprocessingml.endnotes+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.openxmlformats-officedocument.wordprocessingml.fonttable+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.openxmlformats-officedocument.wordprocessingml.footer+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.openxmlformats-officedocument.wordprocessingml.footnotes+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.openxmlformats-officedocument.wordprocessingml.settings+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.openxmlformats-officedocument.wordprocessingml.template": {
+ "source": "iana",
+ "extensions": ["dotx"]
+ },
+ "application/vnd.openxmlformats-officedocument.wordprocessingml.template.main+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.openxmlformats-officedocument.wordprocessingml.websettings+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.openxmlformats-package.core-properties+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.openxmlformats-package.digital-signature-xmlsignature+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.openxmlformats-package.relationships+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.oracle.resource+json": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.orange.indata": {
+ "source": "iana"
+ },
+ "application/vnd.osa.netdeploy": {
+ "source": "iana"
+ },
+ "application/vnd.osgeo.mapguide.package": {
+ "source": "iana",
+ "extensions": ["mgp"]
+ },
+ "application/vnd.osgi.bundle": {
+ "source": "iana"
+ },
+ "application/vnd.osgi.dp": {
+ "source": "iana",
+ "extensions": ["dp"]
+ },
+ "application/vnd.osgi.subsystem": {
+ "source": "iana",
+ "extensions": ["esa"]
+ },
+ "application/vnd.otps.ct-kip+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.oxli.countgraph": {
+ "source": "iana"
+ },
+ "application/vnd.pagerduty+json": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.palm": {
+ "source": "iana",
+ "extensions": ["pdb","pqa","oprc"]
+ },
+ "application/vnd.panoply": {
+ "source": "iana"
+ },
+ "application/vnd.paos.xml": {
+ "source": "iana"
+ },
+ "application/vnd.patentdive": {
+ "source": "iana"
+ },
+ "application/vnd.patientecommsdoc": {
+ "source": "iana"
+ },
+ "application/vnd.pawaafile": {
+ "source": "iana",
+ "extensions": ["paw"]
+ },
+ "application/vnd.pcos": {
+ "source": "iana"
+ },
+ "application/vnd.pg.format": {
+ "source": "iana",
+ "extensions": ["str"]
+ },
+ "application/vnd.pg.osasli": {
+ "source": "iana",
+ "extensions": ["ei6"]
+ },
+ "application/vnd.piaccess.application-licence": {
+ "source": "iana"
+ },
+ "application/vnd.picsel": {
+ "source": "iana",
+ "extensions": ["efif"]
+ },
+ "application/vnd.pmi.widget": {
+ "source": "iana",
+ "extensions": ["wg"]
+ },
+ "application/vnd.poc.group-advertisement+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.pocketlearn": {
+ "source": "iana",
+ "extensions": ["plf"]
+ },
+ "application/vnd.powerbuilder6": {
+ "source": "iana",
+ "extensions": ["pbd"]
+ },
+ "application/vnd.powerbuilder6-s": {
+ "source": "iana"
+ },
+ "application/vnd.powerbuilder7": {
+ "source": "iana"
+ },
+ "application/vnd.powerbuilder7-s": {
+ "source": "iana"
+ },
+ "application/vnd.powerbuilder75": {
+ "source": "iana"
+ },
+ "application/vnd.powerbuilder75-s": {
+ "source": "iana"
+ },
+ "application/vnd.preminet": {
+ "source": "iana"
+ },
+ "application/vnd.previewsystems.box": {
+ "source": "iana",
+ "extensions": ["box"]
+ },
+ "application/vnd.proteus.magazine": {
+ "source": "iana",
+ "extensions": ["mgz"]
+ },
+ "application/vnd.psfs": {
+ "source": "iana"
+ },
+ "application/vnd.publishare-delta-tree": {
+ "source": "iana",
+ "extensions": ["qps"]
+ },
+ "application/vnd.pvi.ptid1": {
+ "source": "iana",
+ "extensions": ["ptid"]
+ },
+ "application/vnd.pwg-multiplexed": {
+ "source": "iana"
+ },
+ "application/vnd.pwg-xhtml-print+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.qualcomm.brew-app-res": {
+ "source": "iana"
+ },
+ "application/vnd.quarantainenet": {
+ "source": "iana"
+ },
+ "application/vnd.quark.quarkxpress": {
+ "source": "iana",
+ "extensions": ["qxd","qxt","qwd","qwt","qxl","qxb"]
+ },
+ "application/vnd.quobject-quoxdocument": {
+ "source": "iana"
+ },
+ "application/vnd.radisys.moml+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.radisys.msml+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.radisys.msml-audit+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.radisys.msml-audit-conf+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.radisys.msml-audit-conn+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.radisys.msml-audit-dialog+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.radisys.msml-audit-stream+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.radisys.msml-conf+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.radisys.msml-dialog+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.radisys.msml-dialog-base+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.radisys.msml-dialog-fax-detect+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.radisys.msml-dialog-fax-sendrecv+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.radisys.msml-dialog-group+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.radisys.msml-dialog-speech+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.radisys.msml-dialog-transform+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.rainstor.data": {
+ "source": "iana"
+ },
+ "application/vnd.rapid": {
+ "source": "iana"
+ },
+ "application/vnd.rar": {
+ "source": "iana",
+ "extensions": ["rar"]
+ },
+ "application/vnd.realvnc.bed": {
+ "source": "iana",
+ "extensions": ["bed"]
+ },
+ "application/vnd.recordare.musicxml": {
+ "source": "iana",
+ "extensions": ["mxl"]
+ },
+ "application/vnd.recordare.musicxml+xml": {
+ "source": "iana",
+ "compressible": true,
+ "extensions": ["musicxml"]
+ },
+ "application/vnd.renlearn.rlprint": {
+ "source": "iana"
+ },
+ "application/vnd.resilient.logic": {
+ "source": "iana"
+ },
+ "application/vnd.restful+json": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.rig.cryptonote": {
+ "source": "iana",
+ "extensions": ["cryptonote"]
+ },
+ "application/vnd.rim.cod": {
+ "source": "apache",
+ "extensions": ["cod"]
+ },
+ "application/vnd.rn-realmedia": {
+ "source": "apache",
+ "extensions": ["rm"]
+ },
+ "application/vnd.rn-realmedia-vbr": {
+ "source": "apache",
+ "extensions": ["rmvb"]
+ },
+ "application/vnd.route66.link66+xml": {
+ "source": "iana",
+ "compressible": true,
+ "extensions": ["link66"]
+ },
+ "application/vnd.rs-274x": {
+ "source": "iana"
+ },
+ "application/vnd.ruckus.download": {
+ "source": "iana"
+ },
+ "application/vnd.s3sms": {
+ "source": "iana"
+ },
+ "application/vnd.sailingtracker.track": {
+ "source": "iana",
+ "extensions": ["st"]
+ },
+ "application/vnd.sar": {
+ "source": "iana"
+ },
+ "application/vnd.sbm.cid": {
+ "source": "iana"
+ },
+ "application/vnd.sbm.mid2": {
+ "source": "iana"
+ },
+ "application/vnd.scribus": {
+ "source": "iana"
+ },
+ "application/vnd.sealed.3df": {
+ "source": "iana"
+ },
+ "application/vnd.sealed.csf": {
+ "source": "iana"
+ },
+ "application/vnd.sealed.doc": {
+ "source": "iana"
+ },
+ "application/vnd.sealed.eml": {
+ "source": "iana"
+ },
+ "application/vnd.sealed.mht": {
+ "source": "iana"
+ },
+ "application/vnd.sealed.net": {
+ "source": "iana"
+ },
+ "application/vnd.sealed.ppt": {
+ "source": "iana"
+ },
+ "application/vnd.sealed.tiff": {
+ "source": "iana"
+ },
+ "application/vnd.sealed.xls": {
+ "source": "iana"
+ },
+ "application/vnd.sealedmedia.softseal.html": {
+ "source": "iana"
+ },
+ "application/vnd.sealedmedia.softseal.pdf": {
+ "source": "iana"
+ },
+ "application/vnd.seemail": {
+ "source": "iana",
+ "extensions": ["see"]
+ },
+ "application/vnd.seis+json": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.sema": {
+ "source": "iana",
+ "extensions": ["sema"]
+ },
+ "application/vnd.semd": {
+ "source": "iana",
+ "extensions": ["semd"]
+ },
+ "application/vnd.semf": {
+ "source": "iana",
+ "extensions": ["semf"]
+ },
+ "application/vnd.shade-save-file": {
+ "source": "iana"
+ },
+ "application/vnd.shana.informed.formdata": {
+ "source": "iana",
+ "extensions": ["ifm"]
+ },
+ "application/vnd.shana.informed.formtemplate": {
+ "source": "iana",
+ "extensions": ["itp"]
+ },
+ "application/vnd.shana.informed.interchange": {
+ "source": "iana",
+ "extensions": ["iif"]
+ },
+ "application/vnd.shana.informed.package": {
+ "source": "iana",
+ "extensions": ["ipk"]
+ },
+ "application/vnd.shootproof+json": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.shopkick+json": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.shp": {
+ "source": "iana"
+ },
+ "application/vnd.shx": {
+ "source": "iana"
+ },
+ "application/vnd.sigrok.session": {
+ "source": "iana"
+ },
+ "application/vnd.simtech-mindmapper": {
+ "source": "iana",
+ "extensions": ["twd","twds"]
+ },
+ "application/vnd.siren+json": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.smaf": {
+ "source": "iana",
+ "extensions": ["mmf"]
+ },
+ "application/vnd.smart.notebook": {
+ "source": "iana"
+ },
+ "application/vnd.smart.teacher": {
+ "source": "iana",
+ "extensions": ["teacher"]
+ },
+ "application/vnd.snesdev-page-table": {
+ "source": "iana"
+ },
+ "application/vnd.software602.filler.form+xml": {
+ "source": "iana",
+ "compressible": true,
+ "extensions": ["fo"]
+ },
+ "application/vnd.software602.filler.form-xml-zip": {
+ "source": "iana"
+ },
+ "application/vnd.solent.sdkm+xml": {
+ "source": "iana",
+ "compressible": true,
+ "extensions": ["sdkm","sdkd"]
+ },
+ "application/vnd.spotfire.dxp": {
+ "source": "iana",
+ "extensions": ["dxp"]
+ },
+ "application/vnd.spotfire.sfs": {
+ "source": "iana",
+ "extensions": ["sfs"]
+ },
+ "application/vnd.sqlite3": {
+ "source": "iana"
+ },
+ "application/vnd.sss-cod": {
+ "source": "iana"
+ },
+ "application/vnd.sss-dtf": {
+ "source": "iana"
+ },
+ "application/vnd.sss-ntf": {
+ "source": "iana"
+ },
+ "application/vnd.stardivision.calc": {
+ "source": "apache",
+ "extensions": ["sdc"]
+ },
+ "application/vnd.stardivision.draw": {
+ "source": "apache",
+ "extensions": ["sda"]
+ },
+ "application/vnd.stardivision.impress": {
+ "source": "apache",
+ "extensions": ["sdd"]
+ },
+ "application/vnd.stardivision.math": {
+ "source": "apache",
+ "extensions": ["smf"]
+ },
+ "application/vnd.stardivision.writer": {
+ "source": "apache",
+ "extensions": ["sdw","vor"]
+ },
+ "application/vnd.stardivision.writer-global": {
+ "source": "apache",
+ "extensions": ["sgl"]
+ },
+ "application/vnd.stepmania.package": {
+ "source": "iana",
+ "extensions": ["smzip"]
+ },
+ "application/vnd.stepmania.stepchart": {
+ "source": "iana",
+ "extensions": ["sm"]
+ },
+ "application/vnd.street-stream": {
+ "source": "iana"
+ },
+ "application/vnd.sun.wadl+xml": {
+ "source": "iana",
+ "compressible": true,
+ "extensions": ["wadl"]
+ },
+ "application/vnd.sun.xml.calc": {
+ "source": "apache",
+ "extensions": ["sxc"]
+ },
+ "application/vnd.sun.xml.calc.template": {
+ "source": "apache",
+ "extensions": ["stc"]
+ },
+ "application/vnd.sun.xml.draw": {
+ "source": "apache",
+ "extensions": ["sxd"]
+ },
+ "application/vnd.sun.xml.draw.template": {
+ "source": "apache",
+ "extensions": ["std"]
+ },
+ "application/vnd.sun.xml.impress": {
+ "source": "apache",
+ "extensions": ["sxi"]
+ },
+ "application/vnd.sun.xml.impress.template": {
+ "source": "apache",
+ "extensions": ["sti"]
+ },
+ "application/vnd.sun.xml.math": {
+ "source": "apache",
+ "extensions": ["sxm"]
+ },
+ "application/vnd.sun.xml.writer": {
+ "source": "apache",
+ "extensions": ["sxw"]
+ },
+ "application/vnd.sun.xml.writer.global": {
+ "source": "apache",
+ "extensions": ["sxg"]
+ },
+ "application/vnd.sun.xml.writer.template": {
+ "source": "apache",
+ "extensions": ["stw"]
+ },
+ "application/vnd.sus-calendar": {
+ "source": "iana",
+ "extensions": ["sus","susp"]
+ },
+ "application/vnd.svd": {
+ "source": "iana",
+ "extensions": ["svd"]
+ },
+ "application/vnd.swiftview-ics": {
+ "source": "iana"
+ },
+ "application/vnd.sycle+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.syft+json": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.symbian.install": {
+ "source": "apache",
+ "extensions": ["sis","sisx"]
+ },
+ "application/vnd.syncml+xml": {
+ "source": "iana",
+ "charset": "UTF-8",
+ "compressible": true,
+ "extensions": ["xsm"]
+ },
+ "application/vnd.syncml.dm+wbxml": {
+ "source": "iana",
+ "charset": "UTF-8",
+ "extensions": ["bdm"]
+ },
+ "application/vnd.syncml.dm+xml": {
+ "source": "iana",
+ "charset": "UTF-8",
+ "compressible": true,
+ "extensions": ["xdm"]
+ },
+ "application/vnd.syncml.dm.notification": {
+ "source": "iana"
+ },
+ "application/vnd.syncml.dmddf+wbxml": {
+ "source": "iana"
+ },
+ "application/vnd.syncml.dmddf+xml": {
+ "source": "iana",
+ "charset": "UTF-8",
+ "compressible": true,
+ "extensions": ["ddf"]
+ },
+ "application/vnd.syncml.dmtnds+wbxml": {
+ "source": "iana"
+ },
+ "application/vnd.syncml.dmtnds+xml": {
+ "source": "iana",
+ "charset": "UTF-8",
+ "compressible": true
+ },
+ "application/vnd.syncml.ds.notification": {
+ "source": "iana"
+ },
+ "application/vnd.tableschema+json": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.tao.intent-module-archive": {
+ "source": "iana",
+ "extensions": ["tao"]
+ },
+ "application/vnd.tcpdump.pcap": {
+ "source": "iana",
+ "extensions": ["pcap","cap","dmp"]
+ },
+ "application/vnd.think-cell.ppttc+json": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.tmd.mediaflex.api+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.tml": {
+ "source": "iana"
+ },
+ "application/vnd.tmobile-livetv": {
+ "source": "iana",
+ "extensions": ["tmo"]
+ },
+ "application/vnd.tri.onesource": {
+ "source": "iana"
+ },
+ "application/vnd.trid.tpt": {
+ "source": "iana",
+ "extensions": ["tpt"]
+ },
+ "application/vnd.triscape.mxs": {
+ "source": "iana",
+ "extensions": ["mxs"]
+ },
+ "application/vnd.trueapp": {
+ "source": "iana",
+ "extensions": ["tra"]
+ },
+ "application/vnd.truedoc": {
+ "source": "iana"
+ },
+ "application/vnd.ubisoft.webplayer": {
+ "source": "iana"
+ },
+ "application/vnd.ufdl": {
+ "source": "iana",
+ "extensions": ["ufd","ufdl"]
+ },
+ "application/vnd.uiq.theme": {
+ "source": "iana",
+ "extensions": ["utz"]
+ },
+ "application/vnd.umajin": {
+ "source": "iana",
+ "extensions": ["umj"]
+ },
+ "application/vnd.unity": {
+ "source": "iana",
+ "extensions": ["unityweb"]
+ },
+ "application/vnd.uoml+xml": {
+ "source": "iana",
+ "compressible": true,
+ "extensions": ["uoml"]
+ },
+ "application/vnd.uplanet.alert": {
+ "source": "iana"
+ },
+ "application/vnd.uplanet.alert-wbxml": {
+ "source": "iana"
+ },
+ "application/vnd.uplanet.bearer-choice": {
+ "source": "iana"
+ },
+ "application/vnd.uplanet.bearer-choice-wbxml": {
+ "source": "iana"
+ },
+ "application/vnd.uplanet.cacheop": {
+ "source": "iana"
+ },
+ "application/vnd.uplanet.cacheop-wbxml": {
+ "source": "iana"
+ },
+ "application/vnd.uplanet.channel": {
+ "source": "iana"
+ },
+ "application/vnd.uplanet.channel-wbxml": {
+ "source": "iana"
+ },
+ "application/vnd.uplanet.list": {
+ "source": "iana"
+ },
+ "application/vnd.uplanet.list-wbxml": {
+ "source": "iana"
+ },
+ "application/vnd.uplanet.listcmd": {
+ "source": "iana"
+ },
+ "application/vnd.uplanet.listcmd-wbxml": {
+ "source": "iana"
+ },
+ "application/vnd.uplanet.signal": {
+ "source": "iana"
+ },
+ "application/vnd.uri-map": {
+ "source": "iana"
+ },
+ "application/vnd.valve.source.material": {
+ "source": "iana"
+ },
+ "application/vnd.vcx": {
+ "source": "iana",
+ "extensions": ["vcx"]
+ },
+ "application/vnd.vd-study": {
+ "source": "iana"
+ },
+ "application/vnd.vectorworks": {
+ "source": "iana"
+ },
+ "application/vnd.vel+json": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.verimatrix.vcas": {
+ "source": "iana"
+ },
+ "application/vnd.veritone.aion+json": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.veryant.thin": {
+ "source": "iana"
+ },
+ "application/vnd.ves.encrypted": {
+ "source": "iana"
+ },
+ "application/vnd.vidsoft.vidconference": {
+ "source": "iana"
+ },
+ "application/vnd.visio": {
+ "source": "iana",
+ "extensions": ["vsd","vst","vss","vsw"]
+ },
+ "application/vnd.visionary": {
+ "source": "iana",
+ "extensions": ["vis"]
+ },
+ "application/vnd.vividence.scriptfile": {
+ "source": "iana"
+ },
+ "application/vnd.vsf": {
+ "source": "iana",
+ "extensions": ["vsf"]
+ },
+ "application/vnd.wap.sic": {
+ "source": "iana"
+ },
+ "application/vnd.wap.slc": {
+ "source": "iana"
+ },
+ "application/vnd.wap.wbxml": {
+ "source": "iana",
+ "charset": "UTF-8",
+ "extensions": ["wbxml"]
+ },
+ "application/vnd.wap.wmlc": {
+ "source": "iana",
+ "extensions": ["wmlc"]
+ },
+ "application/vnd.wap.wmlscriptc": {
+ "source": "iana",
+ "extensions": ["wmlsc"]
+ },
+ "application/vnd.webturbo": {
+ "source": "iana",
+ "extensions": ["wtb"]
+ },
+ "application/vnd.wfa.dpp": {
+ "source": "iana"
+ },
+ "application/vnd.wfa.p2p": {
+ "source": "iana"
+ },
+ "application/vnd.wfa.wsc": {
+ "source": "iana"
+ },
+ "application/vnd.windows.devicepairing": {
+ "source": "iana"
+ },
+ "application/vnd.wmc": {
+ "source": "iana"
+ },
+ "application/vnd.wmf.bootstrap": {
+ "source": "iana"
+ },
+ "application/vnd.wolfram.mathematica": {
+ "source": "iana"
+ },
+ "application/vnd.wolfram.mathematica.package": {
+ "source": "iana"
+ },
+ "application/vnd.wolfram.player": {
+ "source": "iana",
+ "extensions": ["nbp"]
+ },
+ "application/vnd.wordperfect": {
+ "source": "iana",
+ "extensions": ["wpd"]
+ },
+ "application/vnd.wqd": {
+ "source": "iana",
+ "extensions": ["wqd"]
+ },
+ "application/vnd.wrq-hp3000-labelled": {
+ "source": "iana"
+ },
+ "application/vnd.wt.stf": {
+ "source": "iana",
+ "extensions": ["stf"]
+ },
+ "application/vnd.wv.csp+wbxml": {
+ "source": "iana"
+ },
+ "application/vnd.wv.csp+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.wv.ssp+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.xacml+json": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.xara": {
+ "source": "iana",
+ "extensions": ["xar"]
+ },
+ "application/vnd.xfdl": {
+ "source": "iana",
+ "extensions": ["xfdl"]
+ },
+ "application/vnd.xfdl.webform": {
+ "source": "iana"
+ },
+ "application/vnd.xmi+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vnd.xmpie.cpkg": {
+ "source": "iana"
+ },
+ "application/vnd.xmpie.dpkg": {
+ "source": "iana"
+ },
+ "application/vnd.xmpie.plan": {
+ "source": "iana"
+ },
+ "application/vnd.xmpie.ppkg": {
+ "source": "iana"
+ },
+ "application/vnd.xmpie.xlim": {
+ "source": "iana"
+ },
+ "application/vnd.yamaha.hv-dic": {
+ "source": "iana",
+ "extensions": ["hvd"]
+ },
+ "application/vnd.yamaha.hv-script": {
+ "source": "iana",
+ "extensions": ["hvs"]
+ },
+ "application/vnd.yamaha.hv-voice": {
+ "source": "iana",
+ "extensions": ["hvp"]
+ },
+ "application/vnd.yamaha.openscoreformat": {
+ "source": "iana",
+ "extensions": ["osf"]
+ },
+ "application/vnd.yamaha.openscoreformat.osfpvg+xml": {
+ "source": "iana",
+ "compressible": true,
+ "extensions": ["osfpvg"]
+ },
+ "application/vnd.yamaha.remote-setup": {
+ "source": "iana"
+ },
+ "application/vnd.yamaha.smaf-audio": {
+ "source": "iana",
+ "extensions": ["saf"]
+ },
+ "application/vnd.yamaha.smaf-phrase": {
+ "source": "iana",
+ "extensions": ["spf"]
+ },
+ "application/vnd.yamaha.through-ngn": {
+ "source": "iana"
+ },
+ "application/vnd.yamaha.tunnel-udpencap": {
+ "source": "iana"
+ },
+ "application/vnd.yaoweme": {
+ "source": "iana"
+ },
+ "application/vnd.yellowriver-custom-menu": {
+ "source": "iana",
+ "extensions": ["cmp"]
+ },
+ "application/vnd.youtube.yt": {
+ "source": "iana"
+ },
+ "application/vnd.zul": {
+ "source": "iana",
+ "extensions": ["zir","zirz"]
+ },
+ "application/vnd.zzazz.deck+xml": {
+ "source": "iana",
+ "compressible": true,
+ "extensions": ["zaz"]
+ },
+ "application/voicexml+xml": {
+ "source": "iana",
+ "compressible": true,
+ "extensions": ["vxml"]
+ },
+ "application/voucher-cms+json": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/vq-rtcpxr": {
+ "source": "iana"
+ },
+ "application/wasm": {
+ "source": "iana",
+ "compressible": true,
+ "extensions": ["wasm"]
+ },
+ "application/watcherinfo+xml": {
+ "source": "iana",
+ "compressible": true,
+ "extensions": ["wif"]
+ },
+ "application/webpush-options+json": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/whoispp-query": {
+ "source": "iana"
+ },
+ "application/whoispp-response": {
+ "source": "iana"
+ },
+ "application/widget": {
+ "source": "iana",
+ "extensions": ["wgt"]
+ },
+ "application/winhlp": {
+ "source": "apache",
+ "extensions": ["hlp"]
+ },
+ "application/wita": {
+ "source": "iana"
+ },
+ "application/wordperfect5.1": {
+ "source": "iana"
+ },
+ "application/wsdl+xml": {
+ "source": "iana",
+ "compressible": true,
+ "extensions": ["wsdl"]
+ },
+ "application/wspolicy+xml": {
+ "source": "iana",
+ "compressible": true,
+ "extensions": ["wspolicy"]
+ },
+ "application/x-7z-compressed": {
+ "source": "apache",
+ "compressible": false,
+ "extensions": ["7z"]
+ },
+ "application/x-abiword": {
+ "source": "apache",
+ "extensions": ["abw"]
+ },
+ "application/x-ace-compressed": {
+ "source": "apache",
+ "extensions": ["ace"]
+ },
+ "application/x-amf": {
+ "source": "apache"
+ },
+ "application/x-apple-diskimage": {
+ "source": "apache",
+ "extensions": ["dmg"]
+ },
+ "application/x-arj": {
+ "compressible": false,
+ "extensions": ["arj"]
+ },
+ "application/x-authorware-bin": {
+ "source": "apache",
+ "extensions": ["aab","x32","u32","vox"]
+ },
+ "application/x-authorware-map": {
+ "source": "apache",
+ "extensions": ["aam"]
+ },
+ "application/x-authorware-seg": {
+ "source": "apache",
+ "extensions": ["aas"]
+ },
+ "application/x-bcpio": {
+ "source": "apache",
+ "extensions": ["bcpio"]
+ },
+ "application/x-bdoc": {
+ "compressible": false,
+ "extensions": ["bdoc"]
+ },
+ "application/x-bittorrent": {
+ "source": "apache",
+ "extensions": ["torrent"]
+ },
+ "application/x-blorb": {
+ "source": "apache",
+ "extensions": ["blb","blorb"]
+ },
+ "application/x-bzip": {
+ "source": "apache",
+ "compressible": false,
+ "extensions": ["bz"]
+ },
+ "application/x-bzip2": {
+ "source": "apache",
+ "compressible": false,
+ "extensions": ["bz2","boz"]
+ },
+ "application/x-cbr": {
+ "source": "apache",
+ "extensions": ["cbr","cba","cbt","cbz","cb7"]
+ },
+ "application/x-cdlink": {
+ "source": "apache",
+ "extensions": ["vcd"]
+ },
+ "application/x-cfs-compressed": {
+ "source": "apache",
+ "extensions": ["cfs"]
+ },
+ "application/x-chat": {
+ "source": "apache",
+ "extensions": ["chat"]
+ },
+ "application/x-chess-pgn": {
+ "source": "apache",
+ "extensions": ["pgn"]
+ },
+ "application/x-chrome-extension": {
+ "extensions": ["crx"]
+ },
+ "application/x-cocoa": {
+ "source": "nginx",
+ "extensions": ["cco"]
+ },
+ "application/x-compress": {
+ "source": "apache"
+ },
+ "application/x-conference": {
+ "source": "apache",
+ "extensions": ["nsc"]
+ },
+ "application/x-cpio": {
+ "source": "apache",
+ "extensions": ["cpio"]
+ },
+ "application/x-csh": {
+ "source": "apache",
+ "extensions": ["csh"]
+ },
+ "application/x-deb": {
+ "compressible": false
+ },
+ "application/x-debian-package": {
+ "source": "apache",
+ "extensions": ["deb","udeb"]
+ },
+ "application/x-dgc-compressed": {
+ "source": "apache",
+ "extensions": ["dgc"]
+ },
+ "application/x-director": {
+ "source": "apache",
+ "extensions": ["dir","dcr","dxr","cst","cct","cxt","w3d","fgd","swa"]
+ },
+ "application/x-doom": {
+ "source": "apache",
+ "extensions": ["wad"]
+ },
+ "application/x-dtbncx+xml": {
+ "source": "apache",
+ "compressible": true,
+ "extensions": ["ncx"]
+ },
+ "application/x-dtbook+xml": {
+ "source": "apache",
+ "compressible": true,
+ "extensions": ["dtb"]
+ },
+ "application/x-dtbresource+xml": {
+ "source": "apache",
+ "compressible": true,
+ "extensions": ["res"]
+ },
+ "application/x-dvi": {
+ "source": "apache",
+ "compressible": false,
+ "extensions": ["dvi"]
+ },
+ "application/x-envoy": {
+ "source": "apache",
+ "extensions": ["evy"]
+ },
+ "application/x-eva": {
+ "source": "apache",
+ "extensions": ["eva"]
+ },
+ "application/x-font-bdf": {
+ "source": "apache",
+ "extensions": ["bdf"]
+ },
+ "application/x-font-dos": {
+ "source": "apache"
+ },
+ "application/x-font-framemaker": {
+ "source": "apache"
+ },
+ "application/x-font-ghostscript": {
+ "source": "apache",
+ "extensions": ["gsf"]
+ },
+ "application/x-font-libgrx": {
+ "source": "apache"
+ },
+ "application/x-font-linux-psf": {
+ "source": "apache",
+ "extensions": ["psf"]
+ },
+ "application/x-font-pcf": {
+ "source": "apache",
+ "extensions": ["pcf"]
+ },
+ "application/x-font-snf": {
+ "source": "apache",
+ "extensions": ["snf"]
+ },
+ "application/x-font-speedo": {
+ "source": "apache"
+ },
+ "application/x-font-sunos-news": {
+ "source": "apache"
+ },
+ "application/x-font-type1": {
+ "source": "apache",
+ "extensions": ["pfa","pfb","pfm","afm"]
+ },
+ "application/x-font-vfont": {
+ "source": "apache"
+ },
+ "application/x-freearc": {
+ "source": "apache",
+ "extensions": ["arc"]
+ },
+ "application/x-futuresplash": {
+ "source": "apache",
+ "extensions": ["spl"]
+ },
+ "application/x-gca-compressed": {
+ "source": "apache",
+ "extensions": ["gca"]
+ },
+ "application/x-glulx": {
+ "source": "apache",
+ "extensions": ["ulx"]
+ },
+ "application/x-gnumeric": {
+ "source": "apache",
+ "extensions": ["gnumeric"]
+ },
+ "application/x-gramps-xml": {
+ "source": "apache",
+ "extensions": ["gramps"]
+ },
+ "application/x-gtar": {
+ "source": "apache",
+ "extensions": ["gtar"]
+ },
+ "application/x-gzip": {
+ "source": "apache"
+ },
+ "application/x-hdf": {
+ "source": "apache",
+ "extensions": ["hdf"]
+ },
+ "application/x-httpd-php": {
+ "compressible": true,
+ "extensions": ["php"]
+ },
+ "application/x-install-instructions": {
+ "source": "apache",
+ "extensions": ["install"]
+ },
+ "application/x-iso9660-image": {
+ "source": "apache",
+ "extensions": ["iso"]
+ },
+ "application/x-iwork-keynote-sffkey": {
+ "extensions": ["key"]
+ },
+ "application/x-iwork-numbers-sffnumbers": {
+ "extensions": ["numbers"]
+ },
+ "application/x-iwork-pages-sffpages": {
+ "extensions": ["pages"]
+ },
+ "application/x-java-archive-diff": {
+ "source": "nginx",
+ "extensions": ["jardiff"]
+ },
+ "application/x-java-jnlp-file": {
+ "source": "apache",
+ "compressible": false,
+ "extensions": ["jnlp"]
+ },
+ "application/x-javascript": {
+ "compressible": true
+ },
+ "application/x-keepass2": {
+ "extensions": ["kdbx"]
+ },
+ "application/x-latex": {
+ "source": "apache",
+ "compressible": false,
+ "extensions": ["latex"]
+ },
+ "application/x-lua-bytecode": {
+ "extensions": ["luac"]
+ },
+ "application/x-lzh-compressed": {
+ "source": "apache",
+ "extensions": ["lzh","lha"]
+ },
+ "application/x-makeself": {
+ "source": "nginx",
+ "extensions": ["run"]
+ },
+ "application/x-mie": {
+ "source": "apache",
+ "extensions": ["mie"]
+ },
+ "application/x-mobipocket-ebook": {
+ "source": "apache",
+ "extensions": ["prc","mobi"]
+ },
+ "application/x-mpegurl": {
+ "compressible": false
+ },
+ "application/x-ms-application": {
+ "source": "apache",
+ "extensions": ["application"]
+ },
+ "application/x-ms-shortcut": {
+ "source": "apache",
+ "extensions": ["lnk"]
+ },
+ "application/x-ms-wmd": {
+ "source": "apache",
+ "extensions": ["wmd"]
+ },
+ "application/x-ms-wmz": {
+ "source": "apache",
+ "extensions": ["wmz"]
+ },
+ "application/x-ms-xbap": {
+ "source": "apache",
+ "extensions": ["xbap"]
+ },
+ "application/x-msaccess": {
+ "source": "apache",
+ "extensions": ["mdb"]
+ },
+ "application/x-msbinder": {
+ "source": "apache",
+ "extensions": ["obd"]
+ },
+ "application/x-mscardfile": {
+ "source": "apache",
+ "extensions": ["crd"]
+ },
+ "application/x-msclip": {
+ "source": "apache",
+ "extensions": ["clp"]
+ },
+ "application/x-msdos-program": {
+ "extensions": ["exe"]
+ },
+ "application/x-msdownload": {
+ "source": "apache",
+ "extensions": ["exe","dll","com","bat","msi"]
+ },
+ "application/x-msmediaview": {
+ "source": "apache",
+ "extensions": ["mvb","m13","m14"]
+ },
+ "application/x-msmetafile": {
+ "source": "apache",
+ "extensions": ["wmf","wmz","emf","emz"]
+ },
+ "application/x-msmoney": {
+ "source": "apache",
+ "extensions": ["mny"]
+ },
+ "application/x-mspublisher": {
+ "source": "apache",
+ "extensions": ["pub"]
+ },
+ "application/x-msschedule": {
+ "source": "apache",
+ "extensions": ["scd"]
+ },
+ "application/x-msterminal": {
+ "source": "apache",
+ "extensions": ["trm"]
+ },
+ "application/x-mswrite": {
+ "source": "apache",
+ "extensions": ["wri"]
+ },
+ "application/x-netcdf": {
+ "source": "apache",
+ "extensions": ["nc","cdf"]
+ },
+ "application/x-ns-proxy-autoconfig": {
+ "compressible": true,
+ "extensions": ["pac"]
+ },
+ "application/x-nzb": {
+ "source": "apache",
+ "extensions": ["nzb"]
+ },
+ "application/x-perl": {
+ "source": "nginx",
+ "extensions": ["pl","pm"]
+ },
+ "application/x-pilot": {
+ "source": "nginx",
+ "extensions": ["prc","pdb"]
+ },
+ "application/x-pkcs12": {
+ "source": "apache",
+ "compressible": false,
+ "extensions": ["p12","pfx"]
+ },
+ "application/x-pkcs7-certificates": {
+ "source": "apache",
+ "extensions": ["p7b","spc"]
+ },
+ "application/x-pkcs7-certreqresp": {
+ "source": "apache",
+ "extensions": ["p7r"]
+ },
+ "application/x-pki-message": {
+ "source": "iana"
+ },
+ "application/x-rar-compressed": {
+ "source": "apache",
+ "compressible": false,
+ "extensions": ["rar"]
+ },
+ "application/x-redhat-package-manager": {
+ "source": "nginx",
+ "extensions": ["rpm"]
+ },
+ "application/x-research-info-systems": {
+ "source": "apache",
+ "extensions": ["ris"]
+ },
+ "application/x-sea": {
+ "source": "nginx",
+ "extensions": ["sea"]
+ },
+ "application/x-sh": {
+ "source": "apache",
+ "compressible": true,
+ "extensions": ["sh"]
+ },
+ "application/x-shar": {
+ "source": "apache",
+ "extensions": ["shar"]
+ },
+ "application/x-shockwave-flash": {
+ "source": "apache",
+ "compressible": false,
+ "extensions": ["swf"]
+ },
+ "application/x-silverlight-app": {
+ "source": "apache",
+ "extensions": ["xap"]
+ },
+ "application/x-sql": {
+ "source": "apache",
+ "extensions": ["sql"]
+ },
+ "application/x-stuffit": {
+ "source": "apache",
+ "compressible": false,
+ "extensions": ["sit"]
+ },
+ "application/x-stuffitx": {
+ "source": "apache",
+ "extensions": ["sitx"]
+ },
+ "application/x-subrip": {
+ "source": "apache",
+ "extensions": ["srt"]
+ },
+ "application/x-sv4cpio": {
+ "source": "apache",
+ "extensions": ["sv4cpio"]
+ },
+ "application/x-sv4crc": {
+ "source": "apache",
+ "extensions": ["sv4crc"]
+ },
+ "application/x-t3vm-image": {
+ "source": "apache",
+ "extensions": ["t3"]
+ },
+ "application/x-tads": {
+ "source": "apache",
+ "extensions": ["gam"]
+ },
+ "application/x-tar": {
+ "source": "apache",
+ "compressible": true,
+ "extensions": ["tar"]
+ },
+ "application/x-tcl": {
+ "source": "apache",
+ "extensions": ["tcl","tk"]
+ },
+ "application/x-tex": {
+ "source": "apache",
+ "extensions": ["tex"]
+ },
+ "application/x-tex-tfm": {
+ "source": "apache",
+ "extensions": ["tfm"]
+ },
+ "application/x-texinfo": {
+ "source": "apache",
+ "extensions": ["texinfo","texi"]
+ },
+ "application/x-tgif": {
+ "source": "apache",
+ "extensions": ["obj"]
+ },
+ "application/x-ustar": {
+ "source": "apache",
+ "extensions": ["ustar"]
+ },
+ "application/x-virtualbox-hdd": {
+ "compressible": true,
+ "extensions": ["hdd"]
+ },
+ "application/x-virtualbox-ova": {
+ "compressible": true,
+ "extensions": ["ova"]
+ },
+ "application/x-virtualbox-ovf": {
+ "compressible": true,
+ "extensions": ["ovf"]
+ },
+ "application/x-virtualbox-vbox": {
+ "compressible": true,
+ "extensions": ["vbox"]
+ },
+ "application/x-virtualbox-vbox-extpack": {
+ "compressible": false,
+ "extensions": ["vbox-extpack"]
+ },
+ "application/x-virtualbox-vdi": {
+ "compressible": true,
+ "extensions": ["vdi"]
+ },
+ "application/x-virtualbox-vhd": {
+ "compressible": true,
+ "extensions": ["vhd"]
+ },
+ "application/x-virtualbox-vmdk": {
+ "compressible": true,
+ "extensions": ["vmdk"]
+ },
+ "application/x-wais-source": {
+ "source": "apache",
+ "extensions": ["src"]
+ },
+ "application/x-web-app-manifest+json": {
+ "compressible": true,
+ "extensions": ["webapp"]
+ },
+ "application/x-www-form-urlencoded": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/x-x509-ca-cert": {
+ "source": "iana",
+ "extensions": ["der","crt","pem"]
+ },
+ "application/x-x509-ca-ra-cert": {
+ "source": "iana"
+ },
+ "application/x-x509-next-ca-cert": {
+ "source": "iana"
+ },
+ "application/x-xfig": {
+ "source": "apache",
+ "extensions": ["fig"]
+ },
+ "application/x-xliff+xml": {
+ "source": "apache",
+ "compressible": true,
+ "extensions": ["xlf"]
+ },
+ "application/x-xpinstall": {
+ "source": "apache",
+ "compressible": false,
+ "extensions": ["xpi"]
+ },
+ "application/x-xz": {
+ "source": "apache",
+ "extensions": ["xz"]
+ },
+ "application/x-zmachine": {
+ "source": "apache",
+ "extensions": ["z1","z2","z3","z4","z5","z6","z7","z8"]
+ },
+ "application/x400-bp": {
+ "source": "iana"
+ },
+ "application/xacml+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/xaml+xml": {
+ "source": "apache",
+ "compressible": true,
+ "extensions": ["xaml"]
+ },
+ "application/xcap-att+xml": {
+ "source": "iana",
+ "compressible": true,
+ "extensions": ["xav"]
+ },
+ "application/xcap-caps+xml": {
+ "source": "iana",
+ "compressible": true,
+ "extensions": ["xca"]
+ },
+ "application/xcap-diff+xml": {
+ "source": "iana",
+ "compressible": true,
+ "extensions": ["xdf"]
+ },
+ "application/xcap-el+xml": {
+ "source": "iana",
+ "compressible": true,
+ "extensions": ["xel"]
+ },
+ "application/xcap-error+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/xcap-ns+xml": {
+ "source": "iana",
+ "compressible": true,
+ "extensions": ["xns"]
+ },
+ "application/xcon-conference-info+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/xcon-conference-info-diff+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/xenc+xml": {
+ "source": "iana",
+ "compressible": true,
+ "extensions": ["xenc"]
+ },
+ "application/xhtml+xml": {
+ "source": "iana",
+ "compressible": true,
+ "extensions": ["xhtml","xht"]
+ },
+ "application/xhtml-voice+xml": {
+ "source": "apache",
+ "compressible": true
+ },
+ "application/xliff+xml": {
+ "source": "iana",
+ "compressible": true,
+ "extensions": ["xlf"]
+ },
+ "application/xml": {
+ "source": "iana",
+ "compressible": true,
+ "extensions": ["xml","xsl","xsd","rng"]
+ },
+ "application/xml-dtd": {
+ "source": "iana",
+ "compressible": true,
+ "extensions": ["dtd"]
+ },
+ "application/xml-external-parsed-entity": {
+ "source": "iana"
+ },
+ "application/xml-patch+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/xmpp+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/xop+xml": {
+ "source": "iana",
+ "compressible": true,
+ "extensions": ["xop"]
+ },
+ "application/xproc+xml": {
+ "source": "apache",
+ "compressible": true,
+ "extensions": ["xpl"]
+ },
+ "application/xslt+xml": {
+ "source": "iana",
+ "compressible": true,
+ "extensions": ["xsl","xslt"]
+ },
+ "application/xspf+xml": {
+ "source": "apache",
+ "compressible": true,
+ "extensions": ["xspf"]
+ },
+ "application/xv+xml": {
+ "source": "iana",
+ "compressible": true,
+ "extensions": ["mxml","xhvml","xvml","xvm"]
+ },
+ "application/yang": {
+ "source": "iana",
+ "extensions": ["yang"]
+ },
+ "application/yang-data+json": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/yang-data+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/yang-patch+json": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/yang-patch+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "application/yin+xml": {
+ "source": "iana",
+ "compressible": true,
+ "extensions": ["yin"]
+ },
+ "application/zip": {
+ "source": "iana",
+ "compressible": false,
+ "extensions": ["zip"]
+ },
+ "application/zlib": {
+ "source": "iana"
+ },
+ "application/zstd": {
+ "source": "iana"
+ },
+ "audio/1d-interleaved-parityfec": {
+ "source": "iana"
+ },
+ "audio/32kadpcm": {
+ "source": "iana"
+ },
+ "audio/3gpp": {
+ "source": "iana",
+ "compressible": false,
+ "extensions": ["3gpp"]
+ },
+ "audio/3gpp2": {
+ "source": "iana"
+ },
+ "audio/aac": {
+ "source": "iana"
+ },
+ "audio/ac3": {
+ "source": "iana"
+ },
+ "audio/adpcm": {
+ "source": "apache",
+ "extensions": ["adp"]
+ },
+ "audio/amr": {
+ "source": "iana",
+ "extensions": ["amr"]
+ },
+ "audio/amr-wb": {
+ "source": "iana"
+ },
+ "audio/amr-wb+": {
+ "source": "iana"
+ },
+ "audio/aptx": {
+ "source": "iana"
+ },
+ "audio/asc": {
+ "source": "iana"
+ },
+ "audio/atrac-advanced-lossless": {
+ "source": "iana"
+ },
+ "audio/atrac-x": {
+ "source": "iana"
+ },
+ "audio/atrac3": {
+ "source": "iana"
+ },
+ "audio/basic": {
+ "source": "iana",
+ "compressible": false,
+ "extensions": ["au","snd"]
+ },
+ "audio/bv16": {
+ "source": "iana"
+ },
+ "audio/bv32": {
+ "source": "iana"
+ },
+ "audio/clearmode": {
+ "source": "iana"
+ },
+ "audio/cn": {
+ "source": "iana"
+ },
+ "audio/dat12": {
+ "source": "iana"
+ },
+ "audio/dls": {
+ "source": "iana"
+ },
+ "audio/dsr-es201108": {
+ "source": "iana"
+ },
+ "audio/dsr-es202050": {
+ "source": "iana"
+ },
+ "audio/dsr-es202211": {
+ "source": "iana"
+ },
+ "audio/dsr-es202212": {
+ "source": "iana"
+ },
+ "audio/dv": {
+ "source": "iana"
+ },
+ "audio/dvi4": {
+ "source": "iana"
+ },
+ "audio/eac3": {
+ "source": "iana"
+ },
+ "audio/encaprtp": {
+ "source": "iana"
+ },
+ "audio/evrc": {
+ "source": "iana"
+ },
+ "audio/evrc-qcp": {
+ "source": "iana"
+ },
+ "audio/evrc0": {
+ "source": "iana"
+ },
+ "audio/evrc1": {
+ "source": "iana"
+ },
+ "audio/evrcb": {
+ "source": "iana"
+ },
+ "audio/evrcb0": {
+ "source": "iana"
+ },
+ "audio/evrcb1": {
+ "source": "iana"
+ },
+ "audio/evrcnw": {
+ "source": "iana"
+ },
+ "audio/evrcnw0": {
+ "source": "iana"
+ },
+ "audio/evrcnw1": {
+ "source": "iana"
+ },
+ "audio/evrcwb": {
+ "source": "iana"
+ },
+ "audio/evrcwb0": {
+ "source": "iana"
+ },
+ "audio/evrcwb1": {
+ "source": "iana"
+ },
+ "audio/evs": {
+ "source": "iana"
+ },
+ "audio/flexfec": {
+ "source": "iana"
+ },
+ "audio/fwdred": {
+ "source": "iana"
+ },
+ "audio/g711-0": {
+ "source": "iana"
+ },
+ "audio/g719": {
+ "source": "iana"
+ },
+ "audio/g722": {
+ "source": "iana"
+ },
+ "audio/g7221": {
+ "source": "iana"
+ },
+ "audio/g723": {
+ "source": "iana"
+ },
+ "audio/g726-16": {
+ "source": "iana"
+ },
+ "audio/g726-24": {
+ "source": "iana"
+ },
+ "audio/g726-32": {
+ "source": "iana"
+ },
+ "audio/g726-40": {
+ "source": "iana"
+ },
+ "audio/g728": {
+ "source": "iana"
+ },
+ "audio/g729": {
+ "source": "iana"
+ },
+ "audio/g7291": {
+ "source": "iana"
+ },
+ "audio/g729d": {
+ "source": "iana"
+ },
+ "audio/g729e": {
+ "source": "iana"
+ },
+ "audio/gsm": {
+ "source": "iana"
+ },
+ "audio/gsm-efr": {
+ "source": "iana"
+ },
+ "audio/gsm-hr-08": {
+ "source": "iana"
+ },
+ "audio/ilbc": {
+ "source": "iana"
+ },
+ "audio/ip-mr_v2.5": {
+ "source": "iana"
+ },
+ "audio/isac": {
+ "source": "apache"
+ },
+ "audio/l16": {
+ "source": "iana"
+ },
+ "audio/l20": {
+ "source": "iana"
+ },
+ "audio/l24": {
+ "source": "iana",
+ "compressible": false
+ },
+ "audio/l8": {
+ "source": "iana"
+ },
+ "audio/lpc": {
+ "source": "iana"
+ },
+ "audio/melp": {
+ "source": "iana"
+ },
+ "audio/melp1200": {
+ "source": "iana"
+ },
+ "audio/melp2400": {
+ "source": "iana"
+ },
+ "audio/melp600": {
+ "source": "iana"
+ },
+ "audio/mhas": {
+ "source": "iana"
+ },
+ "audio/midi": {
+ "source": "apache",
+ "extensions": ["mid","midi","kar","rmi"]
+ },
+ "audio/mobile-xmf": {
+ "source": "iana",
+ "extensions": ["mxmf"]
+ },
+ "audio/mp3": {
+ "compressible": false,
+ "extensions": ["mp3"]
+ },
+ "audio/mp4": {
+ "source": "iana",
+ "compressible": false,
+ "extensions": ["m4a","mp4a"]
+ },
+ "audio/mp4a-latm": {
+ "source": "iana"
+ },
+ "audio/mpa": {
+ "source": "iana"
+ },
+ "audio/mpa-robust": {
+ "source": "iana"
+ },
+ "audio/mpeg": {
+ "source": "iana",
+ "compressible": false,
+ "extensions": ["mpga","mp2","mp2a","mp3","m2a","m3a"]
+ },
+ "audio/mpeg4-generic": {
+ "source": "iana"
+ },
+ "audio/musepack": {
+ "source": "apache"
+ },
+ "audio/ogg": {
+ "source": "iana",
+ "compressible": false,
+ "extensions": ["oga","ogg","spx","opus"]
+ },
+ "audio/opus": {
+ "source": "iana"
+ },
+ "audio/parityfec": {
+ "source": "iana"
+ },
+ "audio/pcma": {
+ "source": "iana"
+ },
+ "audio/pcma-wb": {
+ "source": "iana"
+ },
+ "audio/pcmu": {
+ "source": "iana"
+ },
+ "audio/pcmu-wb": {
+ "source": "iana"
+ },
+ "audio/prs.sid": {
+ "source": "iana"
+ },
+ "audio/qcelp": {
+ "source": "iana"
+ },
+ "audio/raptorfec": {
+ "source": "iana"
+ },
+ "audio/red": {
+ "source": "iana"
+ },
+ "audio/rtp-enc-aescm128": {
+ "source": "iana"
+ },
+ "audio/rtp-midi": {
+ "source": "iana"
+ },
+ "audio/rtploopback": {
+ "source": "iana"
+ },
+ "audio/rtx": {
+ "source": "iana"
+ },
+ "audio/s3m": {
+ "source": "apache",
+ "extensions": ["s3m"]
+ },
+ "audio/scip": {
+ "source": "iana"
+ },
+ "audio/silk": {
+ "source": "apache",
+ "extensions": ["sil"]
+ },
+ "audio/smv": {
+ "source": "iana"
+ },
+ "audio/smv-qcp": {
+ "source": "iana"
+ },
+ "audio/smv0": {
+ "source": "iana"
+ },
+ "audio/sofa": {
+ "source": "iana"
+ },
+ "audio/sp-midi": {
+ "source": "iana"
+ },
+ "audio/speex": {
+ "source": "iana"
+ },
+ "audio/t140c": {
+ "source": "iana"
+ },
+ "audio/t38": {
+ "source": "iana"
+ },
+ "audio/telephone-event": {
+ "source": "iana"
+ },
+ "audio/tetra_acelp": {
+ "source": "iana"
+ },
+ "audio/tetra_acelp_bb": {
+ "source": "iana"
+ },
+ "audio/tone": {
+ "source": "iana"
+ },
+ "audio/tsvcis": {
+ "source": "iana"
+ },
+ "audio/uemclip": {
+ "source": "iana"
+ },
+ "audio/ulpfec": {
+ "source": "iana"
+ },
+ "audio/usac": {
+ "source": "iana"
+ },
+ "audio/vdvi": {
+ "source": "iana"
+ },
+ "audio/vmr-wb": {
+ "source": "iana"
+ },
+ "audio/vnd.3gpp.iufp": {
+ "source": "iana"
+ },
+ "audio/vnd.4sb": {
+ "source": "iana"
+ },
+ "audio/vnd.audiokoz": {
+ "source": "iana"
+ },
+ "audio/vnd.celp": {
+ "source": "iana"
+ },
+ "audio/vnd.cisco.nse": {
+ "source": "iana"
+ },
+ "audio/vnd.cmles.radio-events": {
+ "source": "iana"
+ },
+ "audio/vnd.cns.anp1": {
+ "source": "iana"
+ },
+ "audio/vnd.cns.inf1": {
+ "source": "iana"
+ },
+ "audio/vnd.dece.audio": {
+ "source": "iana",
+ "extensions": ["uva","uvva"]
+ },
+ "audio/vnd.digital-winds": {
+ "source": "iana",
+ "extensions": ["eol"]
+ },
+ "audio/vnd.dlna.adts": {
+ "source": "iana"
+ },
+ "audio/vnd.dolby.heaac.1": {
+ "source": "iana"
+ },
+ "audio/vnd.dolby.heaac.2": {
+ "source": "iana"
+ },
+ "audio/vnd.dolby.mlp": {
+ "source": "iana"
+ },
+ "audio/vnd.dolby.mps": {
+ "source": "iana"
+ },
+ "audio/vnd.dolby.pl2": {
+ "source": "iana"
+ },
+ "audio/vnd.dolby.pl2x": {
+ "source": "iana"
+ },
+ "audio/vnd.dolby.pl2z": {
+ "source": "iana"
+ },
+ "audio/vnd.dolby.pulse.1": {
+ "source": "iana"
+ },
+ "audio/vnd.dra": {
+ "source": "iana",
+ "extensions": ["dra"]
+ },
+ "audio/vnd.dts": {
+ "source": "iana",
+ "extensions": ["dts"]
+ },
+ "audio/vnd.dts.hd": {
+ "source": "iana",
+ "extensions": ["dtshd"]
+ },
+ "audio/vnd.dts.uhd": {
+ "source": "iana"
+ },
+ "audio/vnd.dvb.file": {
+ "source": "iana"
+ },
+ "audio/vnd.everad.plj": {
+ "source": "iana"
+ },
+ "audio/vnd.hns.audio": {
+ "source": "iana"
+ },
+ "audio/vnd.lucent.voice": {
+ "source": "iana",
+ "extensions": ["lvp"]
+ },
+ "audio/vnd.ms-playready.media.pya": {
+ "source": "iana",
+ "extensions": ["pya"]
+ },
+ "audio/vnd.nokia.mobile-xmf": {
+ "source": "iana"
+ },
+ "audio/vnd.nortel.vbk": {
+ "source": "iana"
+ },
+ "audio/vnd.nuera.ecelp4800": {
+ "source": "iana",
+ "extensions": ["ecelp4800"]
+ },
+ "audio/vnd.nuera.ecelp7470": {
+ "source": "iana",
+ "extensions": ["ecelp7470"]
+ },
+ "audio/vnd.nuera.ecelp9600": {
+ "source": "iana",
+ "extensions": ["ecelp9600"]
+ },
+ "audio/vnd.octel.sbc": {
+ "source": "iana"
+ },
+ "audio/vnd.presonus.multitrack": {
+ "source": "iana"
+ },
+ "audio/vnd.qcelp": {
+ "source": "iana"
+ },
+ "audio/vnd.rhetorex.32kadpcm": {
+ "source": "iana"
+ },
+ "audio/vnd.rip": {
+ "source": "iana",
+ "extensions": ["rip"]
+ },
+ "audio/vnd.rn-realaudio": {
+ "compressible": false
+ },
+ "audio/vnd.sealedmedia.softseal.mpeg": {
+ "source": "iana"
+ },
+ "audio/vnd.vmx.cvsd": {
+ "source": "iana"
+ },
+ "audio/vnd.wave": {
+ "compressible": false
+ },
+ "audio/vorbis": {
+ "source": "iana",
+ "compressible": false
+ },
+ "audio/vorbis-config": {
+ "source": "iana"
+ },
+ "audio/wav": {
+ "compressible": false,
+ "extensions": ["wav"]
+ },
+ "audio/wave": {
+ "compressible": false,
+ "extensions": ["wav"]
+ },
+ "audio/webm": {
+ "source": "apache",
+ "compressible": false,
+ "extensions": ["weba"]
+ },
+ "audio/x-aac": {
+ "source": "apache",
+ "compressible": false,
+ "extensions": ["aac"]
+ },
+ "audio/x-aiff": {
+ "source": "apache",
+ "extensions": ["aif","aiff","aifc"]
+ },
+ "audio/x-caf": {
+ "source": "apache",
+ "compressible": false,
+ "extensions": ["caf"]
+ },
+ "audio/x-flac": {
+ "source": "apache",
+ "extensions": ["flac"]
+ },
+ "audio/x-m4a": {
+ "source": "nginx",
+ "extensions": ["m4a"]
+ },
+ "audio/x-matroska": {
+ "source": "apache",
+ "extensions": ["mka"]
+ },
+ "audio/x-mpegurl": {
+ "source": "apache",
+ "extensions": ["m3u"]
+ },
+ "audio/x-ms-wax": {
+ "source": "apache",
+ "extensions": ["wax"]
+ },
+ "audio/x-ms-wma": {
+ "source": "apache",
+ "extensions": ["wma"]
+ },
+ "audio/x-pn-realaudio": {
+ "source": "apache",
+ "extensions": ["ram","ra"]
+ },
+ "audio/x-pn-realaudio-plugin": {
+ "source": "apache",
+ "extensions": ["rmp"]
+ },
+ "audio/x-realaudio": {
+ "source": "nginx",
+ "extensions": ["ra"]
+ },
+ "audio/x-tta": {
+ "source": "apache"
+ },
+ "audio/x-wav": {
+ "source": "apache",
+ "extensions": ["wav"]
+ },
+ "audio/xm": {
+ "source": "apache",
+ "extensions": ["xm"]
+ },
+ "chemical/x-cdx": {
+ "source": "apache",
+ "extensions": ["cdx"]
+ },
+ "chemical/x-cif": {
+ "source": "apache",
+ "extensions": ["cif"]
+ },
+ "chemical/x-cmdf": {
+ "source": "apache",
+ "extensions": ["cmdf"]
+ },
+ "chemical/x-cml": {
+ "source": "apache",
+ "extensions": ["cml"]
+ },
+ "chemical/x-csml": {
+ "source": "apache",
+ "extensions": ["csml"]
+ },
+ "chemical/x-pdb": {
+ "source": "apache"
+ },
+ "chemical/x-xyz": {
+ "source": "apache",
+ "extensions": ["xyz"]
+ },
+ "font/collection": {
+ "source": "iana",
+ "extensions": ["ttc"]
+ },
+ "font/otf": {
+ "source": "iana",
+ "compressible": true,
+ "extensions": ["otf"]
+ },
+ "font/sfnt": {
+ "source": "iana"
+ },
+ "font/ttf": {
+ "source": "iana",
+ "compressible": true,
+ "extensions": ["ttf"]
+ },
+ "font/woff": {
+ "source": "iana",
+ "extensions": ["woff"]
+ },
+ "font/woff2": {
+ "source": "iana",
+ "extensions": ["woff2"]
+ },
+ "image/aces": {
+ "source": "iana",
+ "extensions": ["exr"]
+ },
+ "image/apng": {
+ "compressible": false,
+ "extensions": ["apng"]
+ },
+ "image/avci": {
+ "source": "iana",
+ "extensions": ["avci"]
+ },
+ "image/avcs": {
+ "source": "iana",
+ "extensions": ["avcs"]
+ },
+ "image/avif": {
+ "source": "iana",
+ "compressible": false,
+ "extensions": ["avif"]
+ },
+ "image/bmp": {
+ "source": "iana",
+ "compressible": true,
+ "extensions": ["bmp"]
+ },
+ "image/cgm": {
+ "source": "iana",
+ "extensions": ["cgm"]
+ },
+ "image/dicom-rle": {
+ "source": "iana",
+ "extensions": ["drle"]
+ },
+ "image/emf": {
+ "source": "iana",
+ "extensions": ["emf"]
+ },
+ "image/fits": {
+ "source": "iana",
+ "extensions": ["fits"]
+ },
+ "image/g3fax": {
+ "source": "iana",
+ "extensions": ["g3"]
+ },
+ "image/gif": {
+ "source": "iana",
+ "compressible": false,
+ "extensions": ["gif"]
+ },
+ "image/heic": {
+ "source": "iana",
+ "extensions": ["heic"]
+ },
+ "image/heic-sequence": {
+ "source": "iana",
+ "extensions": ["heics"]
+ },
+ "image/heif": {
+ "source": "iana",
+ "extensions": ["heif"]
+ },
+ "image/heif-sequence": {
+ "source": "iana",
+ "extensions": ["heifs"]
+ },
+ "image/hej2k": {
+ "source": "iana",
+ "extensions": ["hej2"]
+ },
+ "image/hsj2": {
+ "source": "iana",
+ "extensions": ["hsj2"]
+ },
+ "image/ief": {
+ "source": "iana",
+ "extensions": ["ief"]
+ },
+ "image/jls": {
+ "source": "iana",
+ "extensions": ["jls"]
+ },
+ "image/jp2": {
+ "source": "iana",
+ "compressible": false,
+ "extensions": ["jp2","jpg2"]
+ },
+ "image/jpeg": {
+ "source": "iana",
+ "compressible": false,
+ "extensions": ["jpeg","jpg","jpe"]
+ },
+ "image/jph": {
+ "source": "iana",
+ "extensions": ["jph"]
+ },
+ "image/jphc": {
+ "source": "iana",
+ "extensions": ["jhc"]
+ },
+ "image/jpm": {
+ "source": "iana",
+ "compressible": false,
+ "extensions": ["jpm"]
+ },
+ "image/jpx": {
+ "source": "iana",
+ "compressible": false,
+ "extensions": ["jpx","jpf"]
+ },
+ "image/jxr": {
+ "source": "iana",
+ "extensions": ["jxr"]
+ },
+ "image/jxra": {
+ "source": "iana",
+ "extensions": ["jxra"]
+ },
+ "image/jxrs": {
+ "source": "iana",
+ "extensions": ["jxrs"]
+ },
+ "image/jxs": {
+ "source": "iana",
+ "extensions": ["jxs"]
+ },
+ "image/jxsc": {
+ "source": "iana",
+ "extensions": ["jxsc"]
+ },
+ "image/jxsi": {
+ "source": "iana",
+ "extensions": ["jxsi"]
+ },
+ "image/jxss": {
+ "source": "iana",
+ "extensions": ["jxss"]
+ },
+ "image/ktx": {
+ "source": "iana",
+ "extensions": ["ktx"]
+ },
+ "image/ktx2": {
+ "source": "iana",
+ "extensions": ["ktx2"]
+ },
+ "image/naplps": {
+ "source": "iana"
+ },
+ "image/pjpeg": {
+ "compressible": false
+ },
+ "image/png": {
+ "source": "iana",
+ "compressible": false,
+ "extensions": ["png"]
+ },
+ "image/prs.btif": {
+ "source": "iana",
+ "extensions": ["btif"]
+ },
+ "image/prs.pti": {
+ "source": "iana",
+ "extensions": ["pti"]
+ },
+ "image/pwg-raster": {
+ "source": "iana"
+ },
+ "image/sgi": {
+ "source": "apache",
+ "extensions": ["sgi"]
+ },
+ "image/svg+xml": {
+ "source": "iana",
+ "compressible": true,
+ "extensions": ["svg","svgz"]
+ },
+ "image/t38": {
+ "source": "iana",
+ "extensions": ["t38"]
+ },
+ "image/tiff": {
+ "source": "iana",
+ "compressible": false,
+ "extensions": ["tif","tiff"]
+ },
+ "image/tiff-fx": {
+ "source": "iana",
+ "extensions": ["tfx"]
+ },
+ "image/vnd.adobe.photoshop": {
+ "source": "iana",
+ "compressible": true,
+ "extensions": ["psd"]
+ },
+ "image/vnd.airzip.accelerator.azv": {
+ "source": "iana",
+ "extensions": ["azv"]
+ },
+ "image/vnd.cns.inf2": {
+ "source": "iana"
+ },
+ "image/vnd.dece.graphic": {
+ "source": "iana",
+ "extensions": ["uvi","uvvi","uvg","uvvg"]
+ },
+ "image/vnd.djvu": {
+ "source": "iana",
+ "extensions": ["djvu","djv"]
+ },
+ "image/vnd.dvb.subtitle": {
+ "source": "iana",
+ "extensions": ["sub"]
+ },
+ "image/vnd.dwg": {
+ "source": "iana",
+ "extensions": ["dwg"]
+ },
+ "image/vnd.dxf": {
+ "source": "iana",
+ "extensions": ["dxf"]
+ },
+ "image/vnd.fastbidsheet": {
+ "source": "iana",
+ "extensions": ["fbs"]
+ },
+ "image/vnd.fpx": {
+ "source": "iana",
+ "extensions": ["fpx"]
+ },
+ "image/vnd.fst": {
+ "source": "iana",
+ "extensions": ["fst"]
+ },
+ "image/vnd.fujixerox.edmics-mmr": {
+ "source": "iana",
+ "extensions": ["mmr"]
+ },
+ "image/vnd.fujixerox.edmics-rlc": {
+ "source": "iana",
+ "extensions": ["rlc"]
+ },
+ "image/vnd.globalgraphics.pgb": {
+ "source": "iana"
+ },
+ "image/vnd.microsoft.icon": {
+ "source": "iana",
+ "compressible": true,
+ "extensions": ["ico"]
+ },
+ "image/vnd.mix": {
+ "source": "iana"
+ },
+ "image/vnd.mozilla.apng": {
+ "source": "iana"
+ },
+ "image/vnd.ms-dds": {
+ "compressible": true,
+ "extensions": ["dds"]
+ },
+ "image/vnd.ms-modi": {
+ "source": "iana",
+ "extensions": ["mdi"]
+ },
+ "image/vnd.ms-photo": {
+ "source": "apache",
+ "extensions": ["wdp"]
+ },
+ "image/vnd.net-fpx": {
+ "source": "iana",
+ "extensions": ["npx"]
+ },
+ "image/vnd.pco.b16": {
+ "source": "iana",
+ "extensions": ["b16"]
+ },
+ "image/vnd.radiance": {
+ "source": "iana"
+ },
+ "image/vnd.sealed.png": {
+ "source": "iana"
+ },
+ "image/vnd.sealedmedia.softseal.gif": {
+ "source": "iana"
+ },
+ "image/vnd.sealedmedia.softseal.jpg": {
+ "source": "iana"
+ },
+ "image/vnd.svf": {
+ "source": "iana"
+ },
+ "image/vnd.tencent.tap": {
+ "source": "iana",
+ "extensions": ["tap"]
+ },
+ "image/vnd.valve.source.texture": {
+ "source": "iana",
+ "extensions": ["vtf"]
+ },
+ "image/vnd.wap.wbmp": {
+ "source": "iana",
+ "extensions": ["wbmp"]
+ },
+ "image/vnd.xiff": {
+ "source": "iana",
+ "extensions": ["xif"]
+ },
+ "image/vnd.zbrush.pcx": {
+ "source": "iana",
+ "extensions": ["pcx"]
+ },
+ "image/webp": {
+ "source": "apache",
+ "extensions": ["webp"]
+ },
+ "image/wmf": {
+ "source": "iana",
+ "extensions": ["wmf"]
+ },
+ "image/x-3ds": {
+ "source": "apache",
+ "extensions": ["3ds"]
+ },
+ "image/x-cmu-raster": {
+ "source": "apache",
+ "extensions": ["ras"]
+ },
+ "image/x-cmx": {
+ "source": "apache",
+ "extensions": ["cmx"]
+ },
+ "image/x-freehand": {
+ "source": "apache",
+ "extensions": ["fh","fhc","fh4","fh5","fh7"]
+ },
+ "image/x-icon": {
+ "source": "apache",
+ "compressible": true,
+ "extensions": ["ico"]
+ },
+ "image/x-jng": {
+ "source": "nginx",
+ "extensions": ["jng"]
+ },
+ "image/x-mrsid-image": {
+ "source": "apache",
+ "extensions": ["sid"]
+ },
+ "image/x-ms-bmp": {
+ "source": "nginx",
+ "compressible": true,
+ "extensions": ["bmp"]
+ },
+ "image/x-pcx": {
+ "source": "apache",
+ "extensions": ["pcx"]
+ },
+ "image/x-pict": {
+ "source": "apache",
+ "extensions": ["pic","pct"]
+ },
+ "image/x-portable-anymap": {
+ "source": "apache",
+ "extensions": ["pnm"]
+ },
+ "image/x-portable-bitmap": {
+ "source": "apache",
+ "extensions": ["pbm"]
+ },
+ "image/x-portable-graymap": {
+ "source": "apache",
+ "extensions": ["pgm"]
+ },
+ "image/x-portable-pixmap": {
+ "source": "apache",
+ "extensions": ["ppm"]
+ },
+ "image/x-rgb": {
+ "source": "apache",
+ "extensions": ["rgb"]
+ },
+ "image/x-tga": {
+ "source": "apache",
+ "extensions": ["tga"]
+ },
+ "image/x-xbitmap": {
+ "source": "apache",
+ "extensions": ["xbm"]
+ },
+ "image/x-xcf": {
+ "compressible": false
+ },
+ "image/x-xpixmap": {
+ "source": "apache",
+ "extensions": ["xpm"]
+ },
+ "image/x-xwindowdump": {
+ "source": "apache",
+ "extensions": ["xwd"]
+ },
+ "message/cpim": {
+ "source": "iana"
+ },
+ "message/delivery-status": {
+ "source": "iana"
+ },
+ "message/disposition-notification": {
+ "source": "iana",
+ "extensions": [
+ "disposition-notification"
+ ]
+ },
+ "message/external-body": {
+ "source": "iana"
+ },
+ "message/feedback-report": {
+ "source": "iana"
+ },
+ "message/global": {
+ "source": "iana",
+ "extensions": ["u8msg"]
+ },
+ "message/global-delivery-status": {
+ "source": "iana",
+ "extensions": ["u8dsn"]
+ },
+ "message/global-disposition-notification": {
+ "source": "iana",
+ "extensions": ["u8mdn"]
+ },
+ "message/global-headers": {
+ "source": "iana",
+ "extensions": ["u8hdr"]
+ },
+ "message/http": {
+ "source": "iana",
+ "compressible": false
+ },
+ "message/imdn+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "message/news": {
+ "source": "iana"
+ },
+ "message/partial": {
+ "source": "iana",
+ "compressible": false
+ },
+ "message/rfc822": {
+ "source": "iana",
+ "compressible": true,
+ "extensions": ["eml","mime"]
+ },
+ "message/s-http": {
+ "source": "iana"
+ },
+ "message/sip": {
+ "source": "iana"
+ },
+ "message/sipfrag": {
+ "source": "iana"
+ },
+ "message/tracking-status": {
+ "source": "iana"
+ },
+ "message/vnd.si.simp": {
+ "source": "iana"
+ },
+ "message/vnd.wfa.wsc": {
+ "source": "iana",
+ "extensions": ["wsc"]
+ },
+ "model/3mf": {
+ "source": "iana",
+ "extensions": ["3mf"]
+ },
+ "model/e57": {
+ "source": "iana"
+ },
+ "model/gltf+json": {
+ "source": "iana",
+ "compressible": true,
+ "extensions": ["gltf"]
+ },
+ "model/gltf-binary": {
+ "source": "iana",
+ "compressible": true,
+ "extensions": ["glb"]
+ },
+ "model/iges": {
+ "source": "iana",
+ "compressible": false,
+ "extensions": ["igs","iges"]
+ },
+ "model/mesh": {
+ "source": "iana",
+ "compressible": false,
+ "extensions": ["msh","mesh","silo"]
+ },
+ "model/mtl": {
+ "source": "iana",
+ "extensions": ["mtl"]
+ },
+ "model/obj": {
+ "source": "iana",
+ "extensions": ["obj"]
+ },
+ "model/step": {
+ "source": "iana"
+ },
+ "model/step+xml": {
+ "source": "iana",
+ "compressible": true,
+ "extensions": ["stpx"]
+ },
+ "model/step+zip": {
+ "source": "iana",
+ "compressible": false,
+ "extensions": ["stpz"]
+ },
+ "model/step-xml+zip": {
+ "source": "iana",
+ "compressible": false,
+ "extensions": ["stpxz"]
+ },
+ "model/stl": {
+ "source": "iana",
+ "extensions": ["stl"]
+ },
+ "model/vnd.collada+xml": {
+ "source": "iana",
+ "compressible": true,
+ "extensions": ["dae"]
+ },
+ "model/vnd.dwf": {
+ "source": "iana",
+ "extensions": ["dwf"]
+ },
+ "model/vnd.flatland.3dml": {
+ "source": "iana"
+ },
+ "model/vnd.gdl": {
+ "source": "iana",
+ "extensions": ["gdl"]
+ },
+ "model/vnd.gs-gdl": {
+ "source": "apache"
+ },
+ "model/vnd.gs.gdl": {
+ "source": "iana"
+ },
+ "model/vnd.gtw": {
+ "source": "iana",
+ "extensions": ["gtw"]
+ },
+ "model/vnd.moml+xml": {
+ "source": "iana",
+ "compressible": true
+ },
+ "model/vnd.mts": {
+ "source": "iana",
+ "extensions": ["mts"]
+ },
+ "model/vnd.opengex": {
+ "source": "iana",
+ "extensions": ["ogex"]
+ },
+ "model/vnd.parasolid.transmit.binary": {
+ "source": "iana",
+ "extensions": ["x_b"]
+ },
+ "model/vnd.parasolid.transmit.text": {
+ "source": "iana",
+ "extensions": ["x_t"]
+ },
+ "model/vnd.pytha.pyox": {
+ "source": "iana"
+ },
+ "model/vnd.rosette.annotated-data-model": {
+ "source": "iana"
+ },
+ "model/vnd.sap.vds": {
+ "source": "iana",
+ "extensions": ["vds"]
+ },
+ "model/vnd.usdz+zip": {
+ "source": "iana",
+ "compressible": false,
+ "extensions": ["usdz"]
+ },
+ "model/vnd.valve.source.compiled-map": {
+ "source": "iana",
+ "extensions": ["bsp"]
+ },
+ "model/vnd.vtu": {
+ "source": "iana",
+ "extensions": ["vtu"]
+ },
+ "model/vrml": {
+ "source": "iana",
+ "compressible": false,
+ "extensions": ["wrl","vrml"]
+ },
+ "model/x3d+binary": {
+ "source": "apache",
+ "compressible": false,
+ "extensions": ["x3db","x3dbz"]
+ },
+ "model/x3d+fastinfoset": {
+ "source": "iana",
+ "extensions": ["x3db"]
+ },
+ "model/x3d+vrml": {
+ "source": "apache",
+ "compressible": false,
+ "extensions": ["x3dv","x3dvz"]
+ },
+ "model/x3d+xml": {
+ "source": "iana",
+ "compressible": true,
+ "extensions": ["x3d","x3dz"]
+ },
+ "model/x3d-vrml": {
+ "source": "iana",
+ "extensions": ["x3dv"]
+ },
+ "multipart/alternative": {
+ "source": "iana",
+ "compressible": false
+ },
+ "multipart/appledouble": {
+ "source": "iana"
+ },
+ "multipart/byteranges": {
+ "source": "iana"
+ },
+ "multipart/digest": {
+ "source": "iana"
+ },
+ "multipart/encrypted": {
+ "source": "iana",
+ "compressible": false
+ },
+ "multipart/form-data": {
+ "source": "iana",
+ "compressible": false
+ },
+ "multipart/header-set": {
+ "source": "iana"
+ },
+ "multipart/mixed": {
+ "source": "iana"
+ },
+ "multipart/multilingual": {
+ "source": "iana"
+ },
+ "multipart/parallel": {
+ "source": "iana"
+ },
+ "multipart/related": {
+ "source": "iana",
+ "compressible": false
+ },
+ "multipart/report": {
+ "source": "iana"
+ },
+ "multipart/signed": {
+ "source": "iana",
+ "compressible": false
+ },
+ "multipart/vnd.bint.med-plus": {
+ "source": "iana"
+ },
+ "multipart/voice-message": {
+ "source": "iana"
+ },
+ "multipart/x-mixed-replace": {
+ "source": "iana"
+ },
+ "text/1d-interleaved-parityfec": {
+ "source": "iana"
+ },
+ "text/cache-manifest": {
+ "source": "iana",
+ "compressible": true,
+ "extensions": ["appcache","manifest"]
+ },
+ "text/calendar": {
+ "source": "iana",
+ "extensions": ["ics","ifb"]
+ },
+ "text/calender": {
+ "compressible": true
+ },
+ "text/cmd": {
+ "compressible": true
+ },
+ "text/coffeescript": {
+ "extensions": ["coffee","litcoffee"]
+ },
+ "text/cql": {
+ "source": "iana"
+ },
+ "text/cql-expression": {
+ "source": "iana"
+ },
+ "text/cql-identifier": {
+ "source": "iana"
+ },
+ "text/css": {
+ "source": "iana",
+ "charset": "UTF-8",
+ "compressible": true,
+ "extensions": ["css"]
+ },
+ "text/csv": {
+ "source": "iana",
+ "compressible": true,
+ "extensions": ["csv"]
+ },
+ "text/csv-schema": {
+ "source": "iana"
+ },
+ "text/directory": {
+ "source": "iana"
+ },
+ "text/dns": {
+ "source": "iana"
+ },
+ "text/ecmascript": {
+ "source": "iana"
+ },
+ "text/encaprtp": {
+ "source": "iana"
+ },
+ "text/enriched": {
+ "source": "iana"
+ },
+ "text/fhirpath": {
+ "source": "iana"
+ },
+ "text/flexfec": {
+ "source": "iana"
+ },
+ "text/fwdred": {
+ "source": "iana"
+ },
+ "text/gff3": {
+ "source": "iana"
+ },
+ "text/grammar-ref-list": {
+ "source": "iana"
+ },
+ "text/html": {
+ "source": "iana",
+ "compressible": true,
+ "extensions": ["html","htm","shtml"]
+ },
+ "text/jade": {
+ "extensions": ["jade"]
+ },
+ "text/javascript": {
+ "source": "iana",
+ "compressible": true
+ },
+ "text/jcr-cnd": {
+ "source": "iana"
+ },
+ "text/jsx": {
+ "compressible": true,
+ "extensions": ["jsx"]
+ },
+ "text/less": {
+ "compressible": true,
+ "extensions": ["less"]
+ },
+ "text/markdown": {
+ "source": "iana",
+ "compressible": true,
+ "extensions": ["markdown","md"]
+ },
+ "text/mathml": {
+ "source": "nginx",
+ "extensions": ["mml"]
+ },
+ "text/mdx": {
+ "compressible": true,
+ "extensions": ["mdx"]
+ },
+ "text/mizar": {
+ "source": "iana"
+ },
+ "text/n3": {
+ "source": "iana",
+ "charset": "UTF-8",
+ "compressible": true,
+ "extensions": ["n3"]
+ },
+ "text/parameters": {
+ "source": "iana",
+ "charset": "UTF-8"
+ },
+ "text/parityfec": {
+ "source": "iana"
+ },
+ "text/plain": {
+ "source": "iana",
+ "compressible": true,
+ "extensions": ["txt","text","conf","def","list","log","in","ini"]
+ },
+ "text/provenance-notation": {
+ "source": "iana",
+ "charset": "UTF-8"
+ },
+ "text/prs.fallenstein.rst": {
+ "source": "iana"
+ },
+ "text/prs.lines.tag": {
+ "source": "iana",
+ "extensions": ["dsc"]
+ },
+ "text/prs.prop.logic": {
+ "source": "iana"
+ },
+ "text/raptorfec": {
+ "source": "iana"
+ },
+ "text/red": {
+ "source": "iana"
+ },
+ "text/rfc822-headers": {
+ "source": "iana"
+ },
+ "text/richtext": {
+ "source": "iana",
+ "compressible": true,
+ "extensions": ["rtx"]
+ },
+ "text/rtf": {
+ "source": "iana",
+ "compressible": true,
+ "extensions": ["rtf"]
+ },
+ "text/rtp-enc-aescm128": {
+ "source": "iana"
+ },
+ "text/rtploopback": {
+ "source": "iana"
+ },
+ "text/rtx": {
+ "source": "iana"
+ },
+ "text/sgml": {
+ "source": "iana",
+ "extensions": ["sgml","sgm"]
+ },
+ "text/shaclc": {
+ "source": "iana"
+ },
+ "text/shex": {
+ "source": "iana",
+ "extensions": ["shex"]
+ },
+ "text/slim": {
+ "extensions": ["slim","slm"]
+ },
+ "text/spdx": {
+ "source": "iana",
+ "extensions": ["spdx"]
+ },
+ "text/strings": {
+ "source": "iana"
+ },
+ "text/stylus": {
+ "extensions": ["stylus","styl"]
+ },
+ "text/t140": {
+ "source": "iana"
+ },
+ "text/tab-separated-values": {
+ "source": "iana",
+ "compressible": true,
+ "extensions": ["tsv"]
+ },
+ "text/troff": {
+ "source": "iana",
+ "extensions": ["t","tr","roff","man","me","ms"]
+ },
+ "text/turtle": {
+ "source": "iana",
+ "charset": "UTF-8",
+ "extensions": ["ttl"]
+ },
+ "text/ulpfec": {
+ "source": "iana"
+ },
+ "text/uri-list": {
+ "source": "iana",
+ "compressible": true,
+ "extensions": ["uri","uris","urls"]
+ },
+ "text/vcard": {
+ "source": "iana",
+ "compressible": true,
+ "extensions": ["vcard"]
+ },
+ "text/vnd.a": {
+ "source": "iana"
+ },
+ "text/vnd.abc": {
+ "source": "iana"
+ },
+ "text/vnd.ascii-art": {
+ "source": "iana"
+ },
+ "text/vnd.curl": {
+ "source": "iana",
+ "extensions": ["curl"]
+ },
+ "text/vnd.curl.dcurl": {
+ "source": "apache",
+ "extensions": ["dcurl"]
+ },
+ "text/vnd.curl.mcurl": {
+ "source": "apache",
+ "extensions": ["mcurl"]
+ },
+ "text/vnd.curl.scurl": {
+ "source": "apache",
+ "extensions": ["scurl"]
+ },
+ "text/vnd.debian.copyright": {
+ "source": "iana",
+ "charset": "UTF-8"
+ },
+ "text/vnd.dmclientscript": {
+ "source": "iana"
+ },
+ "text/vnd.dvb.subtitle": {
+ "source": "iana",
+ "extensions": ["sub"]
+ },
+ "text/vnd.esmertec.theme-descriptor": {
+ "source": "iana",
+ "charset": "UTF-8"
+ },
+ "text/vnd.familysearch.gedcom": {
+ "source": "iana",
+ "extensions": ["ged"]
+ },
+ "text/vnd.ficlab.flt": {
+ "source": "iana"
+ },
+ "text/vnd.fly": {
+ "source": "iana",
+ "extensions": ["fly"]
+ },
+ "text/vnd.fmi.flexstor": {
+ "source": "iana",
+ "extensions": ["flx"]
+ },
+ "text/vnd.gml": {
+ "source": "iana"
+ },
+ "text/vnd.graphviz": {
+ "source": "iana",
+ "extensions": ["gv"]
+ },
+ "text/vnd.hans": {
+ "source": "iana"
+ },
+ "text/vnd.hgl": {
+ "source": "iana"
+ },
+ "text/vnd.in3d.3dml": {
+ "source": "iana",
+ "extensions": ["3dml"]
+ },
+ "text/vnd.in3d.spot": {
+ "source": "iana",
+ "extensions": ["spot"]
+ },
+ "text/vnd.iptc.newsml": {
+ "source": "iana"
+ },
+ "text/vnd.iptc.nitf": {
+ "source": "iana"
+ },
+ "text/vnd.latex-z": {
+ "source": "iana"
+ },
+ "text/vnd.motorola.reflex": {
+ "source": "iana"
+ },
+ "text/vnd.ms-mediapackage": {
+ "source": "iana"
+ },
+ "text/vnd.net2phone.commcenter.command": {
+ "source": "iana"
+ },
+ "text/vnd.radisys.msml-basic-layout": {
+ "source": "iana"
+ },
+ "text/vnd.senx.warpscript": {
+ "source": "iana"
+ },
+ "text/vnd.si.uricatalogue": {
+ "source": "iana"
+ },
+ "text/vnd.sosi": {
+ "source": "iana"
+ },
+ "text/vnd.sun.j2me.app-descriptor": {
+ "source": "iana",
+ "charset": "UTF-8",
+ "extensions": ["jad"]
+ },
+ "text/vnd.trolltech.linguist": {
+ "source": "iana",
+ "charset": "UTF-8"
+ },
+ "text/vnd.wap.si": {
+ "source": "iana"
+ },
+ "text/vnd.wap.sl": {
+ "source": "iana"
+ },
+ "text/vnd.wap.wml": {
+ "source": "iana",
+ "extensions": ["wml"]
+ },
+ "text/vnd.wap.wmlscript": {
+ "source": "iana",
+ "extensions": ["wmls"]
+ },
+ "text/vtt": {
+ "source": "iana",
+ "charset": "UTF-8",
+ "compressible": true,
+ "extensions": ["vtt"]
+ },
+ "text/x-asm": {
+ "source": "apache",
+ "extensions": ["s","asm"]
+ },
+ "text/x-c": {
+ "source": "apache",
+ "extensions": ["c","cc","cxx","cpp","h","hh","dic"]
+ },
+ "text/x-component": {
+ "source": "nginx",
+ "extensions": ["htc"]
+ },
+ "text/x-fortran": {
+ "source": "apache",
+ "extensions": ["f","for","f77","f90"]
+ },
+ "text/x-gwt-rpc": {
+ "compressible": true
+ },
+ "text/x-handlebars-template": {
+ "extensions": ["hbs"]
+ },
+ "text/x-java-source": {
+ "source": "apache",
+ "extensions": ["java"]
+ },
+ "text/x-jquery-tmpl": {
+ "compressible": true
+ },
+ "text/x-lua": {
+ "extensions": ["lua"]
+ },
+ "text/x-markdown": {
+ "compressible": true,
+ "extensions": ["mkd"]
+ },
+ "text/x-nfo": {
+ "source": "apache",
+ "extensions": ["nfo"]
+ },
+ "text/x-opml": {
+ "source": "apache",
+ "extensions": ["opml"]
+ },
+ "text/x-org": {
+ "compressible": true,
+ "extensions": ["org"]
+ },
+ "text/x-pascal": {
+ "source": "apache",
+ "extensions": ["p","pas"]
+ },
+ "text/x-processing": {
+ "compressible": true,
+ "extensions": ["pde"]
+ },
+ "text/x-sass": {
+ "extensions": ["sass"]
+ },
+ "text/x-scss": {
+ "extensions": ["scss"]
+ },
+ "text/x-setext": {
+ "source": "apache",
+ "extensions": ["etx"]
+ },
+ "text/x-sfv": {
+ "source": "apache",
+ "extensions": ["sfv"]
+ },
+ "text/x-suse-ymp": {
+ "compressible": true,
+ "extensions": ["ymp"]
+ },
+ "text/x-uuencode": {
+ "source": "apache",
+ "extensions": ["uu"]
+ },
+ "text/x-vcalendar": {
+ "source": "apache",
+ "extensions": ["vcs"]
+ },
+ "text/x-vcard": {
+ "source": "apache",
+ "extensions": ["vcf"]
+ },
+ "text/xml": {
+ "source": "iana",
+ "compressible": true,
+ "extensions": ["xml"]
+ },
+ "text/xml-external-parsed-entity": {
+ "source": "iana"
+ },
+ "text/yaml": {
+ "compressible": true,
+ "extensions": ["yaml","yml"]
+ },
+ "video/1d-interleaved-parityfec": {
+ "source": "iana"
+ },
+ "video/3gpp": {
+ "source": "iana",
+ "extensions": ["3gp","3gpp"]
+ },
+ "video/3gpp-tt": {
+ "source": "iana"
+ },
+ "video/3gpp2": {
+ "source": "iana",
+ "extensions": ["3g2"]
+ },
+ "video/av1": {
+ "source": "iana"
+ },
+ "video/bmpeg": {
+ "source": "iana"
+ },
+ "video/bt656": {
+ "source": "iana"
+ },
+ "video/celb": {
+ "source": "iana"
+ },
+ "video/dv": {
+ "source": "iana"
+ },
+ "video/encaprtp": {
+ "source": "iana"
+ },
+ "video/ffv1": {
+ "source": "iana"
+ },
+ "video/flexfec": {
+ "source": "iana"
+ },
+ "video/h261": {
+ "source": "iana",
+ "extensions": ["h261"]
+ },
+ "video/h263": {
+ "source": "iana",
+ "extensions": ["h263"]
+ },
+ "video/h263-1998": {
+ "source": "iana"
+ },
+ "video/h263-2000": {
+ "source": "iana"
+ },
+ "video/h264": {
+ "source": "iana",
+ "extensions": ["h264"]
+ },
+ "video/h264-rcdo": {
+ "source": "iana"
+ },
+ "video/h264-svc": {
+ "source": "iana"
+ },
+ "video/h265": {
+ "source": "iana"
+ },
+ "video/iso.segment": {
+ "source": "iana",
+ "extensions": ["m4s"]
+ },
+ "video/jpeg": {
+ "source": "iana",
+ "extensions": ["jpgv"]
+ },
+ "video/jpeg2000": {
+ "source": "iana"
+ },
+ "video/jpm": {
+ "source": "apache",
+ "extensions": ["jpm","jpgm"]
+ },
+ "video/jxsv": {
+ "source": "iana"
+ },
+ "video/mj2": {
+ "source": "iana",
+ "extensions": ["mj2","mjp2"]
+ },
+ "video/mp1s": {
+ "source": "iana"
+ },
+ "video/mp2p": {
+ "source": "iana"
+ },
+ "video/mp2t": {
+ "source": "iana",
+ "extensions": ["ts"]
+ },
+ "video/mp4": {
+ "source": "iana",
+ "compressible": false,
+ "extensions": ["mp4","mp4v","mpg4"]
+ },
+ "video/mp4v-es": {
+ "source": "iana"
+ },
+ "video/mpeg": {
+ "source": "iana",
+ "compressible": false,
+ "extensions": ["mpeg","mpg","mpe","m1v","m2v"]
+ },
+ "video/mpeg4-generic": {
+ "source": "iana"
+ },
+ "video/mpv": {
+ "source": "iana"
+ },
+ "video/nv": {
+ "source": "iana"
+ },
+ "video/ogg": {
+ "source": "iana",
+ "compressible": false,
+ "extensions": ["ogv"]
+ },
+ "video/parityfec": {
+ "source": "iana"
+ },
+ "video/pointer": {
+ "source": "iana"
+ },
+ "video/quicktime": {
+ "source": "iana",
+ "compressible": false,
+ "extensions": ["qt","mov"]
+ },
+ "video/raptorfec": {
+ "source": "iana"
+ },
+ "video/raw": {
+ "source": "iana"
+ },
+ "video/rtp-enc-aescm128": {
+ "source": "iana"
+ },
+ "video/rtploopback": {
+ "source": "iana"
+ },
+ "video/rtx": {
+ "source": "iana"
+ },
+ "video/scip": {
+ "source": "iana"
+ },
+ "video/smpte291": {
+ "source": "iana"
+ },
+ "video/smpte292m": {
+ "source": "iana"
+ },
+ "video/ulpfec": {
+ "source": "iana"
+ },
+ "video/vc1": {
+ "source": "iana"
+ },
+ "video/vc2": {
+ "source": "iana"
+ },
+ "video/vnd.cctv": {
+ "source": "iana"
+ },
+ "video/vnd.dece.hd": {
+ "source": "iana",
+ "extensions": ["uvh","uvvh"]
+ },
+ "video/vnd.dece.mobile": {
+ "source": "iana",
+ "extensions": ["uvm","uvvm"]
+ },
+ "video/vnd.dece.mp4": {
+ "source": "iana"
+ },
+ "video/vnd.dece.pd": {
+ "source": "iana",
+ "extensions": ["uvp","uvvp"]
+ },
+ "video/vnd.dece.sd": {
+ "source": "iana",
+ "extensions": ["uvs","uvvs"]
+ },
+ "video/vnd.dece.video": {
+ "source": "iana",
+ "extensions": ["uvv","uvvv"]
+ },
+ "video/vnd.directv.mpeg": {
+ "source": "iana"
+ },
+ "video/vnd.directv.mpeg-tts": {
+ "source": "iana"
+ },
+ "video/vnd.dlna.mpeg-tts": {
+ "source": "iana"
+ },
+ "video/vnd.dvb.file": {
+ "source": "iana",
+ "extensions": ["dvb"]
+ },
+ "video/vnd.fvt": {
+ "source": "iana",
+ "extensions": ["fvt"]
+ },
+ "video/vnd.hns.video": {
+ "source": "iana"
+ },
+ "video/vnd.iptvforum.1dparityfec-1010": {
+ "source": "iana"
+ },
+ "video/vnd.iptvforum.1dparityfec-2005": {
+ "source": "iana"
+ },
+ "video/vnd.iptvforum.2dparityfec-1010": {
+ "source": "iana"
+ },
+ "video/vnd.iptvforum.2dparityfec-2005": {
+ "source": "iana"
+ },
+ "video/vnd.iptvforum.ttsavc": {
+ "source": "iana"
+ },
+ "video/vnd.iptvforum.ttsmpeg2": {
+ "source": "iana"
+ },
+ "video/vnd.motorola.video": {
+ "source": "iana"
+ },
+ "video/vnd.motorola.videop": {
+ "source": "iana"
+ },
+ "video/vnd.mpegurl": {
+ "source": "iana",
+ "extensions": ["mxu","m4u"]
+ },
+ "video/vnd.ms-playready.media.pyv": {
+ "source": "iana",
+ "extensions": ["pyv"]
+ },
+ "video/vnd.nokia.interleaved-multimedia": {
+ "source": "iana"
+ },
+ "video/vnd.nokia.mp4vr": {
+ "source": "iana"
+ },
+ "video/vnd.nokia.videovoip": {
+ "source": "iana"
+ },
+ "video/vnd.objectvideo": {
+ "source": "iana"
+ },
+ "video/vnd.radgamettools.bink": {
+ "source": "iana"
+ },
+ "video/vnd.radgamettools.smacker": {
+ "source": "iana"
+ },
+ "video/vnd.sealed.mpeg1": {
+ "source": "iana"
+ },
+ "video/vnd.sealed.mpeg4": {
+ "source": "iana"
+ },
+ "video/vnd.sealed.swf": {
+ "source": "iana"
+ },
+ "video/vnd.sealedmedia.softseal.mov": {
+ "source": "iana"
+ },
+ "video/vnd.uvvu.mp4": {
+ "source": "iana",
+ "extensions": ["uvu","uvvu"]
+ },
+ "video/vnd.vivo": {
+ "source": "iana",
+ "extensions": ["viv"]
+ },
+ "video/vnd.youtube.yt": {
+ "source": "iana"
+ },
+ "video/vp8": {
+ "source": "iana"
+ },
+ "video/vp9": {
+ "source": "iana"
+ },
+ "video/webm": {
+ "source": "apache",
+ "compressible": false,
+ "extensions": ["webm"]
+ },
+ "video/x-f4v": {
+ "source": "apache",
+ "extensions": ["f4v"]
+ },
+ "video/x-fli": {
+ "source": "apache",
+ "extensions": ["fli"]
+ },
+ "video/x-flv": {
+ "source": "apache",
+ "compressible": false,
+ "extensions": ["flv"]
+ },
+ "video/x-m4v": {
+ "source": "apache",
+ "extensions": ["m4v"]
+ },
+ "video/x-matroska": {
+ "source": "apache",
+ "compressible": false,
+ "extensions": ["mkv","mk3d","mks"]
+ },
+ "video/x-mng": {
+ "source": "apache",
+ "extensions": ["mng"]
+ },
+ "video/x-ms-asf": {
+ "source": "apache",
+ "extensions": ["asf","asx"]
+ },
+ "video/x-ms-vob": {
+ "source": "apache",
+ "extensions": ["vob"]
+ },
+ "video/x-ms-wm": {
+ "source": "apache",
+ "extensions": ["wm"]
+ },
+ "video/x-ms-wmv": {
+ "source": "apache",
+ "compressible": false,
+ "extensions": ["wmv"]
+ },
+ "video/x-ms-wmx": {
+ "source": "apache",
+ "extensions": ["wmx"]
+ },
+ "video/x-ms-wvx": {
+ "source": "apache",
+ "extensions": ["wvx"]
+ },
+ "video/x-msvideo": {
+ "source": "apache",
+ "extensions": ["avi"]
+ },
+ "video/x-sgi-movie": {
+ "source": "apache",
+ "extensions": ["movie"]
+ },
+ "video/x-smv": {
+ "source": "apache",
+ "extensions": ["smv"]
+ },
+ "x-conference/x-cooltalk": {
+ "source": "apache",
+ "extensions": ["ice"]
+ },
+ "x-shader/x-fragment": {
+ "compressible": true
+ },
+ "x-shader/x-vertex": {
+ "compressible": true
+ }
+}
diff --git a/node_modules/mime-db/index.js b/node_modules/mime-db/index.js
new file mode 100644
index 0000000..ec2be30
--- /dev/null
+++ b/node_modules/mime-db/index.js
@@ -0,0 +1,12 @@
+/*!
+ * mime-db
+ * Copyright(c) 2014 Jonathan Ong
+ * Copyright(c) 2015-2022 Douglas Christopher Wilson
+ * MIT Licensed
+ */
+
+/**
+ * Module exports.
+ */
+
+module.exports = require('./db.json')
diff --git a/node_modules/mime-db/package.json b/node_modules/mime-db/package.json
new file mode 100644
index 0000000..32c14b8
--- /dev/null
+++ b/node_modules/mime-db/package.json
@@ -0,0 +1,60 @@
+{
+ "name": "mime-db",
+ "description": "Media Type Database",
+ "version": "1.52.0",
+ "contributors": [
+ "Douglas Christopher Wilson <doug@somethingdoug.com>",
+ "Jonathan Ong <me@jongleberry.com> (http://jongleberry.com)",
+ "Robert Kieffer <robert@broofa.com> (http://github.com/broofa)"
+ ],
+ "license": "MIT",
+ "keywords": [
+ "mime",
+ "db",
+ "type",
+ "types",
+ "database",
+ "charset",
+ "charsets"
+ ],
+ "repository": "jshttp/mime-db",
+ "devDependencies": {
+ "bluebird": "3.7.2",
+ "co": "4.6.0",
+ "cogent": "1.0.1",
+ "csv-parse": "4.16.3",
+ "eslint": "7.32.0",
+ "eslint-config-standard": "15.0.1",
+ "eslint-plugin-import": "2.25.4",
+ "eslint-plugin-markdown": "2.2.1",
+ "eslint-plugin-node": "11.1.0",
+ "eslint-plugin-promise": "5.1.1",
+ "eslint-plugin-standard": "4.1.0",
+ "gnode": "0.1.2",
+ "media-typer": "1.1.0",
+ "mocha": "9.2.1",
+ "nyc": "15.1.0",
+ "raw-body": "2.5.0",
+ "stream-to-array": "2.3.0"
+ },
+ "files": [
+ "HISTORY.md",
+ "LICENSE",
+ "README.md",
+ "db.json",
+ "index.js"
+ ],
+ "engines": {
+ "node": ">= 0.6"
+ },
+ "scripts": {
+ "build": "node scripts/build",
+ "fetch": "node scripts/fetch-apache && gnode scripts/fetch-iana && node scripts/fetch-nginx",
+ "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": "npm run fetch && npm run build",
+ "version": "node scripts/version-history.js && git add HISTORY.md"
+ }
+}
diff --git a/node_modules/mime-types/HISTORY.md b/node_modules/mime-types/HISTORY.md
new file mode 100644
index 0000000..c5043b7
--- /dev/null
+++ b/node_modules/mime-types/HISTORY.md
@@ -0,0 +1,397 @@
+2.1.35 / 2022-03-12
+===================
+
+ * deps: mime-db@1.52.0
+ - Add extensions from IANA for more `image/*` types
+ - Add extension `.asc` to `application/pgp-keys`
+ - Add extensions to various XML types
+ - Add new upstream MIME types
+
+2.1.34 / 2021-11-08
+===================
+
+ * deps: mime-db@1.51.0
+ - Add new upstream MIME types
+
+2.1.33 / 2021-10-01
+===================
+
+ * deps: mime-db@1.50.0
+ - Add deprecated iWorks mime types and extensions
+ - Add new upstream MIME types
+
+2.1.32 / 2021-07-27
+===================
+
+ * deps: mime-db@1.49.0
+ - Add extension `.trig` to `application/trig`
+ - Add new upstream MIME types
+
+2.1.31 / 2021-06-01
+===================
+
+ * deps: mime-db@1.48.0
+ - Add extension `.mvt` to `application/vnd.mapbox-vector-tile`
+ - Add new upstream MIME types
+
+2.1.30 / 2021-04-02
+===================
+
+ * deps: mime-db@1.47.0
+ - Add extension `.amr` to `audio/amr`
+ - Remove ambigious extensions from IANA for `application/*+xml` types
+ - Update primary extension to `.es` for `application/ecmascript`
+
+2.1.29 / 2021-02-17
+===================
+
+ * deps: mime-db@1.46.0
+ - Add extension `.amr` to `audio/amr`
+ - Add extension `.m4s` to `video/iso.segment`
+ - Add extension `.opus` to `audio/ogg`
+ - Add new upstream MIME types
+
+2.1.28 / 2021-01-01
+===================
+
+ * deps: mime-db@1.45.0
+ - Add `application/ubjson` with extension `.ubj`
+ - Add `image/avif` with extension `.avif`
+ - Add `image/ktx2` with extension `.ktx2`
+ - Add extension `.dbf` to `application/vnd.dbf`
+ - Add extension `.rar` to `application/vnd.rar`
+ - Add extension `.td` to `application/urc-targetdesc+xml`
+ - Add new upstream MIME types
+ - Fix extension of `application/vnd.apple.keynote` to be `.key`
+
+2.1.27 / 2020-04-23
+===================
+
+ * deps: mime-db@1.44.0
+ - Add charsets from IANA
+ - Add extension `.cjs` to `application/node`
+ - Add new upstream MIME types
+
+2.1.26 / 2020-01-05
+===================
+
+ * deps: mime-db@1.43.0
+ - Add `application/x-keepass2` with extension `.kdbx`
+ - Add extension `.mxmf` to `audio/mobile-xmf`
+ - Add extensions from IANA for `application/*+xml` types
+ - Add new upstream MIME types
+
+2.1.25 / 2019-11-12
+===================
+
+ * deps: mime-db@1.42.0
+ - Add new upstream MIME types
+ - Add `application/toml` with extension `.toml`
+ - Add `image/vnd.ms-dds` with extension `.dds`
+
+2.1.24 / 2019-04-20
+===================
+
+ * deps: mime-db@1.40.0
+ - Add extensions from IANA for `model/*` types
+ - Add `text/mdx` with extension `.mdx`
+
+2.1.23 / 2019-04-17
+===================
+
+ * deps: mime-db@~1.39.0
+ - Add extensions `.siv` and `.sieve` to `application/sieve`
+ - Add new upstream MIME types
+
+2.1.22 / 2019-02-14
+===================
+
+ * deps: mime-db@~1.38.0
+ - Add extension `.nq` to `application/n-quads`
+ - Add extension `.nt` to `application/n-triples`
+ - Add new upstream MIME types
+
+2.1.21 / 2018-10-19
+===================
+
+ * deps: mime-db@~1.37.0
+ - Add extensions to HEIC image types
+ - Add new upstream MIME types
+
+2.1.20 / 2018-08-26
+===================
+
+ * deps: mime-db@~1.36.0
+ - Add Apple file extensions from IANA
+ - Add extensions from IANA for `image/*` types
+ - Add new upstream MIME types
+
+2.1.19 / 2018-07-17
+===================
+
+ * deps: mime-db@~1.35.0
+ - Add extension `.csl` to `application/vnd.citationstyles.style+xml`
+ - Add extension `.es` to `application/ecmascript`
+ - Add extension `.owl` to `application/rdf+xml`
+ - Add new upstream MIME types
+ - Add UTF-8 as default charset for `text/turtle`
+
+2.1.18 / 2018-02-16
+===================
+
+ * deps: mime-db@~1.33.0
+ - Add `application/raml+yaml` with extension `.raml`
+ - Add `application/wasm` with extension `.wasm`
+ - Add `text/shex` with extension `.shex`
+ - Add extensions for JPEG-2000 images
+ - Add extensions from IANA for `message/*` types
+ - Add new upstream MIME types
+ - Update font MIME types
+ - Update `text/hjson` to registered `application/hjson`
+
+2.1.17 / 2017-09-01
+===================
+
+ * deps: mime-db@~1.30.0
+ - Add `application/vnd.ms-outlook`
+ - Add `application/x-arj`
+ - Add extension `.mjs` to `application/javascript`
+ - Add glTF types and extensions
+ - Add new upstream MIME types
+ - Add `text/x-org`
+ - Add VirtualBox MIME types
+ - Fix `source` records for `video/*` types that are IANA
+ - Update `font/opentype` to registered `font/otf`
+
+2.1.16 / 2017-07-24
+===================
+
+ * deps: mime-db@~1.29.0
+ - Add `application/fido.trusted-apps+json`
+ - Add extension `.wadl` to `application/vnd.sun.wadl+xml`
+ - Add extension `.gz` to `application/gzip`
+ - Add new upstream MIME types
+ - Update extensions `.md` and `.markdown` to be `text/markdown`
+
+2.1.15 / 2017-03-23
+===================
+
+ * deps: mime-db@~1.27.0
+ - Add new mime types
+ - Add `image/apng`
+
+2.1.14 / 2017-01-14
+===================
+
+ * deps: mime-db@~1.26.0
+ - Add new mime types
+
+2.1.13 / 2016-11-18
+===================
+
+ * deps: mime-db@~1.25.0
+ - Add new mime types
+
+2.1.12 / 2016-09-18
+===================
+
+ * deps: mime-db@~1.24.0
+ - Add new mime types
+ - Add `audio/mp3`
+
+2.1.11 / 2016-05-01
+===================
+
+ * deps: mime-db@~1.23.0
+ - Add new mime types
+
+2.1.10 / 2016-02-15
+===================
+
+ * deps: mime-db@~1.22.0
+ - Add new mime types
+ - Fix extension of `application/dash+xml`
+ - Update primary extension for `audio/mp4`
+
+2.1.9 / 2016-01-06
+==================
+
+ * deps: mime-db@~1.21.0
+ - Add new mime types
+
+2.1.8 / 2015-11-30
+==================
+
+ * deps: mime-db@~1.20.0
+ - Add new mime types
+
+2.1.7 / 2015-09-20
+==================
+
+ * deps: mime-db@~1.19.0
+ - Add new mime types
+
+2.1.6 / 2015-09-03
+==================
+
+ * deps: mime-db@~1.18.0
+ - Add new mime types
+
+2.1.5 / 2015-08-20
+==================
+
+ * deps: mime-db@~1.17.0
+ - Add new mime types
+
+2.1.4 / 2015-07-30
+==================
+
+ * deps: mime-db@~1.16.0
+ - Add new mime types
+
+2.1.3 / 2015-07-13
+==================
+
+ * deps: mime-db@~1.15.0
+ - Add new mime types
+
+2.1.2 / 2015-06-25
+==================
+
+ * deps: mime-db@~1.14.0
+ - Add new mime types
+
+2.1.1 / 2015-06-08
+==================
+
+ * perf: fix deopt during mapping
+
+2.1.0 / 2015-06-07
+==================
+
+ * Fix incorrectly treating extension-less file name as extension
+ - i.e. `'path/to/json'` will no longer return `application/json`
+ * Fix `.charset(type)` to accept parameters
+ * Fix `.charset(type)` to match case-insensitive
+ * Improve generation of extension to MIME mapping
+ * Refactor internals for readability and no argument reassignment
+ * Prefer `application/*` MIME types from the same source
+ * Prefer any type over `application/octet-stream`
+ * deps: mime-db@~1.13.0
+ - Add nginx as a source
+ - Add new mime types
+
+2.0.14 / 2015-06-06
+===================
+
+ * deps: mime-db@~1.12.0
+ - Add new mime types
+
+2.0.13 / 2015-05-31
+===================
+
+ * deps: mime-db@~1.11.0
+ - Add new mime types
+
+2.0.12 / 2015-05-19
+===================
+
+ * deps: mime-db@~1.10.0
+ - Add new mime types
+
+2.0.11 / 2015-05-05
+===================
+
+ * deps: mime-db@~1.9.1
+ - Add new mime types
+
+2.0.10 / 2015-03-13
+===================
+
+ * deps: mime-db@~1.8.0
+ - Add new mime types
+
+2.0.9 / 2015-02-09
+==================
+
+ * deps: mime-db@~1.7.0
+ - Add new mime types
+ - Community extensions ownership transferred from `node-mime`
+
+2.0.8 / 2015-01-29
+==================
+
+ * deps: mime-db@~1.6.0
+ - Add new mime types
+
+2.0.7 / 2014-12-30
+==================
+
+ * deps: mime-db@~1.5.0
+ - Add new mime types
+ - Fix various invalid MIME type entries
+
+2.0.6 / 2014-12-30
+==================
+
+ * deps: mime-db@~1.4.0
+ - Add new mime types
+ - Fix various invalid MIME type entries
+ - Remove example template MIME types
+
+2.0.5 / 2014-12-29
+==================
+
+ * deps: mime-db@~1.3.1
+ - Fix missing extensions
+
+2.0.4 / 2014-12-10
+==================
+
+ * deps: mime-db@~1.3.0
+ - Add new mime types
+
+2.0.3 / 2014-11-09
+==================
+
+ * deps: mime-db@~1.2.0
+ - Add new mime types
+
+2.0.2 / 2014-09-28
+==================
+
+ * deps: mime-db@~1.1.0
+ - Add new mime types
+ - Update charsets
+
+2.0.1 / 2014-09-07
+==================
+
+ * Support Node.js 0.6
+
+2.0.0 / 2014-09-02
+==================
+
+ * Use `mime-db`
+ * Remove `.define()`
+
+1.0.2 / 2014-08-04
+==================
+
+ * Set charset=utf-8 for `text/javascript`
+
+1.0.1 / 2014-06-24
+==================
+
+ * Add `text/jsx` type
+
+1.0.0 / 2014-05-12
+==================
+
+ * Return `false` for unknown types
+ * Set charset=utf-8 for `application/json`
+
+0.1.0 / 2014-05-02
+==================
+
+ * Initial release
diff --git a/node_modules/mime-types/LICENSE b/node_modules/mime-types/LICENSE
new file mode 100644
index 0000000..0616607
--- /dev/null
+++ b/node_modules/mime-types/LICENSE
@@ -0,0 +1,23 @@
+(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/mime-types/README.md b/node_modules/mime-types/README.md
new file mode 100644
index 0000000..48d2fb4
--- /dev/null
+++ b/node_modules/mime-types/README.md
@@ -0,0 +1,113 @@
+# mime-types
+
+[![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][ci-image]][ci-url]
+[![Test Coverage][coveralls-image]][coveralls-url]
+
+The ultimate javascript content-type utility.
+
+Similar to [the `mime@1.x` module](https://www.npmjs.com/package/mime), except:
+
+- __No fallbacks.__ Instead of naively returning the first available type,
+ `mime-types` simply returns `false`, so do
+ `var type = mime.lookup('unrecognized') || 'application/octet-stream'`.
+- No `new Mime()` business, so you could do `var lookup = require('mime-types').lookup`.
+- No `.define()` functionality
+- Bug fixes for `.lookup(path)`
+
+Otherwise, the API is compatible with `mime` 1.x.
+
+## 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 mime-types
+```
+
+## Adding Types
+
+All mime types are based on [mime-db](https://www.npmjs.com/package/mime-db),
+so open a PR there if you'd like to add mime types.
+
+## API
+
+```js
+var mime = require('mime-types')
+```
+
+All functions return `false` if input is invalid or not found.
+
+### mime.lookup(path)
+
+Lookup the content-type associated with a file.
+
+```js
+mime.lookup('json') // 'application/json'
+mime.lookup('.md') // 'text/markdown'
+mime.lookup('file.html') // 'text/html'
+mime.lookup('folder/file.js') // 'application/javascript'
+mime.lookup('folder/.htaccess') // false
+
+mime.lookup('cats') // false
+```
+
+### mime.contentType(type)
+
+Create a full content-type header given a content-type or extension.
+When given an extension, `mime.lookup` is used to get the matching
+content-type, otherwise the given content-type is used. Then if the
+content-type does not already have a `charset` parameter, `mime.charset`
+is used to get the default charset and add to the returned content-type.
+
+```js
+mime.contentType('markdown') // 'text/x-markdown; charset=utf-8'
+mime.contentType('file.json') // 'application/json; charset=utf-8'
+mime.contentType('text/html') // 'text/html; charset=utf-8'
+mime.contentType('text/html; charset=iso-8859-1') // 'text/html; charset=iso-8859-1'
+
+// from a full path
+mime.contentType(path.extname('/path/to/file.json')) // 'application/json; charset=utf-8'
+```
+
+### mime.extension(type)
+
+Get the default extension for a content-type.
+
+```js
+mime.extension('application/octet-stream') // 'bin'
+```
+
+### mime.charset(type)
+
+Lookup the implied default charset of a content-type.
+
+```js
+mime.charset('text/markdown') // 'UTF-8'
+```
+
+### var type = mime.types[extension]
+
+A map of content-types by extension.
+
+### [extensions...] = mime.extensions[type]
+
+A map of extensions by content-type.
+
+## License
+
+[MIT](LICENSE)
+
+[ci-image]: https://badgen.net/github/checks/jshttp/mime-types/master?label=ci
+[ci-url]: https://github.com/jshttp/mime-types/actions/workflows/ci.yml
+[coveralls-image]: https://badgen.net/coveralls/c/github/jshttp/mime-types/master
+[coveralls-url]: https://coveralls.io/r/jshttp/mime-types?branch=master
+[node-version-image]: https://badgen.net/npm/node/mime-types
+[node-version-url]: https://nodejs.org/en/download
+[npm-downloads-image]: https://badgen.net/npm/dm/mime-types
+[npm-url]: https://npmjs.org/package/mime-types
+[npm-version-image]: https://badgen.net/npm/v/mime-types
diff --git a/node_modules/mime-types/index.js b/node_modules/mime-types/index.js
new file mode 100644
index 0000000..b9f34d5
--- /dev/null
+++ b/node_modules/mime-types/index.js
@@ -0,0 +1,188 @@
+/*!
+ * mime-types
+ * Copyright(c) 2014 Jonathan Ong
+ * Copyright(c) 2015 Douglas Christopher Wilson
+ * MIT Licensed
+ */
+
+'use strict'
+
+/**
+ * Module dependencies.
+ * @private
+ */
+
+var db = require('mime-db')
+var extname = require('path').extname
+
+/**
+ * Module variables.
+ * @private
+ */
+
+var EXTRACT_TYPE_REGEXP = /^\s*([^;\s]*)(?:;|\s|$)/
+var TEXT_TYPE_REGEXP = /^text\//i
+
+/**
+ * Module exports.
+ * @public
+ */
+
+exports.charset = charset
+exports.charsets = { lookup: charset }
+exports.contentType = contentType
+exports.extension = extension
+exports.extensions = Object.create(null)
+exports.lookup = lookup
+exports.types = Object.create(null)
+
+// Populate the extensions/types maps
+populateMaps(exports.extensions, exports.types)
+
+/**
+ * Get the default charset for a MIME type.
+ *
+ * @param {string} type
+ * @return {boolean|string}
+ */
+
+function charset (type) {
+ if (!type || typeof type !== 'string') {
+ return false
+ }
+
+ // TODO: use media-typer
+ var match = EXTRACT_TYPE_REGEXP.exec(type)
+ var mime = match && db[match[1].toLowerCase()]
+
+ if (mime && mime.charset) {
+ return mime.charset
+ }
+
+ // default text/* to utf-8
+ if (match && TEXT_TYPE_REGEXP.test(match[1])) {
+ return 'UTF-8'
+ }
+
+ return false
+}
+
+/**
+ * Create a full Content-Type header given a MIME type or extension.
+ *
+ * @param {string} str
+ * @return {boolean|string}
+ */
+
+function contentType (str) {
+ // TODO: should this even be in this module?
+ if (!str || typeof str !== 'string') {
+ return false
+ }
+
+ var mime = str.indexOf('/') === -1
+ ? exports.lookup(str)
+ : str
+
+ if (!mime) {
+ return false
+ }
+
+ // TODO: use content-type or other module
+ if (mime.indexOf('charset') === -1) {
+ var charset = exports.charset(mime)
+ if (charset) mime += '; charset=' + charset.toLowerCase()
+ }
+
+ return mime
+}
+
+/**
+ * Get the default extension for a MIME type.
+ *
+ * @param {string} type
+ * @return {boolean|string}
+ */
+
+function extension (type) {
+ if (!type || typeof type !== 'string') {
+ return false
+ }
+
+ // TODO: use media-typer
+ var match = EXTRACT_TYPE_REGEXP.exec(type)
+
+ // get extensions
+ var exts = match && exports.extensions[match[1].toLowerCase()]
+
+ if (!exts || !exts.length) {
+ return false
+ }
+
+ return exts[0]
+}
+
+/**
+ * Lookup the MIME type for a file path/extension.
+ *
+ * @param {string} path
+ * @return {boolean|string}
+ */
+
+function lookup (path) {
+ if (!path || typeof path !== 'string') {
+ return false
+ }
+
+ // get the extension ("ext" or ".ext" or full path)
+ var extension = extname('x.' + path)
+ .toLowerCase()
+ .substr(1)
+
+ if (!extension) {
+ return false
+ }
+
+ return exports.types[extension] || false
+}
+
+/**
+ * Populate the extensions and types maps.
+ * @private
+ */
+
+function populateMaps (extensions, types) {
+ // source preference (least -> most)
+ var preference = ['nginx', 'apache', undefined, 'iana']
+
+ Object.keys(db).forEach(function forEachMimeType (type) {
+ var mime = db[type]
+ var exts = mime.extensions
+
+ if (!exts || !exts.length) {
+ return
+ }
+
+ // mime -> extensions
+ extensions[type] = exts
+
+ // extension -> mime
+ for (var i = 0; i < exts.length; i++) {
+ var extension = exts[i]
+
+ if (types[extension]) {
+ var from = preference.indexOf(db[types[extension]].source)
+ var to = preference.indexOf(mime.source)
+
+ if (types[extension] !== 'application/octet-stream' &&
+ (from > to || (from === to && types[extension].substr(0, 12) === 'application/'))) {
+ // skip the remapping
+ continue
+ }
+ }
+
+ // set the extension -> mime
+ types[extension] = type
+ }
+ })
+}
diff --git a/node_modules/mime-types/package.json b/node_modules/mime-types/package.json
new file mode 100644
index 0000000..bbef696
--- /dev/null
+++ b/node_modules/mime-types/package.json
@@ -0,0 +1,44 @@
+{
+ "name": "mime-types",
+ "description": "The ultimate javascript content-type utility.",
+ "version": "2.1.35",
+ "contributors": [
+ "Douglas Christopher Wilson <doug@somethingdoug.com>",
+ "Jeremiah Senkpiel <fishrock123@rocketmail.com> (https://searchbeam.jit.su)",
+ "Jonathan Ong <me@jongleberry.com> (http://jongleberry.com)"
+ ],
+ "license": "MIT",
+ "keywords": [
+ "mime",
+ "types"
+ ],
+ "repository": "jshttp/mime-types",
+ "dependencies": {
+ "mime-db": "1.52.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"
+ },
+ "files": [
+ "HISTORY.md",
+ "LICENSE",
+ "index.js"
+ ],
+ "engines": {
+ "node": ">= 0.6"
+ },
+ "scripts": {
+ "lint": "eslint .",
+ "test": "mocha --reporter spec test/test.js",
+ "test-ci": "nyc --reporter=lcov --reporter=text npm test",
+ "test-cov": "nyc --reporter=html --reporter=text npm test"
+ }
+}
diff --git a/node_modules/node-wifi/.eslintrc.json b/node_modules/node-wifi/.eslintrc.json
new file mode 100644
index 0000000..b9d7713
--- /dev/null
+++ b/node_modules/node-wifi/.eslintrc.json
@@ -0,0 +1,7 @@
+{
+ "extends": ["prettier", "eslint:recommended", "plugin:node/recommended"],
+ "plugins": ["jest"],
+ "env": {
+ "jest/globals": true
+ }
+}
diff --git a/node_modules/node-wifi/.prettierignore b/node_modules/node-wifi/.prettierignore
new file mode 100644
index 0000000..30d74d2
--- /dev/null
+++ b/node_modules/node-wifi/.prettierignore
@@ -0,0 +1 @@
+test \ No newline at end of file
diff --git a/node_modules/node-wifi/.prettierrc.json b/node_modules/node-wifi/.prettierrc.json
new file mode 100644
index 0000000..36b4861
--- /dev/null
+++ b/node_modules/node-wifi/.prettierrc.json
@@ -0,0 +1,7 @@
+{
+ "tabWidth": 2,
+ "semi": true,
+ "singleQuote": true,
+ "trailingComma": "none",
+ "arrowParens": "avoid"
+}
diff --git a/node_modules/node-wifi/CHANGELOG.md b/node_modules/node-wifi/CHANGELOG.md
new file mode 100644
index 0000000..4fd2d48
--- /dev/null
+++ b/node_modules/node-wifi/CHANGELOG.md
@@ -0,0 +1,145 @@
+# Changelog
+
+All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
+
+### [2.0.16](https://github.com/friedrith/node-wifi/compare/v2.0.16-alpha.0...v2.0.16) (2021-10-22)
+
+### [2.0.16-alpha.0](https://github.com/friedrith/node-wifi/compare/v2.0.15...v2.0.16-alpha.0) (2021-10-21)
+
+
+### Bug Fixes
+
+* hash integrity ([c33b4f3](https://github.com/friedrith/node-wifi/commit/c33b4f3842ff185fcfcbe3abf93178be8d947ed1))
+* quick but remove bssid for macOS Monterey ([a450bec](https://github.com/friedrith/node-wifi/commit/a450becd7b29692f0dc7668d9769e5c391193463))
+* vulnerable dependency ([5bb555d](https://github.com/friedrith/node-wifi/commit/5bb555dd9f2aca16c5520bdce9a9ec9025f91637))
+
+### [2.0.15](https://github.com/friedrith/node-wifi/compare/v2.0.14...v2.0.15) (2021-08-11)
+
+
+### Bug Fixes
+
+* **windows:** connect network for non-admin users ([#164](https://github.com/friedrith/node-wifi/issues/164)) ([08440d4](https://github.com/friedrith/node-wifi/commit/08440d4353f40d9229ceb91c6ce9f1e950f32994)), closes [#159](https://github.com/friedrith/node-wifi/issues/159)
+
+### [2.0.14](https://github.com/friedrith/node-wifi/compare/v2.0.13...v2.0.14) (2020-10-11)
+
+
+### Bug Fixes
+
+* dependencies vulnerabilities ([1066263](https://github.com/friedrith/node-wifi/commit/10662634725a314c5f585a33abf61cff3ea299f9))
+* mac connect for quasar electron apps ([8005de9](https://github.com/friedrith/node-wifi/commit/8005de94dd1d0d1220d6fa09a163f97c4a22deda))
+* **dependencies:** vulnerabilities ([#133](https://github.com/friedrith/node-wifi/issues/133)) ([47ad8a2](https://github.com/friedrith/node-wifi/commit/47ad8a220e7c691c4195d9d7b89ff204005e3d80))
+* **dependencies:** vulnerabilities ([#135](https://github.com/friedrith/node-wifi/issues/135)) ([9a2a50e](https://github.com/friedrith/node-wifi/commit/9a2a50ee9b503d8b6ed78d82f094ab3ea1ecc114))
+* **macos:** scripts ([#132](https://github.com/friedrith/node-wifi/issues/132)) ([36c938f](https://github.com/friedrith/node-wifi/commit/36c938f58cf66c377b631d15056d1fe359541b5d))
+* **macos/scan:** parse networks when shifted ([0fa69c7](https://github.com/friedrith/node-wifi/commit/0fa69c7aaaca44ea83c4019dab342396e742a581))
+* windows wifi scan issue fix for first network ([#138](https://github.com/friedrith/node-wifi/issues/138)) ([f6e878d](https://github.com/friedrith/node-wifi/commit/f6e878d48b91410929c5fe5f0a0ff39e34e50c56))
+
+### [2.0.13](https://github.com/friedrith/node-wifi/compare/v2.0.12...v2.0.13) (2020-07-01)
+
+
+### Bug Fixes
+
+* wifi connect issue fix for Windows ([8d992a6](https://github.com/friedrith/node-wifi/commit/8d992a6))
+
+### [2.0.12](https://github.com/friedrith/node-wifi/compare/v2.0.11...v2.0.12) (2019-09-06)
+
+
+### Bug Fixes
+
+* security vulnerability for cli (windows, mac and linux) ([a6668ca](https://github.com/friedrith/node-wifi/commit/a6668ca))
+* windows connection profile execute ([84549cb](https://github.com/friedrith/node-wifi/commit/84549cb)), closes [#78](https://github.com/friedrith/node-wifi/issues/78)
+
+### [2.0.11](https://github.com/friedrith/node-wifi/compare/v2.0.10...v2.0.11) (2019-09-01)
+
+
+### Bug Fixes
+
+* fix vulnerabilities ([f4b3965](https://github.com/friedrith/node-wifi/commit/f4b3965))
+
+### [2.0.10](https://github.com/friedrith/node-wifi/compare/v2.0.8...v2.0.10) (2019-09-01)
+
+### [2.0.9](https://github.com/friedrith/node-wifi/compare/v2.0.8...v2.0.9) (2019-09-01)
+
+### 2.0.8 (2019-09-01)
+
+### Bug Fixes
+
+- **dependencies:** bump lodash from 3.10.1 to 4.17.11 [#75](https://github.com/friedrith/node-wifi/issues/75) ([04a9477](https://github.com/friedrith/node-wifi/commit/04a9477))
+- **lint:** travis build ([08ab90e](https://github.com/friedrith/node-wifi/commit/08ab90e))
+- adapt chalk string syntax ([d27b027](https://github.com/friedrith/node-wifi/commit/d27b027))
+
+### 2.0.7
+
+### Bug Fixes
+
+- bug #66
+- bug #50
+
+### 2.0.6
+
+### Bug Fixes
+
+- bug #65
+- bug #73
+
+### 2.0.5
+
+- new license LGPL-3.0
+- add quality result which is as signal level but in percentage
+- change the environment settings for en_US
+- add new function to delete a previous profile #51
+
+### Bug Fixes
+
+- bug #38
+- errors while scanning on raspberry or ASUS Tinker Board issue #41
+
+### 2.0.4
+
+- change urls in package.json because of the author's login changed
+
+### Bug Fixes
+
+- bug #29
+
+### 2.0.3
+
+### Bug Fixes
+
+- bug #26
+
+### 2.0.2
+
+### Bug Fixes
+
+- bug #24
+
+### 2.0.1
+
+- improve stability of windows scan and current connection
+
+## 2.0.0
+
+- add disconnection feature on windows (issue #16)
+- add new fields in scan results (bssid equals to mac, channel, security_flags)
+- improve stability of linux scan
+
+### 1.2.5
+
+### Bug Fixes
+
+- bug #13
+
+### 1.2.4
+
+### Bug Fixes
+
+- bug introduced during #7 fix
+
+## 1.2.3
+
+- improve environment variables management
+
+### Bug Fixes
+
+- bug disconnection #9
+- bug #7
diff --git a/node_modules/node-wifi/CONTRIBUTING.md b/node_modules/node-wifi/CONTRIBUTING.md
new file mode 100644
index 0000000..a70b5bb
--- /dev/null
+++ b/node_modules/node-wifi/CONTRIBUTING.md
@@ -0,0 +1,99 @@
+# Contributing to Node-wifi
+
+:+1::tada: First off, thanks for taking the time to contribute! :tada::+1:
+
+## Found an Issue?
+
+Thank you for reporting any issues you find. We do our best to test and make `node-wifi` as solid as possible, but any reported issue is a real help.
+
+Please follow these guidelines when reporting issues:
+
+- Provide a title in the format of `<Error> when <Task>`
+- Tag your issue with the tag `bug`
+- Provide a short summary of what you are trying to do
+- Provide the log of the encountered error if applicable
+- Provide the exact version of `node-wifi`.
+- Be awesome and consider contributing a [pull request](#want-to-contribute)
+
+## Want to contribute?
+
+You consider contributing changes to `node-wifi` – we dig that!
+Please consider these guidelines when filing a pull request:
+
+- Follow the [Coding Rules](#coding-rules)
+- Follow the [Commit Rules](#commit-rules)
+- Make sure you rebased the current master branch when filing the pull request
+- Follow [Test guidelines](#tests)
+- Squash your commits when filing the pull request
+- Provide a short title with a maximum of 100 characters
+- Provide a more detailed description containing
+ _ What you want to achieve
+ _ What you changed
+ _ What you added
+ _ What you removed
+- For significant changes, post also an issue before to know if your idea has a chance to be accepted
+- Consider your development for windows, linux and macOS platforms at the same time
+ because having a module compatible with all platforms is the main concern of `node-wifi`.
+
+## Coding Rules
+
+To keep the code base of commitlint neat and tidy the following rules apply to every change
+
+- `prettier` is king
+- `eslint` is awesome
+- Favor micro library over swiss army knives (rimraf, ncp vs. fs-extra)
+- Be awesome
+
+> use commands `npm run eslint` and `npm run format` to be sure your code
+> respect coding rules.
+
+> You can also use `npm run format:fix` to fix prettier errors
+
+## Commit Rules
+
+To help everyone with understanding the commit history of commitlint the following commit rules are enforced.
+
+- [conventional commits](https://www.conventionalcommits.org/en/v1.0.0-beta.3/)
+- present tense
+- maximum of 100 characters
+- for bugs, includes the github tag of the issue in the description.
+- message format of `$type($scope): $message`
+
+These are the authorized types:
+
+- build
+- ci
+- chore
+- docs
+- feat
+- fix
+- perf
+- refactor
+- revert
+- style
+- test
+
+## Test
+
+If you add a feature or fix a bug, you need to provide a test verifying your
+improvement. You can launch tests using `npm run test`.
+
+If you fix a bug related to a parser, please provide a log of a command standard
+output. For example for a scan, use `node scripts/scan.js > file.log` to generate a
+log file. Check unit tests for more details.
+
+## Versioning
+
+`node-wifi` use [standard-version](https://github.com/conventional-changelog/standard-version) to handle versioning
+automatically. So you just need to follow commit rules and once the maintainer will want to release a version, he will use commands:
+
+```bash
+git pull origin master
+npm run release
+git push --follow-tags origin master && npm publish
+```
+
+> Please do not use these commands if you don't have write capabilities on the repository. We want to
+> have versions synchronized with npm so these commands should be executed in the same time.
+
+**May the force be with you !!**
diff --git a/node_modules/node-wifi/LICENSE b/node_modules/node-wifi/LICENSE
new file mode 100644
index 0000000..65ad969
--- /dev/null
+++ b/node_modules/node-wifi/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2015 gatsbyjs
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/node_modules/node-wifi/README.md b/node_modules/node-wifi/README.md
new file mode 100644
index 0000000..3a4fdeb
--- /dev/null
+++ b/node_modules/node-wifi/README.md
@@ -0,0 +1,196 @@
+<div align="center">
+<p>
+<img src="https://raw.githubusercontent.com/friedrith/assets/master/node-wifi/logo.png" alt="node-wifi" />
+<br>
+<br>
+<img src="https://img.shields.io/github/workflow/status/friedrith/node-wifi/build" alt="build" />
+<img src="https://img.shields.io/bundlephobia/min/node-wifi" alt="size" >
+<img src="https://img.shields.io/npm/v/node-wifi?color=green&label=npm%20package" alt= "version">
+</p>
+</div>
+
+> We think about switching to ES Modules only for next major release. We would like to have your opinion on this. Please consider leave a comment in the [discussion thread](https://github.com/friedrith/node-wifi/discussions/170).
+
+**I am looking for maintainers who could help me to handle all improvements and
+bug fixes about this project because the hardware/os dependencies make it quite
+hard to test.**
+
+The node-wifi module allows macOS, windows and linux users to interact with surrounding wifi networks through various methods. These methods include scanning for wifi access points and connecting to these access points.
+
+<div align="center">
+
+| Features | Linux | Mac | Windows |
+| ----------------------------- | ----- | --- | ------- |
+| Connect | ✓ | ✓ | ✓ |
+| Scan | ✓ | ✓ | ✓ |
+| List current wifi connections | ✓ | ✓ | ✓ |
+| Disconnect | ✓ | | ✓ |
+| Delete connection information | ✓ | ✓ | |
+
+</div>
+
+We wish to be clear in saying that this module is inspired from [node-wifi-control](https://github.com/msolters/wifi-control-node) but with some slight modifications to certain functions such as the various OS-specific parsers for terminal output as we noticed that these parsers did not work well on certain operating systems.
+
+> As everything with hardware dependencies, weird behaviors may happen depending of your configuration. You should never hesitate to notify us about a specificity of your OS/Hardware/Wifi card/whatever.
+
+---
+
+## Install
+
+```bash
+# Use as a module
+npm install node-wifi
+```
+
+## Getting started
+
+```javascript
+const wifi = require('node-wifi');
+
+// Initialize wifi module
+// Absolutely necessary even to set interface to null
+wifi.init({
+ iface: null // network interface, choose a random wifi interface if set to null
+});
+
+// Scan networks
+wifi.scan((error, networks) => {
+ if (error) {
+ console.log(error);
+ } else {
+ console.log(networks);
+ /*
+ networks = [
+ {
+ ssid: '...',
+ bssid: '...',
+ mac: '...', // equals to bssid (for retrocompatibility)
+ channel: <number>,
+ frequency: <number>, // in MHz
+ signal_level: <number>, // in dB
+ quality: <number>, // same as signal level but in %
+ security: 'WPA WPA2' // format depending on locale for open networks in Windows
+ security_flags: '...' // encryption protocols (format currently depending of the OS)
+ mode: '...' // network mode like Infra (format currently depending of the OS)
+ },
+ ...
+ ];
+ */
+ }
+});
+
+// Connect to a network
+wifi.connect({ ssid: 'ssid', password: 'password' }, () => {
+ console.log('Connected');
+ // on windows, the callback is called even if the connection failed due to netsh limitations
+ // if your software may work on windows, you should use `wifi.getCurrentConnections` to check if the connection succeeded
+});
+
+// Disconnect from a network
+// not available on all os for now
+wifi.disconnect(error => {
+ if (error) {
+ console.log(error);
+ } else {
+ console.log('Disconnected');
+ }
+});
+
+// Delete a saved network
+// not available on all os for now
+wifi.deleteConnection({ ssid: 'ssid' }, error => {
+ if (error) {
+ console.log(error);
+ } else {
+ console.log('Deleted');
+ }
+});
+
+// List the current wifi connections
+wifi.getCurrentConnections((error, currentConnections) => {
+ if (error) {
+ console.log(error);
+ } else {
+ console.log(currentConnections);
+ /*
+ // you may have several connections
+ [
+ {
+ iface: '...', // network interface used for the connection, not available on macOS
+ ssid: '...',
+ bssid: '...',
+ mac: '...', // equals to bssid (for retrocompatibility)
+ channel: <number>,
+ frequency: <number>, // in MHz
+ signal_level: <number>, // in dB
+ quality: <number>, // same as signal level but in %
+ security: '...' //
+ security_flags: '...' // encryption protocols (format currently depending of the OS)
+ mode: '...' // network mode like Infra (format currently depending of the OS)
+ }
+ ]
+ */
+ }
+});
+
+// All functions also return promise if there is no callback given
+wifi
+ .scan()
+ .then(networks => {
+ // networks
+ })
+ .catch(error => {
+ // error
+ });
+```
+
+
+## Use as CLI
+
+`node-wifi` is also usable as a CLI tool with the library [node-wifi-cli](https://github.com/friedrith/node-wifi-cli).
+
+## Platforms compatibility
+
+This project is tested with operating systems:
+
+- macOS Catalina 10.15.5
+- macOS Big Sur 11.5.1
+- linux Ubuntu 18.04.3 LTS
+
+> Do not hesitate to create a pull request to add the OS you are using.
+
+## Dependencies
+
+Linux:
+
+- network-manager (nmcli)
+
+Windows:
+
+- netsh
+
+MacOS:
+
+- airport
+- networksetup
+
+## Contribute
+
+Please read [development guidelines](./CONTRIBUTING.md) before proposing a pull request.
+
+## Roadmap
+
+- [x] add conventional commits
+- [x] plug to travis
+- [x] add github templates
+- [x] add eslint
+- [x] add prettier
+- [x] switch to MIT license
+- [x] generate changelog and release note
+- [x] stdout how to reproduce bug
+- [x] use github actions
+- [ ] add unit tests (in progress)
+- [ ] rewrite the library using ES7 (in progress)
+- [ ] harmonize security flags and modes
+- [ ] install commitizen
+- [ ] use xml to stabilize parsers
diff --git a/node_modules/node-wifi/bin/help.js b/node_modules/node-wifi/bin/help.js
new file mode 100644
index 0000000..eefc261
--- /dev/null
+++ b/node_modules/node-wifi/bin/help.js
@@ -0,0 +1,78 @@
+const optionDefinitions = [
+ {
+ name: 'scan',
+ type: Boolean,
+ description:
+ 'Scan for wifi networks. It returns a JSON formatted response with ssid, bssid, frequency, signal level and security for every network detected.'
+ },
+ {
+ name: 'connect',
+ type: Boolean,
+ description:
+ 'Connect to a wifi network. It needs options {bold --ssid} and {bold --password}. A specific interface may be selected by adding option {bold --iface}'
+ },
+ {
+ name: 'disconnect',
+ type: Boolean,
+ description:
+ 'Disconnect from a wifi network. A specific interface may be selected by adding option {bold --iface}'
+ },
+ {
+ name: 'current',
+ type: Boolean,
+ description:
+ 'List the current wifi connections. A specific interface may be selected by adding option {bold --iface}'
+ },
+ {
+ name: 'delete',
+ type: Boolean,
+ description:
+ 'Delete the wifi config related to a specific network identified by a ssid. It needs options {bold --ssid}. A specific interface may be selected by adding option {bold --iface}'
+ },
+ {
+ name: 'ssid',
+ type: String,
+ typeLabel: '{underline ssid}',
+ description: 'Ssid to connect to the wifi.'
+ },
+ {
+ name: 'password',
+ type: String,
+ typeLabel: '{underline password}',
+ description: 'Password to connect to the wifi.'
+ },
+ {
+ name: 'iface',
+ type: String,
+ typeLabel: '{underline interface}',
+ description: 'Network interface to connect to the wifi.'
+ },
+ {
+ name: 'help',
+ alias: 'h',
+ type: Boolean,
+ description: 'Show the help.'
+ },
+ {
+ name: 'version',
+ alias: 'v',
+ type: Boolean,
+ description: 'Display the current version of node-wifi.'
+ }
+];
+
+const sections = [
+ {
+ header: 'Wifi',
+ content: 'Multi-OS tool to manage wifi.'
+ },
+ {
+ header: 'Options',
+ optionList: optionDefinitions
+ }
+];
+
+module.exports = {
+ sections,
+ optionDefinitions
+};
diff --git a/node_modules/node-wifi/bin/wifi.js b/node_modules/node-wifi/bin/wifi.js
new file mode 100755
index 0000000..a97cd76
--- /dev/null
+++ b/node_modules/node-wifi/bin/wifi.js
@@ -0,0 +1,128 @@
+#!/usr/bin/env node
+/* eslint-disable no-process-exit */
+
+'use strict';
+
+const commandLineArgs = require('command-line-args');
+const getUsage = require('command-line-usage');
+
+const packageJson = require('../package.json');
+
+const wifi = require('../src/wifi');
+const { sections, optionDefinitions } = require('./help');
+
+const usage = getUsage(sections);
+
+let options = null;
+
+const fgRed = '\x1b[31m'; // cf https://stackoverflow.com/questions/9781218/how-to-change-node-jss-console-font-color
+
+console.error(
+ `${fgRed}[Deprecated] node-wifi CLI is deprecated and will be removed in the next major release. Use node-wifi-cli instead.`
+);
+
+try {
+ options = commandLineArgs(optionDefinitions);
+} catch (e) {
+ console.error('Bad options, please see the help with option -h', e);
+ process.exit(2);
+}
+
+if (options.version) {
+ console.log(`Version ${packageJson.version}`);
+ process.exit(0);
+}
+
+if (options.help) {
+ console.log(usage);
+ process.exit(0);
+}
+
+let cmds = 0;
+
+if (options.connect) cmds++;
+if (options.disconnect) cmds++;
+if (options.scan) cmds++;
+if (options.current) cmds++;
+if (options.delete) cmds++;
+
+if (cmds > 1) {
+ console.error('You cannot do several operations at the same time');
+ process.exit(2);
+}
+
+if (
+ !options.connect &&
+ !options.scan &&
+ !options.disconnect &&
+ !options.current &&
+ !options.delete
+) {
+ console.log(usage);
+ process.exit(2);
+}
+
+wifi.init({
+ iface: options.iface
+});
+
+if (options.scan) {
+ wifi.scan((error, resp) => {
+ if (error) {
+ console.error(error);
+ process.exit(2);
+ } else {
+ console.log(resp);
+ }
+ });
+} else if (options.connect) {
+ if (!options.ssid || !options.password) {
+ console.error(usage);
+ process.exit(2);
+ }
+
+ const accessPoint = {
+ ssid: options.ssid,
+ password: options.password
+ };
+
+ wifi.connect(accessPoint, error => {
+ if (error) {
+ console.error(error);
+ process.exit(2);
+ }
+ });
+} else if (options.disconnect) {
+ wifi.disconnect(error => {
+ if (error) {
+ console.error(error);
+ process.exit(2);
+ }
+ });
+} else if (options.current) {
+ wifi.getCurrentConnections((error, currentConnections) => {
+ if (error) {
+ console.log(error);
+ process.exit(2);
+ } else {
+ console.log(currentConnections);
+ }
+ });
+} else if (options.delete) {
+ console.log('ok');
+ if (!options.ssid) {
+ console.error(usage);
+ process.exit(2);
+ }
+
+ const accessPoint = {
+ ssid: options.ssid
+ };
+
+ wifi.deleteConnection(accessPoint, error => {
+ if (error) {
+ console.error(error);
+ process.exit(2);
+ }
+ });
+}
diff --git a/node_modules/node-wifi/package.json b/node_modules/node-wifi/package.json
new file mode 100644
index 0000000..b448bf1
--- /dev/null
+++ b/node_modules/node-wifi/package.json
@@ -0,0 +1,57 @@
+{
+ "name": "node-wifi",
+ "version": "2.0.16",
+ "description": "NodeJS tool to manage wifi",
+ "keywords": [
+ "wifi",
+ "multiplatform",
+ "node"
+ ],
+ "author": "Thibault Friedrich",
+ "contributors": [
+ "Thibault Friedrich <thibault.friedrich@gmail.com> (https://thibaultfriedrich.io)"
+ ],
+ "license": "MIT",
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/friedrith/node-wifi.git"
+ },
+ "bugs": {
+ "url": "https://github.com/friedrith/node-wifi/issues"
+ },
+ "publishConfig": {
+ "registry": "https://registry.npmjs.org/"
+ },
+ "bin": {
+ "wifi": "bin/wifi.js"
+ },
+ "main": "src/wifi.js",
+ "directories": {
+ "test": "test"
+ },
+ "type": "commonjs",
+ "engines": {
+ "node": ">=10.0.0"
+ },
+ "dependencies": {
+ "command-line-args": "^5.2.0",
+ "command-line-usage": "^6.1.1"
+ },
+ "devDependencies": {
+ "dotenv": "^10.0.0",
+ "eslint": "^7.32.0",
+ "eslint-config-prettier": "^8.3.0",
+ "eslint-plugin-jest": "^24.4.0",
+ "eslint-plugin-node": "^11.1.0",
+ "jest": "^27.0.6",
+ "prettier": "^2.3.2",
+ "standard-version": "^9.3.1"
+ },
+ "scripts": {
+ "test": "jest",
+ "lint": "eslint {src,bin}/**/*.js",
+ "format": "prettier --check '{src,bin}/**/*.js'",
+ "format:fix": "prettier --write '{src,bin}/**/*.js'",
+ "release": "standard-version"
+ }
+}
diff --git a/node_modules/node-wifi/src/__test__/unlogger.js b/node_modules/node-wifi/src/__test__/unlogger.js
new file mode 100644
index 0000000..d87f291
--- /dev/null
+++ b/node_modules/node-wifi/src/__test__/unlogger.js
@@ -0,0 +1,12 @@
+const fs = require('fs');
+
+module.exports = path =>
+ new Promise((resolve, reject) => {
+ fs.readFile(path, 'utf8', (error, data) => {
+ if (error) {
+ reject();
+ } else {
+ resolve(data.replace(/.*\n/, ''));
+ }
+ });
+ });
diff --git a/node_modules/node-wifi/src/env.js b/node_modules/node-wifi/src/env.js
new file mode 100644
index 0000000..b333b28
--- /dev/null
+++ b/node_modules/node-wifi/src/env.js
@@ -0,0 +1,5 @@
+module.exports = Object.assign(process.env, {
+ LANG: 'en_US.UTF-8',
+ LC_ALL: 'en_US.UTF-8',
+ LC_MESSAGES: 'en_US.UTF-8'
+});
diff --git a/node_modules/node-wifi/src/index.js b/node_modules/node-wifi/src/index.js
new file mode 100644
index 0000000..67e57cb
--- /dev/null
+++ b/node_modules/node-wifi/src/index.js
@@ -0,0 +1,52 @@
+const execute = require('./utils/executer');
+const promiser = require('./utils/promiser');
+
+const platform = require('./platform');
+
+let config = {
+ debug: false,
+ iface: null
+};
+
+const init = newConfig => {
+ config = {
+ ...config,
+ ...newConfig
+ };
+};
+
+const notAvailable = () => {
+ throw new Error('ERROR : not available for this OS');
+};
+
+const scan = () => {
+ if (!platform().scan) {
+ notAvailable();
+ }
+
+ const { command, parse } = platform().scan;
+
+ const scanWifi = config =>
+ execute(command(config)).then(output => parse(output));
+
+ return promiser(scanWifi)(config)();
+};
+
+const connect = accessPoint => {
+ if (!platform().connect) {
+ notAvailable();
+ }
+
+ const { command, parse } = platform().connect;
+
+ const connectWifi = config =>
+ execute(command(config)).then(output => parse(output));
+
+ return promiser(connectWifi)(config)(accessPoint);
+};
+
+module.exports = {
+ init,
+ scan,
+ connect
+};
diff --git a/node_modules/node-wifi/src/linux-connect.js b/node_modules/node-wifi/src/linux-connect.js
new file mode 100644
index 0000000..164c121
--- /dev/null
+++ b/node_modules/node-wifi/src/linux-connect.js
@@ -0,0 +1,45 @@
+const execFile = require('child_process').execFile;
+const env = require('./env');
+
+function connectToWifi(config, ap, callback) {
+ const args = [];
+ args.push('-w');
+ args.push('10');
+ args.push('device');
+ args.push('wifi');
+ args.push('connect');
+ args.push(ap.ssid);
+ args.push('password');
+ args.push(ap.password);
+
+ if (config.iface) {
+ args.push('ifname');
+ args.push(config.iface);
+ }
+
+ execFile('nmcli', args, { env }, (err, resp) => {
+ // Errors from nmcli came from stdout, we test presence of 'Error: ' string
+ if (resp.includes('Error: ')) {
+ err = new Error(resp.replace('Error: ', ''));
+ }
+ callback && callback(err);
+ });
+}
+
+module.exports = config => {
+ return (ap, callback) => {
+ if (callback) {
+ connectToWifi(config, ap, callback);
+ } else {
+ return new Promise((resolve, reject) => {
+ connectToWifi(config, ap, err => {
+ if (err) {
+ reject(err);
+ } else {
+ resolve();
+ }
+ });
+ });
+ }
+ };
+};
diff --git a/node_modules/node-wifi/src/linux-current-connections.js b/node_modules/node-wifi/src/linux-current-connections.js
new file mode 100644
index 0000000..cec7005
--- /dev/null
+++ b/node_modules/node-wifi/src/linux-current-connections.js
@@ -0,0 +1,75 @@
+const execFile = require('child_process').execFile;
+const networkUtils = require('./utils/network-utils');
+const env = require('./env');
+
+function getCurrentConnection(config, callback) {
+ const args = [];
+ args.push('--terse');
+ args.push('--fields');
+ args.push(
+ 'active,ssid,bssid,mode,chan,freq,signal,security,wpa-flags,rsn-flags,device'
+ );
+ args.push('device');
+ args.push('wifi');
+
+ if (config.iface) {
+ args.push('list');
+ args.push('ifname');
+ args.push(config.iface);
+ }
+
+ execFile('nmcli', args, { env }, (err, scanResults) => {
+ if (err) {
+ callback && callback(err);
+ return;
+ }
+
+ const lines = scanResults.split('\n');
+
+ const networks = [];
+ for (let i = 0; i < lines.length; i++) {
+ if (lines[i] != '') {
+ const fields = lines[i].replace(/\\:/g, '&&').split(':');
+ if (fields[0] == 'yes') {
+ networks.push({
+ iface: fields[10].replace(/&&/g, ':'),
+ ssid: fields[1].replace(/&&/g, ':'),
+ bssid: fields[2].replace(/&&/g, ':'),
+ mac: fields[2].replace(/&&/g, ':'), // for retrocompatibility with version 1.x
+ mode: fields[3].replace(/&&/g, ':'),
+ channel: parseInt(fields[4].replace(/&&/g, ':')),
+ frequency: parseInt(fields[5].replace(/&&/g, ':')),
+ signal_level: networkUtils.dBFromQuality(
+ fields[6].replace(/&&/g, ':')
+ ),
+ quality: parseFloat(fields[6].replace(/&&/g, ':')),
+ security: fields[7].replace(/&&/g, ':'),
+ security_flags: {
+ wpa: fields[8].replace(/&&/g, ':'),
+ rsn: fields[9].replace(/&&/g, ':')
+ }
+ });
+ }
+ }
+ }
+ callback && callback(null, networks);
+ });
+}
+
+module.exports = config => {
+ return callback => {
+ if (callback) {
+ getCurrentConnection(config, callback);
+ } else {
+ return new Promise((resolve, reject) => {
+ getCurrentConnection(config, (err, connections) => {
+ if (err) {
+ reject(err);
+ } else {
+ resolve(connections);
+ }
+ });
+ });
+ }
+ };
+};
diff --git a/node_modules/node-wifi/src/linux-delete.js b/node_modules/node-wifi/src/linux-delete.js
new file mode 100644
index 0000000..ed2356c
--- /dev/null
+++ b/node_modules/node-wifi/src/linux-delete.js
@@ -0,0 +1,33 @@
+const execFile = require('child_process').execFile;
+const env = require('./env');
+
+function deleteConnection(config, ap, callback) {
+ const args = [];
+ args.push('connection');
+ args.push('delete');
+ args.push('id');
+
+ args.push(ap.ssid);
+
+ execFile('nmcli', args, env, err => {
+ callback && callback(err);
+ });
+}
+
+module.exports = config => {
+ return (ap, callback) => {
+ if (callback) {
+ deleteConnection(config, ap, callback);
+ } else {
+ return new Promise((resolve, reject) => {
+ deleteConnection(config, ap, err => {
+ if (err) {
+ reject(err);
+ } else {
+ resolve();
+ }
+ });
+ });
+ }
+ };
+};
diff --git a/node_modules/node-wifi/src/linux-disconnect.js b/node_modules/node-wifi/src/linux-disconnect.js
new file mode 100644
index 0000000..22ee4f6
--- /dev/null
+++ b/node_modules/node-wifi/src/linux-disconnect.js
@@ -0,0 +1,34 @@
+const execFile = require('child_process').execFile;
+const env = require('./env');
+
+function disconnect(config, callback) {
+ const args = [];
+ args.push('device');
+ args.push('disconnect');
+
+ if (config.iface) {
+ args.push(config.iface);
+ }
+
+ execFile('nmcli', args, { env }, err => {
+ callback && callback(err);
+ });
+}
+
+module.exports = config => {
+ return callback => {
+ if (callback) {
+ disconnect(config, callback);
+ } else {
+ return new Promise((resolve, reject) => {
+ disconnect(config, err => {
+ if (err) {
+ reject(err);
+ } else {
+ resolve();
+ }
+ });
+ });
+ }
+ };
+};
diff --git a/node_modules/node-wifi/src/linux-scan.js b/node_modules/node-wifi/src/linux-scan.js
new file mode 100644
index 0000000..a3d3bc0
--- /dev/null
+++ b/node_modules/node-wifi/src/linux-scan.js
@@ -0,0 +1,9 @@
+const execute = require('./utils/executer');
+const promiser = require('./utils/promiser');
+const command = require('./linux/scan/command.js');
+const parse = require('./linux/scan/parser');
+
+const scanWifi = config =>
+ execute(command(config)).then(output => parse(output));
+
+module.exports = promiser(scanWifi);
diff --git a/node_modules/node-wifi/src/linux/__logs__/scan-01.log b/node_modules/node-wifi/src/linux/__logs__/scan-01.log
new file mode 100644
index 0000000..009b346
--- /dev/null
+++ b/node_modules/node-wifi/src/linux/__logs__/scan-01.log
@@ -0,0 +1,16 @@
+$ nmcli --terse --fields active,ssid,bssid,mode,chan,freq,signal,security,wpa-flags,rsn-flags device wifi list
+no:Linksys01777:31\:23\:03\:1A\:9F\:1C:Infra:11:2462 MHz:100:WPA2:(none):pair_ccmp group_ccmp psk
+no:Linksys01777-invité:31\:23\:03\:18\:9F\:1C:Infra:11:2462 MHz:100::(none):(none)
+no:EBOX_6070:00\:21\:6A\:75\:60\:22:Infra:11:2462 MHz:100:WPA1 WPA2:pair_tkip pair_ccmp group_tkip psk:pair_tkip pair_ccmp group_tkip psk
+yes:Linksys01777_5GHz:31\:23\:03\:1A\:9F\:1D:Infra:36:5180 MHz:75:WPA2:(none):pair_ccmp group_ccmp psk
+no:NERMNET:61\:FF\:7B\:43\:B5\:27:Infra:1:2412 MHz:64:WPA2:(none):pair_tkip pair_ccmp group_tkip psk
+no:NERMNET:61\:FF\:7B\:43\:B5\:26:Infra:149:5745 MHz:64:WPA1 WPA2:pair_tkip pair_ccmp group_tkip psk:pair_tkip pair_ccmp group_tkip psk
+no:VIRGIN172:B1\:EE\:0E\:E4\:FA\:1E:Infra:6:2437 MHz:62:WPA2:(none):pair_ccmp group_ccmp psk
+no:NERMNET:91\:48\:27\:4B\:7C\:5A:Infra:13:2472 MHz:55:WPA1 WPA2:pair_tkip pair_ccmp group_tkip psk:pair_tkip pair_ccmp group_tkip psk
+no:VIRGIN660:D1\:D7\:75\:A2\:BC\:F6:Infra:6:2437 MHz:54:WPA2:(none):pair_ccmp group_ccmp psk
+no:VIDEOTRON9021:A1\:E4\:CB\:FB\:42\:38:Infra:11:2462 MHz:40:WPA2:(none):pair_ccmp group_ccmp psk
+no:BELL320:A1\:6A\:BB\:E9\:FC\:E7:Infra:44:5220 MHz:30:WPA2:(none):pair_ccmp group_ccmp psk
+no:BELL320:A1\:6A\:BB\:E9\:FC\:E5:Infra:100:5500 MHz:30:WPA2:(none):pair_ccmp group_ccmp psk
+no::A1\:6A\:BB\:E9\:FC\:E5:Infra:100:5500 MHz:30:WPA2:(none):pair_ccmp group_ccmp psk
+no:BELL320:A1\:6A\:BB\:E9\:FC\:E6:Infra:1:2412 MHz:25:WPA2:(none):pair_ccmp group_ccmp psk
+
diff --git a/node_modules/node-wifi/src/linux/index.js b/node_modules/node-wifi/src/linux/index.js
new file mode 100644
index 0000000..a3b3d57
--- /dev/null
+++ b/node_modules/node-wifi/src/linux/index.js
@@ -0,0 +1,3 @@
+const scan = require('./scan/index');
+
+module.exports = { scan };
diff --git a/node_modules/node-wifi/src/linux/scan/__logs__/scan-01.log b/node_modules/node-wifi/src/linux/scan/__logs__/scan-01.log
new file mode 100644
index 0000000..009b346
--- /dev/null
+++ b/node_modules/node-wifi/src/linux/scan/__logs__/scan-01.log
@@ -0,0 +1,16 @@
+$ nmcli --terse --fields active,ssid,bssid,mode,chan,freq,signal,security,wpa-flags,rsn-flags device wifi list
+no:Linksys01777:31\:23\:03\:1A\:9F\:1C:Infra:11:2462 MHz:100:WPA2:(none):pair_ccmp group_ccmp psk
+no:Linksys01777-invité:31\:23\:03\:18\:9F\:1C:Infra:11:2462 MHz:100::(none):(none)
+no:EBOX_6070:00\:21\:6A\:75\:60\:22:Infra:11:2462 MHz:100:WPA1 WPA2:pair_tkip pair_ccmp group_tkip psk:pair_tkip pair_ccmp group_tkip psk
+yes:Linksys01777_5GHz:31\:23\:03\:1A\:9F\:1D:Infra:36:5180 MHz:75:WPA2:(none):pair_ccmp group_ccmp psk
+no:NERMNET:61\:FF\:7B\:43\:B5\:27:Infra:1:2412 MHz:64:WPA2:(none):pair_tkip pair_ccmp group_tkip psk
+no:NERMNET:61\:FF\:7B\:43\:B5\:26:Infra:149:5745 MHz:64:WPA1 WPA2:pair_tkip pair_ccmp group_tkip psk:pair_tkip pair_ccmp group_tkip psk
+no:VIRGIN172:B1\:EE\:0E\:E4\:FA\:1E:Infra:6:2437 MHz:62:WPA2:(none):pair_ccmp group_ccmp psk
+no:NERMNET:91\:48\:27\:4B\:7C\:5A:Infra:13:2472 MHz:55:WPA1 WPA2:pair_tkip pair_ccmp group_tkip psk:pair_tkip pair_ccmp group_tkip psk
+no:VIRGIN660:D1\:D7\:75\:A2\:BC\:F6:Infra:6:2437 MHz:54:WPA2:(none):pair_ccmp group_ccmp psk
+no:VIDEOTRON9021:A1\:E4\:CB\:FB\:42\:38:Infra:11:2462 MHz:40:WPA2:(none):pair_ccmp group_ccmp psk
+no:BELL320:A1\:6A\:BB\:E9\:FC\:E7:Infra:44:5220 MHz:30:WPA2:(none):pair_ccmp group_ccmp psk
+no:BELL320:A1\:6A\:BB\:E9\:FC\:E5:Infra:100:5500 MHz:30:WPA2:(none):pair_ccmp group_ccmp psk
+no::A1\:6A\:BB\:E9\:FC\:E5:Infra:100:5500 MHz:30:WPA2:(none):pair_ccmp group_ccmp psk
+no:BELL320:A1\:6A\:BB\:E9\:FC\:E6:Infra:1:2412 MHz:25:WPA2:(none):pair_ccmp group_ccmp psk
+
diff --git a/node_modules/node-wifi/src/linux/scan/__test__/command.spec.js b/node_modules/node-wifi/src/linux/scan/__test__/command.spec.js
new file mode 100644
index 0000000..ea630ff
--- /dev/null
+++ b/node_modules/node-wifi/src/linux/scan/__test__/command.spec.js
@@ -0,0 +1,33 @@
+const command = require('../command');
+
+describe('linux scan command', () => {
+ it('should generate basic command without iface', () => {
+ expect(command({ iface: null })).toEqual({
+ cmd: 'nmcli',
+ args: [
+ '--terse',
+ '--fields',
+ 'active,ssid,bssid,mode,chan,freq,signal,security,wpa-flags,rsn-flags',
+ 'device',
+ 'wifi',
+ 'list'
+ ]
+ });
+ });
+
+ it('should generate basic command with iface', () => {
+ expect(command({ iface: 'wlan0' })).toEqual({
+ cmd: 'nmcli',
+ args: [
+ '--terse',
+ '--fields',
+ 'active,ssid,bssid,mode,chan,freq,signal,security,wpa-flags,rsn-flags',
+ 'device',
+ 'wifi',
+ 'list',
+ 'ifname',
+ 'wlan0'
+ ]
+ });
+ });
+});
diff --git a/node_modules/node-wifi/src/linux/scan/__test__/parser.spec.js b/node_modules/node-wifi/src/linux/scan/__test__/parser.spec.js
new file mode 100644
index 0000000..955dbd8
--- /dev/null
+++ b/node_modules/node-wifi/src/linux/scan/__test__/parser.spec.js
@@ -0,0 +1,196 @@
+const path = require('path');
+const unlog = require('../../../__test__/unlogger');
+const parse = require('../parser');
+
+const log = filename => path.resolve(__dirname, '../__logs__/', filename);
+
+describe('parse linux scan output', () => {
+ it('should return wifi networks', async () => {
+ const output = await unlog(log('scan-01.log'));
+
+ const networks = parse(output);
+
+ expect(networks).toEqual([
+ {
+ ssid: 'Linksys01777',
+ bssid: '31:23:03:1A:9F:1C',
+ mac: '31:23:03:1A:9F:1C',
+ mode: 'Infra',
+ channel: 11,
+ frequency: 2462,
+ signal_level: -50,
+ quality: 100,
+ security: 'WPA2',
+ security_flags: { wpa: '(none)', rsn: 'pair_ccmp group_ccmp psk' }
+ },
+ {
+ ssid: 'Linksys01777-invité',
+ bssid: '31:23:03:18:9F:1C',
+ mac: '31:23:03:18:9F:1C',
+ mode: 'Infra',
+ channel: 11,
+ frequency: 2462,
+ signal_level: -50,
+ quality: 100,
+ security: '',
+ security_flags: { wpa: '(none)', rsn: '(none)' }
+ },
+ {
+ ssid: 'EBOX_6070',
+ bssid: '00:21:6A:75:60:22',
+ mac: '00:21:6A:75:60:22',
+ mode: 'Infra',
+ channel: 11,
+ frequency: 2462,
+ signal_level: -50,
+ quality: 100,
+ security: 'WPA1 WPA2',
+ security_flags: {
+ wpa: 'pair_tkip pair_ccmp group_tkip psk',
+ rsn: 'pair_tkip pair_ccmp group_tkip psk'
+ }
+ },
+ {
+ ssid: 'Linksys01777_5GHz',
+ bssid: '31:23:03:1A:9F:1D',
+ mac: '31:23:03:1A:9F:1D',
+ mode: 'Infra',
+ channel: 36,
+ frequency: 5180,
+ signal_level: -62.5,
+ quality: 75,
+ security: 'WPA2',
+ security_flags: { wpa: '(none)', rsn: 'pair_ccmp group_ccmp psk' }
+ },
+ {
+ ssid: 'NERMNET',
+ bssid: '61:FF:7B:43:B5:27',
+ mac: '61:FF:7B:43:B5:27',
+ mode: 'Infra',
+ channel: 1,
+ frequency: 2412,
+ signal_level: -68,
+ quality: 64,
+ security: 'WPA2',
+ security_flags: {
+ wpa: '(none)',
+ rsn: 'pair_tkip pair_ccmp group_tkip psk'
+ }
+ },
+ {
+ ssid: 'NERMNET',
+ bssid: '61:FF:7B:43:B5:26',
+ mac: '61:FF:7B:43:B5:26',
+ mode: 'Infra',
+ channel: 149,
+ frequency: 5745,
+ signal_level: -68,
+ quality: 64,
+ security: 'WPA1 WPA2',
+ security_flags: {
+ wpa: 'pair_tkip pair_ccmp group_tkip psk',
+ rsn: 'pair_tkip pair_ccmp group_tkip psk'
+ }
+ },
+ {
+ ssid: 'VIRGIN172',
+ bssid: 'B1:EE:0E:E4:FA:1E',
+ mac: 'B1:EE:0E:E4:FA:1E',
+ mode: 'Infra',
+ channel: 6,
+ frequency: 2437,
+ signal_level: -69,
+ quality: 62,
+ security: 'WPA2',
+ security_flags: { wpa: '(none)', rsn: 'pair_ccmp group_ccmp psk' }
+ },
+ {
+ ssid: 'NERMNET',
+ bssid: '91:48:27:4B:7C:5A',
+ mac: '91:48:27:4B:7C:5A',
+ mode: 'Infra',
+ channel: 13,
+ frequency: 2472,
+ signal_level: -72.5,
+ quality: 55,
+ security: 'WPA1 WPA2',
+ security_flags: {
+ wpa: 'pair_tkip pair_ccmp group_tkip psk',
+ rsn: 'pair_tkip pair_ccmp group_tkip psk'
+ }
+ },
+ {
+ ssid: 'VIRGIN660',
+ bssid: 'D1:D7:75:A2:BC:F6',
+ mac: 'D1:D7:75:A2:BC:F6',
+ mode: 'Infra',
+ channel: 6,
+ frequency: 2437,
+ signal_level: -73,
+ quality: 54,
+ security: 'WPA2',
+ security_flags: { wpa: '(none)', rsn: 'pair_ccmp group_ccmp psk' }
+ },
+ {
+ ssid: 'VIDEOTRON9021',
+ bssid: 'A1:E4:CB:FB:42:38',
+ mac: 'A1:E4:CB:FB:42:38',
+ mode: 'Infra',
+ channel: 11,
+ frequency: 2462,
+ signal_level: -80,
+ quality: 40,
+ security: 'WPA2',
+ security_flags: { wpa: '(none)', rsn: 'pair_ccmp group_ccmp psk' }
+ },
+ {
+ ssid: 'BELL320',
+ bssid: 'A1:6A:BB:E9:FC:E7',
+ mac: 'A1:6A:BB:E9:FC:E7',
+ mode: 'Infra',
+ channel: 44,
+ frequency: 5220,
+ signal_level: -85,
+ quality: 30,
+ security: 'WPA2',
+ security_flags: { wpa: '(none)', rsn: 'pair_ccmp group_ccmp psk' }
+ },
+ {
+ ssid: 'BELL320',
+ bssid: 'A1:6A:BB:E9:FC:E5',
+ mac: 'A1:6A:BB:E9:FC:E5',
+ mode: 'Infra',
+ channel: 100,
+ frequency: 5500,
+ signal_level: -85,
+ quality: 30,
+ security: 'WPA2',
+ security_flags: { wpa: '(none)', rsn: 'pair_ccmp group_ccmp psk' }
+ },
+ {
+ ssid: '',
+ bssid: 'A1:6A:BB:E9:FC:E5',
+ mac: 'A1:6A:BB:E9:FC:E5',
+ mode: 'Infra',
+ channel: 100,
+ frequency: 5500,
+ signal_level: -85,
+ quality: 30,
+ security: 'WPA2',
+ security_flags: { wpa: '(none)', rsn: 'pair_ccmp group_ccmp psk' }
+ },
+ {
+ ssid: 'BELL320',
+ bssid: 'A1:6A:BB:E9:FC:E6',
+ mac: 'A1:6A:BB:E9:FC:E6',
+ mode: 'Infra',
+ channel: 1,
+ frequency: 2412,
+ signal_level: -87.5,
+ quality: 25,
+ security: 'WPA2',
+ security_flags: { wpa: '(none)', rsn: 'pair_ccmp group_ccmp psk' }
+ }
+ ]);
+ });
+});
diff --git a/node_modules/node-wifi/src/linux/scan/command.js b/node_modules/node-wifi/src/linux/scan/command.js
new file mode 100644
index 0000000..8558270
--- /dev/null
+++ b/node_modules/node-wifi/src/linux/scan/command.js
@@ -0,0 +1,22 @@
+const command = config => {
+ const args = [
+ '--terse',
+ '--fields',
+ 'active,ssid,bssid,mode,chan,freq,signal,security,wpa-flags,rsn-flags',
+ 'device',
+ 'wifi',
+ 'list'
+ ];
+
+ if (config.iface) {
+ args.push('ifname');
+ args.push(config.iface);
+ }
+
+ return {
+ cmd: 'nmcli',
+ args
+ };
+};
+
+module.exports = command;
diff --git a/node_modules/node-wifi/src/linux/scan/index.js b/node_modules/node-wifi/src/linux/scan/index.js
new file mode 100644
index 0000000..822c85d
--- /dev/null
+++ b/node_modules/node-wifi/src/linux/scan/index.js
@@ -0,0 +1,4 @@
+const command = require('./command');
+const parse = require('./parser');
+
+module.exports = { command, parse };
diff --git a/node_modules/node-wifi/src/linux/scan/parser.js b/node_modules/node-wifi/src/linux/scan/parser.js
new file mode 100644
index 0000000..97f8490
--- /dev/null
+++ b/node_modules/node-wifi/src/linux/scan/parser.js
@@ -0,0 +1,51 @@
+const { dBFromPercentage } = require('../../utils/percentage-db');
+
+const matchBssid = line =>
+ line.match(
+ /[A-F0-9]{2}\\:[A-F0-9]{2}\\:[A-F0-9]{2}\\:[A-F0-9]{2}\\:[A-F0-9]{2}\\:[A-F0-9]{2}/
+ );
+
+const parse = stdout =>
+ stdout
+ .split('\n')
+ .filter(line => line !== '' && line.includes(':'))
+ .filter(line => matchBssid(line))
+ .map(line => {
+ const match = matchBssid(line);
+ const bssid = match[0].replace(/\\:/g, ':');
+
+ const fields = line.replace(match[0]).split(':');
+
+ const [
+ // eslint-disable-next-line no-unused-vars
+ active,
+ ssid,
+ // eslint-disable-next-line no-unused-vars
+ bssidAlreadyProcessed,
+ mode,
+ channel,
+ frequency,
+ quality,
+ security,
+ security_flags_wpa,
+ security_flags_rsn
+ ] = fields;
+
+ return {
+ ssid,
+ bssid,
+ mac: bssid, // for retrocompatibility with version 1.x
+ mode,
+ channel: parseInt(channel),
+ frequency: parseInt(frequency),
+ signal_level: dBFromPercentage(quality),
+ quality: parseInt(quality),
+ security: security !== '(none)' ? security : 'none',
+ security_flags: {
+ wpa: security_flags_wpa,
+ rsn: security_flags_rsn
+ }
+ };
+ });
+
+module.exports = parse;
diff --git a/node_modules/node-wifi/src/mac-connect.js b/node_modules/node-wifi/src/mac-connect.js
new file mode 100644
index 0000000..4b30c9a
--- /dev/null
+++ b/node_modules/node-wifi/src/mac-connect.js
@@ -0,0 +1,8 @@
+const execute = require('./utils/executer');
+const promiser = require('./utils/promiser');
+const connectWifiCommand = require('./macOS/connect/command.js');
+
+const connectWifi = (config, accessPoint) =>
+ execute(connectWifiCommand(config, accessPoint));
+
+module.exports = promiser(connectWifi);
diff --git a/node_modules/node-wifi/src/mac-current-connections.js b/node_modules/node-wifi/src/mac-current-connections.js
new file mode 100644
index 0000000..10dc5f6
--- /dev/null
+++ b/node_modules/node-wifi/src/mac-current-connections.js
@@ -0,0 +1,9 @@
+const execute = require('./utils/executer');
+const promiser = require('./utils/promiser');
+const command = require('./macOS/current-connections/command.js');
+const parse = require('./macOS/current-connections/parser');
+
+const currentConnectionWifi = config =>
+ execute(command(config)).then(output => parse(output));
+
+module.exports = promiser(currentConnectionWifi);
diff --git a/node_modules/node-wifi/src/mac-delete.js b/node_modules/node-wifi/src/mac-delete.js
new file mode 100644
index 0000000..c95a7f2
--- /dev/null
+++ b/node_modules/node-wifi/src/mac-delete.js
@@ -0,0 +1,9 @@
+const execute = require('./utils/executer');
+const promiser = require('./utils/promiser');
+const command = require('./macOS/delete/command.js');
+const parse = require('./macOS/delete/parser');
+
+const disconnectWifi = (config, accessPoint) =>
+ execute(command(config, accessPoint)).then(output => parse(output));
+
+module.exports = promiser(disconnectWifi);
diff --git a/node_modules/node-wifi/src/mac-scan.js b/node_modules/node-wifi/src/mac-scan.js
new file mode 100644
index 0000000..8894e6e
--- /dev/null
+++ b/node_modules/node-wifi/src/mac-scan.js
@@ -0,0 +1,9 @@
+const execute = require('./utils/executer');
+const promiser = require('./utils/promiser');
+const command = require('./macOS/scan/command.js');
+const parse = require('./macOS/scan/parser');
+
+const scanWifi = config =>
+ execute(command(config)).then(output => parse(output));
+
+module.exports = promiser(scanWifi);
diff --git a/node_modules/node-wifi/src/macOS/__logs__/current-connections-01.log b/node_modules/node-wifi/src/macOS/__logs__/current-connections-01.log
new file mode 100644
index 0000000..962c231
--- /dev/null
+++ b/node_modules/node-wifi/src/macOS/__logs__/current-connections-01.log
@@ -0,0 +1,17 @@
+$ /System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport --getinfo
+ agrCtlRSSI: -50
+ agrExtRSSI: 0
+ agrCtlNoise: -92
+ agrExtNoise: 0
+ state: running
+ op mode: station
+ lastTxRate: 650
+ maxRate: 867
+lastAssocStatus: 0
+ 802.11 auth: open
+ link auth: wpa2-psk
+ BSSID: 31:23:3:1a:9f:1d
+ SSID: Linksys01227_5GHz
+ MCS: 7
+ channel: 36,80
+
diff --git a/node_modules/node-wifi/src/macOS/__logs__/delete-01.log b/node_modules/node-wifi/src/macOS/__logs__/delete-01.log
new file mode 100644
index 0000000..a68c10c
--- /dev/null
+++ b/node_modules/node-wifi/src/macOS/__logs__/delete-01.log
@@ -0,0 +1,3 @@
+$ /usr/sbin/networksetup -removepreferredwirelessnetwork en0 SSID
+Network SSID was not found in the preferred networks list
+
diff --git a/node_modules/node-wifi/src/macOS/__logs__/scan-01.log b/node_modules/node-wifi/src/macOS/__logs__/scan-01.log
new file mode 100644
index 0000000..0065777
--- /dev/null
+++ b/node_modules/node-wifi/src/macOS/__logs__/scan-01.log
@@ -0,0 +1,6 @@
+$ /System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport --scan
+ SSID BSSID RSSI CHANNEL HT CC SECURITY (auth/unicast/group)
+ foo-bar f6:d1:6d:b3:d2:88 -86 6 Y ca WPA2(PSK/AES/AES)
+ VIRGO1732 c1:ee:0e:e4:fa:1f -86 36 Y CA WPA2(PSK/AES/AES)
+ NERMNET 34:e8:94:1e:fc:5c -55 1 Y -- WPA(PSK/AES,TKIP/TKIP) WPA2(PSK/AES,TKIP/TKIP)
+ NERMNET 45:ff:7b:43:b5:26 -64 149 Y US WPA(PSK/TKIP,AES/TKIP) WPA2(PSK/TKIP,AES/TKIP)
diff --git a/node_modules/node-wifi/src/macOS/__logs__/scan-shifted.log b/node_modules/node-wifi/src/macOS/__logs__/scan-shifted.log
new file mode 100644
index 0000000..5677ddc
--- /dev/null
+++ b/node_modules/node-wifi/src/macOS/__logs__/scan-shifted.log
@@ -0,0 +1,7 @@
+$ /System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport --scan
+ SSID BSSID RSSI CHANNEL HT CC SECURITY (auth/unicast/group)
+ NERMNET 18:ff:7b:43:b5:26 -64 149 Y US WPA(PSK/TKIP,AES/TKIP) WPA2(PSK/TKIP,AES/TKIP)
+ Linksys02787-invité 12:23:03:18:9f:1c -33 11 Y US NONE
+ Linksys02787 10:23:03:1a:9f:1c -33 11 Y US WPA2(PSK/AES/AES)
+ NERMNET 18:ff:7b:43:b5:27 -53 1,+1 Y -- WPA2(PSK/TKIP,AES/TKIP)
+ \ No newline at end of file
diff --git a/node_modules/node-wifi/src/macOS/__logs__/scan-space.log b/node_modules/node-wifi/src/macOS/__logs__/scan-space.log
new file mode 100644
index 0000000..476b783
--- /dev/null
+++ b/node_modules/node-wifi/src/macOS/__logs__/scan-space.log
@@ -0,0 +1,5 @@
+$ /System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport --scan
+ SSID BSSID RSSI CHANNEL HT CC SECURITY (auth/unicast/group)
+ Linksys02787 10:23:03:1a:9f:1c -33 11 Y US WPA2(PSK/AES/AES)
+ Terminus 1 1e:27:e2:fa:c6:32 -26 4 Y -- WPA2(PSK/AES/AES)
+ Linksys02787_5GHz 10:23:03:1a:9f:1d -51 36 Y US WPA2(PSK/AES/AES)
diff --git a/node_modules/node-wifi/src/macOS/connect/__test__/command.spec.js b/node_modules/node-wifi/src/macOS/connect/__test__/command.spec.js
new file mode 100644
index 0000000..358f07d
--- /dev/null
+++ b/node_modules/node-wifi/src/macOS/connect/__test__/command.spec.js
@@ -0,0 +1,23 @@
+const command = require('../command');
+
+describe('mac Os connect command', () => {
+ it('should generate command with default interface', () => {
+ const config = { iface: null };
+ const accessPoint = { ssid: 'foo', password: 'bar' };
+
+ expect(command(config, accessPoint)).toEqual({
+ cmd: '/usr/sbin/networksetup',
+ args: ['-setairportnetwork', 'en0', 'foo', 'bar']
+ });
+ });
+
+ it('should generate command with configured interface', () => {
+ const config = { iface: 'en2' };
+ const accessPoint = { ssid: 'foo', password: 'bar' };
+
+ expect(command(config, accessPoint)).toEqual({
+ cmd: '/usr/sbin/networksetup',
+ args: ['-setairportnetwork', 'en2', 'foo', 'bar']
+ });
+ });
+});
diff --git a/node_modules/node-wifi/src/macOS/connect/command.js b/node_modules/node-wifi/src/macOS/connect/command.js
new file mode 100644
index 0000000..e7d696b
--- /dev/null
+++ b/node_modules/node-wifi/src/macOS/connect/command.js
@@ -0,0 +1,15 @@
+const command = (config, accessPoint) => {
+ const args = ['-setairportnetwork'];
+
+ args.push(config.iface || 'en0');
+
+ args.push(accessPoint.ssid);
+ args.push(accessPoint.password);
+
+ return {
+ cmd: '/usr/sbin/networksetup',
+ args
+ };
+};
+
+module.exports = command;
diff --git a/node_modules/node-wifi/src/macOS/connect/index.js b/node_modules/node-wifi/src/macOS/connect/index.js
new file mode 100644
index 0000000..716a9d7
--- /dev/null
+++ b/node_modules/node-wifi/src/macOS/connect/index.js
@@ -0,0 +1,3 @@
+const command = require('./command');
+
+module.exports = { command };
diff --git a/node_modules/node-wifi/src/macOS/current-connections/__logs__/current-connections-01.log b/node_modules/node-wifi/src/macOS/current-connections/__logs__/current-connections-01.log
new file mode 100644
index 0000000..962c231
--- /dev/null
+++ b/node_modules/node-wifi/src/macOS/current-connections/__logs__/current-connections-01.log
@@ -0,0 +1,17 @@
+$ /System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport --getinfo
+ agrCtlRSSI: -50
+ agrExtRSSI: 0
+ agrCtlNoise: -92
+ agrExtNoise: 0
+ state: running
+ op mode: station
+ lastTxRate: 650
+ maxRate: 867
+lastAssocStatus: 0
+ 802.11 auth: open
+ link auth: wpa2-psk
+ BSSID: 31:23:3:1a:9f:1d
+ SSID: Linksys01227_5GHz
+ MCS: 7
+ channel: 36,80
+
diff --git a/node_modules/node-wifi/src/macOS/current-connections/__test__/command.spec.js b/node_modules/node-wifi/src/macOS/current-connections/__test__/command.spec.js
new file mode 100644
index 0000000..98dd779
--- /dev/null
+++ b/node_modules/node-wifi/src/macOS/current-connections/__test__/command.spec.js
@@ -0,0 +1,10 @@
+const command = require('../command');
+
+describe('mac Os get current connections command', () => {
+ it('should generate basic command', () => {
+ expect(command()).toEqual({
+ cmd: '/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport',
+ args: ['--getinfo']
+ });
+ });
+});
diff --git a/node_modules/node-wifi/src/macOS/current-connections/__test__/parser.spec.js b/node_modules/node-wifi/src/macOS/current-connections/__test__/parser.spec.js
new file mode 100644
index 0000000..539cf04
--- /dev/null
+++ b/node_modules/node-wifi/src/macOS/current-connections/__test__/parser.spec.js
@@ -0,0 +1,27 @@
+const path = require('path');
+const unlog = require('../../../__test__/unlogger');
+const parse = require('../parser');
+
+const log = filename => path.resolve(__dirname, '../__logs__/', filename);
+
+describe('parse macOS get current connections output', () => {
+ it('should return current wifi networks', async () => {
+ const output = await unlog(log('current-connections-01.log'));
+
+ const connections = parse(output);
+
+ expect(connections).toEqual([
+ {
+ mac: '31:23:03:1a:9f:1d',
+ bssid: '31:23:03:1a:9f:1d',
+ ssid: 'Linksys01227_5GHz',
+ channel: '36,80',
+ frequency: 5180,
+ quality: 100,
+ signal_level: -50,
+ security: 'wpa2-psk',
+ security_flags: []
+ }
+ ]);
+ });
+});
diff --git a/node_modules/node-wifi/src/macOS/current-connections/command.js b/node_modules/node-wifi/src/macOS/current-connections/command.js
new file mode 100644
index 0000000..0ffe1ac
--- /dev/null
+++ b/node_modules/node-wifi/src/macOS/current-connections/command.js
@@ -0,0 +1,6 @@
+const command = () => ({
+ cmd: '/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport',
+ args: ['--getinfo']
+});
+
+module.exports = command;
diff --git a/node_modules/node-wifi/src/macOS/current-connections/index.js b/node_modules/node-wifi/src/macOS/current-connections/index.js
new file mode 100644
index 0000000..822c85d
--- /dev/null
+++ b/node_modules/node-wifi/src/macOS/current-connections/index.js
@@ -0,0 +1,4 @@
+const command = require('./command');
+const parse = require('./parser');
+
+module.exports = { command, parse };
diff --git a/node_modules/node-wifi/src/macOS/current-connections/parser.js b/node_modules/node-wifi/src/macOS/current-connections/parser.js
new file mode 100644
index 0000000..c48abdf
--- /dev/null
+++ b/node_modules/node-wifi/src/macOS/current-connections/parser.js
@@ -0,0 +1,61 @@
+const { percentageFromDB } = require('../../utils/percentage-db');
+const frequencyFromChannel = require('../../utils/frequency-from-channel');
+
+const agrCtlRSSIRegex = /[ ]*agrCtlRSSI: (.*)/;
+const BSSIDRegex = /[ ]*BSSID: ([0-9A-Fa-f:]*)/;
+const SSIDRegex = /[ ]*SSID: (.*)/;
+const securityRegex = /[ ]*link auth: (.*)/;
+const channelRegex = /[ ]*channel: (.*)/;
+
+const formatMacAddress = mac =>
+ mac
+ .split(':')
+ .map(part => (part.length === 1 ? `0${part}` : part))
+ .join(':');
+
+const parse = stdout => {
+ const lines = stdout.split('\n');
+
+ const connections = [];
+ let connection = {};
+ lines.forEach(line => {
+ const matchAgrCtlRSSI = line.match(agrCtlRSSIRegex);
+ if (matchAgrCtlRSSI) {
+ connection.signal_level = parseInt(matchAgrCtlRSSI[1]);
+ connection.quality = percentageFromDB(connection.signal_level);
+ return;
+ }
+
+ const matchBSSID = line.match(BSSIDRegex);
+ if (matchBSSID) {
+ connection.bssid = formatMacAddress(matchBSSID[1]);
+ connection.mac = connection.bssid; // for retrocompatibility
+ return;
+ }
+
+ const matchSSID = line.match(SSIDRegex);
+ if (matchSSID) {
+ connection.ssid = matchSSID[1];
+ return;
+ }
+
+ const matchSecurity = line.match(securityRegex);
+ if (matchSecurity) {
+ connection.security = matchSecurity[1];
+ connection.security_flags = [];
+ return;
+ }
+
+ const matchChannel = line.match(channelRegex);
+ if (matchChannel) {
+ connection.channel = matchChannel[1];
+ connection.frequency = frequencyFromChannel(connection.channel);
+ connections.push(connection);
+ connection = {};
+ }
+ });
+
+ return connections;
+};
+
+module.exports = parse;
diff --git a/node_modules/node-wifi/src/macOS/delete/__logs__/delete-01.log b/node_modules/node-wifi/src/macOS/delete/__logs__/delete-01.log
new file mode 100644
index 0000000..a68c10c
--- /dev/null
+++ b/node_modules/node-wifi/src/macOS/delete/__logs__/delete-01.log
@@ -0,0 +1,3 @@
+$ /usr/sbin/networksetup -removepreferredwirelessnetwork en0 SSID
+Network SSID was not found in the preferred networks list
+
diff --git a/node_modules/node-wifi/src/macOS/delete/__test__/command.spec.js b/node_modules/node-wifi/src/macOS/delete/__test__/command.spec.js
new file mode 100644
index 0000000..37c7540
--- /dev/null
+++ b/node_modules/node-wifi/src/macOS/delete/__test__/command.spec.js
@@ -0,0 +1,21 @@
+const command = require('../command');
+
+describe('mac Os delete connection command', () => {
+ it('should generate basic command without iface', () => {
+ const config = { iface: null };
+ const accessPoint = { ssid: 'ssid' };
+ expect(command(config, accessPoint)).toEqual({
+ cmd: '/usr/sbin/networksetup',
+ args: ['-removepreferredwirelessnetwork', 'en0', 'ssid']
+ });
+ });
+
+ it('should generate basic command without iface', () => {
+ const config = { iface: 'en2' };
+ const accessPoint = { ssid: 'ssid' };
+ expect(command(config, accessPoint)).toEqual({
+ cmd: '/usr/sbin/networksetup',
+ args: ['-removepreferredwirelessnetwork', 'en2', 'ssid']
+ });
+ });
+});
diff --git a/node_modules/node-wifi/src/macOS/delete/__test__/parser.spec.js b/node_modules/node-wifi/src/macOS/delete/__test__/parser.spec.js
new file mode 100644
index 0000000..da6b35d
--- /dev/null
+++ b/node_modules/node-wifi/src/macOS/delete/__test__/parser.spec.js
@@ -0,0 +1,15 @@
+const path = require('path');
+const unlog = require('../../../__test__/unlogger');
+const parse = require('../parser');
+
+const log = filename => path.resolve(__dirname, '../__logs__/', filename);
+
+describe('parse macOS delete output', () => {
+ it('should throw error', async () => {
+ const output = await unlog(log('delete-01.log'));
+
+ expect(() => parse(output)).toThrow(
+ 'Network SSID was not found in the preferred networks list'
+ );
+ });
+});
diff --git a/node_modules/node-wifi/src/macOS/delete/command.js b/node_modules/node-wifi/src/macOS/delete/command.js
new file mode 100644
index 0000000..e5e2b00
--- /dev/null
+++ b/node_modules/node-wifi/src/macOS/delete/command.js
@@ -0,0 +1,14 @@
+const command = (config, accessPoint) => {
+ const args = ['-removepreferredwirelessnetwork'];
+
+ args.push(config.iface || 'en0');
+
+ args.push(accessPoint.ssid);
+
+ return {
+ cmd: '/usr/sbin/networksetup',
+ args
+ };
+};
+
+module.exports = command;
diff --git a/node_modules/node-wifi/src/macOS/delete/index.js b/node_modules/node-wifi/src/macOS/delete/index.js
new file mode 100644
index 0000000..716a9d7
--- /dev/null
+++ b/node_modules/node-wifi/src/macOS/delete/index.js
@@ -0,0 +1,3 @@
+const command = require('./command');
+
+module.exports = { command };
diff --git a/node_modules/node-wifi/src/macOS/delete/parser.js b/node_modules/node-wifi/src/macOS/delete/parser.js
new file mode 100644
index 0000000..a73938f
--- /dev/null
+++ b/node_modules/node-wifi/src/macOS/delete/parser.js
@@ -0,0 +1,10 @@
+const parse = stdout => {
+ if (
+ stdout &&
+ stdout.includes('was not found in the preferred networks list')
+ ) {
+ throw new Error(stdout.trim());
+ }
+};
+
+module.exports = parse;
diff --git a/node_modules/node-wifi/src/macOS/index.js b/node_modules/node-wifi/src/macOS/index.js
new file mode 100644
index 0000000..304fd2a
--- /dev/null
+++ b/node_modules/node-wifi/src/macOS/index.js
@@ -0,0 +1,6 @@
+const scan = require('./scan');
+const connect = require('./connect');
+const getCurrentConnections = require('./current-connections');
+const deleteConnection = require('./delete');
+
+module.exports = { scan, connect, getCurrentConnections, deleteConnection };
diff --git a/node_modules/node-wifi/src/macOS/scan/__logs__/airport-xml-2.log b/node_modules/node-wifi/src/macOS/scan/__logs__/airport-xml-2.log
new file mode 100644
index 0000000..e929e2a
--- /dev/null
+++ b/node_modules/node-wifi/src/macOS/scan/__logs__/airport-xml-2.log
@@ -0,0 +1,3104 @@
+$ /System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport --scan --xml
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<array>
+ <dict>
+ <key>AGE</key>
+ <integer>0</integer>
+ <key>AP_MODE</key>
+ <integer>2</integer>
+ <key>BEACON_INT</key>
+ <integer>100</integer>
+ <key>BSSID</key>
+ <string>bc:9f:e4:b0:f8:70</string>
+ <key>CAPABILITIES</key>
+ <integer>17</integer>
+ <key>CHANNEL</key>
+ <integer>44</integer>
+ <key>CHANNEL_FLAGS</key>
+ <integer>18</integer>
+ <key>EXT_CAPS</key>
+ <dict>
+ <key>BSS_TRANS_MGMT</key>
+ <integer>1</integer>
+ </dict>
+ <key>HT_CAPS_IE</key>
+ <dict>
+ <key>AMPDU_PARAMS</key>
+ <integer>23</integer>
+ <key>ASEL_CAPS</key>
+ <integer>0</integer>
+ <key>CAPS</key>
+ <integer>429</integer>
+ <key>EXT_CAPS</key>
+ <integer>0</integer>
+ <key>MCS_SET</key>
+ <data>
+ /////wAAAAAAAAAAAAAAAA==
+ </data>
+ <key>TXBF_CAPS</key>
+ <integer>0</integer>
+ </dict>
+ <key>HT_IE</key>
+ <dict>
+ <key>HT_BASIC_MCS_SET</key>
+ <data>
+ AAAAAAAAAAAAAAAAAAAAAA==
+ </data>
+ <key>HT_DUAL_BEACON</key>
+ <false/>
+ <key>HT_DUAL_CTS_PROT</key>
+ <false/>
+ <key>HT_LSIG_TXOP_PROT_FULL</key>
+ <false/>
+ <key>HT_NON_GF_STAS_PRESENT</key>
+ <true/>
+ <key>HT_OBSS_NON_HT_STAS_PRESENT</key>
+ <false/>
+ <key>HT_OP_MODE</key>
+ <integer>0</integer>
+ <key>HT_PCO_ACTIVE</key>
+ <false/>
+ <key>HT_PCO_PHASE</key>
+ <false/>
+ <key>HT_PRIMARY_CHAN</key>
+ <integer>44</integer>
+ <key>HT_PSMP_STAS_ONLY</key>
+ <false/>
+ <key>HT_RIFS_MODE</key>
+ <false/>
+ <key>HT_SECONDARY_BEACON</key>
+ <false/>
+ <key>HT_SECONDARY_CHAN_OFFSET</key>
+ <integer>0</integer>
+ <key>HT_SERVICE_INT</key>
+ <integer>0</integer>
+ <key>HT_STA_CHAN_WIDTH</key>
+ <false/>
+ <key>HT_TX_BURST_LIMIT</key>
+ <false/>
+ </dict>
+ <key>IE</key>
+ <data>
+ AAdlZHVyb2FtAQaYJLBIYGwDASwwFAEAAA+sBAEAAA+sBAEAAA+sASgALRqt
+ ARf/////AAAAAAAAAAAAAAAAAAAAAAAAAD0WLAAEAAAAAAAAAAAAAAAAAAAA
+ AAAAAH8IBAAIAAAAAEC/DJB5gw+q/wAAqv8AIMAFAAAAAADDAgAp3RgAUPIC
+ AQGAAAOkAAAnpAAAQkNeAGIyLwA=
+ </data>
+ <key>NOISE</key>
+ <integer>-92</integer>
+ <key>RATES</key>
+ <array>
+ <integer>12</integer>
+ <integer>18</integer>
+ <integer>24</integer>
+ <integer>36</integer>
+ <integer>48</integer>
+ <integer>54</integer>
+ </array>
+ <key>RSN_IE</key>
+ <dict>
+ <key>IE_KEY_RSN_AUTHSELS</key>
+ <array>
+ <integer>1</integer>
+ </array>
+ <key>IE_KEY_RSN_CAPS</key>
+ <dict>
+ <key>GTKSA_REPLAY_COUNTERS</key>
+ <integer>4</integer>
+ <key>MFP_CAPABLE</key>
+ <false/>
+ <key>MFP_REQUIRED</key>
+ <false/>
+ <key>NO_PAIRWISE</key>
+ <false/>
+ <key>PRE_AUTH</key>
+ <false/>
+ <key>PTKSA_REPLAY_COUNTERS</key>
+ <integer>4</integer>
+ <key>RSN_CAPABILITIES</key>
+ <integer>40</integer>
+ </dict>
+ <key>IE_KEY_RSN_MCIPHER</key>
+ <integer>4</integer>
+ <key>IE_KEY_RSN_UCIPHERS</key>
+ <array>
+ <integer>4</integer>
+ </array>
+ <key>IE_KEY_RSN_VERSION</key>
+ <integer>1</integer>
+ </dict>
+ <key>RSSI</key>
+ <integer>-89</integer>
+ <key>SSID</key>
+ <data>
+ ZWR1cm9hbQ==
+ </data>
+ <key>SSID_STR</key>
+ <string>eduroam</string>
+ <key>VHT_CAPS</key>
+ <dict>
+ <key>INFO</key>
+ <integer>260274576</integer>
+ <key>SUPPORTED_MCS_SET</key>
+ <data>
+ qv8AAKr/ACA=
+ </data>
+ </dict>
+ <key>VHT_OP</key>
+ <dict>
+ <key>BASIC_MCS_SET</key>
+ <integer>0</integer>
+ <key>CHANNEL_CENTER_FREQUENCY_SEG0</key>
+ <integer>0</integer>
+ <key>CHANNEL_CENTER_FREQUENCY_SEG1</key>
+ <integer>0</integer>
+ <key>CHANNEL_WIDTH</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>AGE</key>
+ <integer>0</integer>
+ <key>AP_MODE</key>
+ <integer>2</integer>
+ <key>BEACON_INT</key>
+ <integer>100</integer>
+ <key>BSSID</key>
+ <string>bc:9f:e4:b0:f8:72</string>
+ <key>CAPABILITIES</key>
+ <integer>1</integer>
+ <key>CHANNEL</key>
+ <integer>44</integer>
+ <key>CHANNEL_FLAGS</key>
+ <integer>18</integer>
+ <key>EXT_CAPS</key>
+ <dict>
+ <key>BSS_TRANS_MGMT</key>
+ <integer>1</integer>
+ </dict>
+ <key>HT_CAPS_IE</key>
+ <dict>
+ <key>AMPDU_PARAMS</key>
+ <integer>23</integer>
+ <key>ASEL_CAPS</key>
+ <integer>0</integer>
+ <key>CAPS</key>
+ <integer>429</integer>
+ <key>EXT_CAPS</key>
+ <integer>0</integer>
+ <key>MCS_SET</key>
+ <data>
+ /////wAAAAAAAAAAAAAAAA==
+ </data>
+ <key>TXBF_CAPS</key>
+ <integer>0</integer>
+ </dict>
+ <key>HT_IE</key>
+ <dict>
+ <key>HT_BASIC_MCS_SET</key>
+ <data>
+ AAAAAAAAAAAAAAAAAAAAAA==
+ </data>
+ <key>HT_DUAL_BEACON</key>
+ <false/>
+ <key>HT_DUAL_CTS_PROT</key>
+ <false/>
+ <key>HT_LSIG_TXOP_PROT_FULL</key>
+ <false/>
+ <key>HT_NON_GF_STAS_PRESENT</key>
+ <true/>
+ <key>HT_OBSS_NON_HT_STAS_PRESENT</key>
+ <false/>
+ <key>HT_OP_MODE</key>
+ <integer>0</integer>
+ <key>HT_PCO_ACTIVE</key>
+ <false/>
+ <key>HT_PCO_PHASE</key>
+ <false/>
+ <key>HT_PRIMARY_CHAN</key>
+ <integer>44</integer>
+ <key>HT_PSMP_STAS_ONLY</key>
+ <false/>
+ <key>HT_RIFS_MODE</key>
+ <false/>
+ <key>HT_SECONDARY_BEACON</key>
+ <false/>
+ <key>HT_SECONDARY_CHAN_OFFSET</key>
+ <integer>0</integer>
+ <key>HT_SERVICE_INT</key>
+ <integer>0</integer>
+ <key>HT_STA_CHAN_WIDTH</key>
+ <false/>
+ <key>HT_TX_BURST_LIMIT</key>
+ <false/>
+ </dict>
+ <key>IE</key>
+ <data>
+ AAtFVFMtSW52aXRlcwEGmCSwSGBsAwEsLRqtARf/////AAAAAAAAAAAAAAAA
+ AAAAAAAAAD0WLAAEAAAAAAAAAAAAAAAAAAAAAAAAAH8IBAAIAAAAAEC/DJB5
+ gw+q/wAAqv8AIMAFAAAAAADDAgAp3RgAUPICAQGAAAOkAAAnpAAAQkNeAGIy
+ LwA=
+ </data>
+ <key>NOISE</key>
+ <integer>-92</integer>
+ <key>RATES</key>
+ <array>
+ <integer>12</integer>
+ <integer>18</integer>
+ <integer>24</integer>
+ <integer>36</integer>
+ <integer>48</integer>
+ <integer>54</integer>
+ </array>
+ <key>RSSI</key>
+ <integer>-88</integer>
+ <key>SSID</key>
+ <data>
+ RVRTLUludml0ZXM=
+ </data>
+ <key>SSID_STR</key>
+ <string>ETS-Invites</string>
+ <key>VHT_CAPS</key>
+ <dict>
+ <key>INFO</key>
+ <integer>260274576</integer>
+ <key>SUPPORTED_MCS_SET</key>
+ <data>
+ qv8AAKr/ACA=
+ </data>
+ </dict>
+ <key>VHT_OP</key>
+ <dict>
+ <key>BASIC_MCS_SET</key>
+ <integer>0</integer>
+ <key>CHANNEL_CENTER_FREQUENCY_SEG0</key>
+ <integer>0</integer>
+ <key>CHANNEL_CENTER_FREQUENCY_SEG1</key>
+ <integer>0</integer>
+ <key>CHANNEL_WIDTH</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>AGE</key>
+ <integer>0</integer>
+ <key>AP_MODE</key>
+ <integer>2</integer>
+ <key>BEACON_INT</key>
+ <integer>100</integer>
+ <key>BSSID</key>
+ <string>bc:9f:e4:be:52:b2</string>
+ <key>CAPABILITIES</key>
+ <integer>1</integer>
+ <key>CHANNEL</key>
+ <integer>157</integer>
+ <key>CHANNEL_FLAGS</key>
+ <integer>18</integer>
+ <key>EXT_CAPS</key>
+ <dict>
+ <key>BSS_TRANS_MGMT</key>
+ <integer>1</integer>
+ </dict>
+ <key>HT_CAPS_IE</key>
+ <dict>
+ <key>AMPDU_PARAMS</key>
+ <integer>23</integer>
+ <key>ASEL_CAPS</key>
+ <integer>0</integer>
+ <key>CAPS</key>
+ <integer>429</integer>
+ <key>EXT_CAPS</key>
+ <integer>0</integer>
+ <key>MCS_SET</key>
+ <data>
+ /////wAAAAAAAAAAAAAAAA==
+ </data>
+ <key>TXBF_CAPS</key>
+ <integer>0</integer>
+ </dict>
+ <key>HT_IE</key>
+ <dict>
+ <key>HT_BASIC_MCS_SET</key>
+ <data>
+ AAAAAAAAAAAAAAAAAAAAAA==
+ </data>
+ <key>HT_DUAL_BEACON</key>
+ <false/>
+ <key>HT_DUAL_CTS_PROT</key>
+ <false/>
+ <key>HT_LSIG_TXOP_PROT_FULL</key>
+ <false/>
+ <key>HT_NON_GF_STAS_PRESENT</key>
+ <true/>
+ <key>HT_OBSS_NON_HT_STAS_PRESENT</key>
+ <true/>
+ <key>HT_OP_MODE</key>
+ <integer>1</integer>
+ <key>HT_PCO_ACTIVE</key>
+ <false/>
+ <key>HT_PCO_PHASE</key>
+ <false/>
+ <key>HT_PRIMARY_CHAN</key>
+ <integer>157</integer>
+ <key>HT_PSMP_STAS_ONLY</key>
+ <false/>
+ <key>HT_RIFS_MODE</key>
+ <false/>
+ <key>HT_SECONDARY_BEACON</key>
+ <false/>
+ <key>HT_SECONDARY_CHAN_OFFSET</key>
+ <integer>0</integer>
+ <key>HT_SERVICE_INT</key>
+ <integer>0</integer>
+ <key>HT_STA_CHAN_WIDTH</key>
+ <false/>
+ <key>HT_TX_BURST_LIMIT</key>
+ <false/>
+ </dict>
+ <key>IE</key>
+ <data>
+ AAtFVFMtSW52aXRlcwEGmCSwSGBsAwGdLRqtARf/////AAAAAAAAAAAAAAAA
+ AAAAAAAAAD0WnQAVAAAAAAAAAAAAAAAAAAAAAAAAAH8IBAAIAAAAAEC/DJB5
+ gw+q/wAAqv8AIMAFAAAAAADDAgA/3RgAUPICAQGAAAOkAAAnpAAAQkNeAGIy
+ LwA=
+ </data>
+ <key>NOISE</key>
+ <integer>-92</integer>
+ <key>RATES</key>
+ <array>
+ <integer>12</integer>
+ <integer>18</integer>
+ <integer>24</integer>
+ <integer>36</integer>
+ <integer>48</integer>
+ <integer>54</integer>
+ </array>
+ <key>RSSI</key>
+ <integer>-87</integer>
+ <key>SSID</key>
+ <data>
+ RVRTLUludml0ZXM=
+ </data>
+ <key>SSID_STR</key>
+ <string>ETS-Invites</string>
+ <key>VHT_CAPS</key>
+ <dict>
+ <key>INFO</key>
+ <integer>260274576</integer>
+ <key>SUPPORTED_MCS_SET</key>
+ <data>
+ qv8AAKr/ACA=
+ </data>
+ </dict>
+ <key>VHT_OP</key>
+ <dict>
+ <key>BASIC_MCS_SET</key>
+ <integer>0</integer>
+ <key>CHANNEL_CENTER_FREQUENCY_SEG0</key>
+ <integer>0</integer>
+ <key>CHANNEL_CENTER_FREQUENCY_SEG1</key>
+ <integer>0</integer>
+ <key>CHANNEL_WIDTH</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>AGE</key>
+ <integer>0</integer>
+ <key>AP_MODE</key>
+ <integer>2</integer>
+ <key>BEACON_INT</key>
+ <integer>100</integer>
+ <key>BSSID</key>
+ <string>bc:9f:e4:be:52:b1</string>
+ <key>CAPABILITIES</key>
+ <integer>17</integer>
+ <key>CHANNEL</key>
+ <integer>157</integer>
+ <key>CHANNEL_FLAGS</key>
+ <integer>18</integer>
+ <key>EXT_CAPS</key>
+ <dict>
+ <key>BSS_TRANS_MGMT</key>
+ <integer>1</integer>
+ </dict>
+ <key>HT_CAPS_IE</key>
+ <dict>
+ <key>AMPDU_PARAMS</key>
+ <integer>23</integer>
+ <key>ASEL_CAPS</key>
+ <integer>0</integer>
+ <key>CAPS</key>
+ <integer>429</integer>
+ <key>EXT_CAPS</key>
+ <integer>0</integer>
+ <key>MCS_SET</key>
+ <data>
+ /////wAAAAAAAAAAAAAAAA==
+ </data>
+ <key>TXBF_CAPS</key>
+ <integer>0</integer>
+ </dict>
+ <key>HT_IE</key>
+ <dict>
+ <key>HT_BASIC_MCS_SET</key>
+ <data>
+ AAAAAAAAAAAAAAAAAAAAAA==
+ </data>
+ <key>HT_DUAL_BEACON</key>
+ <false/>
+ <key>HT_DUAL_CTS_PROT</key>
+ <false/>
+ <key>HT_LSIG_TXOP_PROT_FULL</key>
+ <false/>
+ <key>HT_NON_GF_STAS_PRESENT</key>
+ <true/>
+ <key>HT_OBSS_NON_HT_STAS_PRESENT</key>
+ <true/>
+ <key>HT_OP_MODE</key>
+ <integer>1</integer>
+ <key>HT_PCO_ACTIVE</key>
+ <false/>
+ <key>HT_PCO_PHASE</key>
+ <false/>
+ <key>HT_PRIMARY_CHAN</key>
+ <integer>157</integer>
+ <key>HT_PSMP_STAS_ONLY</key>
+ <false/>
+ <key>HT_RIFS_MODE</key>
+ <false/>
+ <key>HT_SECONDARY_BEACON</key>
+ <false/>
+ <key>HT_SECONDARY_CHAN_OFFSET</key>
+ <integer>0</integer>
+ <key>HT_SERVICE_INT</key>
+ <integer>0</integer>
+ <key>HT_STA_CHAN_WIDTH</key>
+ <false/>
+ <key>HT_TX_BURST_LIMIT</key>
+ <false/>
+ </dict>
+ <key>IE</key>
+ <data>
+ AApFVFMtQ2FtcHVzAQaYJLBIYGwDAZ0FBAABAAAwFAEAAA+sBAEAAA+sBAEA
+ AA+sASgACwUDAApodi0arQEX/////wAAAAAAAAAAAAAAAAAAAAAAAAA9Fp0A
+ FQAAAAAAAAAAAAAAAAAAAAAAAAB/CAQACAAAAABAvwyQeYMPqv8AAKr/ACDA
+ BQAAAAAAwwIAP90YAFDyAgEBgAADpAAAJ6QAAEJDXgBiMi8A3QcAC4YBBAgP
+ </data>
+ <key>NOISE</key>
+ <integer>-92</integer>
+ <key>QBSS_LOAD_IE</key>
+ <dict>
+ <key>QBSS_AAC</key>
+ <integer>30312</integer>
+ <key>QBSS_CHAN_UTIL</key>
+ <integer>10</integer>
+ <key>QBSS_STA_COUNT</key>
+ <integer>3</integer>
+ </dict>
+ <key>RATES</key>
+ <array>
+ <integer>12</integer>
+ <integer>18</integer>
+ <integer>24</integer>
+ <integer>36</integer>
+ <integer>48</integer>
+ <integer>54</integer>
+ </array>
+ <key>RSN_IE</key>
+ <dict>
+ <key>IE_KEY_RSN_AUTHSELS</key>
+ <array>
+ <integer>1</integer>
+ </array>
+ <key>IE_KEY_RSN_CAPS</key>
+ <dict>
+ <key>GTKSA_REPLAY_COUNTERS</key>
+ <integer>4</integer>
+ <key>MFP_CAPABLE</key>
+ <false/>
+ <key>MFP_REQUIRED</key>
+ <false/>
+ <key>NO_PAIRWISE</key>
+ <false/>
+ <key>PRE_AUTH</key>
+ <false/>
+ <key>PTKSA_REPLAY_COUNTERS</key>
+ <integer>4</integer>
+ <key>RSN_CAPABILITIES</key>
+ <integer>40</integer>
+ </dict>
+ <key>IE_KEY_RSN_MCIPHER</key>
+ <integer>4</integer>
+ <key>IE_KEY_RSN_UCIPHERS</key>
+ <array>
+ <integer>4</integer>
+ </array>
+ <key>IE_KEY_RSN_VERSION</key>
+ <integer>1</integer>
+ </dict>
+ <key>RSSI</key>
+ <integer>-87</integer>
+ <key>SSID</key>
+ <data>
+ RVRTLUNhbXB1cw==
+ </data>
+ <key>SSID_STR</key>
+ <string>ETS-Campus</string>
+ <key>VHT_CAPS</key>
+ <dict>
+ <key>INFO</key>
+ <integer>260274576</integer>
+ <key>SUPPORTED_MCS_SET</key>
+ <data>
+ qv8AAKr/ACA=
+ </data>
+ </dict>
+ <key>VHT_OP</key>
+ <dict>
+ <key>BASIC_MCS_SET</key>
+ <integer>0</integer>
+ <key>CHANNEL_CENTER_FREQUENCY_SEG0</key>
+ <integer>0</integer>
+ <key>CHANNEL_CENTER_FREQUENCY_SEG1</key>
+ <integer>0</integer>
+ <key>CHANNEL_WIDTH</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>AGE</key>
+ <integer>0</integer>
+ <key>AP_MODE</key>
+ <integer>2</integer>
+ <key>BEACON_INT</key>
+ <integer>100</integer>
+ <key>BSSID</key>
+ <string>bc:9f:e4:be:52:b0</string>
+ <key>CAPABILITIES</key>
+ <integer>17</integer>
+ <key>CHANNEL</key>
+ <integer>157</integer>
+ <key>CHANNEL_FLAGS</key>
+ <integer>18</integer>
+ <key>EXT_CAPS</key>
+ <dict>
+ <key>BSS_TRANS_MGMT</key>
+ <integer>1</integer>
+ </dict>
+ <key>HT_CAPS_IE</key>
+ <dict>
+ <key>AMPDU_PARAMS</key>
+ <integer>23</integer>
+ <key>ASEL_CAPS</key>
+ <integer>0</integer>
+ <key>CAPS</key>
+ <integer>429</integer>
+ <key>EXT_CAPS</key>
+ <integer>0</integer>
+ <key>MCS_SET</key>
+ <data>
+ /////wAAAAAAAAAAAAAAAA==
+ </data>
+ <key>TXBF_CAPS</key>
+ <integer>0</integer>
+ </dict>
+ <key>HT_IE</key>
+ <dict>
+ <key>HT_BASIC_MCS_SET</key>
+ <data>
+ AAAAAAAAAAAAAAAAAAAAAA==
+ </data>
+ <key>HT_DUAL_BEACON</key>
+ <false/>
+ <key>HT_DUAL_CTS_PROT</key>
+ <false/>
+ <key>HT_LSIG_TXOP_PROT_FULL</key>
+ <false/>
+ <key>HT_NON_GF_STAS_PRESENT</key>
+ <true/>
+ <key>HT_OBSS_NON_HT_STAS_PRESENT</key>
+ <true/>
+ <key>HT_OP_MODE</key>
+ <integer>1</integer>
+ <key>HT_PCO_ACTIVE</key>
+ <false/>
+ <key>HT_PCO_PHASE</key>
+ <false/>
+ <key>HT_PRIMARY_CHAN</key>
+ <integer>157</integer>
+ <key>HT_PSMP_STAS_ONLY</key>
+ <false/>
+ <key>HT_RIFS_MODE</key>
+ <false/>
+ <key>HT_SECONDARY_BEACON</key>
+ <false/>
+ <key>HT_SECONDARY_CHAN_OFFSET</key>
+ <integer>0</integer>
+ <key>HT_SERVICE_INT</key>
+ <integer>0</integer>
+ <key>HT_STA_CHAN_WIDTH</key>
+ <false/>
+ <key>HT_TX_BURST_LIMIT</key>
+ <false/>
+ </dict>
+ <key>IE</key>
+ <data>
+ AAdlZHVyb2FtAQaYJLBIYGwDAZ0FBAABAAAwFAEAAA+sBAEAAA+sBAEAAA+s
+ ASgALRqtARf/////AAAAAAAAAAAAAAAAAAAAAAAAAD0WnQAVAAAAAAAAAAAA
+ AAAAAAAAAAAAAH8IBAAIAAAAAEC/DJB5gw+q/wAAqv8AIMAFAAAAAADDAgA/
+ 3RgAUPICAQGAAAOkAAAnpAAAQkNeAGIyLwDdBwALhgEECA8=
+ </data>
+ <key>NOISE</key>
+ <integer>-92</integer>
+ <key>RATES</key>
+ <array>
+ <integer>12</integer>
+ <integer>18</integer>
+ <integer>24</integer>
+ <integer>36</integer>
+ <integer>48</integer>
+ <integer>54</integer>
+ </array>
+ <key>RSN_IE</key>
+ <dict>
+ <key>IE_KEY_RSN_AUTHSELS</key>
+ <array>
+ <integer>1</integer>
+ </array>
+ <key>IE_KEY_RSN_CAPS</key>
+ <dict>
+ <key>GTKSA_REPLAY_COUNTERS</key>
+ <integer>4</integer>
+ <key>MFP_CAPABLE</key>
+ <false/>
+ <key>MFP_REQUIRED</key>
+ <false/>
+ <key>NO_PAIRWISE</key>
+ <false/>
+ <key>PRE_AUTH</key>
+ <false/>
+ <key>PTKSA_REPLAY_COUNTERS</key>
+ <integer>4</integer>
+ <key>RSN_CAPABILITIES</key>
+ <integer>40</integer>
+ </dict>
+ <key>IE_KEY_RSN_MCIPHER</key>
+ <integer>4</integer>
+ <key>IE_KEY_RSN_UCIPHERS</key>
+ <array>
+ <integer>4</integer>
+ </array>
+ <key>IE_KEY_RSN_VERSION</key>
+ <integer>1</integer>
+ </dict>
+ <key>RSSI</key>
+ <integer>-87</integer>
+ <key>SSID</key>
+ <data>
+ ZWR1cm9hbQ==
+ </data>
+ <key>SSID_STR</key>
+ <string>eduroam</string>
+ <key>VHT_CAPS</key>
+ <dict>
+ <key>INFO</key>
+ <integer>260274576</integer>
+ <key>SUPPORTED_MCS_SET</key>
+ <data>
+ qv8AAKr/ACA=
+ </data>
+ </dict>
+ <key>VHT_OP</key>
+ <dict>
+ <key>BASIC_MCS_SET</key>
+ <integer>0</integer>
+ <key>CHANNEL_CENTER_FREQUENCY_SEG0</key>
+ <integer>0</integer>
+ <key>CHANNEL_CENTER_FREQUENCY_SEG1</key>
+ <integer>0</integer>
+ <key>CHANNEL_WIDTH</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>AGE</key>
+ <integer>0</integer>
+ <key>AP_MODE</key>
+ <integer>2</integer>
+ <key>BEACON_INT</key>
+ <integer>100</integer>
+ <key>BSSID</key>
+ <string>bc:9f:e4:b0:f8:71</string>
+ <key>CAPABILITIES</key>
+ <integer>17</integer>
+ <key>CHANNEL</key>
+ <integer>44</integer>
+ <key>CHANNEL_FLAGS</key>
+ <integer>18</integer>
+ <key>EXT_CAPS</key>
+ <dict>
+ <key>BSS_TRANS_MGMT</key>
+ <integer>1</integer>
+ </dict>
+ <key>HT_CAPS_IE</key>
+ <dict>
+ <key>AMPDU_PARAMS</key>
+ <integer>23</integer>
+ <key>ASEL_CAPS</key>
+ <integer>0</integer>
+ <key>CAPS</key>
+ <integer>429</integer>
+ <key>EXT_CAPS</key>
+ <integer>0</integer>
+ <key>MCS_SET</key>
+ <data>
+ /////wAAAAAAAAAAAAAAAA==
+ </data>
+ <key>TXBF_CAPS</key>
+ <integer>0</integer>
+ </dict>
+ <key>HT_IE</key>
+ <dict>
+ <key>HT_BASIC_MCS_SET</key>
+ <data>
+ AAAAAAAAAAAAAAAAAAAAAA==
+ </data>
+ <key>HT_DUAL_BEACON</key>
+ <false/>
+ <key>HT_DUAL_CTS_PROT</key>
+ <false/>
+ <key>HT_LSIG_TXOP_PROT_FULL</key>
+ <false/>
+ <key>HT_NON_GF_STAS_PRESENT</key>
+ <true/>
+ <key>HT_OBSS_NON_HT_STAS_PRESENT</key>
+ <false/>
+ <key>HT_OP_MODE</key>
+ <integer>0</integer>
+ <key>HT_PCO_ACTIVE</key>
+ <false/>
+ <key>HT_PCO_PHASE</key>
+ <false/>
+ <key>HT_PRIMARY_CHAN</key>
+ <integer>44</integer>
+ <key>HT_PSMP_STAS_ONLY</key>
+ <false/>
+ <key>HT_RIFS_MODE</key>
+ <false/>
+ <key>HT_SECONDARY_BEACON</key>
+ <false/>
+ <key>HT_SECONDARY_CHAN_OFFSET</key>
+ <integer>0</integer>
+ <key>HT_SERVICE_INT</key>
+ <integer>0</integer>
+ <key>HT_STA_CHAN_WIDTH</key>
+ <false/>
+ <key>HT_TX_BURST_LIMIT</key>
+ <false/>
+ </dict>
+ <key>IE</key>
+ <data>
+ AApFVFMtQ2FtcHVzAQaYJLBIYGwDASwwFAEAAA+sBAEAAA+sBAEAAA+sASgA
+ CwUCAAWhdy0arQEX/////wAAAAAAAAAAAAAAAAAAAAAAAAA9FiwABAAAAAAA
+ AAAAAAAAAAAAAAAAAAB/CAQACAAAAABAvwyQeYMPqv8AAKr/ACDABQAAAAAA
+ wwIAKd0YAFDyAgEBgAADpAAAJ6QAAEJDXgBiMi8A
+ </data>
+ <key>NOISE</key>
+ <integer>-92</integer>
+ <key>QBSS_LOAD_IE</key>
+ <dict>
+ <key>QBSS_AAC</key>
+ <integer>30625</integer>
+ <key>QBSS_CHAN_UTIL</key>
+ <integer>5</integer>
+ <key>QBSS_STA_COUNT</key>
+ <integer>2</integer>
+ </dict>
+ <key>RATES</key>
+ <array>
+ <integer>12</integer>
+ <integer>18</integer>
+ <integer>24</integer>
+ <integer>36</integer>
+ <integer>48</integer>
+ <integer>54</integer>
+ </array>
+ <key>RSN_IE</key>
+ <dict>
+ <key>IE_KEY_RSN_AUTHSELS</key>
+ <array>
+ <integer>1</integer>
+ </array>
+ <key>IE_KEY_RSN_CAPS</key>
+ <dict>
+ <key>GTKSA_REPLAY_COUNTERS</key>
+ <integer>4</integer>
+ <key>MFP_CAPABLE</key>
+ <false/>
+ <key>MFP_REQUIRED</key>
+ <false/>
+ <key>NO_PAIRWISE</key>
+ <false/>
+ <key>PRE_AUTH</key>
+ <false/>
+ <key>PTKSA_REPLAY_COUNTERS</key>
+ <integer>4</integer>
+ <key>RSN_CAPABILITIES</key>
+ <integer>40</integer>
+ </dict>
+ <key>IE_KEY_RSN_MCIPHER</key>
+ <integer>4</integer>
+ <key>IE_KEY_RSN_UCIPHERS</key>
+ <array>
+ <integer>4</integer>
+ </array>
+ <key>IE_KEY_RSN_VERSION</key>
+ <integer>1</integer>
+ </dict>
+ <key>RSSI</key>
+ <integer>-87</integer>
+ <key>SSID</key>
+ <data>
+ RVRTLUNhbXB1cw==
+ </data>
+ <key>SSID_STR</key>
+ <string>ETS-Campus</string>
+ <key>VHT_CAPS</key>
+ <dict>
+ <key>INFO</key>
+ <integer>260274576</integer>
+ <key>SUPPORTED_MCS_SET</key>
+ <data>
+ qv8AAKr/ACA=
+ </data>
+ </dict>
+ <key>VHT_OP</key>
+ <dict>
+ <key>BASIC_MCS_SET</key>
+ <integer>0</integer>
+ <key>CHANNEL_CENTER_FREQUENCY_SEG0</key>
+ <integer>0</integer>
+ <key>CHANNEL_CENTER_FREQUENCY_SEG1</key>
+ <integer>0</integer>
+ <key>CHANNEL_WIDTH</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>80211D_IE</key>
+ <dict>
+ <key>IE_KEY_80211D_CHAN_INFO_ARRAY</key>
+ <array>
+ <dict>
+ <key>IE_KEY_80211D_FIRST_CHANNEL</key>
+ <integer>36</integer>
+ <key>IE_KEY_80211D_MAX_POWER</key>
+ <integer>17</integer>
+ <key>IE_KEY_80211D_NUM_CHANNELS</key>
+ <integer>1</integer>
+ </dict>
+ <dict>
+ <key>IE_KEY_80211D_FIRST_CHANNEL</key>
+ <integer>40</integer>
+ <key>IE_KEY_80211D_MAX_POWER</key>
+ <integer>17</integer>
+ <key>IE_KEY_80211D_NUM_CHANNELS</key>
+ <integer>1</integer>
+ </dict>
+ <dict>
+ <key>IE_KEY_80211D_FIRST_CHANNEL</key>
+ <integer>44</integer>
+ <key>IE_KEY_80211D_MAX_POWER</key>
+ <integer>17</integer>
+ <key>IE_KEY_80211D_NUM_CHANNELS</key>
+ <integer>1</integer>
+ </dict>
+ <dict>
+ <key>IE_KEY_80211D_FIRST_CHANNEL</key>
+ <integer>48</integer>
+ <key>IE_KEY_80211D_MAX_POWER</key>
+ <integer>17</integer>
+ <key>IE_KEY_80211D_NUM_CHANNELS</key>
+ <integer>1</integer>
+ </dict>
+ <dict>
+ <key>IE_KEY_80211D_FIRST_CHANNEL</key>
+ <integer>52</integer>
+ <key>IE_KEY_80211D_MAX_POWER</key>
+ <integer>24</integer>
+ <key>IE_KEY_80211D_NUM_CHANNELS</key>
+ <integer>1</integer>
+ </dict>
+ <dict>
+ <key>IE_KEY_80211D_FIRST_CHANNEL</key>
+ <integer>56</integer>
+ <key>IE_KEY_80211D_MAX_POWER</key>
+ <integer>24</integer>
+ <key>IE_KEY_80211D_NUM_CHANNELS</key>
+ <integer>1</integer>
+ </dict>
+ <dict>
+ <key>IE_KEY_80211D_FIRST_CHANNEL</key>
+ <integer>60</integer>
+ <key>IE_KEY_80211D_MAX_POWER</key>
+ <integer>24</integer>
+ <key>IE_KEY_80211D_NUM_CHANNELS</key>
+ <integer>1</integer>
+ </dict>
+ <dict>
+ <key>IE_KEY_80211D_FIRST_CHANNEL</key>
+ <integer>64</integer>
+ <key>IE_KEY_80211D_MAX_POWER</key>
+ <integer>24</integer>
+ <key>IE_KEY_80211D_NUM_CHANNELS</key>
+ <integer>1</integer>
+ </dict>
+ <dict>
+ <key>IE_KEY_80211D_FIRST_CHANNEL</key>
+ <integer>100</integer>
+ <key>IE_KEY_80211D_MAX_POWER</key>
+ <integer>24</integer>
+ <key>IE_KEY_80211D_NUM_CHANNELS</key>
+ <integer>1</integer>
+ </dict>
+ <dict>
+ <key>IE_KEY_80211D_FIRST_CHANNEL</key>
+ <integer>104</integer>
+ <key>IE_KEY_80211D_MAX_POWER</key>
+ <integer>24</integer>
+ <key>IE_KEY_80211D_NUM_CHANNELS</key>
+ <integer>1</integer>
+ </dict>
+ <dict>
+ <key>IE_KEY_80211D_FIRST_CHANNEL</key>
+ <integer>108</integer>
+ <key>IE_KEY_80211D_MAX_POWER</key>
+ <integer>24</integer>
+ <key>IE_KEY_80211D_NUM_CHANNELS</key>
+ <integer>1</integer>
+ </dict>
+ <dict>
+ <key>IE_KEY_80211D_FIRST_CHANNEL</key>
+ <integer>112</integer>
+ <key>IE_KEY_80211D_MAX_POWER</key>
+ <integer>24</integer>
+ <key>IE_KEY_80211D_NUM_CHANNELS</key>
+ <integer>1</integer>
+ </dict>
+ <dict>
+ <key>IE_KEY_80211D_FIRST_CHANNEL</key>
+ <integer>116</integer>
+ <key>IE_KEY_80211D_MAX_POWER</key>
+ <integer>24</integer>
+ <key>IE_KEY_80211D_NUM_CHANNELS</key>
+ <integer>1</integer>
+ </dict>
+ <dict>
+ <key>IE_KEY_80211D_FIRST_CHANNEL</key>
+ <integer>132</integer>
+ <key>IE_KEY_80211D_MAX_POWER</key>
+ <integer>24</integer>
+ <key>IE_KEY_80211D_NUM_CHANNELS</key>
+ <integer>1</integer>
+ </dict>
+ <dict>
+ <key>IE_KEY_80211D_FIRST_CHANNEL</key>
+ <integer>136</integer>
+ <key>IE_KEY_80211D_MAX_POWER</key>
+ <integer>24</integer>
+ <key>IE_KEY_80211D_NUM_CHANNELS</key>
+ <integer>1</integer>
+ </dict>
+ <dict>
+ <key>IE_KEY_80211D_FIRST_CHANNEL</key>
+ <integer>140</integer>
+ <key>IE_KEY_80211D_MAX_POWER</key>
+ <integer>24</integer>
+ <key>IE_KEY_80211D_NUM_CHANNELS</key>
+ <integer>1</integer>
+ </dict>
+ <dict>
+ <key>IE_KEY_80211D_FIRST_CHANNEL</key>
+ <integer>144</integer>
+ <key>IE_KEY_80211D_MAX_POWER</key>
+ <integer>24</integer>
+ <key>IE_KEY_80211D_NUM_CHANNELS</key>
+ <integer>1</integer>
+ </dict>
+ <dict>
+ <key>IE_KEY_80211D_FIRST_CHANNEL</key>
+ <integer>149</integer>
+ <key>IE_KEY_80211D_MAX_POWER</key>
+ <integer>30</integer>
+ <key>IE_KEY_80211D_NUM_CHANNELS</key>
+ <integer>1</integer>
+ </dict>
+ <dict>
+ <key>IE_KEY_80211D_FIRST_CHANNEL</key>
+ <integer>153</integer>
+ <key>IE_KEY_80211D_MAX_POWER</key>
+ <integer>30</integer>
+ <key>IE_KEY_80211D_NUM_CHANNELS</key>
+ <integer>1</integer>
+ </dict>
+ <dict>
+ <key>IE_KEY_80211D_FIRST_CHANNEL</key>
+ <integer>157</integer>
+ <key>IE_KEY_80211D_MAX_POWER</key>
+ <integer>30</integer>
+ <key>IE_KEY_80211D_NUM_CHANNELS</key>
+ <integer>1</integer>
+ </dict>
+ <dict>
+ <key>IE_KEY_80211D_FIRST_CHANNEL</key>
+ <integer>161</integer>
+ <key>IE_KEY_80211D_MAX_POWER</key>
+ <integer>30</integer>
+ <key>IE_KEY_80211D_NUM_CHANNELS</key>
+ <integer>1</integer>
+ </dict>
+ <dict>
+ <key>IE_KEY_80211D_FIRST_CHANNEL</key>
+ <integer>165</integer>
+ <key>IE_KEY_80211D_MAX_POWER</key>
+ <integer>30</integer>
+ <key>IE_KEY_80211D_NUM_CHANNELS</key>
+ <integer>1</integer>
+ </dict>
+ </array>
+ <key>IE_KEY_80211D_COUNTRY_CODE</key>
+ <string>CA</string>
+ </dict>
+ <key>AGE</key>
+ <integer>0</integer>
+ <key>APPLE_IE</key>
+ <dict>
+ <key>APPLE_IE_PRODUCT_ID</key>
+ <integer>119</integer>
+ <key>APPLE_IE_VERSION</key>
+ <integer>1</integer>
+ <key>APPLE_IE_WOW_SUPPORTED</key>
+ <true/>
+ <key>APPLE_IE_WSC_CAP</key>
+ <true/>
+ </dict>
+ <key>AP_MODE</key>
+ <integer>2</integer>
+ <key>BEACON_INT</key>
+ <integer>100</integer>
+ <key>BSSID</key>
+ <string>24:a0:74:7a:18:81</string>
+ <key>CAPABILITIES</key>
+ <integer>4369</integer>
+ <key>CHANNEL</key>
+ <integer>149</integer>
+ <key>CHANNEL_FLAGS</key>
+ <integer>1040</integer>
+ <key>HT_CAPS_IE</key>
+ <dict>
+ <key>AMPDU_PARAMS</key>
+ <integer>23</integer>
+ <key>ASEL_CAPS</key>
+ <integer>0</integer>
+ <key>CAPS</key>
+ <integer>2543</integer>
+ <key>EXT_CAPS</key>
+ <integer>0</integer>
+ <key>MCS_SET</key>
+ <data>
+ ////AAAAAAAAAAAAAAAAAA==
+ </data>
+ <key>TXBF_CAPS</key>
+ <integer>0</integer>
+ </dict>
+ <key>HT_IE</key>
+ <dict>
+ <key>HT_BASIC_MCS_SET</key>
+ <data>
+ AAAAAAAAAAAAAAAAAAAAAA==
+ </data>
+ <key>HT_DUAL_BEACON</key>
+ <false/>
+ <key>HT_DUAL_CTS_PROT</key>
+ <false/>
+ <key>HT_LSIG_TXOP_PROT_FULL</key>
+ <false/>
+ <key>HT_NON_GF_STAS_PRESENT</key>
+ <false/>
+ <key>HT_OBSS_NON_HT_STAS_PRESENT</key>
+ <false/>
+ <key>HT_OP_MODE</key>
+ <integer>0</integer>
+ <key>HT_PCO_ACTIVE</key>
+ <false/>
+ <key>HT_PCO_PHASE</key>
+ <false/>
+ <key>HT_PRIMARY_CHAN</key>
+ <integer>149</integer>
+ <key>HT_PSMP_STAS_ONLY</key>
+ <false/>
+ <key>HT_RIFS_MODE</key>
+ <true/>
+ <key>HT_SECONDARY_BEACON</key>
+ <false/>
+ <key>HT_SECONDARY_CHAN_OFFSET</key>
+ <integer>1</integer>
+ <key>HT_SERVICE_INT</key>
+ <integer>0</integer>
+ <key>HT_STA_CHAN_WIDTH</key>
+ <true/>
+ <key>HT_TX_BURST_LIMIT</key>
+ <false/>
+ </dict>
+ <key>IE</key>
+ <data>
+ AA5sYWJvQTM0ODQgNUdoegEIjBKYJLBIYGwFBAIDAAAHRkNBICQBESgBESwB
+ ETABETQBGDgBGDwBGEABGGQBGGgBGGwBGHABGHQBGIQBGIgBGIwBGJABGJUB
+ HpkBHp0BHqEBHqUBHgAgAQAjAhkAMBgBAAAPrAICAAAPrAQAD6wCAQAAD6wC
+ AAAtGu8JF////wAAAAAAAAAAAAAAAAAAAAAAAAAAPRaVDQAAAAAAAAAAAAAA
+ AAAAAAAAAAAAfwgAAAAAAAAAQL8MslmCD+r/AADq/wAAwAUBmwAAAMMEAgIC
+ At0LABfyAQABAQAAAAfdBwADkwF3AyDdDgAX8gcAAQEGJKB0ehiB3QkAEBgC
+ AAAcAADdFgBQ8gEBAABQ8gIBAABQ8gIBAABQ8gLdGABQ8gIBAYAAA6QAACek
+ AABCQ14AYjIvAEYFAgABAAA=
+ </data>
+ <key>NOISE</key>
+ <integer>-92</integer>
+ <key>RATES</key>
+ <array>
+ <integer>6</integer>
+ <integer>9</integer>
+ <integer>12</integer>
+ <integer>18</integer>
+ <integer>24</integer>
+ <integer>36</integer>
+ <integer>48</integer>
+ <integer>54</integer>
+ </array>
+ <key>RSN_IE</key>
+ <dict>
+ <key>IE_KEY_RSN_AUTHSELS</key>
+ <array>
+ <integer>2</integer>
+ </array>
+ <key>IE_KEY_RSN_MCIPHER</key>
+ <integer>2</integer>
+ <key>IE_KEY_RSN_UCIPHERS</key>
+ <array>
+ <integer>4</integer>
+ <integer>2</integer>
+ </array>
+ <key>IE_KEY_RSN_VERSION</key>
+ <integer>1</integer>
+ </dict>
+ <key>RSSI</key>
+ <integer>-84</integer>
+ <key>SSID</key>
+ <data>
+ bGFib0EzNDg0IDVHaHo=
+ </data>
+ <key>SSID_STR</key>
+ <string>laboA3484 5Ghz</string>
+ <key>VHT_CAPS</key>
+ <dict>
+ <key>INFO</key>
+ <integer>260200882</integer>
+ <key>SUPPORTED_MCS_SET</key>
+ <data>
+ 6v8AAOr/AAA=
+ </data>
+ </dict>
+ <key>VHT_OP</key>
+ <dict>
+ <key>BASIC_MCS_SET</key>
+ <integer>0</integer>
+ <key>CHANNEL_CENTER_FREQUENCY_SEG0</key>
+ <integer>-101</integer>
+ <key>CHANNEL_CENTER_FREQUENCY_SEG1</key>
+ <integer>0</integer>
+ <key>CHANNEL_WIDTH</key>
+ <integer>1</integer>
+ </dict>
+ <key>WPA_IE</key>
+ <dict>
+ <key>IE_KEY_WPA_AUTHSELS</key>
+ <array>
+ <integer>2</integer>
+ </array>
+ <key>IE_KEY_WPA_MCIPHER</key>
+ <integer>2</integer>
+ <key>IE_KEY_WPA_UCIPHERS</key>
+ <array>
+ <integer>2</integer>
+ </array>
+ <key>IE_KEY_WPA_VERSION</key>
+ <integer>1</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>80211D_IE</key>
+ <dict>
+ <key>IE_KEY_80211D_CHAN_INFO_ARRAY</key>
+ <array>
+ <dict>
+ <key>IE_KEY_80211D_FIRST_CHANNEL</key>
+ <integer>36</integer>
+ <key>IE_KEY_80211D_MAX_POWER</key>
+ <integer>23</integer>
+ <key>IE_KEY_80211D_NUM_CHANNELS</key>
+ <integer>4</integer>
+ </dict>
+ <dict>
+ <key>IE_KEY_80211D_FIRST_CHANNEL</key>
+ <integer>52</integer>
+ <key>IE_KEY_80211D_MAX_POWER</key>
+ <integer>30</integer>
+ <key>IE_KEY_80211D_NUM_CHANNELS</key>
+ <integer>4</integer>
+ </dict>
+ <dict>
+ <key>IE_KEY_80211D_FIRST_CHANNEL</key>
+ <integer>100</integer>
+ <key>IE_KEY_80211D_MAX_POWER</key>
+ <integer>36</integer>
+ <key>IE_KEY_80211D_NUM_CHANNELS</key>
+ <integer>5</integer>
+ </dict>
+ <dict>
+ <key>IE_KEY_80211D_FIRST_CHANNEL</key>
+ <integer>132</integer>
+ <key>IE_KEY_80211D_MAX_POWER</key>
+ <integer>36</integer>
+ <key>IE_KEY_80211D_NUM_CHANNELS</key>
+ <integer>4</integer>
+ </dict>
+ <dict>
+ <key>IE_KEY_80211D_FIRST_CHANNEL</key>
+ <integer>149</integer>
+ <key>IE_KEY_80211D_MAX_POWER</key>
+ <integer>36</integer>
+ <key>IE_KEY_80211D_NUM_CHANNELS</key>
+ <integer>5</integer>
+ </dict>
+ </array>
+ <key>IE_KEY_80211D_COUNTRY_CODE</key>
+ <string>CA</string>
+ </dict>
+ <key>AGE</key>
+ <integer>0</integer>
+ <key>AP_MODE</key>
+ <integer>2</integer>
+ <key>BEACON_INT</key>
+ <integer>100</integer>
+ <key>BSSID</key>
+ <string>bc:9f:e4:b1:1:b2</string>
+ <key>CAPABILITIES</key>
+ <integer>1</integer>
+ <key>CHANNEL</key>
+ <integer>132</integer>
+ <key>CHANNEL_FLAGS</key>
+ <integer>18</integer>
+ <key>EXT_CAPS</key>
+ <dict>
+ <key>BSS_TRANS_MGMT</key>
+ <integer>1</integer>
+ </dict>
+ <key>HT_CAPS_IE</key>
+ <dict>
+ <key>AMPDU_PARAMS</key>
+ <integer>23</integer>
+ <key>ASEL_CAPS</key>
+ <integer>0</integer>
+ <key>CAPS</key>
+ <integer>429</integer>
+ <key>EXT_CAPS</key>
+ <integer>0</integer>
+ <key>MCS_SET</key>
+ <data>
+ /////wAAAAAAAAAAAAAAAA==
+ </data>
+ <key>TXBF_CAPS</key>
+ <integer>0</integer>
+ </dict>
+ <key>HT_IE</key>
+ <dict>
+ <key>HT_BASIC_MCS_SET</key>
+ <data>
+ AAAAAAAAAAAAAAAAAAAAAA==
+ </data>
+ <key>HT_DUAL_BEACON</key>
+ <false/>
+ <key>HT_DUAL_CTS_PROT</key>
+ <false/>
+ <key>HT_LSIG_TXOP_PROT_FULL</key>
+ <false/>
+ <key>HT_NON_GF_STAS_PRESENT</key>
+ <true/>
+ <key>HT_OBSS_NON_HT_STAS_PRESENT</key>
+ <false/>
+ <key>HT_OP_MODE</key>
+ <integer>0</integer>
+ <key>HT_PCO_ACTIVE</key>
+ <false/>
+ <key>HT_PCO_PHASE</key>
+ <false/>
+ <key>HT_PRIMARY_CHAN</key>
+ <integer>132</integer>
+ <key>HT_PSMP_STAS_ONLY</key>
+ <false/>
+ <key>HT_RIFS_MODE</key>
+ <false/>
+ <key>HT_SECONDARY_BEACON</key>
+ <false/>
+ <key>HT_SECONDARY_CHAN_OFFSET</key>
+ <integer>0</integer>
+ <key>HT_SERVICE_INT</key>
+ <integer>0</integer>
+ <key>HT_STA_CHAN_WIDTH</key>
+ <false/>
+ <key>HT_TX_BURST_LIMIT</key>
+ <false/>
+ </dict>
+ <key>IE</key>
+ <data>
+ AAtFVFMtSW52aXRlcwEGmCSwSGBsAwGEBxJDQSAkBBc0BB5kBSSEBCSVBSQg
+ AQAjAg8ALRqtARf/////AAAAAAAAAAAAAAAAAAAAAAAAAD0WhAAEAAAAAAAA
+ AAAAAAAAAAAAAAAAAH8IBAAIAAAAAEC/DJB5gw+q/wAAqv8AIMAFAAAAAADD
+ AgA+3RgAUPICAQGAAAOkAAAnpAAAQkNeAGIyLwA=
+ </data>
+ <key>NOISE</key>
+ <integer>-92</integer>
+ <key>RATES</key>
+ <array>
+ <integer>12</integer>
+ <integer>18</integer>
+ <integer>24</integer>
+ <integer>36</integer>
+ <integer>48</integer>
+ <integer>54</integer>
+ </array>
+ <key>RSSI</key>
+ <integer>-82</integer>
+ <key>SSID</key>
+ <data>
+ RVRTLUludml0ZXM=
+ </data>
+ <key>SSID_STR</key>
+ <string>ETS-Invites</string>
+ <key>VHT_CAPS</key>
+ <dict>
+ <key>INFO</key>
+ <integer>260274576</integer>
+ <key>SUPPORTED_MCS_SET</key>
+ <data>
+ qv8AAKr/ACA=
+ </data>
+ </dict>
+ <key>VHT_OP</key>
+ <dict>
+ <key>BASIC_MCS_SET</key>
+ <integer>0</integer>
+ <key>CHANNEL_CENTER_FREQUENCY_SEG0</key>
+ <integer>0</integer>
+ <key>CHANNEL_CENTER_FREQUENCY_SEG1</key>
+ <integer>0</integer>
+ <key>CHANNEL_WIDTH</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>80211D_IE</key>
+ <dict>
+ <key>IE_KEY_80211D_CHAN_INFO_ARRAY</key>
+ <array>
+ <dict>
+ <key>IE_KEY_80211D_FIRST_CHANNEL</key>
+ <integer>36</integer>
+ <key>IE_KEY_80211D_MAX_POWER</key>
+ <integer>23</integer>
+ <key>IE_KEY_80211D_NUM_CHANNELS</key>
+ <integer>4</integer>
+ </dict>
+ <dict>
+ <key>IE_KEY_80211D_FIRST_CHANNEL</key>
+ <integer>52</integer>
+ <key>IE_KEY_80211D_MAX_POWER</key>
+ <integer>30</integer>
+ <key>IE_KEY_80211D_NUM_CHANNELS</key>
+ <integer>4</integer>
+ </dict>
+ <dict>
+ <key>IE_KEY_80211D_FIRST_CHANNEL</key>
+ <integer>100</integer>
+ <key>IE_KEY_80211D_MAX_POWER</key>
+ <integer>36</integer>
+ <key>IE_KEY_80211D_NUM_CHANNELS</key>
+ <integer>5</integer>
+ </dict>
+ <dict>
+ <key>IE_KEY_80211D_FIRST_CHANNEL</key>
+ <integer>132</integer>
+ <key>IE_KEY_80211D_MAX_POWER</key>
+ <integer>36</integer>
+ <key>IE_KEY_80211D_NUM_CHANNELS</key>
+ <integer>4</integer>
+ </dict>
+ <dict>
+ <key>IE_KEY_80211D_FIRST_CHANNEL</key>
+ <integer>149</integer>
+ <key>IE_KEY_80211D_MAX_POWER</key>
+ <integer>36</integer>
+ <key>IE_KEY_80211D_NUM_CHANNELS</key>
+ <integer>5</integer>
+ </dict>
+ </array>
+ <key>IE_KEY_80211D_COUNTRY_CODE</key>
+ <string>CA</string>
+ </dict>
+ <key>AGE</key>
+ <integer>0</integer>
+ <key>AP_MODE</key>
+ <integer>2</integer>
+ <key>BEACON_INT</key>
+ <integer>100</integer>
+ <key>BSSID</key>
+ <string>bc:9f:e4:b1:1:b1</string>
+ <key>CAPABILITIES</key>
+ <integer>17</integer>
+ <key>CHANNEL</key>
+ <integer>132</integer>
+ <key>CHANNEL_FLAGS</key>
+ <integer>18</integer>
+ <key>EXT_CAPS</key>
+ <dict>
+ <key>BSS_TRANS_MGMT</key>
+ <integer>1</integer>
+ </dict>
+ <key>HT_CAPS_IE</key>
+ <dict>
+ <key>AMPDU_PARAMS</key>
+ <integer>23</integer>
+ <key>ASEL_CAPS</key>
+ <integer>0</integer>
+ <key>CAPS</key>
+ <integer>429</integer>
+ <key>EXT_CAPS</key>
+ <integer>0</integer>
+ <key>MCS_SET</key>
+ <data>
+ /////wAAAAAAAAAAAAAAAA==
+ </data>
+ <key>TXBF_CAPS</key>
+ <integer>0</integer>
+ </dict>
+ <key>HT_IE</key>
+ <dict>
+ <key>HT_BASIC_MCS_SET</key>
+ <data>
+ AAAAAAAAAAAAAAAAAAAAAA==
+ </data>
+ <key>HT_DUAL_BEACON</key>
+ <false/>
+ <key>HT_DUAL_CTS_PROT</key>
+ <false/>
+ <key>HT_LSIG_TXOP_PROT_FULL</key>
+ <false/>
+ <key>HT_NON_GF_STAS_PRESENT</key>
+ <true/>
+ <key>HT_OBSS_NON_HT_STAS_PRESENT</key>
+ <false/>
+ <key>HT_OP_MODE</key>
+ <integer>0</integer>
+ <key>HT_PCO_ACTIVE</key>
+ <false/>
+ <key>HT_PCO_PHASE</key>
+ <false/>
+ <key>HT_PRIMARY_CHAN</key>
+ <integer>132</integer>
+ <key>HT_PSMP_STAS_ONLY</key>
+ <false/>
+ <key>HT_RIFS_MODE</key>
+ <false/>
+ <key>HT_SECONDARY_BEACON</key>
+ <false/>
+ <key>HT_SECONDARY_CHAN_OFFSET</key>
+ <integer>0</integer>
+ <key>HT_SERVICE_INT</key>
+ <integer>0</integer>
+ <key>HT_STA_CHAN_WIDTH</key>
+ <false/>
+ <key>HT_TX_BURST_LIMIT</key>
+ <false/>
+ </dict>
+ <key>IE</key>
+ <data>
+ AApFVFMtQ2FtcHVzAQaYJLBIYGwDAYQHEkNBICQEFzQEHmQFJIQEJJUFJCAB
+ ACMCDwAwFAEAAA+sBAEAAA+sBAEAAA+sASgACwUFABqhdy0arQEX/////wAA
+ AAAAAAAAAAAAAAAAAAAAAAA9FoQABAAAAAAAAAAAAAAAAAAAAAAAAAB/CAQA
+ CAAAAABAvwyQeYMPqv8AAKr/ACDABQAAAAAAwwIAPt0YAFDyAgEBgAADpAAA
+ J6QAAEJDXgBiMi8A
+ </data>
+ <key>NOISE</key>
+ <integer>-92</integer>
+ <key>QBSS_LOAD_IE</key>
+ <dict>
+ <key>QBSS_AAC</key>
+ <integer>30625</integer>
+ <key>QBSS_CHAN_UTIL</key>
+ <integer>26</integer>
+ <key>QBSS_STA_COUNT</key>
+ <integer>5</integer>
+ </dict>
+ <key>RATES</key>
+ <array>
+ <integer>12</integer>
+ <integer>18</integer>
+ <integer>24</integer>
+ <integer>36</integer>
+ <integer>48</integer>
+ <integer>54</integer>
+ </array>
+ <key>RSN_IE</key>
+ <dict>
+ <key>IE_KEY_RSN_AUTHSELS</key>
+ <array>
+ <integer>1</integer>
+ </array>
+ <key>IE_KEY_RSN_CAPS</key>
+ <dict>
+ <key>GTKSA_REPLAY_COUNTERS</key>
+ <integer>4</integer>
+ <key>MFP_CAPABLE</key>
+ <false/>
+ <key>MFP_REQUIRED</key>
+ <false/>
+ <key>NO_PAIRWISE</key>
+ <false/>
+ <key>PRE_AUTH</key>
+ <false/>
+ <key>PTKSA_REPLAY_COUNTERS</key>
+ <integer>4</integer>
+ <key>RSN_CAPABILITIES</key>
+ <integer>40</integer>
+ </dict>
+ <key>IE_KEY_RSN_MCIPHER</key>
+ <integer>4</integer>
+ <key>IE_KEY_RSN_UCIPHERS</key>
+ <array>
+ <integer>4</integer>
+ </array>
+ <key>IE_KEY_RSN_VERSION</key>
+ <integer>1</integer>
+ </dict>
+ <key>RSSI</key>
+ <integer>-82</integer>
+ <key>SSID</key>
+ <data>
+ RVRTLUNhbXB1cw==
+ </data>
+ <key>SSID_STR</key>
+ <string>ETS-Campus</string>
+ <key>VHT_CAPS</key>
+ <dict>
+ <key>INFO</key>
+ <integer>260274576</integer>
+ <key>SUPPORTED_MCS_SET</key>
+ <data>
+ qv8AAKr/ACA=
+ </data>
+ </dict>
+ <key>VHT_OP</key>
+ <dict>
+ <key>BASIC_MCS_SET</key>
+ <integer>0</integer>
+ <key>CHANNEL_CENTER_FREQUENCY_SEG0</key>
+ <integer>0</integer>
+ <key>CHANNEL_CENTER_FREQUENCY_SEG1</key>
+ <integer>0</integer>
+ <key>CHANNEL_WIDTH</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>80211D_IE</key>
+ <dict>
+ <key>IE_KEY_80211D_CHAN_INFO_ARRAY</key>
+ <array>
+ <dict>
+ <key>IE_KEY_80211D_FIRST_CHANNEL</key>
+ <integer>36</integer>
+ <key>IE_KEY_80211D_MAX_POWER</key>
+ <integer>23</integer>
+ <key>IE_KEY_80211D_NUM_CHANNELS</key>
+ <integer>4</integer>
+ </dict>
+ <dict>
+ <key>IE_KEY_80211D_FIRST_CHANNEL</key>
+ <integer>52</integer>
+ <key>IE_KEY_80211D_MAX_POWER</key>
+ <integer>30</integer>
+ <key>IE_KEY_80211D_NUM_CHANNELS</key>
+ <integer>4</integer>
+ </dict>
+ <dict>
+ <key>IE_KEY_80211D_FIRST_CHANNEL</key>
+ <integer>100</integer>
+ <key>IE_KEY_80211D_MAX_POWER</key>
+ <integer>36</integer>
+ <key>IE_KEY_80211D_NUM_CHANNELS</key>
+ <integer>5</integer>
+ </dict>
+ <dict>
+ <key>IE_KEY_80211D_FIRST_CHANNEL</key>
+ <integer>132</integer>
+ <key>IE_KEY_80211D_MAX_POWER</key>
+ <integer>36</integer>
+ <key>IE_KEY_80211D_NUM_CHANNELS</key>
+ <integer>4</integer>
+ </dict>
+ <dict>
+ <key>IE_KEY_80211D_FIRST_CHANNEL</key>
+ <integer>149</integer>
+ <key>IE_KEY_80211D_MAX_POWER</key>
+ <integer>36</integer>
+ <key>IE_KEY_80211D_NUM_CHANNELS</key>
+ <integer>5</integer>
+ </dict>
+ </array>
+ <key>IE_KEY_80211D_COUNTRY_CODE</key>
+ <string>CA</string>
+ </dict>
+ <key>AGE</key>
+ <integer>0</integer>
+ <key>AP_MODE</key>
+ <integer>2</integer>
+ <key>BEACON_INT</key>
+ <integer>100</integer>
+ <key>BSSID</key>
+ <string>bc:9f:e4:b1:1:b0</string>
+ <key>CAPABILITIES</key>
+ <integer>17</integer>
+ <key>CHANNEL</key>
+ <integer>132</integer>
+ <key>CHANNEL_FLAGS</key>
+ <integer>18</integer>
+ <key>EXT_CAPS</key>
+ <dict>
+ <key>BSS_TRANS_MGMT</key>
+ <integer>1</integer>
+ </dict>
+ <key>HT_CAPS_IE</key>
+ <dict>
+ <key>AMPDU_PARAMS</key>
+ <integer>23</integer>
+ <key>ASEL_CAPS</key>
+ <integer>0</integer>
+ <key>CAPS</key>
+ <integer>429</integer>
+ <key>EXT_CAPS</key>
+ <integer>0</integer>
+ <key>MCS_SET</key>
+ <data>
+ /////wAAAAAAAAAAAAAAAA==
+ </data>
+ <key>TXBF_CAPS</key>
+ <integer>0</integer>
+ </dict>
+ <key>HT_IE</key>
+ <dict>
+ <key>HT_BASIC_MCS_SET</key>
+ <data>
+ AAAAAAAAAAAAAAAAAAAAAA==
+ </data>
+ <key>HT_DUAL_BEACON</key>
+ <false/>
+ <key>HT_DUAL_CTS_PROT</key>
+ <false/>
+ <key>HT_LSIG_TXOP_PROT_FULL</key>
+ <false/>
+ <key>HT_NON_GF_STAS_PRESENT</key>
+ <true/>
+ <key>HT_OBSS_NON_HT_STAS_PRESENT</key>
+ <false/>
+ <key>HT_OP_MODE</key>
+ <integer>0</integer>
+ <key>HT_PCO_ACTIVE</key>
+ <false/>
+ <key>HT_PCO_PHASE</key>
+ <false/>
+ <key>HT_PRIMARY_CHAN</key>
+ <integer>132</integer>
+ <key>HT_PSMP_STAS_ONLY</key>
+ <false/>
+ <key>HT_RIFS_MODE</key>
+ <false/>
+ <key>HT_SECONDARY_BEACON</key>
+ <false/>
+ <key>HT_SECONDARY_CHAN_OFFSET</key>
+ <integer>0</integer>
+ <key>HT_SERVICE_INT</key>
+ <integer>0</integer>
+ <key>HT_STA_CHAN_WIDTH</key>
+ <false/>
+ <key>HT_TX_BURST_LIMIT</key>
+ <false/>
+ </dict>
+ <key>IE</key>
+ <data>
+ AAdlZHVyb2FtAQaYJLBIYGwDAYQHEkNBICQEFzQEHmQFJIQEJJUFJCABACMC
+ DwAwFAEAAA+sBAEAAA+sBAEAAA+sASgALRqtARf/////AAAAAAAAAAAAAAAA
+ AAAAAAAAAD0WhAAEAAAAAAAAAAAAAAAAAAAAAAAAAH8IBAAIAAAAAEC/DJB5
+ gw+q/wAAqv8AIMAFAAAAAADDAgA+3RgAUPICAQGAAAOkAAAnpAAAQkNeAGIy
+ LwA=
+ </data>
+ <key>NOISE</key>
+ <integer>-92</integer>
+ <key>RATES</key>
+ <array>
+ <integer>12</integer>
+ <integer>18</integer>
+ <integer>24</integer>
+ <integer>36</integer>
+ <integer>48</integer>
+ <integer>54</integer>
+ </array>
+ <key>RSN_IE</key>
+ <dict>
+ <key>IE_KEY_RSN_AUTHSELS</key>
+ <array>
+ <integer>1</integer>
+ </array>
+ <key>IE_KEY_RSN_CAPS</key>
+ <dict>
+ <key>GTKSA_REPLAY_COUNTERS</key>
+ <integer>4</integer>
+ <key>MFP_CAPABLE</key>
+ <false/>
+ <key>MFP_REQUIRED</key>
+ <false/>
+ <key>NO_PAIRWISE</key>
+ <false/>
+ <key>PRE_AUTH</key>
+ <false/>
+ <key>PTKSA_REPLAY_COUNTERS</key>
+ <integer>4</integer>
+ <key>RSN_CAPABILITIES</key>
+ <integer>40</integer>
+ </dict>
+ <key>IE_KEY_RSN_MCIPHER</key>
+ <integer>4</integer>
+ <key>IE_KEY_RSN_UCIPHERS</key>
+ <array>
+ <integer>4</integer>
+ </array>
+ <key>IE_KEY_RSN_VERSION</key>
+ <integer>1</integer>
+ </dict>
+ <key>RSSI</key>
+ <integer>-82</integer>
+ <key>SSID</key>
+ <data>
+ ZWR1cm9hbQ==
+ </data>
+ <key>SSID_STR</key>
+ <string>eduroam</string>
+ <key>VHT_CAPS</key>
+ <dict>
+ <key>INFO</key>
+ <integer>260274576</integer>
+ <key>SUPPORTED_MCS_SET</key>
+ <data>
+ qv8AAKr/ACA=
+ </data>
+ </dict>
+ <key>VHT_OP</key>
+ <dict>
+ <key>BASIC_MCS_SET</key>
+ <integer>0</integer>
+ <key>CHANNEL_CENTER_FREQUENCY_SEG0</key>
+ <integer>0</integer>
+ <key>CHANNEL_CENTER_FREQUENCY_SEG1</key>
+ <integer>0</integer>
+ <key>CHANNEL_WIDTH</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>AGE</key>
+ <integer>0</integer>
+ <key>AP_MODE</key>
+ <integer>2</integer>
+ <key>BEACON_INT</key>
+ <integer>100</integer>
+ <key>BSSID</key>
+ <string>d8:47:32:af:ae:ff</string>
+ <key>CAPABILITIES</key>
+ <integer>17</integer>
+ <key>CHANNEL</key>
+ <integer>149</integer>
+ <key>CHANNEL_FLAGS</key>
+ <integer>1040</integer>
+ <key>EXT_CAPS</key>
+ <dict>
+ <key>BSS_TRANS_MGMT</key>
+ <integer>1</integer>
+ </dict>
+ <key>HT_CAPS_IE</key>
+ <dict>
+ <key>AMPDU_PARAMS</key>
+ <integer>23</integer>
+ <key>ASEL_CAPS</key>
+ <integer>0</integer>
+ <key>CAPS</key>
+ <integer>111</integer>
+ <key>EXT_CAPS</key>
+ <integer>0</integer>
+ <key>MCS_SET</key>
+ <data>
+ //8AAAEAAAAAAAAAAAAAAA==
+ </data>
+ <key>TXBF_CAPS</key>
+ <integer>0</integer>
+ </dict>
+ <key>HT_IE</key>
+ <dict>
+ <key>HT_BASIC_MCS_SET</key>
+ <data>
+ AAAAAAAAAAAAAAAAAAAAAA==
+ </data>
+ <key>HT_DUAL_BEACON</key>
+ <false/>
+ <key>HT_DUAL_CTS_PROT</key>
+ <false/>
+ <key>HT_LSIG_TXOP_PROT_FULL</key>
+ <false/>
+ <key>HT_NON_GF_STAS_PRESENT</key>
+ <false/>
+ <key>HT_OBSS_NON_HT_STAS_PRESENT</key>
+ <false/>
+ <key>HT_OP_MODE</key>
+ <integer>0</integer>
+ <key>HT_PCO_ACTIVE</key>
+ <false/>
+ <key>HT_PCO_PHASE</key>
+ <false/>
+ <key>HT_PRIMARY_CHAN</key>
+ <integer>149</integer>
+ <key>HT_PSMP_STAS_ONLY</key>
+ <false/>
+ <key>HT_RIFS_MODE</key>
+ <false/>
+ <key>HT_SECONDARY_BEACON</key>
+ <false/>
+ <key>HT_SECONDARY_CHAN_OFFSET</key>
+ <integer>1</integer>
+ <key>HT_SERVICE_INT</key>
+ <integer>0</integer>
+ <key>HT_STA_CHAN_WIDTH</key>
+ <true/>
+ <key>HT_TX_BURST_LIMIT</key>
+ <false/>
+ </dict>
+ <key>IE</key>
+ <data>
+ AA9UUC1MaW5rX0FGMDBfNUcBCIwSmCSwSGBsAwGVLRpvABf//wAAAQAAAAAA
+ AAAAAAAAAAAAAAAAAD0WlQUAAAAAAAAAAAAAAAAAAAAAAAAAADAUAQAAD6wE
+ AQAAD6wEAQAAD6wCAAB/CAAACAAAAAAA3RgAUPICAQEAAAOkAAAnpAAAQkNe
+ AGIyLwC/DLABwDH6/wwD+v8MA8AFAZsA+v/dkwBQ8gQQSgABEBBEAAECEDsA
+ AQMQRwAQOIMwkjCSGIOcd9hHMq+vxBAhAAdUUC1MaW5rECMACkFyY2hlciBD
+ NTAQJAADNC4wEEIAAzEuMBBUAAgABgBQ8gQAARARACBBQzEyMDAgV2lyZWxl
+ c3MgRHVhbCBCYW5kIFJvdXRlchAIAAIhDBA8AAECEEkABgA3KgABIN0HAAxD
+ AAAAAN0HAAznAAAAAA==
+ </data>
+ <key>NOISE</key>
+ <integer>-92</integer>
+ <key>RATES</key>
+ <array>
+ <integer>6</integer>
+ <integer>9</integer>
+ <integer>12</integer>
+ <integer>18</integer>
+ <integer>24</integer>
+ <integer>36</integer>
+ <integer>48</integer>
+ <integer>54</integer>
+ </array>
+ <key>RSN_IE</key>
+ <dict>
+ <key>IE_KEY_RSN_AUTHSELS</key>
+ <array>
+ <integer>2</integer>
+ </array>
+ <key>IE_KEY_RSN_MCIPHER</key>
+ <integer>4</integer>
+ <key>IE_KEY_RSN_UCIPHERS</key>
+ <array>
+ <integer>4</integer>
+ </array>
+ <key>IE_KEY_RSN_VERSION</key>
+ <integer>1</integer>
+ </dict>
+ <key>RSSI</key>
+ <integer>-67</integer>
+ <key>SSID</key>
+ <data>
+ VFAtTGlua19BRjAwXzVH
+ </data>
+ <key>SSID_STR</key>
+ <string>TP-Link_AF00_5G</string>
+ <key>VHT_CAPS</key>
+ <dict>
+ <key>INFO</key>
+ <integer>834666928</integer>
+ <key>SUPPORTED_MCS_SET</key>
+ <data>
+ +v8MA/r/DAM=
+ </data>
+ </dict>
+ <key>VHT_OP</key>
+ <dict>
+ <key>BASIC_MCS_SET</key>
+ <integer>-6</integer>
+ <key>CHANNEL_CENTER_FREQUENCY_SEG0</key>
+ <integer>-101</integer>
+ <key>CHANNEL_CENTER_FREQUENCY_SEG1</key>
+ <integer>0</integer>
+ <key>CHANNEL_WIDTH</key>
+ <integer>1</integer>
+ </dict>
+ <key>WPS_PROB_RESP_IE</key>
+ <dict>
+ <key>IE_KEY_WPS_CFG_METHODS</key>
+ <integer>8460</integer>
+ <key>IE_KEY_WPS_DEV_NAME</key>
+ <string>AC1200 Wireless Dual Band Router</string>
+ <key>IE_KEY_WPS_DEV_NAME_DATA</key>
+ <data>
+ QUMxMjAwIFdpcmVsZXNzIER1YWwgQmFuZCBSb3V0ZXI=
+ </data>
+ <key>IE_KEY_WPS_MANUFACTURER</key>
+ <string>TP-Link</string>
+ <key>IE_KEY_WPS_MODEL_NAME</key>
+ <string>Archer C50</string>
+ <key>IE_KEY_WPS_MODEL_NUM</key>
+ <string>4.0</string>
+ <key>IE_KEY_WPS_PRIMARY_DEV_TYPE</key>
+ <dict>
+ <key>WPS_DEV_TYPE_CAT</key>
+ <integer>6</integer>
+ <key>WPS_DEV_TYPE_OUI</key>
+ <data>
+ AFDyBA==
+ </data>
+ <key>WPS_DEV_TYPE_SUB_CAT</key>
+ <integer>1</integer>
+ </dict>
+ <key>IE_KEY_WPS_RESP_TYPE</key>
+ <integer>3</integer>
+ <key>IE_KEY_WPS_RF_BANDS</key>
+ <integer>2</integer>
+ <key>IE_KEY_WPS_SC_STATE</key>
+ <integer>2</integer>
+ <key>IE_KEY_WPS_SERIAL_NUM</key>
+ <string>1.0</string>
+ <key>IE_KEY_WPS_UUID_E</key>
+ <data>
+ OIMwkjCSGIOcd9hHMq+vxA==
+ </data>
+ </dict>
+ </dict>
+ <dict>
+ <key>80211D_IE</key>
+ <dict>
+ <key>IE_KEY_80211D_CHAN_INFO_ARRAY</key>
+ <array>
+ <dict>
+ <key>IE_KEY_80211D_FIRST_CHANNEL</key>
+ <integer>36</integer>
+ <key>IE_KEY_80211D_MAX_POWER</key>
+ <integer>23</integer>
+ <key>IE_KEY_80211D_NUM_CHANNELS</key>
+ <integer>4</integer>
+ </dict>
+ <dict>
+ <key>IE_KEY_80211D_FIRST_CHANNEL</key>
+ <integer>52</integer>
+ <key>IE_KEY_80211D_MAX_POWER</key>
+ <integer>30</integer>
+ <key>IE_KEY_80211D_NUM_CHANNELS</key>
+ <integer>4</integer>
+ </dict>
+ <dict>
+ <key>IE_KEY_80211D_FIRST_CHANNEL</key>
+ <integer>100</integer>
+ <key>IE_KEY_80211D_MAX_POWER</key>
+ <integer>36</integer>
+ <key>IE_KEY_80211D_NUM_CHANNELS</key>
+ <integer>5</integer>
+ </dict>
+ <dict>
+ <key>IE_KEY_80211D_FIRST_CHANNEL</key>
+ <integer>132</integer>
+ <key>IE_KEY_80211D_MAX_POWER</key>
+ <integer>36</integer>
+ <key>IE_KEY_80211D_NUM_CHANNELS</key>
+ <integer>4</integer>
+ </dict>
+ <dict>
+ <key>IE_KEY_80211D_FIRST_CHANNEL</key>
+ <integer>149</integer>
+ <key>IE_KEY_80211D_MAX_POWER</key>
+ <integer>36</integer>
+ <key>IE_KEY_80211D_NUM_CHANNELS</key>
+ <integer>5</integer>
+ </dict>
+ </array>
+ <key>IE_KEY_80211D_COUNTRY_CODE</key>
+ <string>CA</string>
+ </dict>
+ <key>AGE</key>
+ <integer>0</integer>
+ <key>AP_MODE</key>
+ <integer>2</integer>
+ <key>BEACON_INT</key>
+ <integer>100</integer>
+ <key>BSSID</key>
+ <string>f4:2e:7f:18:c7:72</string>
+ <key>CAPABILITIES</key>
+ <integer>1</integer>
+ <key>CHANNEL</key>
+ <integer>136</integer>
+ <key>CHANNEL_FLAGS</key>
+ <integer>18</integer>
+ <key>EXT_CAPS</key>
+ <dict>
+ <key>BSS_TRANS_MGMT</key>
+ <integer>1</integer>
+ </dict>
+ <key>HT_CAPS_IE</key>
+ <dict>
+ <key>AMPDU_PARAMS</key>
+ <integer>23</integer>
+ <key>ASEL_CAPS</key>
+ <integer>0</integer>
+ <key>CAPS</key>
+ <integer>429</integer>
+ <key>EXT_CAPS</key>
+ <integer>0</integer>
+ <key>MCS_SET</key>
+ <data>
+ /////wAAAAAAAAAAAAAAAA==
+ </data>
+ <key>TXBF_CAPS</key>
+ <integer>0</integer>
+ </dict>
+ <key>HT_IE</key>
+ <dict>
+ <key>HT_BASIC_MCS_SET</key>
+ <data>
+ AAAAAAAAAAAAAAAAAAAAAA==
+ </data>
+ <key>HT_DUAL_BEACON</key>
+ <false/>
+ <key>HT_DUAL_CTS_PROT</key>
+ <false/>
+ <key>HT_LSIG_TXOP_PROT_FULL</key>
+ <false/>
+ <key>HT_NON_GF_STAS_PRESENT</key>
+ <true/>
+ <key>HT_OBSS_NON_HT_STAS_PRESENT</key>
+ <false/>
+ <key>HT_OP_MODE</key>
+ <integer>0</integer>
+ <key>HT_PCO_ACTIVE</key>
+ <false/>
+ <key>HT_PCO_PHASE</key>
+ <false/>
+ <key>HT_PRIMARY_CHAN</key>
+ <integer>136</integer>
+ <key>HT_PSMP_STAS_ONLY</key>
+ <false/>
+ <key>HT_RIFS_MODE</key>
+ <false/>
+ <key>HT_SECONDARY_BEACON</key>
+ <false/>
+ <key>HT_SECONDARY_CHAN_OFFSET</key>
+ <integer>0</integer>
+ <key>HT_SERVICE_INT</key>
+ <integer>0</integer>
+ <key>HT_STA_CHAN_WIDTH</key>
+ <false/>
+ <key>HT_TX_BURST_LIMIT</key>
+ <false/>
+ </dict>
+ <key>IE</key>
+ <data>
+ AAtFVFMtSW52aXRlcwEGmCSwSGBsAwGIBQQAAQAABxJDQSAkBBc0BB5kBSSE
+ BCSVBSQgAQAjAg8ALRqtARf/////AAAAAAAAAAAAAAAAAAAAAAAAAD0WiAAE
+ AAAAAAAAAAAAAAAAAAAAAAAAAH8IBAAIAAAAAEC/DJB5gw+q/wAAqv8AIMAF
+ AAAAAADDAgA+3RgAUPICAQGAAAOkAAAnpAAAQkNeAGIyLwDdBwALhgEECA8=
+ </data>
+ <key>NOISE</key>
+ <integer>-92</integer>
+ <key>RATES</key>
+ <array>
+ <integer>12</integer>
+ <integer>18</integer>
+ <integer>24</integer>
+ <integer>36</integer>
+ <integer>48</integer>
+ <integer>54</integer>
+ </array>
+ <key>RSSI</key>
+ <integer>-66</integer>
+ <key>SSID</key>
+ <data>
+ RVRTLUludml0ZXM=
+ </data>
+ <key>SSID_STR</key>
+ <string>ETS-Invites</string>
+ <key>VHT_CAPS</key>
+ <dict>
+ <key>INFO</key>
+ <integer>260274576</integer>
+ <key>SUPPORTED_MCS_SET</key>
+ <data>
+ qv8AAKr/ACA=
+ </data>
+ </dict>
+ <key>VHT_OP</key>
+ <dict>
+ <key>BASIC_MCS_SET</key>
+ <integer>0</integer>
+ <key>CHANNEL_CENTER_FREQUENCY_SEG0</key>
+ <integer>0</integer>
+ <key>CHANNEL_CENTER_FREQUENCY_SEG1</key>
+ <integer>0</integer>
+ <key>CHANNEL_WIDTH</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>80211D_IE</key>
+ <dict>
+ <key>IE_KEY_80211D_CHAN_INFO_ARRAY</key>
+ <array>
+ <dict>
+ <key>IE_KEY_80211D_FIRST_CHANNEL</key>
+ <integer>36</integer>
+ <key>IE_KEY_80211D_MAX_POWER</key>
+ <integer>23</integer>
+ <key>IE_KEY_80211D_NUM_CHANNELS</key>
+ <integer>4</integer>
+ </dict>
+ <dict>
+ <key>IE_KEY_80211D_FIRST_CHANNEL</key>
+ <integer>52</integer>
+ <key>IE_KEY_80211D_MAX_POWER</key>
+ <integer>30</integer>
+ <key>IE_KEY_80211D_NUM_CHANNELS</key>
+ <integer>4</integer>
+ </dict>
+ <dict>
+ <key>IE_KEY_80211D_FIRST_CHANNEL</key>
+ <integer>100</integer>
+ <key>IE_KEY_80211D_MAX_POWER</key>
+ <integer>36</integer>
+ <key>IE_KEY_80211D_NUM_CHANNELS</key>
+ <integer>5</integer>
+ </dict>
+ <dict>
+ <key>IE_KEY_80211D_FIRST_CHANNEL</key>
+ <integer>132</integer>
+ <key>IE_KEY_80211D_MAX_POWER</key>
+ <integer>36</integer>
+ <key>IE_KEY_80211D_NUM_CHANNELS</key>
+ <integer>4</integer>
+ </dict>
+ <dict>
+ <key>IE_KEY_80211D_FIRST_CHANNEL</key>
+ <integer>149</integer>
+ <key>IE_KEY_80211D_MAX_POWER</key>
+ <integer>36</integer>
+ <key>IE_KEY_80211D_NUM_CHANNELS</key>
+ <integer>5</integer>
+ </dict>
+ </array>
+ <key>IE_KEY_80211D_COUNTRY_CODE</key>
+ <string>CA</string>
+ </dict>
+ <key>AGE</key>
+ <integer>0</integer>
+ <key>AP_MODE</key>
+ <integer>2</integer>
+ <key>BEACON_INT</key>
+ <integer>100</integer>
+ <key>BSSID</key>
+ <string>f4:2e:7f:18:c7:71</string>
+ <key>CAPABILITIES</key>
+ <integer>17</integer>
+ <key>CHANNEL</key>
+ <integer>136</integer>
+ <key>CHANNEL_FLAGS</key>
+ <integer>18</integer>
+ <key>EXT_CAPS</key>
+ <dict>
+ <key>BSS_TRANS_MGMT</key>
+ <integer>1</integer>
+ </dict>
+ <key>HT_CAPS_IE</key>
+ <dict>
+ <key>AMPDU_PARAMS</key>
+ <integer>23</integer>
+ <key>ASEL_CAPS</key>
+ <integer>0</integer>
+ <key>CAPS</key>
+ <integer>429</integer>
+ <key>EXT_CAPS</key>
+ <integer>0</integer>
+ <key>MCS_SET</key>
+ <data>
+ /////wAAAAAAAAAAAAAAAA==
+ </data>
+ <key>TXBF_CAPS</key>
+ <integer>0</integer>
+ </dict>
+ <key>HT_IE</key>
+ <dict>
+ <key>HT_BASIC_MCS_SET</key>
+ <data>
+ AAAAAAAAAAAAAAAAAAAAAA==
+ </data>
+ <key>HT_DUAL_BEACON</key>
+ <false/>
+ <key>HT_DUAL_CTS_PROT</key>
+ <false/>
+ <key>HT_LSIG_TXOP_PROT_FULL</key>
+ <false/>
+ <key>HT_NON_GF_STAS_PRESENT</key>
+ <true/>
+ <key>HT_OBSS_NON_HT_STAS_PRESENT</key>
+ <false/>
+ <key>HT_OP_MODE</key>
+ <integer>0</integer>
+ <key>HT_PCO_ACTIVE</key>
+ <false/>
+ <key>HT_PCO_PHASE</key>
+ <false/>
+ <key>HT_PRIMARY_CHAN</key>
+ <integer>136</integer>
+ <key>HT_PSMP_STAS_ONLY</key>
+ <false/>
+ <key>HT_RIFS_MODE</key>
+ <false/>
+ <key>HT_SECONDARY_BEACON</key>
+ <false/>
+ <key>HT_SECONDARY_CHAN_OFFSET</key>
+ <integer>0</integer>
+ <key>HT_SERVICE_INT</key>
+ <integer>0</integer>
+ <key>HT_STA_CHAN_WIDTH</key>
+ <false/>
+ <key>HT_TX_BURST_LIMIT</key>
+ <false/>
+ </dict>
+ <key>IE</key>
+ <data>
+ AApFVFMtQ2FtcHVzAQaYJLBIYGwDAYgFBAABAAAHEkNBICQEFzQEHmQFJIQE
+ JJUFJCABACMCDwAwFAEAAA+sBAEAAA+sBAEAAA+sASgACwUCAAHZeC0arQEX
+ /////wAAAAAAAAAAAAAAAAAAAAAAAAA9FogABAAAAAAAAAAAAAAAAAAAAAAA
+ AAB/CAQACAAAAABAvwyQeYMPqv8AAKr/ACDABQAAAAAAwwIAPt0YAFDyAgEB
+ gAADpAAAJ6QAAEJDXgBiMi8A3QcAC4YBBAgP
+ </data>
+ <key>NOISE</key>
+ <integer>-92</integer>
+ <key>QBSS_LOAD_IE</key>
+ <dict>
+ <key>QBSS_AAC</key>
+ <integer>30937</integer>
+ <key>QBSS_CHAN_UTIL</key>
+ <integer>1</integer>
+ <key>QBSS_STA_COUNT</key>
+ <integer>2</integer>
+ </dict>
+ <key>RATES</key>
+ <array>
+ <integer>12</integer>
+ <integer>18</integer>
+ <integer>24</integer>
+ <integer>36</integer>
+ <integer>48</integer>
+ <integer>54</integer>
+ </array>
+ <key>RSN_IE</key>
+ <dict>
+ <key>IE_KEY_RSN_AUTHSELS</key>
+ <array>
+ <integer>1</integer>
+ </array>
+ <key>IE_KEY_RSN_CAPS</key>
+ <dict>
+ <key>GTKSA_REPLAY_COUNTERS</key>
+ <integer>4</integer>
+ <key>MFP_CAPABLE</key>
+ <false/>
+ <key>MFP_REQUIRED</key>
+ <false/>
+ <key>NO_PAIRWISE</key>
+ <false/>
+ <key>PRE_AUTH</key>
+ <false/>
+ <key>PTKSA_REPLAY_COUNTERS</key>
+ <integer>4</integer>
+ <key>RSN_CAPABILITIES</key>
+ <integer>40</integer>
+ </dict>
+ <key>IE_KEY_RSN_MCIPHER</key>
+ <integer>4</integer>
+ <key>IE_KEY_RSN_UCIPHERS</key>
+ <array>
+ <integer>4</integer>
+ </array>
+ <key>IE_KEY_RSN_VERSION</key>
+ <integer>1</integer>
+ </dict>
+ <key>RSSI</key>
+ <integer>-66</integer>
+ <key>SSID</key>
+ <data>
+ RVRTLUNhbXB1cw==
+ </data>
+ <key>SSID_STR</key>
+ <string>ETS-Campus</string>
+ <key>VHT_CAPS</key>
+ <dict>
+ <key>INFO</key>
+ <integer>260274576</integer>
+ <key>SUPPORTED_MCS_SET</key>
+ <data>
+ qv8AAKr/ACA=
+ </data>
+ </dict>
+ <key>VHT_OP</key>
+ <dict>
+ <key>BASIC_MCS_SET</key>
+ <integer>0</integer>
+ <key>CHANNEL_CENTER_FREQUENCY_SEG0</key>
+ <integer>0</integer>
+ <key>CHANNEL_CENTER_FREQUENCY_SEG1</key>
+ <integer>0</integer>
+ <key>CHANNEL_WIDTH</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>80211D_IE</key>
+ <dict>
+ <key>IE_KEY_80211D_CHAN_INFO_ARRAY</key>
+ <array>
+ <dict>
+ <key>IE_KEY_80211D_FIRST_CHANNEL</key>
+ <integer>36</integer>
+ <key>IE_KEY_80211D_MAX_POWER</key>
+ <integer>23</integer>
+ <key>IE_KEY_80211D_NUM_CHANNELS</key>
+ <integer>4</integer>
+ </dict>
+ <dict>
+ <key>IE_KEY_80211D_FIRST_CHANNEL</key>
+ <integer>52</integer>
+ <key>IE_KEY_80211D_MAX_POWER</key>
+ <integer>30</integer>
+ <key>IE_KEY_80211D_NUM_CHANNELS</key>
+ <integer>4</integer>
+ </dict>
+ <dict>
+ <key>IE_KEY_80211D_FIRST_CHANNEL</key>
+ <integer>100</integer>
+ <key>IE_KEY_80211D_MAX_POWER</key>
+ <integer>36</integer>
+ <key>IE_KEY_80211D_NUM_CHANNELS</key>
+ <integer>5</integer>
+ </dict>
+ <dict>
+ <key>IE_KEY_80211D_FIRST_CHANNEL</key>
+ <integer>132</integer>
+ <key>IE_KEY_80211D_MAX_POWER</key>
+ <integer>36</integer>
+ <key>IE_KEY_80211D_NUM_CHANNELS</key>
+ <integer>4</integer>
+ </dict>
+ <dict>
+ <key>IE_KEY_80211D_FIRST_CHANNEL</key>
+ <integer>149</integer>
+ <key>IE_KEY_80211D_MAX_POWER</key>
+ <integer>36</integer>
+ <key>IE_KEY_80211D_NUM_CHANNELS</key>
+ <integer>5</integer>
+ </dict>
+ </array>
+ <key>IE_KEY_80211D_COUNTRY_CODE</key>
+ <string>CA</string>
+ </dict>
+ <key>AGE</key>
+ <integer>0</integer>
+ <key>AP_MODE</key>
+ <integer>2</integer>
+ <key>BEACON_INT</key>
+ <integer>100</integer>
+ <key>BSSID</key>
+ <string>f4:2e:7f:18:c7:70</string>
+ <key>CAPABILITIES</key>
+ <integer>17</integer>
+ <key>CHANNEL</key>
+ <integer>136</integer>
+ <key>CHANNEL_FLAGS</key>
+ <integer>18</integer>
+ <key>EXT_CAPS</key>
+ <dict>
+ <key>BSS_TRANS_MGMT</key>
+ <integer>1</integer>
+ </dict>
+ <key>HT_CAPS_IE</key>
+ <dict>
+ <key>AMPDU_PARAMS</key>
+ <integer>23</integer>
+ <key>ASEL_CAPS</key>
+ <integer>0</integer>
+ <key>CAPS</key>
+ <integer>429</integer>
+ <key>EXT_CAPS</key>
+ <integer>0</integer>
+ <key>MCS_SET</key>
+ <data>
+ /////wAAAAAAAAAAAAAAAA==
+ </data>
+ <key>TXBF_CAPS</key>
+ <integer>0</integer>
+ </dict>
+ <key>HT_IE</key>
+ <dict>
+ <key>HT_BASIC_MCS_SET</key>
+ <data>
+ AAAAAAAAAAAAAAAAAAAAAA==
+ </data>
+ <key>HT_DUAL_BEACON</key>
+ <false/>
+ <key>HT_DUAL_CTS_PROT</key>
+ <false/>
+ <key>HT_LSIG_TXOP_PROT_FULL</key>
+ <false/>
+ <key>HT_NON_GF_STAS_PRESENT</key>
+ <true/>
+ <key>HT_OBSS_NON_HT_STAS_PRESENT</key>
+ <false/>
+ <key>HT_OP_MODE</key>
+ <integer>0</integer>
+ <key>HT_PCO_ACTIVE</key>
+ <false/>
+ <key>HT_PCO_PHASE</key>
+ <false/>
+ <key>HT_PRIMARY_CHAN</key>
+ <integer>136</integer>
+ <key>HT_PSMP_STAS_ONLY</key>
+ <false/>
+ <key>HT_RIFS_MODE</key>
+ <false/>
+ <key>HT_SECONDARY_BEACON</key>
+ <false/>
+ <key>HT_SECONDARY_CHAN_OFFSET</key>
+ <integer>0</integer>
+ <key>HT_SERVICE_INT</key>
+ <integer>0</integer>
+ <key>HT_STA_CHAN_WIDTH</key>
+ <false/>
+ <key>HT_TX_BURST_LIMIT</key>
+ <false/>
+ </dict>
+ <key>IE</key>
+ <data>
+ AAdlZHVyb2FtAQaYJLBIYGwDAYgFBAABAAAHEkNBICQEFzQEHmQFJIQEJJUF
+ JCABACMCDwAwFAEAAA+sBAEAAA+sBAEAAA+sASgALRqtARf/////AAAAAAAA
+ AAAAAAAAAAAAAAAAAD0WiAAEAAAAAAAAAAAAAAAAAAAAAAAAAH8IBAAIAAAA
+ AEC/DJB5gw+q/wAAqv8AIMAFAAAAAADDAgA+3RgAUPICAQGAAAOkAAAnpAAA
+ QkNeAGIyLwDdBwALhgEECA8=
+ </data>
+ <key>NOISE</key>
+ <integer>-92</integer>
+ <key>RATES</key>
+ <array>
+ <integer>12</integer>
+ <integer>18</integer>
+ <integer>24</integer>
+ <integer>36</integer>
+ <integer>48</integer>
+ <integer>54</integer>
+ </array>
+ <key>RSN_IE</key>
+ <dict>
+ <key>IE_KEY_RSN_AUTHSELS</key>
+ <array>
+ <integer>1</integer>
+ </array>
+ <key>IE_KEY_RSN_CAPS</key>
+ <dict>
+ <key>GTKSA_REPLAY_COUNTERS</key>
+ <integer>4</integer>
+ <key>MFP_CAPABLE</key>
+ <false/>
+ <key>MFP_REQUIRED</key>
+ <false/>
+ <key>NO_PAIRWISE</key>
+ <false/>
+ <key>PRE_AUTH</key>
+ <false/>
+ <key>PTKSA_REPLAY_COUNTERS</key>
+ <integer>4</integer>
+ <key>RSN_CAPABILITIES</key>
+ <integer>40</integer>
+ </dict>
+ <key>IE_KEY_RSN_MCIPHER</key>
+ <integer>4</integer>
+ <key>IE_KEY_RSN_UCIPHERS</key>
+ <array>
+ <integer>4</integer>
+ </array>
+ <key>IE_KEY_RSN_VERSION</key>
+ <integer>1</integer>
+ </dict>
+ <key>RSSI</key>
+ <integer>-66</integer>
+ <key>SSID</key>
+ <data>
+ ZWR1cm9hbQ==
+ </data>
+ <key>SSID_STR</key>
+ <string>eduroam</string>
+ <key>VHT_CAPS</key>
+ <dict>
+ <key>INFO</key>
+ <integer>260274576</integer>
+ <key>SUPPORTED_MCS_SET</key>
+ <data>
+ qv8AAKr/ACA=
+ </data>
+ </dict>
+ <key>VHT_OP</key>
+ <dict>
+ <key>BASIC_MCS_SET</key>
+ <integer>0</integer>
+ <key>CHANNEL_CENTER_FREQUENCY_SEG0</key>
+ <integer>0</integer>
+ <key>CHANNEL_CENTER_FREQUENCY_SEG1</key>
+ <integer>0</integer>
+ <key>CHANNEL_WIDTH</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>AGE</key>
+ <integer>0</integer>
+ <key>AP_MODE</key>
+ <integer>2</integer>
+ <key>BEACON_INT</key>
+ <integer>100</integer>
+ <key>BSSID</key>
+ <string>0:25:9c:da:c6:38</string>
+ <key>CAPABILITIES</key>
+ <integer>1073</integer>
+ <key>CHANNEL</key>
+ <integer>8</integer>
+ <key>CHANNEL_FLAGS</key>
+ <integer>10</integer>
+ <key>IE</key>
+ <data>
+ AARNQVJTAQiChIuWDBIYJAMBCDAUAQAAD6wEAQAAD6wEAQAAD6wCAAAqAQAy
+ BDBIYGzdCQADfwEBAAD/f90KAAN/BAEAAgBAAN10AFDyBBBKAAEQEEQAAQIQ
+ OwABAxBHABAAAAAAAAAQAAAAACWc2sY4ECEADExpbmtzeXMgSW5jLhAjAAdX
+ UlQ1NEcyECQAB3YxLjUuMDEQQgABMBBUAAgABgBQ8gQAARARAAdXUlQ1NEcy
+ EAgAAgCEEDwAAQE=
+ </data>
+ <key>NOISE</key>
+ <integer>-92</integer>
+ <key>RATES</key>
+ <array>
+ <integer>1</integer>
+ <integer>2</integer>
+ <integer>5</integer>
+ <integer>11</integer>
+ <integer>6</integer>
+ <integer>9</integer>
+ <integer>12</integer>
+ <integer>18</integer>
+ <integer>24</integer>
+ <integer>36</integer>
+ <integer>48</integer>
+ <integer>54</integer>
+ </array>
+ <key>RSN_IE</key>
+ <dict>
+ <key>IE_KEY_RSN_AUTHSELS</key>
+ <array>
+ <integer>2</integer>
+ </array>
+ <key>IE_KEY_RSN_MCIPHER</key>
+ <integer>4</integer>
+ <key>IE_KEY_RSN_UCIPHERS</key>
+ <array>
+ <integer>4</integer>
+ </array>
+ <key>IE_KEY_RSN_VERSION</key>
+ <integer>1</integer>
+ </dict>
+ <key>RSSI</key>
+ <integer>-65</integer>
+ <key>SSID</key>
+ <data>
+ TUFSUw==
+ </data>
+ <key>SSID_STR</key>
+ <string>MARS</string>
+ <key>WPS_PROB_RESP_IE</key>
+ <dict>
+ <key>IE_KEY_WPS_CFG_METHODS</key>
+ <integer>132</integer>
+ <key>IE_KEY_WPS_DEV_NAME</key>
+ <string>WRT54G2</string>
+ <key>IE_KEY_WPS_DEV_NAME_DATA</key>
+ <data>
+ V1JUNTRHMg==
+ </data>
+ <key>IE_KEY_WPS_MANUFACTURER</key>
+ <string>Linksys Inc.</string>
+ <key>IE_KEY_WPS_MODEL_NAME</key>
+ <string>WRT54G2</string>
+ <key>IE_KEY_WPS_MODEL_NUM</key>
+ <string>v1.5.01</string>
+ <key>IE_KEY_WPS_PRIMARY_DEV_TYPE</key>
+ <dict>
+ <key>WPS_DEV_TYPE_CAT</key>
+ <integer>6</integer>
+ <key>WPS_DEV_TYPE_OUI</key>
+ <data>
+ AFDyBA==
+ </data>
+ <key>WPS_DEV_TYPE_SUB_CAT</key>
+ <integer>1</integer>
+ </dict>
+ <key>IE_KEY_WPS_RESP_TYPE</key>
+ <integer>3</integer>
+ <key>IE_KEY_WPS_RF_BANDS</key>
+ <integer>1</integer>
+ <key>IE_KEY_WPS_SC_STATE</key>
+ <integer>2</integer>
+ <key>IE_KEY_WPS_SERIAL_NUM</key>
+ <string>0</string>
+ <key>IE_KEY_WPS_UUID_E</key>
+ <data>
+ AAAAAAAAEAAAAAAlnNrGOA==
+ </data>
+ </dict>
+ </dict>
+ <dict>
+ <key>AGE</key>
+ <integer>0</integer>
+ <key>AP_MODE</key>
+ <integer>2</integer>
+ <key>BEACON_INT</key>
+ <integer>100</integer>
+ <key>BSSID</key>
+ <string>f4:2e:7f:18:c7:62</string>
+ <key>CAPABILITIES</key>
+ <integer>1057</integer>
+ <key>CHANNEL</key>
+ <integer>1</integer>
+ <key>CHANNEL_FLAGS</key>
+ <integer>10</integer>
+ <key>EXT_CAPS</key>
+ <dict>
+ <key>BSS_TRANS_MGMT</key>
+ <integer>1</integer>
+ </dict>
+ <key>HT_CAPS_IE</key>
+ <dict>
+ <key>AMPDU_PARAMS</key>
+ <integer>23</integer>
+ <key>ASEL_CAPS</key>
+ <integer>0</integer>
+ <key>CAPS</key>
+ <integer>429</integer>
+ <key>EXT_CAPS</key>
+ <integer>0</integer>
+ <key>MCS_SET</key>
+ <data>
+ //8AAAAAAAAAAAAAAAAAAA==
+ </data>
+ <key>TXBF_CAPS</key>
+ <integer>0</integer>
+ </dict>
+ <key>HT_IE</key>
+ <dict>
+ <key>HT_BASIC_MCS_SET</key>
+ <data>
+ AAAAAAAAAAAAAAAAAAAAAA==
+ </data>
+ <key>HT_DUAL_BEACON</key>
+ <false/>
+ <key>HT_DUAL_CTS_PROT</key>
+ <false/>
+ <key>HT_LSIG_TXOP_PROT_FULL</key>
+ <false/>
+ <key>HT_NON_GF_STAS_PRESENT</key>
+ <true/>
+ <key>HT_OBSS_NON_HT_STAS_PRESENT</key>
+ <false/>
+ <key>HT_OP_MODE</key>
+ <integer>0</integer>
+ <key>HT_PCO_ACTIVE</key>
+ <false/>
+ <key>HT_PCO_PHASE</key>
+ <false/>
+ <key>HT_PRIMARY_CHAN</key>
+ <integer>1</integer>
+ <key>HT_PSMP_STAS_ONLY</key>
+ <false/>
+ <key>HT_RIFS_MODE</key>
+ <false/>
+ <key>HT_SECONDARY_BEACON</key>
+ <false/>
+ <key>HT_SECONDARY_CHAN_OFFSET</key>
+ <integer>0</integer>
+ <key>HT_SERVICE_INT</key>
+ <integer>0</integer>
+ <key>HT_STA_CHAN_WIDTH</key>
+ <false/>
+ <key>HT_TX_BURST_LIMIT</key>
+ <false/>
+ </dict>
+ <key>IE</key>
+ <data>
+ AAtFVFMtSW52aXRlcwEGmCSwSGBsAwEBKgEELRqtARf//wAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAD0WAQAEAAAAAAAAAAAAAAAAAAAAAAAAAEoOFAAKACwByAAU
+ AAUAGQB/CAUACAAAAABA3R4AkEwECL8MkAGAA///AAD//wAAwAUAAAAAAMMC
+ ADbdGABQ8gIBAYAAA6QAACekAABCQ14AYjIvAA==
+ </data>
+ <key>NOISE</key>
+ <integer>-92</integer>
+ <key>RATES</key>
+ <array>
+ <integer>12</integer>
+ <integer>18</integer>
+ <integer>24</integer>
+ <integer>36</integer>
+ <integer>48</integer>
+ <integer>54</integer>
+ </array>
+ <key>RSSI</key>
+ <integer>-64</integer>
+ <key>SSID</key>
+ <data>
+ RVRTLUludml0ZXM=
+ </data>
+ <key>SSID_STR</key>
+ <string>ETS-Invites</string>
+ </dict>
+ <dict>
+ <key>AGE</key>
+ <integer>0</integer>
+ <key>AP_MODE</key>
+ <integer>2</integer>
+ <key>BEACON_INT</key>
+ <integer>100</integer>
+ <key>BSSID</key>
+ <string>f4:2e:7f:18:c7:61</string>
+ <key>CAPABILITIES</key>
+ <integer>1041</integer>
+ <key>CHANNEL</key>
+ <integer>1</integer>
+ <key>CHANNEL_FLAGS</key>
+ <integer>10</integer>
+ <key>EXT_CAPS</key>
+ <dict>
+ <key>BSS_TRANS_MGMT</key>
+ <integer>1</integer>
+ </dict>
+ <key>HT_CAPS_IE</key>
+ <dict>
+ <key>AMPDU_PARAMS</key>
+ <integer>23</integer>
+ <key>ASEL_CAPS</key>
+ <integer>0</integer>
+ <key>CAPS</key>
+ <integer>429</integer>
+ <key>EXT_CAPS</key>
+ <integer>0</integer>
+ <key>MCS_SET</key>
+ <data>
+ //8AAAAAAAAAAAAAAAAAAA==
+ </data>
+ <key>TXBF_CAPS</key>
+ <integer>0</integer>
+ </dict>
+ <key>HT_IE</key>
+ <dict>
+ <key>HT_BASIC_MCS_SET</key>
+ <data>
+ AAAAAAAAAAAAAAAAAAAAAA==
+ </data>
+ <key>HT_DUAL_BEACON</key>
+ <false/>
+ <key>HT_DUAL_CTS_PROT</key>
+ <false/>
+ <key>HT_LSIG_TXOP_PROT_FULL</key>
+ <false/>
+ <key>HT_NON_GF_STAS_PRESENT</key>
+ <true/>
+ <key>HT_OBSS_NON_HT_STAS_PRESENT</key>
+ <false/>
+ <key>HT_OP_MODE</key>
+ <integer>0</integer>
+ <key>HT_PCO_ACTIVE</key>
+ <false/>
+ <key>HT_PCO_PHASE</key>
+ <false/>
+ <key>HT_PRIMARY_CHAN</key>
+ <integer>1</integer>
+ <key>HT_PSMP_STAS_ONLY</key>
+ <false/>
+ <key>HT_RIFS_MODE</key>
+ <false/>
+ <key>HT_SECONDARY_BEACON</key>
+ <false/>
+ <key>HT_SECONDARY_CHAN_OFFSET</key>
+ <integer>0</integer>
+ <key>HT_SERVICE_INT</key>
+ <integer>0</integer>
+ <key>HT_STA_CHAN_WIDTH</key>
+ <false/>
+ <key>HT_TX_BURST_LIMIT</key>
+ <false/>
+ </dict>
+ <key>IE</key>
+ <data>
+ AApFVFMtQ2FtcHVzAQaYJLBIYGwDAQEqAQQwFAEAAA+sBAEAAA+sBAEAAA+s
+ ASgACwUBAALZeC0arQEX//8AAAAAAAAAAAAAAAAAAAAAAAAAAAA9FgEABAAA
+ AAAAAAAAAAAAAAAAAAAAAABKDhQACgAsAcgAFAAFABkAfwgFAAgAAAAAQN0e
+ AJBMBAi/DJABgAP//wAA//8AAMAFAAAAAADDAgA23RgAUPICAQGAAAOkAAAn
+ pAAAQkNeAGIyLwA=
+ </data>
+ <key>NOISE</key>
+ <integer>-92</integer>
+ <key>QBSS_LOAD_IE</key>
+ <dict>
+ <key>QBSS_AAC</key>
+ <integer>30937</integer>
+ <key>QBSS_CHAN_UTIL</key>
+ <integer>2</integer>
+ <key>QBSS_STA_COUNT</key>
+ <integer>1</integer>
+ </dict>
+ <key>RATES</key>
+ <array>
+ <integer>12</integer>
+ <integer>18</integer>
+ <integer>24</integer>
+ <integer>36</integer>
+ <integer>48</integer>
+ <integer>54</integer>
+ </array>
+ <key>RSN_IE</key>
+ <dict>
+ <key>IE_KEY_RSN_AUTHSELS</key>
+ <array>
+ <integer>1</integer>
+ </array>
+ <key>IE_KEY_RSN_CAPS</key>
+ <dict>
+ <key>GTKSA_REPLAY_COUNTERS</key>
+ <integer>4</integer>
+ <key>MFP_CAPABLE</key>
+ <false/>
+ <key>MFP_REQUIRED</key>
+ <false/>
+ <key>NO_PAIRWISE</key>
+ <false/>
+ <key>PRE_AUTH</key>
+ <false/>
+ <key>PTKSA_REPLAY_COUNTERS</key>
+ <integer>4</integer>
+ <key>RSN_CAPABILITIES</key>
+ <integer>40</integer>
+ </dict>
+ <key>IE_KEY_RSN_MCIPHER</key>
+ <integer>4</integer>
+ <key>IE_KEY_RSN_UCIPHERS</key>
+ <array>
+ <integer>4</integer>
+ </array>
+ <key>IE_KEY_RSN_VERSION</key>
+ <integer>1</integer>
+ </dict>
+ <key>RSSI</key>
+ <integer>-64</integer>
+ <key>SSID</key>
+ <data>
+ RVRTLUNhbXB1cw==
+ </data>
+ <key>SSID_STR</key>
+ <string>ETS-Campus</string>
+ </dict>
+ <dict>
+ <key>AGE</key>
+ <integer>0</integer>
+ <key>AP_MODE</key>
+ <integer>2</integer>
+ <key>BEACON_INT</key>
+ <integer>100</integer>
+ <key>BSSID</key>
+ <string>f4:2e:7f:18:c7:60</string>
+ <key>CAPABILITIES</key>
+ <integer>1073</integer>
+ <key>CHANNEL</key>
+ <integer>1</integer>
+ <key>CHANNEL_FLAGS</key>
+ <integer>10</integer>
+ <key>EXT_CAPS</key>
+ <dict>
+ <key>BSS_TRANS_MGMT</key>
+ <integer>1</integer>
+ </dict>
+ <key>HT_CAPS_IE</key>
+ <dict>
+ <key>AMPDU_PARAMS</key>
+ <integer>23</integer>
+ <key>ASEL_CAPS</key>
+ <integer>0</integer>
+ <key>CAPS</key>
+ <integer>429</integer>
+ <key>EXT_CAPS</key>
+ <integer>0</integer>
+ <key>MCS_SET</key>
+ <data>
+ //8AAAAAAAAAAAAAAAAAAA==
+ </data>
+ <key>TXBF_CAPS</key>
+ <integer>0</integer>
+ </dict>
+ <key>HT_IE</key>
+ <dict>
+ <key>HT_BASIC_MCS_SET</key>
+ <data>
+ AAAAAAAAAAAAAAAAAAAAAA==
+ </data>
+ <key>HT_DUAL_BEACON</key>
+ <false/>
+ <key>HT_DUAL_CTS_PROT</key>
+ <false/>
+ <key>HT_LSIG_TXOP_PROT_FULL</key>
+ <false/>
+ <key>HT_NON_GF_STAS_PRESENT</key>
+ <true/>
+ <key>HT_OBSS_NON_HT_STAS_PRESENT</key>
+ <false/>
+ <key>HT_OP_MODE</key>
+ <integer>0</integer>
+ <key>HT_PCO_ACTIVE</key>
+ <false/>
+ <key>HT_PCO_PHASE</key>
+ <false/>
+ <key>HT_PRIMARY_CHAN</key>
+ <integer>1</integer>
+ <key>HT_PSMP_STAS_ONLY</key>
+ <false/>
+ <key>HT_RIFS_MODE</key>
+ <false/>
+ <key>HT_SECONDARY_BEACON</key>
+ <false/>
+ <key>HT_SECONDARY_CHAN_OFFSET</key>
+ <integer>0</integer>
+ <key>HT_SERVICE_INT</key>
+ <integer>0</integer>
+ <key>HT_STA_CHAN_WIDTH</key>
+ <false/>
+ <key>HT_TX_BURST_LIMIT</key>
+ <false/>
+ </dict>
+ <key>IE</key>
+ <data>
+ AAdlZHVyb2FtAQaYJLBIYGwDAQEqAQQwFAEAAA+sBAEAAA+sBAEAAA+sASgA
+ LRqtARf//wAAAAAAAAAAAAAAAAAAAAAAAAAAAD0WAQAEAAAAAAAAAAAAAAAA
+ AAAAAAAAAEoOFAAKACwByAAUAAUAGQB/CAUACAAAAABA3R4AkEwECL8MkAGA
+ A///AAD//wAAwAUAAAAAAMMCADbdGABQ8gIBAYAAA6QAACekAABCQ14AYjIv
+ AA==
+ </data>
+ <key>NOISE</key>
+ <integer>-92</integer>
+ <key>RATES</key>
+ <array>
+ <integer>12</integer>
+ <integer>18</integer>
+ <integer>24</integer>
+ <integer>36</integer>
+ <integer>48</integer>
+ <integer>54</integer>
+ </array>
+ <key>RSN_IE</key>
+ <dict>
+ <key>IE_KEY_RSN_AUTHSELS</key>
+ <array>
+ <integer>1</integer>
+ </array>
+ <key>IE_KEY_RSN_CAPS</key>
+ <dict>
+ <key>GTKSA_REPLAY_COUNTERS</key>
+ <integer>4</integer>
+ <key>MFP_CAPABLE</key>
+ <false/>
+ <key>MFP_REQUIRED</key>
+ <false/>
+ <key>NO_PAIRWISE</key>
+ <false/>
+ <key>PRE_AUTH</key>
+ <false/>
+ <key>PTKSA_REPLAY_COUNTERS</key>
+ <integer>4</integer>
+ <key>RSN_CAPABILITIES</key>
+ <integer>40</integer>
+ </dict>
+ <key>IE_KEY_RSN_MCIPHER</key>
+ <integer>4</integer>
+ <key>IE_KEY_RSN_UCIPHERS</key>
+ <array>
+ <integer>4</integer>
+ </array>
+ <key>IE_KEY_RSN_VERSION</key>
+ <integer>1</integer>
+ </dict>
+ <key>RSSI</key>
+ <integer>-64</integer>
+ <key>SSID</key>
+ <data>
+ ZWR1cm9hbQ==
+ </data>
+ <key>SSID_STR</key>
+ <string>eduroam</string>
+ </dict>
+ <dict>
+ <key>AGE</key>
+ <integer>0</integer>
+ <key>APPLE_SWAP</key>
+ <true/>
+ <key>APPLE_SWAP_IE</key>
+ <dict>
+ <key>SWAP_IE_FEATURES</key>
+ <data>
+ AQAA
+ </data>
+ <key>SWAP_IE_FEATURE_INTERNET_CONNECTION_SHARING_ENABLED</key>
+ <true/>
+ <key>SWAP_IE_FEATURE_VERSION</key>
+ <integer>1</integer>
+ <key>SWAP_IE_MODEL_IDENTIFIER</key>
+ <string>iMac15,1
diff --git a/node_modules/node-wifi/src/macOS/scan/__logs__/scan-01.log b/node_modules/node-wifi/src/macOS/scan/__logs__/scan-01.log
new file mode 100644
index 0000000..0065777
--- /dev/null
+++ b/node_modules/node-wifi/src/macOS/scan/__logs__/scan-01.log
@@ -0,0 +1,6 @@
+$ /System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport --scan
+ SSID BSSID RSSI CHANNEL HT CC SECURITY (auth/unicast/group)
+ foo-bar f6:d1:6d:b3:d2:88 -86 6 Y ca WPA2(PSK/AES/AES)
+ VIRGO1732 c1:ee:0e:e4:fa:1f -86 36 Y CA WPA2(PSK/AES/AES)
+ NERMNET 34:e8:94:1e:fc:5c -55 1 Y -- WPA(PSK/AES,TKIP/TKIP) WPA2(PSK/AES,TKIP/TKIP)
+ NERMNET 45:ff:7b:43:b5:26 -64 149 Y US WPA(PSK/TKIP,AES/TKIP) WPA2(PSK/TKIP,AES/TKIP)
diff --git a/node_modules/node-wifi/src/macOS/scan/__logs__/scan-monterey.log b/node_modules/node-wifi/src/macOS/scan/__logs__/scan-monterey.log
new file mode 100644
index 0000000..b8ad8a7
--- /dev/null
+++ b/node_modules/node-wifi/src/macOS/scan/__logs__/scan-monterey.log
@@ -0,0 +1,6 @@
+$ /System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport --scan
+ SSID BSSID RSSI CHANNEL HT CC SECURITY (auth/unicast/group)
+ XXXX-AMPLIFI -81 36 Y -- WPA2(PSK/AES/AES)
+ XXXX-AMPLIFI -65 36 Y -- WPA2(PSK/AES/AES)
+ XXXX-2.4GHz -27 11 Y -- WPA(PSK/TKIP,AES/TKIP) WPA2(PSK/TKIP,AES/TKIP)
+ XXXX-5GHz -33 149 Y -- WPA(PSK/TKIP,AES/TKIP) WPA2(PSK/TKIP,AES/TKIP) \ No newline at end of file
diff --git a/node_modules/node-wifi/src/macOS/scan/__logs__/scan-shifted.log b/node_modules/node-wifi/src/macOS/scan/__logs__/scan-shifted.log
new file mode 100644
index 0000000..5677ddc
--- /dev/null
+++ b/node_modules/node-wifi/src/macOS/scan/__logs__/scan-shifted.log
@@ -0,0 +1,7 @@
+$ /System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport --scan
+ SSID BSSID RSSI CHANNEL HT CC SECURITY (auth/unicast/group)
+ NERMNET 18:ff:7b:43:b5:26 -64 149 Y US WPA(PSK/TKIP,AES/TKIP) WPA2(PSK/TKIP,AES/TKIP)
+ Linksys02787-invité 12:23:03:18:9f:1c -33 11 Y US NONE
+ Linksys02787 10:23:03:1a:9f:1c -33 11 Y US WPA2(PSK/AES/AES)
+ NERMNET 18:ff:7b:43:b5:27 -53 1,+1 Y -- WPA2(PSK/TKIP,AES/TKIP)
+ \ No newline at end of file
diff --git a/node_modules/node-wifi/src/macOS/scan/__logs__/scan-space.log b/node_modules/node-wifi/src/macOS/scan/__logs__/scan-space.log
new file mode 100644
index 0000000..476b783
--- /dev/null
+++ b/node_modules/node-wifi/src/macOS/scan/__logs__/scan-space.log
@@ -0,0 +1,5 @@
+$ /System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport --scan
+ SSID BSSID RSSI CHANNEL HT CC SECURITY (auth/unicast/group)
+ Linksys02787 10:23:03:1a:9f:1c -33 11 Y US WPA2(PSK/AES/AES)
+ Terminus 1 1e:27:e2:fa:c6:32 -26 4 Y -- WPA2(PSK/AES/AES)
+ Linksys02787_5GHz 10:23:03:1a:9f:1d -51 36 Y US WPA2(PSK/AES/AES)
diff --git a/node_modules/node-wifi/src/macOS/scan/__test__/command.spec.js b/node_modules/node-wifi/src/macOS/scan/__test__/command.spec.js
new file mode 100644
index 0000000..17da860
--- /dev/null
+++ b/node_modules/node-wifi/src/macOS/scan/__test__/command.spec.js
@@ -0,0 +1,10 @@
+const command = require('../command');
+
+describe('mac Os scan command', () => {
+ it('should generate basic command', () => {
+ expect(command()).toEqual({
+ cmd: '/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport',
+ args: ['--scan']
+ });
+ });
+});
diff --git a/node_modules/node-wifi/src/macOS/scan/__test__/parser.spec.js b/node_modules/node-wifi/src/macOS/scan/__test__/parser.spec.js
new file mode 100644
index 0000000..7f5fca3
--- /dev/null
+++ b/node_modules/node-wifi/src/macOS/scan/__test__/parser.spec.js
@@ -0,0 +1,208 @@
+const path = require('path');
+const unlog = require('../../../__test__/unlogger');
+const parse = require('../parser');
+
+const log = filename => path.resolve(__dirname, '../__logs__/', filename);
+
+describe('parse macOS scan output', () => {
+ it('should return wifi networks', async () => {
+ const output = await unlog(log('scan-01.log'));
+
+ const networks = parse(output);
+
+ expect(networks).toEqual([
+ {
+ mac: 'f6:d1:6d:b3:d2:88',
+ bssid: 'f6:d1:6d:b3:d2:88',
+ ssid: 'foo-bar',
+ channel: 6,
+ frequency: 2437,
+ quality: 28,
+ signal_level: '-86',
+ security: 'WPA2',
+ security_flags: ['(PSK/AES/AES)']
+ },
+ {
+ mac: 'c1:ee:0e:e4:fa:1f',
+ bssid: 'c1:ee:0e:e4:fa:1f',
+ ssid: 'VIRGO1732',
+ channel: 36,
+ frequency: 5180,
+ quality: 28,
+ signal_level: '-86',
+ security: 'WPA2',
+ security_flags: ['(PSK/AES/AES)']
+ },
+ {
+ mac: '34:e8:94:1e:fc:5c',
+ bssid: '34:e8:94:1e:fc:5c',
+ ssid: 'NERMNET',
+ channel: 1,
+ frequency: 2412,
+ quality: 90,
+ signal_level: '-55',
+ security: 'WPA WPA2',
+ security_flags: ['(PSK/AES,TKIP/TKIP)', '(PSK/AES,TKIP/TKIP)']
+ },
+ {
+ mac: '45:ff:7b:43:b5:26',
+ bssid: '45:ff:7b:43:b5:26',
+ ssid: 'NERMNET',
+ channel: 149,
+ frequency: 5745,
+ quality: 72,
+ signal_level: '-64',
+ security: 'WPA WPA2',
+ security_flags: ['(PSK/TKIP,AES/TKIP)', '(PSK/TKIP,AES/TKIP)']
+ }
+ ]);
+ });
+
+ it('should return wifi networks with shifted lines', async () => {
+ const output = await unlog(log('scan-shifted.log'));
+
+ const networks = parse(output);
+
+ expect(networks).toEqual([
+ {
+ mac: '18:ff:7b:43:b5:26',
+ bssid: '18:ff:7b:43:b5:26',
+ ssid: 'NERMNET',
+ channel: 149,
+ frequency: 5745,
+ quality: 72,
+ signal_level: '-64',
+ security: 'WPA WPA2',
+ security_flags: ['(PSK/TKIP,AES/TKIP)', '(PSK/TKIP,AES/TKIP)']
+ },
+ {
+ mac: '12:23:03:18:9f:1c',
+ bssid: '12:23:03:18:9f:1c',
+ ssid: 'Linksys02787-invité',
+ channel: 11,
+ frequency: 2462,
+ quality: 134,
+ signal_level: '-33',
+ security: 'NONE',
+ security_flags: []
+ },
+ {
+ mac: '10:23:03:1a:9f:1c',
+ bssid: '10:23:03:1a:9f:1c',
+ ssid: 'Linksys02787',
+ channel: 11,
+ frequency: 2462,
+ quality: 134,
+ signal_level: '-33',
+ security: 'WPA2',
+ security_flags: ['(PSK/AES/AES)']
+ },
+ {
+ mac: '18:ff:7b:43:b5:27',
+ bssid: '18:ff:7b:43:b5:27',
+ ssid: 'NERMNET',
+ channel: 1,
+ frequency: 2412,
+ quality: 94,
+ signal_level: '-53',
+ security: 'WPA2',
+ security_flags: ['(PSK/TKIP,AES/TKIP)']
+ }
+ ]);
+ });
+
+ it('should return wifi networks with space in ssid', async () => {
+ const output = await unlog(log('scan-space.log'));
+
+ const networks = parse(output);
+
+ expect(networks).toEqual([
+ {
+ mac: '10:23:03:1a:9f:1c',
+ bssid: '10:23:03:1a:9f:1c',
+ ssid: 'Linksys02787',
+ channel: 11,
+ frequency: 2462,
+ quality: 134,
+ signal_level: '-33',
+ security: 'WPA2',
+ security_flags: ['(PSK/AES/AES)']
+ },
+ {
+ mac: '1e:27:e2:fa:c6:32',
+ bssid: '1e:27:e2:fa:c6:32',
+ ssid: 'Terminus 1',
+ channel: 4,
+ frequency: 2427,
+ quality: 148,
+ signal_level: '-26',
+ security: 'WPA2',
+ security_flags: ['(PSK/AES/AES)']
+ },
+ {
+ mac: '10:23:03:1a:9f:1d',
+ bssid: '10:23:03:1a:9f:1d',
+ ssid: 'Linksys02787_5GHz',
+ channel: 36,
+ frequency: 5180,
+ quality: 98,
+ signal_level: '-51',
+ security: 'WPA2',
+ security_flags: ['(PSK/AES/AES)']
+ }
+ ]);
+ });
+
+ it('should return wifi networks on macOS Monterey', async () => {
+ const output = await unlog(log('scan-monterey.log'));
+
+ const networks = parse(output);
+
+ expect(networks).toEqual([
+ {
+ mac: '',
+ bssid: '',
+ ssid: 'XXXX-AMPLIFI',
+ channel: 36,
+ frequency: 5180,
+ quality: 38,
+ signal_level: '-81',
+ security: 'WPA2',
+ security_flags: ['(PSK/AES/AES)']
+ },
+ {
+ mac: '',
+ bssid: '',
+ ssid: 'XXXX-AMPLIFI',
+ channel: 36,
+ frequency: 5180,
+ quality: 70,
+ signal_level: '-65',
+ security: 'WPA2',
+ security_flags: ['(PSK/AES/AES)']
+ },
+ {
+ mac: '',
+ bssid: '',
+ ssid: 'XXXX-2.4GHz',
+ channel: 11,
+ frequency: 2462,
+ quality: 146,
+ signal_level: '-27',
+ security: 'WPA WPA2',
+ security_flags: ['(PSK/TKIP,AES/TKIP)', '(PSK/TKIP,AES/TKIP)']
+ },
+ {
+ mac: '',
+ bssid: '',
+ ssid: 'XXXX-5GHz',
+ channel: 149,
+ frequency: 5745,
+ quality: 134,
+ signal_level: '-33',
+ security: 'WPA WPA2',
+ security_flags: ['(PSK/TKIP,AES/TKIP)', '(PSK/TKIP,AES/TKIP)']
+ }
+ ]);
+ });
+});
diff --git a/node_modules/node-wifi/src/macOS/scan/command.js b/node_modules/node-wifi/src/macOS/scan/command.js
new file mode 100644
index 0000000..b91da45
--- /dev/null
+++ b/node_modules/node-wifi/src/macOS/scan/command.js
@@ -0,0 +1,6 @@
+const command = () => ({
+ cmd: '/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport',
+ args: ['--scan']
+});
+
+module.exports = command;
diff --git a/node_modules/node-wifi/src/macOS/scan/index.js b/node_modules/node-wifi/src/macOS/scan/index.js
new file mode 100644
index 0000000..822c85d
--- /dev/null
+++ b/node_modules/node-wifi/src/macOS/scan/index.js
@@ -0,0 +1,4 @@
+const command = require('./command');
+const parse = require('./parser');
+
+module.exports = { command, parse };
diff --git a/node_modules/node-wifi/src/macOS/scan/parser.js b/node_modules/node-wifi/src/macOS/scan/parser.js
new file mode 100644
index 0000000..7df0421
--- /dev/null
+++ b/node_modules/node-wifi/src/macOS/scan/parser.js
@@ -0,0 +1,73 @@
+const { percentageFromDB } = require('../../utils/percentage-db');
+const frequencyFromChannel = require('../../utils/frequency-from-channel');
+
+const isNotEmpty = line => line.trim() !== '';
+
+const parseSecurity = security => {
+ const securities =
+ security === 'NONE'
+ ? [{ protocole: 'NONE', flag: '' }]
+ : security
+ .split(' ')
+ .map(s => s.match(/(.*)\((.*)\)/))
+ .filter(Boolean)
+ .map(([, protocole, flag]) => ({
+ protocole,
+ flag
+ }));
+
+ return {
+ security: securities.map(s => s.protocole).join(' '),
+ security_flags: securities.filter(s => s.flag).map(s => `(${s.flag})`)
+ };
+};
+
+const parse = stdout => {
+ const lines = stdout.split('\n');
+
+ const [, ...otherLines] = lines;
+
+ const networks = otherLines
+ .filter(isNotEmpty)
+ .map(line => line.trim())
+ .map(line => {
+ const match = line.match(
+ /(.*)\s+([a-zA-Z0-9]{2}:[a-zA-Z0-9]{2}:[a-zA-Z0-9]{2}:[a-zA-Z0-9]{2}:[a-zA-Z0-9]{2}:[a-zA-Z0-9]{2}|)\s+(-[0-9]+)\s+([0-9]+).*\s+([A-Z]+)\s+([a-zA-Z-]+)\s+([A-Z0-9(,)\s/]+)/
+ );
+
+ if (match) {
+ const [
+ ,
+ ssid,
+ bssid,
+ rssi,
+ channelStr,
+ // eslint-disable-next-line no-unused-vars
+ ht,
+ // eslint-disable-next-line no-unused-vars
+ countryCode,
+ security
+ ] = match;
+
+ const channel = parseInt(channelStr);
+
+ return {
+ mac: bssid, // for retrocompatibility
+ bssid,
+ ssid: ssid.trim(),
+ channel,
+ frequency: frequencyFromChannel(channel),
+ signal_level: rssi,
+ quality: percentageFromDB(rssi),
+ ...parseSecurity(security)
+ };
+ }
+
+ return false;
+ })
+ .filter(Boolean);
+
+ return networks;
+};
+
+module.exports = parse;
diff --git a/node_modules/node-wifi/src/platform.js b/node_modules/node-wifi/src/platform.js
new file mode 100644
index 0000000..d1db2e2
--- /dev/null
+++ b/node_modules/node-wifi/src/platform.js
@@ -0,0 +1,21 @@
+const linux = require('./linux');
+const macOS = require('./macOS');
+
+module.exports = () => {
+ let platform;
+
+ switch (process.platform) {
+ case 'linux':
+ platform = linux;
+ break;
+ case 'darwin':
+ platform = macOS;
+ break;
+ case 'win32':
+ break;
+ default:
+ throw new Error('ERROR : UNRECOGNIZED OS');
+ }
+
+ return platform;
+};
diff --git a/node_modules/node-wifi/src/utils/__test__/frequency-from-channel.spec.js b/node_modules/node-wifi/src/utils/__test__/frequency-from-channel.spec.js
new file mode 100644
index 0000000..e925be9
--- /dev/null
+++ b/node_modules/node-wifi/src/utils/__test__/frequency-from-channel.spec.js
@@ -0,0 +1,11 @@
+const frequencyFromChannel = require('../frequency-from-channel');
+
+describe('frequencyFromChannel', () => {
+ it('should return 2437Hz', () => {
+ expect(frequencyFromChannel(6)).toEqual(2437);
+ });
+
+ it('should return 5180Hz', () => {
+ expect(frequencyFromChannel(36)).toEqual(5180);
+ });
+});
diff --git a/node_modules/node-wifi/src/utils/__test__/percentage-db.spec.js b/node_modules/node-wifi/src/utils/__test__/percentage-db.spec.js
new file mode 100644
index 0000000..f6f9b9d
--- /dev/null
+++ b/node_modules/node-wifi/src/utils/__test__/percentage-db.spec.js
@@ -0,0 +1,13 @@
+const { percentageFromDB, dBFromPercentage } = require('../percentage-db');
+
+describe('qualityFromDB', () => {
+ it('should return quality when dB is string', () => {
+ expect(percentageFromDB('-86')).toEqual(28);
+ });
+});
+
+describe('dBFromQuality', () => {
+ it('should return dB when quality is string', () => {
+ expect(dBFromPercentage('28')).toEqual(-86);
+ });
+});
diff --git a/node_modules/node-wifi/src/utils/__test__/promiser.spec.js b/node_modules/node-wifi/src/utils/__test__/promiser.spec.js
new file mode 100644
index 0000000..b2754e4
--- /dev/null
+++ b/node_modules/node-wifi/src/utils/__test__/promiser.spec.js
@@ -0,0 +1,66 @@
+const promiser = require('../promiser');
+
+const config = { foo: 'foo' };
+
+describe('promiser', () => {
+ it('should execute function without error and return promise if no callback provided', async () => {
+ const func = jest.fn(() => Promise.resolve('bar'));
+
+ const result = await promiser(func)(config)();
+
+ expect(func).toHaveBeenCalledWith(config);
+ expect(result).toEqual('bar');
+ });
+
+ it('should execute function with error and return promise if no callback provided', async () => {
+ expect.assertions(2);
+
+ const func = jest.fn(() => Promise.reject('error'));
+ try {
+ await promiser(func)(config)();
+ } catch (error) {
+ expect(func).toHaveBeenCalledWith(config);
+ expect(error).toEqual('error');
+ }
+ });
+
+ it('should execute function without error and call callback', done => {
+ const func = jest.fn(() => Promise.resolve('bar'));
+
+ promiser(func)(config)((error, result) => {
+ expect(func).toHaveBeenCalledWith(config);
+ expect(result).toEqual('bar');
+ done();
+ });
+ });
+
+ it('should execute function with error and return promise if no callback provided', done => {
+ const func = jest.fn(() => Promise.reject('error'));
+ promiser(func)(config)(error => {
+ expect(func).toHaveBeenCalledWith(config);
+ expect(error).toEqual('error');
+ done();
+ });
+ });
+
+ it('should execute function without error with all args and return promise if no callback provided', async () => {
+ const func = jest.fn(() => Promise.resolve('bar'));
+ const arg = { ssid: 'foo', password: 'bar' };
+
+ const result = await promiser(func)(config)(arg);
+
+ expect(func).toHaveBeenCalledWith(config, arg);
+ expect(result).toEqual('bar');
+ });
+
+ it('should execute function without error and call callback', done => {
+ const func = jest.fn(() => Promise.resolve('bar'));
+ const arg = { ssid: 'foo', password: 'bar' };
+
+ promiser(func)(config)(arg, (error, result) => {
+ expect(func).toHaveBeenCalledWith(config, arg);
+ expect(result).toEqual('bar');
+ done();
+ });
+ });
+});
diff --git a/node_modules/node-wifi/src/utils/executer.js b/node_modules/node-wifi/src/utils/executer.js
new file mode 100644
index 0000000..ebc9396
--- /dev/null
+++ b/node_modules/node-wifi/src/utils/executer.js
@@ -0,0 +1,13 @@
+const { execFile } = require('child_process');
+const env = require('../env');
+
+module.exports = ({ cmd, args }) =>
+ new Promise((resolve, reject) => {
+ execFile(cmd, args, { env }, (error, output) => {
+ if (error) {
+ reject(error);
+ } else {
+ resolve(output);
+ }
+ });
+ });
diff --git a/node_modules/node-wifi/src/utils/frequency-from-channel.js b/node_modules/node-wifi/src/utils/frequency-from-channel.js
new file mode 100644
index 0000000..61e7e41
--- /dev/null
+++ b/node_modules/node-wifi/src/utils/frequency-from-channel.js
@@ -0,0 +1,40 @@
+const channels = {};
+
+// cf [wlan channels frequency](https://en.wikipedia.org/wiki/List_of_WLAN_channels)
+
+let frequency = 2412;
+
+for (let i = 1; i < 15; i++) {
+ channels[i] = frequency;
+ frequency = frequency + 5;
+}
+
+frequency = 5180;
+
+for (let j = 36; j <= 64; j += 2) {
+ channels[j] = frequency;
+ frequency += 10;
+}
+
+frequency = 5500;
+
+for (let k = 100; k <= 144; k += 2) {
+ channels[k] = frequency;
+ frequency += 10;
+}
+
+frequency = 5745;
+
+for (let l = 149; l <= 161; l += 2) {
+ channels[l] = frequency;
+ frequency += 10;
+}
+
+frequency = 5825;
+
+for (let m = 165; m <= 173; m += 4) {
+ channels[m] = frequency;
+ frequency += 20;
+}
+
+module.exports = channel => channels[parseInt(channel)];
diff --git a/node_modules/node-wifi/src/utils/network-utils.js b/node_modules/node-wifi/src/utils/network-utils.js
new file mode 100644
index 0000000..f8b917f
--- /dev/null
+++ b/node_modules/node-wifi/src/utils/network-utils.js
@@ -0,0 +1,54 @@
+const channels = {};
+
+// cf [wlan channels frequency](https://en.wikipedia.org/wiki/List_of_WLAN_channels)
+
+let frequency = 2412;
+
+for (let i = 1; i < 15; i++) {
+ channels[i] = frequency.toString();
+ frequency = frequency + 5;
+}
+
+frequency = 5180;
+
+for (let j = 36; j <= 64; j += 2) {
+ channels[j] = frequency.toString();
+ frequency += 10;
+}
+
+frequency = 5500;
+
+for (let k = 100; k <= 144; k += 2) {
+ channels[k] = frequency.toString();
+ frequency += 10;
+}
+
+frequency = 5745;
+
+for (let l = 149; l <= 161; l += 2) {
+ channels[l] = frequency.toString();
+ frequency += 10;
+}
+
+frequency = 5825;
+
+for (let m = 165; m <= 173; m += 4) {
+ channels[m] = frequency.toString();
+ frequency += 20;
+}
+
+function frequencyFromChannel(channelId) {
+ return channels[parseInt(channelId)];
+}
+
+function dBFromQuality(quality) {
+ return parseFloat(quality) / 2 - 100;
+}
+
+function qualityFromDB(db) {
+ return 2 * (parseFloat(db) + 100);
+}
+
+exports.frequencyFromChannel = frequencyFromChannel;
+exports.dBFromQuality = dBFromQuality;
+exports.qualityFromDB = qualityFromDB;
diff --git a/node_modules/node-wifi/src/utils/percentage-db.js b/node_modules/node-wifi/src/utils/percentage-db.js
new file mode 100644
index 0000000..dfb8fb0
--- /dev/null
+++ b/node_modules/node-wifi/src/utils/percentage-db.js
@@ -0,0 +1,10 @@
+// cf [relation between quality and dB](https://www.netspotapp.com/what-is-rssi-level.html)
+
+const percentageFromDB = db => 2 * (parseFloat(db) + 100);
+
+const dBFromPercentage = quality => parseFloat(quality) / 2 - 100;
+
+module.exports = {
+ percentageFromDB,
+ dBFromPercentage
+};
diff --git a/node_modules/node-wifi/src/utils/promiser.js b/node_modules/node-wifi/src/utils/promiser.js
new file mode 100644
index 0000000..237e6dd
--- /dev/null
+++ b/node_modules/node-wifi/src/utils/promiser.js
@@ -0,0 +1,33 @@
+const extractArgs = allArgs => {
+ const callbackIndex = allArgs.length - 1;
+ if (callbackIndex >= 0 && typeof allArgs[callbackIndex] === 'function') {
+ return {
+ callback: allArgs[callbackIndex],
+ args: allArgs.slice(0, callbackIndex)
+ };
+ }
+
+ return {
+ callback: null,
+ args: allArgs
+ };
+};
+
+module.exports =
+ func =>
+ config =>
+ (...allArgs) => {
+ const { args, callback } = extractArgs(allArgs);
+
+ if (typeof callback === 'function') {
+ func(config, ...args)
+ .then(response => {
+ callback(null, response);
+ })
+ .catch(error => {
+ callback(error);
+ });
+ } else {
+ return func(config, ...args);
+ }
+ };
diff --git a/node_modules/node-wifi/src/wifi.js b/node_modules/node-wifi/src/wifi.js
new file mode 100644
index 0000000..3f0af56
--- /dev/null
+++ b/node_modules/node-wifi/src/wifi.js
@@ -0,0 +1,94 @@
+const windowsConnect = require('./windows-connect.js');
+const windowsScan = require('./windows-scan.js');
+const windowsDisconnect = require('./windows-disconnect.js');
+const windowsGetCurrentConnections = require('./windows-current-connections');
+const linuxConnect = require('./linux-connect');
+const linuxDisconnect = require('./linux-disconnect');
+const linuxDelete = require('./linux-delete');
+const linuxGetCurrentConnections = require('./linux-current-connections');
+const linuxScan = require('./linux-scan.js');
+const macConnect = require('./mac-connect.js');
+const macScan = require('./mac-scan.js');
+const macDelete = require('./mac-delete');
+const macGetCurrentConnections = require('./mac-current-connections');
+
+const config = {
+ debug: false,
+ iface: null
+};
+
+function init(options) {
+ if (options && options.debug) {
+ config.debug = options.debug;
+ }
+
+ if (options && options.iface) {
+ config.iface = options.iface;
+ }
+
+ let scan = () => {
+ throw new Error('ERROR : not available for this OS');
+ };
+ let connect = () => {
+ throw new Error('ERROR : not available for this OS');
+ };
+ let disconnect = () => {
+ throw new Error('ERROR : not available for this OS');
+ };
+ let deleteConnection = () => {
+ throw new Error('ERROR : not available for this OS');
+ };
+ let getCurrentConnections = () => {
+ throw new Error('ERROR : not available for this OS');
+ };
+
+ switch (process.platform) {
+ case 'linux':
+ connect = linuxConnect(config);
+ scan = linuxScan(config);
+ disconnect = linuxDisconnect(config);
+ deleteConnection = linuxDelete(config);
+ getCurrentConnections = linuxGetCurrentConnections(config);
+ break;
+ case 'darwin':
+ connect = macConnect(config);
+ scan = macScan(config);
+ deleteConnection = macDelete(config);
+ getCurrentConnections = macGetCurrentConnections(config);
+ break;
+ case 'win32':
+ connect = windowsConnect(config);
+ scan = windowsScan(config);
+ disconnect = windowsDisconnect(config);
+ getCurrentConnections = windowsGetCurrentConnections(config);
+ break;
+ default:
+ throw new Error('ERROR : UNRECOGNIZED OS');
+ }
+ exports.scan = scan;
+ exports.connect = connect;
+ exports.disconnect = disconnect;
+ exports.deleteConnection = deleteConnection;
+ exports.getCurrentConnections = getCurrentConnections;
+}
+
+exports.init = init;
+exports.scan = () => {
+ throw new Error('ERROR : use init before');
+};
+
+exports.connect = () => {
+ throw new Error('ERROR : use init before');
+};
+
+exports.disconnect = () => {
+ throw new Error('ERROR : use init before');
+};
+
+exports.getCurrentConnections = () => {
+ throw new Error('ERROR : use init before');
+};
+
+exports.deleteConnection = () => {
+ throw new Error('ERROR : use init before');
+};
diff --git a/node_modules/node-wifi/src/windows-connect.js b/node_modules/node-wifi/src/windows-connect.js
new file mode 100644
index 0000000..11e80c1
--- /dev/null
+++ b/node_modules/node-wifi/src/windows-connect.js
@@ -0,0 +1,136 @@
+const fs = require('fs');
+const execFile = require('child_process').execFile;
+const env = require('./env');
+const scan = require('./windows-scan');
+const path = require('path');
+const os = require('os');
+const profileFilename = path.join(os.tmpdir(), 'nodeWifiConnect.xml');
+
+function execCommand(cmd, params) {
+ return new Promise((resolve, reject) => {
+ execFile(cmd, params, { env, shell: true }, (err, stdout, stderr) => {
+ if (err) {
+ // Add command output to error, so it's easier to handle
+ err.stdout = stdout;
+ err.stderr = stderr;
+
+ reject(err);
+ } else {
+ resolve(stdout);
+ }
+ });
+ });
+}
+
+function connectToWifi(config, ap, callback) {
+ scan(config)()
+ .then(networks => {
+ const selectedAp = networks.find(network => {
+ return network.ssid === ap.ssid;
+ });
+
+ if (selectedAp === undefined) {
+ throw 'SSID not found';
+ }
+
+ fs.writeFileSync(
+ profileFilename,
+ win32WirelessProfileBuilder(selectedAp, ap.password)
+ );
+ })
+ .then(() => {
+ return execCommand('netsh', [
+ 'wlan',
+ 'add',
+ 'profile',
+ `filename=${profileFilename}`
+ ]);
+ })
+ .then(() => {
+ const cmd = 'netsh';
+ const params = [
+ 'wlan',
+ 'connect',
+ `ssid="${ap.ssid}"`,
+ `name="${ap.ssid}"`
+ ];
+ if (config.iface) {
+ params.push(`interface="${config.iface}"`);
+ }
+ return execCommand(cmd, params);
+ })
+ .then(() => {
+ return execCommand(`del ${profileFilename}`);
+ })
+ .then(() => {
+ callback && callback();
+ })
+ .catch(err => {
+ execFile(
+ 'netsh',
+ ['wlan', 'delete', `profile "${ap.ssid}"`],
+ { env },
+ () => {
+ callback && callback(err);
+ }
+ );
+ });
+}
+
+function getHexSsid(plainTextSsid) {
+ let i, j, ref, hex;
+
+ hex = '';
+
+ for (
+ i = j = 0, ref = plainTextSsid.length - 1;
+ ref >= 0 ? j <= ref : j >= ref;
+ i = ref >= 0 ? ++j : --j
+ ) {
+ hex += plainTextSsid.charCodeAt(i).toString(16);
+ }
+
+ return hex;
+}
+
+function win32WirelessProfileBuilder(selectedAp, key) {
+ let profile_content = `<?xml version="1.0"?> <WLANProfile xmlns="http://www.microsoft.com/networking/WLAN/profile/v1"> <name>${
+ selectedAp.ssid
+ }</name> <SSIDConfig> <SSID> <hex>${getHexSsid(
+ selectedAp.ssid
+ )}</hex> <name>${selectedAp.ssid}</name> </SSID> </SSIDConfig>`;
+
+ if (selectedAp.security.includes('WPA2')) {
+ profile_content += `<connectionType>ESS</connectionType> <connectionMode>auto</connectionMode> <autoSwitch>true</autoSwitch> <MSM> <security> <authEncryption> <authentication>WPA2PSK</authentication> <encryption>AES</encryption> <useOneX>false</useOneX> </authEncryption> <sharedKey> <keyType>passPhrase</keyType> <protected>false</protected> <keyMaterial>${key}</keyMaterial> </sharedKey> </security> </MSM>`;
+ } else if (selectedAp.security.includes('WPA')) {
+ profile_content += `<connectionType>ESS</connectionType> <connectionMode>auto</connectionMode> <autoSwitch>true</autoSwitch> <MSM> <security> <authEncryption> <authentication>WPAPSK</authentication> <encryption>TKIP</encryption> <useOneX>false</useOneX> </authEncryption> <sharedKey> <keyType>passPhrase</keyType> <protected>false</protected> <keyMaterial>${key}</keyMaterial> </sharedKey> </security> </MSM>`;
+ } else {
+ if (selectedAp.security_flags.includes('WEP')) {
+ profile_content += `<connectionType>ESS</connectionType> <connectionMode>auto</connectionMode> <autoSwitch>true</autoSwitch> <MSM> <security> <authEncryption> <authentication>open</authentication> <encryption>WEP</encryption> <useOneX>false</useOneX> </authEncryption> <sharedKey> <keyType>networkKey</keyType> <protected>false</protected> <keyMaterial>${key}</keyMaterial> </sharedKey> </security> </MSM>`;
+ } else {
+ profile_content +=
+ '<connectionType>ESS</connectionType> <connectionMode>manual</connectionMode> <MSM> <security> <authEncryption> <authentication>open</authentication> <encryption>none</encryption> <useOneX>false</useOneX> </authEncryption> </security> </MSM>';
+ }
+ }
+
+ profile_content += '</WLANProfile>';
+ return profile_content;
+}
+
+module.exports = config => {
+ return (ap, callback) => {
+ if (callback) {
+ connectToWifi(config, ap, callback);
+ } else {
+ return new Promise((resolve, reject) => {
+ connectToWifi(config, ap, err => {
+ if (err) {
+ reject(err);
+ } else {
+ resolve();
+ }
+ });
+ });
+ }
+ };
+};
diff --git a/node_modules/node-wifi/src/windows-current-connections.js b/node_modules/node-wifi/src/windows-current-connections.js
new file mode 100644
index 0000000..477456b
--- /dev/null
+++ b/node_modules/node-wifi/src/windows-current-connections.js
@@ -0,0 +1,89 @@
+const execFile = require('child_process').execFile;
+const env = require('./env');
+const networkUtils = require('./utils/network-utils.js');
+
+function parseShowInterfaces(stdout) {
+ const lines = stdout.split('\r\n');
+ const connections = [];
+ let i = 3;
+ while (lines.length > i + 18) {
+ const tmpConnection = {};
+ const fields = [
+ 'name',
+ 'description',
+ 'guid',
+ 'mac',
+ 'state',
+ 'ssid',
+ 'bssid',
+ 'mode',
+ 'radio',
+ 'authentication',
+ 'encryption',
+ 'connection',
+ 'channel',
+ 'reception',
+ 'transmission',
+ 'signal',
+ 'profil'
+ ];
+ for (let j = 0; j < fields.length; j++) {
+ const line = lines[i + j];
+ tmpConnection[fields[j]] = line.match(/.*: (.*)/)[1];
+ }
+
+ connections.push({
+ iface: tmpConnection.name,
+ ssid: tmpConnection.ssid,
+ bssid: tmpConnection.bssid,
+ mac: tmpConnection.bssid,
+ mode: tmpConnection.mode,
+ channel: parseInt(tmpConnection.channel),
+ frequency: parseInt(
+ networkUtils.frequencyFromChannel(parseInt(tmpConnection.channel))
+ ),
+ signal_level: networkUtils.dBFromQuality(tmpConnection.signal),
+ quality: parseFloat(tmpConnection.signal),
+ security: tmpConnection.authentication,
+ security_flags: tmpConnection.encryption
+ });
+
+ i = i + 18;
+ }
+
+ return connections;
+}
+
+function getCurrentConnection(config, callback) {
+ const params = ['wlan', 'show', 'interfaces'];
+ execFile('netsh', params, { env }, (err, stdout) => {
+ if (err) {
+ callback && callback(err);
+ } else {
+ try {
+ const connections = parseShowInterfaces(stdout, config);
+ callback && callback(null, connections);
+ } catch (e) {
+ callback && callback(e);
+ }
+ }
+ });
+}
+
+module.exports = config => {
+ return callback => {
+ if (callback) {
+ getCurrentConnection(config, callback);
+ } else {
+ return new Promise((resolve, reject) => {
+ getCurrentConnection(config, (err, connections) => {
+ if (err) {
+ reject(err);
+ } else {
+ resolve(connections);
+ }
+ });
+ });
+ }
+ };
+};
diff --git a/node_modules/node-wifi/src/windows-disconnect.js b/node_modules/node-wifi/src/windows-disconnect.js
new file mode 100644
index 0000000..61b2f89
--- /dev/null
+++ b/node_modules/node-wifi/src/windows-disconnect.js
@@ -0,0 +1,31 @@
+const execFile = require('child_process').execFile;
+const env = require('./env');
+
+function disconnect(config, callback) {
+ const cmd = 'netsh';
+ const params = ['wlan', 'disconnect'];
+ if (config.iface) {
+ params.push(`interface="${config.iface}"`);
+ }
+ execFile(cmd, params, { env }, err => {
+ callback && callback(err);
+ });
+}
+
+module.exports = config => {
+ return callback => {
+ if (callback) {
+ disconnect(config, callback);
+ } else {
+ return new Promise((resolve, reject) => {
+ disconnect(config, err => {
+ if (err) {
+ reject(err);
+ } else {
+ resolve();
+ }
+ });
+ });
+ }
+ };
+};
diff --git a/node_modules/node-wifi/src/windows-scan.js b/node_modules/node-wifi/src/windows-scan.js
new file mode 100644
index 0000000..0f570d8
--- /dev/null
+++ b/node_modules/node-wifi/src/windows-scan.js
@@ -0,0 +1,100 @@
+const execFile = require('child_process').execFile;
+const networkUtils = require('./utils/network-utils');
+const env = require('./env');
+
+function scanWifi(config, callback) {
+ try {
+ execFile(
+ 'netsh',
+ ['wlan', 'show', 'networks', 'mode=Bssid'],
+ { env },
+ (err, scanResults) => {
+ if (err) {
+ callback && callback(err);
+ return;
+ }
+
+ scanResults = scanResults
+ .toString('utf8')
+ .split('\r')
+ .join('')
+ .split('\n')
+ .slice(4, scanResults.length);
+
+ let numNetworks = -1;
+ let currentLine = 0;
+ let networkTmp;
+ const networksTmp = [];
+ let network;
+ const networks = [];
+ let i;
+
+ for (i = 0; i < scanResults.length; i++) {
+ if (scanResults[i] === '') {
+ numNetworks++;
+ networkTmp = scanResults.slice(currentLine, i);
+ networksTmp.push(networkTmp);
+ currentLine = i + 1;
+ }
+ }
+
+ for (i = 0; i < numNetworks; i++) {
+ // skip empty networks
+ if (networksTmp[i] && networksTmp[i].length > 0) {
+ network = parse(networksTmp[i]);
+ networks.push(network);
+ }
+ }
+
+ callback && callback(null, networks);
+ }
+ );
+ } catch (e) {
+ callback && callback(e);
+ }
+}
+
+function parse(networkTmp) {
+ const network = {};
+
+ network.mac = networkTmp[4] ? networkTmp[4].match(/.*?:\s(.*)/)[1] : '';
+ network.bssid = network.mac;
+ network.ssid = networkTmp[0] ? networkTmp[0].match(/.*?:\s(.*)/)[1] : '';
+ network.channel = networkTmp[7]
+ ? parseInt(networkTmp[7].match(/.*?:\s(.*)/)[1])
+ : -1;
+ network.frequency = network.channel
+ ? parseInt(networkUtils.frequencyFromChannel(network.channel))
+ : 0;
+ network.signal_level = networkTmp[5]
+ ? networkUtils.dBFromQuality(networkTmp[5].match(/.*?:\s(.*)/)[1])
+ : Number.MIN_VALUE;
+ network.quality = networkTmp[5]
+ ? parseFloat(networkTmp[5].match(/.*?:\s(.*)/)[1])
+ : 0;
+ network.security = networkTmp[2] ? networkTmp[2].match(/.*?:\s(.*)/)[1] : '';
+ network.security_flags = networkTmp[3]
+ ? networkTmp[3].match(/.*?:\s(.*)/)[1]
+ : '';
+ network.mode = 'Unknown';
+
+ return network;
+}
+
+module.exports = config => {
+ return callback => {
+ if (callback) {
+ scanWifi(config, callback);
+ } else {
+ return new Promise((resolve, reject) => {
+ scanWifi(config, (err, networks) => {
+ if (err) {
+ reject(err);
+ } else {
+ resolve(networks);
+ }
+ });
+ });
+ }
+ };
+};
diff --git a/node_modules/prompts/dist/dateparts/datepart.js b/node_modules/prompts/dist/dateparts/datepart.js
new file mode 100644
index 0000000..b954c5e
--- /dev/null
+++ b/node_modules/prompts/dist/dateparts/datepart.js
@@ -0,0 +1,39 @@
+'use strict';
+
+class DatePart {
+ constructor({
+ token,
+ date,
+ parts,
+ locales
+ }) {
+ this.token = token;
+ this.date = date || new Date();
+ this.parts = parts || [this];
+ this.locales = locales || {};
+ }
+
+ up() {}
+
+ down() {}
+
+ next() {
+ const currentIdx = this.parts.indexOf(this);
+ return this.parts.find((part, idx) => idx > currentIdx && part instanceof DatePart);
+ }
+
+ setTo(val) {}
+
+ prev() {
+ let parts = [].concat(this.parts).reverse();
+ const currentIdx = parts.indexOf(this);
+ return parts.find((part, idx) => idx > currentIdx && part instanceof DatePart);
+ }
+
+ toString() {
+ return String(this.date);
+ }
+
+}
+
+module.exports = DatePart; \ No newline at end of file
diff --git a/node_modules/prompts/dist/dateparts/day.js b/node_modules/prompts/dist/dateparts/day.js
new file mode 100644
index 0000000..a525e92
--- /dev/null
+++ b/node_modules/prompts/dist/dateparts/day.js
@@ -0,0 +1,35 @@
+'use strict';
+
+const DatePart = require('./datepart');
+
+const pos = n => {
+ n = n % 10;
+ return n === 1 ? 'st' : n === 2 ? 'nd' : n === 3 ? 'rd' : 'th';
+};
+
+class Day extends DatePart {
+ constructor(opts = {}) {
+ super(opts);
+ }
+
+ up() {
+ this.date.setDate(this.date.getDate() + 1);
+ }
+
+ down() {
+ this.date.setDate(this.date.getDate() - 1);
+ }
+
+ setTo(val) {
+ this.date.setDate(parseInt(val.substr(-2)));
+ }
+
+ toString() {
+ let date = this.date.getDate();
+ let day = this.date.getDay();
+ return this.token === 'DD' ? String(date).padStart(2, '0') : this.token === 'Do' ? date + pos(date) : this.token === 'd' ? day + 1 : this.token === 'ddd' ? this.locales.weekdaysShort[day] : this.token === 'dddd' ? this.locales.weekdays[day] : date;
+ }
+
+}
+
+module.exports = Day; \ No newline at end of file
diff --git a/node_modules/prompts/dist/dateparts/hours.js b/node_modules/prompts/dist/dateparts/hours.js
new file mode 100644
index 0000000..7743632
--- /dev/null
+++ b/node_modules/prompts/dist/dateparts/hours.js
@@ -0,0 +1,30 @@
+'use strict';
+
+const DatePart = require('./datepart');
+
+class Hours extends DatePart {
+ constructor(opts = {}) {
+ super(opts);
+ }
+
+ up() {
+ this.date.setHours(this.date.getHours() + 1);
+ }
+
+ down() {
+ this.date.setHours(this.date.getHours() - 1);
+ }
+
+ setTo(val) {
+ this.date.setHours(parseInt(val.substr(-2)));
+ }
+
+ toString() {
+ let hours = this.date.getHours();
+ if (/h/.test(this.token)) hours = hours % 12 || 12;
+ return this.token.length > 1 ? String(hours).padStart(2, '0') : hours;
+ }
+
+}
+
+module.exports = Hours; \ No newline at end of file
diff --git a/node_modules/prompts/dist/dateparts/index.js b/node_modules/prompts/dist/dateparts/index.js
new file mode 100644
index 0000000..754516e
--- /dev/null
+++ b/node_modules/prompts/dist/dateparts/index.js
@@ -0,0 +1,13 @@
+'use strict';
+
+module.exports = {
+ DatePart: require('./datepart'),
+ Meridiem: require('./meridiem'),
+ Day: require('./day'),
+ Hours: require('./hours'),
+ Milliseconds: require('./milliseconds'),
+ Minutes: require('./minutes'),
+ Month: require('./month'),
+ Seconds: require('./seconds'),
+ Year: require('./year')
+}; \ No newline at end of file
diff --git a/node_modules/prompts/dist/dateparts/meridiem.js b/node_modules/prompts/dist/dateparts/meridiem.js
new file mode 100644
index 0000000..5bc8dd7
--- /dev/null
+++ b/node_modules/prompts/dist/dateparts/meridiem.js
@@ -0,0 +1,25 @@
+'use strict';
+
+const DatePart = require('./datepart');
+
+class Meridiem extends DatePart {
+ constructor(opts = {}) {
+ super(opts);
+ }
+
+ up() {
+ this.date.setHours((this.date.getHours() + 12) % 24);
+ }
+
+ down() {
+ this.up();
+ }
+
+ toString() {
+ let meridiem = this.date.getHours() > 12 ? 'pm' : 'am';
+ return /\A/.test(this.token) ? meridiem.toUpperCase() : meridiem;
+ }
+
+}
+
+module.exports = Meridiem; \ No newline at end of file
diff --git a/node_modules/prompts/dist/dateparts/milliseconds.js b/node_modules/prompts/dist/dateparts/milliseconds.js
new file mode 100644
index 0000000..3440e3a
--- /dev/null
+++ b/node_modules/prompts/dist/dateparts/milliseconds.js
@@ -0,0 +1,28 @@
+'use strict';
+
+const DatePart = require('./datepart');
+
+class Milliseconds extends DatePart {
+ constructor(opts = {}) {
+ super(opts);
+ }
+
+ up() {
+ this.date.setMilliseconds(this.date.getMilliseconds() + 1);
+ }
+
+ down() {
+ this.date.setMilliseconds(this.date.getMilliseconds() - 1);
+ }
+
+ setTo(val) {
+ this.date.setMilliseconds(parseInt(val.substr(-this.token.length)));
+ }
+
+ toString() {
+ return String(this.date.getMilliseconds()).padStart(4, '0').substr(0, this.token.length);
+ }
+
+}
+
+module.exports = Milliseconds; \ No newline at end of file
diff --git a/node_modules/prompts/dist/dateparts/minutes.js b/node_modules/prompts/dist/dateparts/minutes.js
new file mode 100644
index 0000000..2b8ef1f
--- /dev/null
+++ b/node_modules/prompts/dist/dateparts/minutes.js
@@ -0,0 +1,29 @@
+'use strict';
+
+const DatePart = require('./datepart');
+
+class Minutes extends DatePart {
+ constructor(opts = {}) {
+ super(opts);
+ }
+
+ up() {
+ this.date.setMinutes(this.date.getMinutes() + 1);
+ }
+
+ down() {
+ this.date.setMinutes(this.date.getMinutes() - 1);
+ }
+
+ setTo(val) {
+ this.date.setMinutes(parseInt(val.substr(-2)));
+ }
+
+ toString() {
+ let m = this.date.getMinutes();
+ return this.token.length > 1 ? String(m).padStart(2, '0') : m;
+ }
+
+}
+
+module.exports = Minutes; \ No newline at end of file
diff --git a/node_modules/prompts/dist/dateparts/month.js b/node_modules/prompts/dist/dateparts/month.js
new file mode 100644
index 0000000..f9d4e13
--- /dev/null
+++ b/node_modules/prompts/dist/dateparts/month.js
@@ -0,0 +1,31 @@
+'use strict';
+
+const DatePart = require('./datepart');
+
+class Month extends DatePart {
+ constructor(opts = {}) {
+ super(opts);
+ }
+
+ up() {
+ this.date.setMonth(this.date.getMonth() + 1);
+ }
+
+ down() {
+ this.date.setMonth(this.date.getMonth() - 1);
+ }
+
+ setTo(val) {
+ val = parseInt(val.substr(-2)) - 1;
+ this.date.setMonth(val < 0 ? 0 : val);
+ }
+
+ toString() {
+ let month = this.date.getMonth();
+ let tl = this.token.length;
+ return tl === 2 ? String(month + 1).padStart(2, '0') : tl === 3 ? this.locales.monthsShort[month] : tl === 4 ? this.locales.months[month] : String(month + 1);
+ }
+
+}
+
+module.exports = Month; \ No newline at end of file
diff --git a/node_modules/prompts/dist/dateparts/seconds.js b/node_modules/prompts/dist/dateparts/seconds.js
new file mode 100644
index 0000000..e16f030
--- /dev/null
+++ b/node_modules/prompts/dist/dateparts/seconds.js
@@ -0,0 +1,29 @@
+'use strict';
+
+const DatePart = require('./datepart');
+
+class Seconds extends DatePart {
+ constructor(opts = {}) {
+ super(opts);
+ }
+
+ up() {
+ this.date.setSeconds(this.date.getSeconds() + 1);
+ }
+
+ down() {
+ this.date.setSeconds(this.date.getSeconds() - 1);
+ }
+
+ setTo(val) {
+ this.date.setSeconds(parseInt(val.substr(-2)));
+ }
+
+ toString() {
+ let s = this.date.getSeconds();
+ return this.token.length > 1 ? String(s).padStart(2, '0') : s;
+ }
+
+}
+
+module.exports = Seconds; \ No newline at end of file
diff --git a/node_modules/prompts/dist/dateparts/year.js b/node_modules/prompts/dist/dateparts/year.js
new file mode 100644
index 0000000..cd62677
--- /dev/null
+++ b/node_modules/prompts/dist/dateparts/year.js
@@ -0,0 +1,29 @@
+'use strict';
+
+const DatePart = require('./datepart');
+
+class Year extends DatePart {
+ constructor(opts = {}) {
+ super(opts);
+ }
+
+ up() {
+ this.date.setFullYear(this.date.getFullYear() + 1);
+ }
+
+ down() {
+ this.date.setFullYear(this.date.getFullYear() - 1);
+ }
+
+ setTo(val) {
+ this.date.setFullYear(val.substr(-4));
+ }
+
+ toString() {
+ let year = String(this.date.getFullYear()).padStart(4, '0');
+ return this.token.length === 2 ? year.substr(-2) : year;
+ }
+
+}
+
+module.exports = Year; \ No newline at end of file
diff --git a/node_modules/prompts/dist/elements/autocomplete.js b/node_modules/prompts/dist/elements/autocomplete.js
new file mode 100644
index 0000000..60e41bc
--- /dev/null
+++ b/node_modules/prompts/dist/elements/autocomplete.js
@@ -0,0 +1,285 @@
+'use strict';
+
+function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
+
+function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
+
+const color = require('kleur');
+
+const Prompt = require('./prompt');
+
+const _require = require('sisteransi'),
+ erase = _require.erase,
+ cursor = _require.cursor;
+
+const _require2 = require('../util'),
+ style = _require2.style,
+ clear = _require2.clear,
+ figures = _require2.figures,
+ wrap = _require2.wrap,
+ entriesToDisplay = _require2.entriesToDisplay;
+
+const getVal = (arr, i) => arr[i] && (arr[i].value || arr[i].title || arr[i]);
+
+const getTitle = (arr, i) => arr[i] && (arr[i].title || arr[i].value || arr[i]);
+
+const getIndex = (arr, valOrTitle) => {
+ const index = arr.findIndex(el => el.value === valOrTitle || el.title === valOrTitle);
+ return index > -1 ? index : undefined;
+};
+/**
+ * TextPrompt Base Element
+ * @param {Object} opts Options
+ * @param {String} opts.message Message
+ * @param {Array} opts.choices Array of auto-complete choices objects
+ * @param {Function} [opts.suggest] Filter function. Defaults to sort by title
+ * @param {Number} [opts.limit=10] Max number of results to show
+ * @param {Number} [opts.cursor=0] Cursor start position
+ * @param {String} [opts.style='default'] Render style
+ * @param {String} [opts.fallback] Fallback message - initial to default value
+ * @param {String} [opts.initial] Index of the default value
+ * @param {Boolean} [opts.clearFirst] The first ESCAPE keypress will clear the input
+ * @param {Stream} [opts.stdin] The Readable stream to listen to
+ * @param {Stream} [opts.stdout] The Writable stream to write readline data to
+ * @param {String} [opts.noMatches] The no matches found label
+ */
+
+
+class AutocompletePrompt extends Prompt {
+ constructor(opts = {}) {
+ super(opts);
+ this.msg = opts.message;
+ this.suggest = opts.suggest;
+ this.choices = opts.choices;
+ this.initial = typeof opts.initial === 'number' ? opts.initial : getIndex(opts.choices, opts.initial);
+ this.select = this.initial || opts.cursor || 0;
+ this.i18n = {
+ noMatches: opts.noMatches || 'no matches found'
+ };
+ this.fallback = opts.fallback || this.initial;
+ this.clearFirst = opts.clearFirst || false;
+ this.suggestions = [];
+ this.input = '';
+ this.limit = opts.limit || 10;
+ this.cursor = 0;
+ this.transform = style.render(opts.style);
+ this.scale = this.transform.scale;
+ this.render = this.render.bind(this);
+ this.complete = this.complete.bind(this);
+ this.clear = clear('', this.out.columns);
+ this.complete(this.render);
+ this.render();
+ }
+
+ set fallback(fb) {
+ this._fb = Number.isSafeInteger(parseInt(fb)) ? parseInt(fb) : fb;
+ }
+
+ get fallback() {
+ let choice;
+ if (typeof this._fb === 'number') choice = this.choices[this._fb];else if (typeof this._fb === 'string') choice = {
+ title: this._fb
+ };
+ return choice || this._fb || {
+ title: this.i18n.noMatches
+ };
+ }
+
+ moveSelect(i) {
+ this.select = i;
+ if (this.suggestions.length > 0) this.value = getVal(this.suggestions, i);else this.value = this.fallback.value;
+ this.fire();
+ }
+
+ complete(cb) {
+ var _this = this;
+
+ return _asyncToGenerator(function* () {
+ const p = _this.completing = _this.suggest(_this.input, _this.choices);
+
+ const suggestions = yield p;
+ if (_this.completing !== p) return;
+ _this.suggestions = suggestions.map((s, i, arr) => ({
+ title: getTitle(arr, i),
+ value: getVal(arr, i),
+ description: s.description
+ }));
+ _this.completing = false;
+ const l = Math.max(suggestions.length - 1, 0);
+
+ _this.moveSelect(Math.min(l, _this.select));
+
+ cb && cb();
+ })();
+ }
+
+ reset() {
+ this.input = '';
+ this.complete(() => {
+ this.moveSelect(this.initial !== void 0 ? this.initial : 0);
+ this.render();
+ });
+ this.render();
+ }
+
+ exit() {
+ if (this.clearFirst && this.input.length > 0) {
+ this.reset();
+ } else {
+ this.done = this.exited = true;
+ this.aborted = false;
+ this.fire();
+ this.render();
+ this.out.write('\n');
+ this.close();
+ }
+ }
+
+ abort() {
+ this.done = this.aborted = true;
+ this.exited = false;
+ this.fire();
+ this.render();
+ this.out.write('\n');
+ this.close();
+ }
+
+ submit() {
+ this.done = true;
+ this.aborted = this.exited = false;
+ this.fire();
+ this.render();
+ this.out.write('\n');
+ this.close();
+ }
+
+ _(c, key) {
+ let s1 = this.input.slice(0, this.cursor);
+ let s2 = this.input.slice(this.cursor);
+ this.input = `${s1}${c}${s2}`;
+ this.cursor = s1.length + 1;
+ this.complete(this.render);
+ this.render();
+ }
+
+ delete() {
+ if (this.cursor === 0) return this.bell();
+ let s1 = this.input.slice(0, this.cursor - 1);
+ let s2 = this.input.slice(this.cursor);
+ this.input = `${s1}${s2}`;
+ this.complete(this.render);
+ this.cursor = this.cursor - 1;
+ this.render();
+ }
+
+ deleteForward() {
+ if (this.cursor * this.scale >= this.rendered.length) return this.bell();
+ let s1 = this.input.slice(0, this.cursor);
+ let s2 = this.input.slice(this.cursor + 1);
+ this.input = `${s1}${s2}`;
+ this.complete(this.render);
+ this.render();
+ }
+
+ first() {
+ this.moveSelect(0);
+ this.render();
+ }
+
+ last() {
+ this.moveSelect(this.suggestions.length - 1);
+ this.render();
+ }
+
+ up() {
+ if (this.select === 0) {
+ this.moveSelect(this.suggestions.length - 1);
+ } else {
+ this.moveSelect(this.select - 1);
+ }
+
+ this.render();
+ }
+
+ down() {
+ if (this.select === this.suggestions.length - 1) {
+ this.moveSelect(0);
+ } else {
+ this.moveSelect(this.select + 1);
+ }
+
+ this.render();
+ }
+
+ next() {
+ if (this.select === this.suggestions.length - 1) {
+ this.moveSelect(0);
+ } else this.moveSelect(this.select + 1);
+
+ this.render();
+ }
+
+ nextPage() {
+ this.moveSelect(Math.min(this.select + this.limit, this.suggestions.length - 1));
+ this.render();
+ }
+
+ prevPage() {
+ this.moveSelect(Math.max(this.select - this.limit, 0));
+ this.render();
+ }
+
+ left() {
+ if (this.cursor <= 0) return this.bell();
+ this.cursor = this.cursor - 1;
+ this.render();
+ }
+
+ right() {
+ if (this.cursor * this.scale >= this.rendered.length) return this.bell();
+ this.cursor = this.cursor + 1;
+ this.render();
+ }
+
+ renderOption(v, hovered, isStart, isEnd) {
+ let desc;
+ let prefix = isStart ? figures.arrowUp : isEnd ? figures.arrowDown : ' ';
+ let title = hovered ? color.cyan().underline(v.title) : v.title;
+ prefix = (hovered ? color.cyan(figures.pointer) + ' ' : ' ') + prefix;
+
+ if (v.description) {
+ desc = ` - ${v.description}`;
+
+ if (prefix.length + title.length + desc.length >= this.out.columns || v.description.split(/\r?\n/).length > 1) {
+ desc = '\n' + wrap(v.description, {
+ margin: 3,
+ width: this.out.columns
+ });
+ }
+ }
+
+ return prefix + ' ' + title + color.gray(desc || '');
+ }
+
+ render() {
+ if (this.closed) return;
+ if (this.firstRender) this.out.write(cursor.hide);else this.out.write(clear(this.outputText, this.out.columns));
+ super.render();
+
+ let _entriesToDisplay = entriesToDisplay(this.select, this.choices.length, this.limit),
+ startIndex = _entriesToDisplay.startIndex,
+ endIndex = _entriesToDisplay.endIndex;
+
+ this.outputText = [style.symbol(this.done, this.aborted, this.exited), color.bold(this.msg), style.delimiter(this.completing), this.done && this.suggestions[this.select] ? this.suggestions[this.select].title : this.rendered = this.transform.render(this.input)].join(' ');
+
+ if (!this.done) {
+ const suggestions = this.suggestions.slice(startIndex, endIndex).map((item, i) => this.renderOption(item, this.select === i + startIndex, i === 0 && startIndex > 0, i + startIndex === endIndex - 1 && endIndex < this.choices.length)).join('\n');
+ this.outputText += `\n` + (suggestions || color.gray(this.fallback.title));
+ }
+
+ this.out.write(erase.line + cursor.to(0) + this.outputText);
+ }
+
+}
+
+module.exports = AutocompletePrompt; \ No newline at end of file
diff --git a/node_modules/prompts/dist/elements/autocompleteMultiselect.js b/node_modules/prompts/dist/elements/autocompleteMultiselect.js
new file mode 100644
index 0000000..ac4af0d
--- /dev/null
+++ b/node_modules/prompts/dist/elements/autocompleteMultiselect.js
@@ -0,0 +1,201 @@
+'use strict';
+
+const color = require('kleur');
+
+const _require = require('sisteransi'),
+ cursor = _require.cursor;
+
+const MultiselectPrompt = require('./multiselect');
+
+const _require2 = require('../util'),
+ clear = _require2.clear,
+ style = _require2.style,
+ figures = _require2.figures;
+/**
+ * MultiselectPrompt Base Element
+ * @param {Object} opts Options
+ * @param {String} opts.message Message
+ * @param {Array} opts.choices Array of choice objects
+ * @param {String} [opts.hint] Hint to display
+ * @param {String} [opts.warn] Hint shown for disabled choices
+ * @param {Number} [opts.max] Max choices
+ * @param {Number} [opts.cursor=0] Cursor start position
+ * @param {Stream} [opts.stdin] The Readable stream to listen to
+ * @param {Stream} [opts.stdout] The Writable stream to write readline data to
+ */
+
+
+class AutocompleteMultiselectPrompt extends MultiselectPrompt {
+ constructor(opts = {}) {
+ opts.overrideRender = true;
+ super(opts);
+ this.inputValue = '';
+ this.clear = clear('', this.out.columns);
+ this.filteredOptions = this.value;
+ this.render();
+ }
+
+ last() {
+ this.cursor = this.filteredOptions.length - 1;
+ this.render();
+ }
+
+ next() {
+ this.cursor = (this.cursor + 1) % this.filteredOptions.length;
+ this.render();
+ }
+
+ up() {
+ if (this.cursor === 0) {
+ this.cursor = this.filteredOptions.length - 1;
+ } else {
+ this.cursor--;
+ }
+
+ this.render();
+ }
+
+ down() {
+ if (this.cursor === this.filteredOptions.length - 1) {
+ this.cursor = 0;
+ } else {
+ this.cursor++;
+ }
+
+ this.render();
+ }
+
+ left() {
+ this.filteredOptions[this.cursor].selected = false;
+ this.render();
+ }
+
+ right() {
+ if (this.value.filter(e => e.selected).length >= this.maxChoices) return this.bell();
+ this.filteredOptions[this.cursor].selected = true;
+ this.render();
+ }
+
+ delete() {
+ if (this.inputValue.length) {
+ this.inputValue = this.inputValue.substr(0, this.inputValue.length - 1);
+ this.updateFilteredOptions();
+ }
+ }
+
+ updateFilteredOptions() {
+ const currentHighlight = this.filteredOptions[this.cursor];
+ this.filteredOptions = this.value.filter(v => {
+ if (this.inputValue) {
+ if (typeof v.title === 'string') {
+ if (v.title.toLowerCase().includes(this.inputValue.toLowerCase())) {
+ return true;
+ }
+ }
+
+ if (typeof v.value === 'string') {
+ if (v.value.toLowerCase().includes(this.inputValue.toLowerCase())) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ return true;
+ });
+ const newHighlightIndex = this.filteredOptions.findIndex(v => v === currentHighlight);
+ this.cursor = newHighlightIndex < 0 ? 0 : newHighlightIndex;
+ this.render();
+ }
+
+ handleSpaceToggle() {
+ const v = this.filteredOptions[this.cursor];
+
+ if (v.selected) {
+ v.selected = false;
+ this.render();
+ } else if (v.disabled || this.value.filter(e => e.selected).length >= this.maxChoices) {
+ return this.bell();
+ } else {
+ v.selected = true;
+ this.render();
+ }
+ }
+
+ handleInputChange(c) {
+ this.inputValue = this.inputValue + c;
+ this.updateFilteredOptions();
+ }
+
+ _(c, key) {
+ if (c === ' ') {
+ this.handleSpaceToggle();
+ } else {
+ this.handleInputChange(c);
+ }
+ }
+
+ renderInstructions() {
+ if (this.instructions === undefined || this.instructions) {
+ if (typeof this.instructions === 'string') {
+ return this.instructions;
+ }
+
+ return `
+Instructions:
+ ${figures.arrowUp}/${figures.arrowDown}: Highlight option
+ ${figures.arrowLeft}/${figures.arrowRight}/[space]: Toggle selection
+ [a,b,c]/delete: Filter choices
+ enter/return: Complete answer
+`;
+ }
+
+ return '';
+ }
+
+ renderCurrentInput() {
+ return `
+Filtered results for: ${this.inputValue ? this.inputValue : color.gray('Enter something to filter')}\n`;
+ }
+
+ renderOption(cursor, v, i) {
+ let title;
+ if (v.disabled) title = cursor === i ? color.gray().underline(v.title) : color.strikethrough().gray(v.title);else title = cursor === i ? color.cyan().underline(v.title) : v.title;
+ return (v.selected ? color.green(figures.radioOn) : figures.radioOff) + ' ' + title;
+ }
+
+ renderDoneOrInstructions() {
+ if (this.done) {
+ return this.value.filter(e => e.selected).map(v => v.title).join(', ');
+ }
+
+ const output = [color.gray(this.hint), this.renderInstructions(), this.renderCurrentInput()];
+
+ if (this.filteredOptions.length && this.filteredOptions[this.cursor].disabled) {
+ output.push(color.yellow(this.warn));
+ }
+
+ return output.join(' ');
+ }
+
+ render() {
+ if (this.closed) return;
+ if (this.firstRender) this.out.write(cursor.hide);
+ super.render(); // print prompt
+
+ let prompt = [style.symbol(this.done, this.aborted), color.bold(this.msg), style.delimiter(false), this.renderDoneOrInstructions()].join(' ');
+
+ if (this.showMinError) {
+ prompt += color.red(`You must select a minimum of ${this.minSelected} choices.`);
+ this.showMinError = false;
+ }
+
+ prompt += this.renderOptions(this.filteredOptions);
+ this.out.write(this.clear + prompt);
+ this.clear = clear(prompt, this.out.columns);
+ }
+
+}
+
+module.exports = AutocompleteMultiselectPrompt; \ No newline at end of file
diff --git a/node_modules/prompts/dist/elements/confirm.js b/node_modules/prompts/dist/elements/confirm.js
new file mode 100644
index 0000000..6c342d2
--- /dev/null
+++ b/node_modules/prompts/dist/elements/confirm.js
@@ -0,0 +1,93 @@
+"use strict";
+
+const color = require('kleur');
+
+const Prompt = require('./prompt');
+
+const _require = require('../util'),
+ style = _require.style,
+ clear = _require.clear;
+
+const _require2 = require('sisteransi'),
+ erase = _require2.erase,
+ cursor = _require2.cursor;
+/**
+ * ConfirmPrompt Base Element
+ * @param {Object} opts Options
+ * @param {String} opts.message Message
+ * @param {Boolean} [opts.initial] Default value (true/false)
+ * @param {Stream} [opts.stdin] The Readable stream to listen to
+ * @param {Stream} [opts.stdout] The Writable stream to write readline data to
+ * @param {String} [opts.yes] The "Yes" label
+ * @param {String} [opts.yesOption] The "Yes" option when choosing between yes/no
+ * @param {String} [opts.no] The "No" label
+ * @param {String} [opts.noOption] The "No" option when choosing between yes/no
+ */
+
+
+class ConfirmPrompt extends Prompt {
+ constructor(opts = {}) {
+ super(opts);
+ this.msg = opts.message;
+ this.value = opts.initial;
+ this.initialValue = !!opts.initial;
+ this.yesMsg = opts.yes || 'yes';
+ this.yesOption = opts.yesOption || '(Y/n)';
+ this.noMsg = opts.no || 'no';
+ this.noOption = opts.noOption || '(y/N)';
+ this.render();
+ }
+
+ reset() {
+ this.value = this.initialValue;
+ this.fire();
+ this.render();
+ }
+
+ exit() {
+ this.abort();
+ }
+
+ abort() {
+ this.done = this.aborted = true;
+ this.fire();
+ this.render();
+ this.out.write('\n');
+ this.close();
+ }
+
+ submit() {
+ this.value = this.value || false;
+ this.done = true;
+ this.aborted = false;
+ this.fire();
+ this.render();
+ this.out.write('\n');
+ this.close();
+ }
+
+ _(c, key) {
+ if (c.toLowerCase() === 'y') {
+ this.value = true;
+ return this.submit();
+ }
+
+ if (c.toLowerCase() === 'n') {
+ this.value = false;
+ return this.submit();
+ }
+
+ return this.bell();
+ }
+
+ render() {
+ if (this.closed) return;
+ if (this.firstRender) this.out.write(cursor.hide);else this.out.write(clear(this.outputText, this.out.columns));
+ super.render();
+ this.outputText = [style.symbol(this.done, this.aborted), color.bold(this.msg), style.delimiter(this.done), this.done ? this.value ? this.yesMsg : this.noMsg : color.gray(this.initialValue ? this.yesOption : this.noOption)].join(' ');
+ this.out.write(erase.line + cursor.to(0) + this.outputText);
+ }
+
+}
+
+module.exports = ConfirmPrompt; \ No newline at end of file
diff --git a/node_modules/prompts/dist/elements/date.js b/node_modules/prompts/dist/elements/date.js
new file mode 100644
index 0000000..0b254f8
--- /dev/null
+++ b/node_modules/prompts/dist/elements/date.js
@@ -0,0 +1,250 @@
+'use strict';
+
+function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
+
+function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
+
+const color = require('kleur');
+
+const Prompt = require('./prompt');
+
+const _require = require('../util'),
+ style = _require.style,
+ clear = _require.clear,
+ figures = _require.figures;
+
+const _require2 = require('sisteransi'),
+ erase = _require2.erase,
+ cursor = _require2.cursor;
+
+const _require3 = require('../dateparts'),
+ DatePart = _require3.DatePart,
+ Meridiem = _require3.Meridiem,
+ Day = _require3.Day,
+ Hours = _require3.Hours,
+ Milliseconds = _require3.Milliseconds,
+ Minutes = _require3.Minutes,
+ Month = _require3.Month,
+ Seconds = _require3.Seconds,
+ Year = _require3.Year;
+
+const regex = /\\(.)|"((?:\\["\\]|[^"])+)"|(D[Do]?|d{3,4}|d)|(M{1,4})|(YY(?:YY)?)|([aA])|([Hh]{1,2})|(m{1,2})|(s{1,2})|(S{1,4})|./g;
+const regexGroups = {
+ 1: ({
+ token
+ }) => token.replace(/\\(.)/g, '$1'),
+ 2: opts => new Day(opts),
+ // Day // TODO
+ 3: opts => new Month(opts),
+ // Month
+ 4: opts => new Year(opts),
+ // Year
+ 5: opts => new Meridiem(opts),
+ // AM/PM // TODO (special)
+ 6: opts => new Hours(opts),
+ // Hours
+ 7: opts => new Minutes(opts),
+ // Minutes
+ 8: opts => new Seconds(opts),
+ // Seconds
+ 9: opts => new Milliseconds(opts) // Fractional seconds
+
+};
+const dfltLocales = {
+ months: 'January,February,March,April,May,June,July,August,September,October,November,December'.split(','),
+ monthsShort: 'Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec'.split(','),
+ weekdays: 'Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday'.split(','),
+ weekdaysShort: 'Sun,Mon,Tue,Wed,Thu,Fri,Sat'.split(',')
+};
+/**
+ * DatePrompt Base Element
+ * @param {Object} opts Options
+ * @param {String} opts.message Message
+ * @param {Number} [opts.initial] Index of default value
+ * @param {String} [opts.mask] The format mask
+ * @param {object} [opts.locales] The date locales
+ * @param {String} [opts.error] The error message shown on invalid value
+ * @param {Function} [opts.validate] Function to validate the submitted value
+ * @param {Stream} [opts.stdin] The Readable stream to listen to
+ * @param {Stream} [opts.stdout] The Writable stream to write readline data to
+ */
+
+class DatePrompt extends Prompt {
+ constructor(opts = {}) {
+ super(opts);
+ this.msg = opts.message;
+ this.cursor = 0;
+ this.typed = '';
+ this.locales = Object.assign(dfltLocales, opts.locales);
+ this._date = opts.initial || new Date();
+ this.errorMsg = opts.error || 'Please Enter A Valid Value';
+
+ this.validator = opts.validate || (() => true);
+
+ this.mask = opts.mask || 'YYYY-MM-DD HH:mm:ss';
+ this.clear = clear('', this.out.columns);
+ this.render();
+ }
+
+ get value() {
+ return this.date;
+ }
+
+ get date() {
+ return this._date;
+ }
+
+ set date(date) {
+ if (date) this._date.setTime(date.getTime());
+ }
+
+ set mask(mask) {
+ let result;
+ this.parts = [];
+
+ while (result = regex.exec(mask)) {
+ let match = result.shift();
+ let idx = result.findIndex(gr => gr != null);
+ this.parts.push(idx in regexGroups ? regexGroups[idx]({
+ token: result[idx] || match,
+ date: this.date,
+ parts: this.parts,
+ locales: this.locales
+ }) : result[idx] || match);
+ }
+
+ let parts = this.parts.reduce((arr, i) => {
+ if (typeof i === 'string' && typeof arr[arr.length - 1] === 'string') arr[arr.length - 1] += i;else arr.push(i);
+ return arr;
+ }, []);
+ this.parts.splice(0);
+ this.parts.push(...parts);
+ this.reset();
+ }
+
+ moveCursor(n) {
+ this.typed = '';
+ this.cursor = n;
+ this.fire();
+ }
+
+ reset() {
+ this.moveCursor(this.parts.findIndex(p => p instanceof DatePart));
+ this.fire();
+ this.render();
+ }
+
+ exit() {
+ this.abort();
+ }
+
+ abort() {
+ this.done = this.aborted = true;
+ this.error = false;
+ this.fire();
+ this.render();
+ this.out.write('\n');
+ this.close();
+ }
+
+ validate() {
+ var _this = this;
+
+ return _asyncToGenerator(function* () {
+ let valid = yield _this.validator(_this.value);
+
+ if (typeof valid === 'string') {
+ _this.errorMsg = valid;
+ valid = false;
+ }
+
+ _this.error = !valid;
+ })();
+ }
+
+ submit() {
+ var _this2 = this;
+
+ return _asyncToGenerator(function* () {
+ yield _this2.validate();
+
+ if (_this2.error) {
+ _this2.color = 'red';
+
+ _this2.fire();
+
+ _this2.render();
+
+ return;
+ }
+
+ _this2.done = true;
+ _this2.aborted = false;
+
+ _this2.fire();
+
+ _this2.render();
+
+ _this2.out.write('\n');
+
+ _this2.close();
+ })();
+ }
+
+ up() {
+ this.typed = '';
+ this.parts[this.cursor].up();
+ this.render();
+ }
+
+ down() {
+ this.typed = '';
+ this.parts[this.cursor].down();
+ this.render();
+ }
+
+ left() {
+ let prev = this.parts[this.cursor].prev();
+ if (prev == null) return this.bell();
+ this.moveCursor(this.parts.indexOf(prev));
+ this.render();
+ }
+
+ right() {
+ let next = this.parts[this.cursor].next();
+ if (next == null) return this.bell();
+ this.moveCursor(this.parts.indexOf(next));
+ this.render();
+ }
+
+ next() {
+ let next = this.parts[this.cursor].next();
+ this.moveCursor(next ? this.parts.indexOf(next) : this.parts.findIndex(part => part instanceof DatePart));
+ this.render();
+ }
+
+ _(c) {
+ if (/\d/.test(c)) {
+ this.typed += c;
+ this.parts[this.cursor].setTo(this.typed);
+ this.render();
+ }
+ }
+
+ render() {
+ if (this.closed) return;
+ if (this.firstRender) this.out.write(cursor.hide);else this.out.write(clear(this.outputText, this.out.columns));
+ super.render(); // Print prompt
+
+ this.outputText = [style.symbol(this.done, this.aborted), color.bold(this.msg), style.delimiter(false), this.parts.reduce((arr, p, idx) => arr.concat(idx === this.cursor && !this.done ? color.cyan().underline(p.toString()) : p), []).join('')].join(' '); // Print error
+
+ if (this.error) {
+ this.outputText += this.errorMsg.split('\n').reduce((a, l, i) => a + `\n${i ? ` ` : figures.pointerSmall} ${color.red().italic(l)}`, ``);
+ }
+
+ this.out.write(erase.line + cursor.to(0) + this.outputText);
+ }
+
+}
+
+module.exports = DatePrompt; \ No newline at end of file
diff --git a/node_modules/prompts/dist/elements/index.js b/node_modules/prompts/dist/elements/index.js
new file mode 100644
index 0000000..cf0ccc1
--- /dev/null
+++ b/node_modules/prompts/dist/elements/index.js
@@ -0,0 +1,13 @@
+'use strict';
+
+module.exports = {
+ TextPrompt: require('./text'),
+ SelectPrompt: require('./select'),
+ TogglePrompt: require('./toggle'),
+ DatePrompt: require('./date'),
+ NumberPrompt: require('./number'),
+ MultiselectPrompt: require('./multiselect'),
+ AutocompletePrompt: require('./autocomplete'),
+ AutocompleteMultiselectPrompt: require('./autocompleteMultiselect'),
+ ConfirmPrompt: require('./confirm')
+}; \ No newline at end of file
diff --git a/node_modules/prompts/dist/elements/multiselect.js b/node_modules/prompts/dist/elements/multiselect.js
new file mode 100644
index 0000000..2d129ea
--- /dev/null
+++ b/node_modules/prompts/dist/elements/multiselect.js
@@ -0,0 +1,289 @@
+'use strict';
+
+const color = require('kleur');
+
+const _require = require('sisteransi'),
+ cursor = _require.cursor;
+
+const Prompt = require('./prompt');
+
+const _require2 = require('../util'),
+ clear = _require2.clear,
+ figures = _require2.figures,
+ style = _require2.style,
+ wrap = _require2.wrap,
+ entriesToDisplay = _require2.entriesToDisplay;
+/**
+ * MultiselectPrompt Base Element
+ * @param {Object} opts Options
+ * @param {String} opts.message Message
+ * @param {Array} opts.choices Array of choice objects
+ * @param {String} [opts.hint] Hint to display
+ * @param {String} [opts.warn] Hint shown for disabled choices
+ * @param {Number} [opts.max] Max choices
+ * @param {Number} [opts.cursor=0] Cursor start position
+ * @param {Number} [opts.optionsPerPage=10] Max options to display at once
+ * @param {Stream} [opts.stdin] The Readable stream to listen to
+ * @param {Stream} [opts.stdout] The Writable stream to write readline data to
+ */
+
+
+class MultiselectPrompt extends Prompt {
+ constructor(opts = {}) {
+ super(opts);
+ this.msg = opts.message;
+ this.cursor = opts.cursor || 0;
+ this.scrollIndex = opts.cursor || 0;
+ this.hint = opts.hint || '';
+ this.warn = opts.warn || '- This option is disabled -';
+ this.minSelected = opts.min;
+ this.showMinError = false;
+ this.maxChoices = opts.max;
+ this.instructions = opts.instructions;
+ this.optionsPerPage = opts.optionsPerPage || 10;
+ this.value = opts.choices.map((ch, idx) => {
+ if (typeof ch === 'string') ch = {
+ title: ch,
+ value: idx
+ };
+ return {
+ title: ch && (ch.title || ch.value || ch),
+ description: ch && ch.description,
+ value: ch && (ch.value === undefined ? idx : ch.value),
+ selected: ch && ch.selected,
+ disabled: ch && ch.disabled
+ };
+ });
+ this.clear = clear('', this.out.columns);
+
+ if (!opts.overrideRender) {
+ this.render();
+ }
+ }
+
+ reset() {
+ this.value.map(v => !v.selected);
+ this.cursor = 0;
+ this.fire();
+ this.render();
+ }
+
+ selected() {
+ return this.value.filter(v => v.selected);
+ }
+
+ exit() {
+ this.abort();
+ }
+
+ abort() {
+ this.done = this.aborted = true;
+ this.fire();
+ this.render();
+ this.out.write('\n');
+ this.close();
+ }
+
+ submit() {
+ const selected = this.value.filter(e => e.selected);
+
+ if (this.minSelected && selected.length < this.minSelected) {
+ this.showMinError = true;
+ this.render();
+ } else {
+ this.done = true;
+ this.aborted = false;
+ this.fire();
+ this.render();
+ this.out.write('\n');
+ this.close();
+ }
+ }
+
+ first() {
+ this.cursor = 0;
+ this.render();
+ }
+
+ last() {
+ this.cursor = this.value.length - 1;
+ this.render();
+ }
+
+ next() {
+ this.cursor = (this.cursor + 1) % this.value.length;
+ this.render();
+ }
+
+ up() {
+ if (this.cursor === 0) {
+ this.cursor = this.value.length - 1;
+ } else {
+ this.cursor--;
+ }
+
+ this.render();
+ }
+
+ down() {
+ if (this.cursor === this.value.length - 1) {
+ this.cursor = 0;
+ } else {
+ this.cursor++;
+ }
+
+ this.render();
+ }
+
+ left() {
+ this.value[this.cursor].selected = false;
+ this.render();
+ }
+
+ right() {
+ if (this.value.filter(e => e.selected).length >= this.maxChoices) return this.bell();
+ this.value[this.cursor].selected = true;
+ this.render();
+ }
+
+ handleSpaceToggle() {
+ const v = this.value[this.cursor];
+
+ if (v.selected) {
+ v.selected = false;
+ this.render();
+ } else if (v.disabled || this.value.filter(e => e.selected).length >= this.maxChoices) {
+ return this.bell();
+ } else {
+ v.selected = true;
+ this.render();
+ }
+ }
+
+ toggleAll() {
+ if (this.maxChoices !== undefined || this.value[this.cursor].disabled) {
+ return this.bell();
+ }
+
+ const newSelected = !this.value[this.cursor].selected;
+ this.value.filter(v => !v.disabled).forEach(v => v.selected = newSelected);
+ this.render();
+ }
+
+ _(c, key) {
+ if (c === ' ') {
+ this.handleSpaceToggle();
+ } else if (c === 'a') {
+ this.toggleAll();
+ } else {
+ return this.bell();
+ }
+ }
+
+ renderInstructions() {
+ if (this.instructions === undefined || this.instructions) {
+ if (typeof this.instructions === 'string') {
+ return this.instructions;
+ }
+
+ return '\nInstructions:\n' + ` ${figures.arrowUp}/${figures.arrowDown}: Highlight option\n` + ` ${figures.arrowLeft}/${figures.arrowRight}/[space]: Toggle selection\n` + (this.maxChoices === undefined ? ` a: Toggle all\n` : '') + ` enter/return: Complete answer`;
+ }
+
+ return '';
+ }
+
+ renderOption(cursor, v, i, arrowIndicator) {
+ const prefix = (v.selected ? color.green(figures.radioOn) : figures.radioOff) + ' ' + arrowIndicator + ' ';
+ let title, desc;
+
+ if (v.disabled) {
+ title = cursor === i ? color.gray().underline(v.title) : color.strikethrough().gray(v.title);
+ } else {
+ title = cursor === i ? color.cyan().underline(v.title) : v.title;
+
+ if (cursor === i && v.description) {
+ desc = ` - ${v.description}`;
+
+ if (prefix.length + title.length + desc.length >= this.out.columns || v.description.split(/\r?\n/).length > 1) {
+ desc = '\n' + wrap(v.description, {
+ margin: prefix.length,
+ width: this.out.columns
+ });
+ }
+ }
+ }
+
+ return prefix + title + color.gray(desc || '');
+ } // shared with autocompleteMultiselect
+
+
+ paginateOptions(options) {
+ if (options.length === 0) {
+ return color.red('No matches for this query.');
+ }
+
+ let _entriesToDisplay = entriesToDisplay(this.cursor, options.length, this.optionsPerPage),
+ startIndex = _entriesToDisplay.startIndex,
+ endIndex = _entriesToDisplay.endIndex;
+
+ let prefix,
+ styledOptions = [];
+
+ for (let i = startIndex; i < endIndex; i++) {
+ if (i === startIndex && startIndex > 0) {
+ prefix = figures.arrowUp;
+ } else if (i === endIndex - 1 && endIndex < options.length) {
+ prefix = figures.arrowDown;
+ } else {
+ prefix = ' ';
+ }
+
+ styledOptions.push(this.renderOption(this.cursor, options[i], i, prefix));
+ }
+
+ return '\n' + styledOptions.join('\n');
+ } // shared with autocomleteMultiselect
+
+
+ renderOptions(options) {
+ if (!this.done) {
+ return this.paginateOptions(options);
+ }
+
+ return '';
+ }
+
+ renderDoneOrInstructions() {
+ if (this.done) {
+ return this.value.filter(e => e.selected).map(v => v.title).join(', ');
+ }
+
+ const output = [color.gray(this.hint), this.renderInstructions()];
+
+ if (this.value[this.cursor].disabled) {
+ output.push(color.yellow(this.warn));
+ }
+
+ return output.join(' ');
+ }
+
+ render() {
+ if (this.closed) return;
+ if (this.firstRender) this.out.write(cursor.hide);
+ super.render(); // print prompt
+
+ let prompt = [style.symbol(this.done, this.aborted), color.bold(this.msg), style.delimiter(false), this.renderDoneOrInstructions()].join(' ');
+
+ if (this.showMinError) {
+ prompt += color.red(`You must select a minimum of ${this.minSelected} choices.`);
+ this.showMinError = false;
+ }
+
+ prompt += this.renderOptions(this.value);
+ this.out.write(this.clear + prompt);
+ this.clear = clear(prompt, this.out.columns);
+ }
+
+}
+
+module.exports = MultiselectPrompt; \ No newline at end of file
diff --git a/node_modules/prompts/dist/elements/number.js b/node_modules/prompts/dist/elements/number.js
new file mode 100644
index 0000000..fd144af
--- /dev/null
+++ b/node_modules/prompts/dist/elements/number.js
@@ -0,0 +1,250 @@
+"use strict";
+
+function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
+
+function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
+
+const color = require('kleur');
+
+const Prompt = require('./prompt');
+
+const _require = require('sisteransi'),
+ cursor = _require.cursor,
+ erase = _require.erase;
+
+const _require2 = require('../util'),
+ style = _require2.style,
+ figures = _require2.figures,
+ clear = _require2.clear,
+ lines = _require2.lines;
+
+const isNumber = /[0-9]/;
+
+const isDef = any => any !== undefined;
+
+const round = (number, precision) => {
+ let factor = Math.pow(10, precision);
+ return Math.round(number * factor) / factor;
+};
+/**
+ * NumberPrompt Base Element
+ * @param {Object} opts Options
+ * @param {String} opts.message Message
+ * @param {String} [opts.style='default'] Render style
+ * @param {Number} [opts.initial] Default value
+ * @param {Number} [opts.max=+Infinity] Max value
+ * @param {Number} [opts.min=-Infinity] Min value
+ * @param {Boolean} [opts.float=false] Parse input as floats
+ * @param {Number} [opts.round=2] Round floats to x decimals
+ * @param {Number} [opts.increment=1] Number to increment by when using arrow-keys
+ * @param {Function} [opts.validate] Validate function
+ * @param {Stream} [opts.stdin] The Readable stream to listen to
+ * @param {Stream} [opts.stdout] The Writable stream to write readline data to
+ * @param {String} [opts.error] The invalid error label
+ */
+
+
+class NumberPrompt extends Prompt {
+ constructor(opts = {}) {
+ super(opts);
+ this.transform = style.render(opts.style);
+ this.msg = opts.message;
+ this.initial = isDef(opts.initial) ? opts.initial : '';
+ this.float = !!opts.float;
+ this.round = opts.round || 2;
+ this.inc = opts.increment || 1;
+ this.min = isDef(opts.min) ? opts.min : -Infinity;
+ this.max = isDef(opts.max) ? opts.max : Infinity;
+ this.errorMsg = opts.error || `Please Enter A Valid Value`;
+
+ this.validator = opts.validate || (() => true);
+
+ this.color = `cyan`;
+ this.value = ``;
+ this.typed = ``;
+ this.lastHit = 0;
+ this.render();
+ }
+
+ set value(v) {
+ if (!v && v !== 0) {
+ this.placeholder = true;
+ this.rendered = color.gray(this.transform.render(`${this.initial}`));
+ this._value = ``;
+ } else {
+ this.placeholder = false;
+ this.rendered = this.transform.render(`${round(v, this.round)}`);
+ this._value = round(v, this.round);
+ }
+
+ this.fire();
+ }
+
+ get value() {
+ return this._value;
+ }
+
+ parse(x) {
+ return this.float ? parseFloat(x) : parseInt(x);
+ }
+
+ valid(c) {
+ return c === `-` || c === `.` && this.float || isNumber.test(c);
+ }
+
+ reset() {
+ this.typed = ``;
+ this.value = ``;
+ this.fire();
+ this.render();
+ }
+
+ exit() {
+ this.abort();
+ }
+
+ abort() {
+ let x = this.value;
+ this.value = x !== `` ? x : this.initial;
+ this.done = this.aborted = true;
+ this.error = false;
+ this.fire();
+ this.render();
+ this.out.write(`\n`);
+ this.close();
+ }
+
+ validate() {
+ var _this = this;
+
+ return _asyncToGenerator(function* () {
+ let valid = yield _this.validator(_this.value);
+
+ if (typeof valid === `string`) {
+ _this.errorMsg = valid;
+ valid = false;
+ }
+
+ _this.error = !valid;
+ })();
+ }
+
+ submit() {
+ var _this2 = this;
+
+ return _asyncToGenerator(function* () {
+ yield _this2.validate();
+
+ if (_this2.error) {
+ _this2.color = `red`;
+
+ _this2.fire();
+
+ _this2.render();
+
+ return;
+ }
+
+ let x = _this2.value;
+ _this2.value = x !== `` ? x : _this2.initial;
+ _this2.done = true;
+ _this2.aborted = false;
+ _this2.error = false;
+
+ _this2.fire();
+
+ _this2.render();
+
+ _this2.out.write(`\n`);
+
+ _this2.close();
+ })();
+ }
+
+ up() {
+ this.typed = ``;
+
+ if (this.value === '') {
+ this.value = this.min - this.inc;
+ }
+
+ if (this.value >= this.max) return this.bell();
+ this.value += this.inc;
+ this.color = `cyan`;
+ this.fire();
+ this.render();
+ }
+
+ down() {
+ this.typed = ``;
+
+ if (this.value === '') {
+ this.value = this.min + this.inc;
+ }
+
+ if (this.value <= this.min) return this.bell();
+ this.value -= this.inc;
+ this.color = `cyan`;
+ this.fire();
+ this.render();
+ }
+
+ delete() {
+ let val = this.value.toString();
+ if (val.length === 0) return this.bell();
+ this.value = this.parse(val = val.slice(0, -1)) || ``;
+
+ if (this.value !== '' && this.value < this.min) {
+ this.value = this.min;
+ }
+
+ this.color = `cyan`;
+ this.fire();
+ this.render();
+ }
+
+ next() {
+ this.value = this.initial;
+ this.fire();
+ this.render();
+ }
+
+ _(c, key) {
+ if (!this.valid(c)) return this.bell();
+ const now = Date.now();
+ if (now - this.lastHit > 1000) this.typed = ``; // 1s elapsed
+
+ this.typed += c;
+ this.lastHit = now;
+ this.color = `cyan`;
+ if (c === `.`) return this.fire();
+ this.value = Math.min(this.parse(this.typed), this.max);
+ if (this.value > this.max) this.value = this.max;
+ if (this.value < this.min) this.value = this.min;
+ this.fire();
+ this.render();
+ }
+
+ render() {
+ if (this.closed) return;
+
+ if (!this.firstRender) {
+ if (this.outputError) this.out.write(cursor.down(lines(this.outputError, this.out.columns) - 1) + clear(this.outputError, this.out.columns));
+ this.out.write(clear(this.outputText, this.out.columns));
+ }
+
+ super.render();
+ this.outputError = ''; // Print prompt
+
+ this.outputText = [style.symbol(this.done, this.aborted), color.bold(this.msg), style.delimiter(this.done), !this.done || !this.done && !this.placeholder ? color[this.color]().underline(this.rendered) : this.rendered].join(` `); // Print error
+
+ if (this.error) {
+ this.outputError += this.errorMsg.split(`\n`).reduce((a, l, i) => a + `\n${i ? ` ` : figures.pointerSmall} ${color.red().italic(l)}`, ``);
+ }
+
+ this.out.write(erase.line + cursor.to(0) + this.outputText + cursor.save + this.outputError + cursor.restore);
+ }
+
+}
+
+module.exports = NumberPrompt; \ No newline at end of file
diff --git a/node_modules/prompts/dist/elements/prompt.js b/node_modules/prompts/dist/elements/prompt.js
new file mode 100644
index 0000000..7deef04
--- /dev/null
+++ b/node_modules/prompts/dist/elements/prompt.js
@@ -0,0 +1,82 @@
+'use strict';
+
+const readline = require('readline');
+
+const _require = require('../util'),
+ action = _require.action;
+
+const EventEmitter = require('events');
+
+const _require2 = require('sisteransi'),
+ beep = _require2.beep,
+ cursor = _require2.cursor;
+
+const color = require('kleur');
+/**
+ * Base prompt skeleton
+ * @param {Stream} [opts.stdin] The Readable stream to listen to
+ * @param {Stream} [opts.stdout] The Writable stream to write readline data to
+ */
+
+
+class Prompt extends EventEmitter {
+ constructor(opts = {}) {
+ super();
+ this.firstRender = true;
+ this.in = opts.stdin || process.stdin;
+ this.out = opts.stdout || process.stdout;
+
+ this.onRender = (opts.onRender || (() => void 0)).bind(this);
+
+ const rl = readline.createInterface({
+ input: this.in,
+ escapeCodeTimeout: 50
+ });
+ readline.emitKeypressEvents(this.in, rl);
+ if (this.in.isTTY) this.in.setRawMode(true);
+ const isSelect = ['SelectPrompt', 'MultiselectPrompt'].indexOf(this.constructor.name) > -1;
+
+ const keypress = (str, key) => {
+ let a = action(key, isSelect);
+
+ if (a === false) {
+ this._ && this._(str, key);
+ } else if (typeof this[a] === 'function') {
+ this[a](key);
+ } else {
+ this.bell();
+ }
+ };
+
+ this.close = () => {
+ this.out.write(cursor.show);
+ this.in.removeListener('keypress', keypress);
+ if (this.in.isTTY) this.in.setRawMode(false);
+ rl.close();
+ this.emit(this.aborted ? 'abort' : this.exited ? 'exit' : 'submit', this.value);
+ this.closed = true;
+ };
+
+ this.in.on('keypress', keypress);
+ }
+
+ fire() {
+ this.emit('state', {
+ value: this.value,
+ aborted: !!this.aborted,
+ exited: !!this.exited
+ });
+ }
+
+ bell() {
+ this.out.write(beep);
+ }
+
+ render() {
+ this.onRender(color);
+ if (this.firstRender) this.firstRender = false;
+ }
+
+}
+
+module.exports = Prompt; \ No newline at end of file
diff --git a/node_modules/prompts/dist/elements/select.js b/node_modules/prompts/dist/elements/select.js
new file mode 100644
index 0000000..5e27c69
--- /dev/null
+++ b/node_modules/prompts/dist/elements/select.js
@@ -0,0 +1,190 @@
+'use strict';
+
+const color = require('kleur');
+
+const Prompt = require('./prompt');
+
+const _require = require('../util'),
+ style = _require.style,
+ clear = _require.clear,
+ figures = _require.figures,
+ wrap = _require.wrap,
+ entriesToDisplay = _require.entriesToDisplay;
+
+const _require2 = require('sisteransi'),
+ cursor = _require2.cursor;
+/**
+ * SelectPrompt Base Element
+ * @param {Object} opts Options
+ * @param {String} opts.message Message
+ * @param {Array} opts.choices Array of choice objects
+ * @param {String} [opts.hint] Hint to display
+ * @param {Number} [opts.initial] Index of default value
+ * @param {Stream} [opts.stdin] The Readable stream to listen to
+ * @param {Stream} [opts.stdout] The Writable stream to write readline data to
+ * @param {Number} [opts.optionsPerPage=10] Max options to display at once
+ */
+
+
+class SelectPrompt extends Prompt {
+ constructor(opts = {}) {
+ super(opts);
+ this.msg = opts.message;
+ this.hint = opts.hint || '- Use arrow-keys. Return to submit.';
+ this.warn = opts.warn || '- This option is disabled';
+ this.cursor = opts.initial || 0;
+ this.choices = opts.choices.map((ch, idx) => {
+ if (typeof ch === 'string') ch = {
+ title: ch,
+ value: idx
+ };
+ return {
+ title: ch && (ch.title || ch.value || ch),
+ value: ch && (ch.value === undefined ? idx : ch.value),
+ description: ch && ch.description,
+ selected: ch && ch.selected,
+ disabled: ch && ch.disabled
+ };
+ });
+ this.optionsPerPage = opts.optionsPerPage || 10;
+ this.value = (this.choices[this.cursor] || {}).value;
+ this.clear = clear('', this.out.columns);
+ this.render();
+ }
+
+ moveCursor(n) {
+ this.cursor = n;
+ this.value = this.choices[n].value;
+ this.fire();
+ }
+
+ reset() {
+ this.moveCursor(0);
+ this.fire();
+ this.render();
+ }
+
+ exit() {
+ this.abort();
+ }
+
+ abort() {
+ this.done = this.aborted = true;
+ this.fire();
+ this.render();
+ this.out.write('\n');
+ this.close();
+ }
+
+ submit() {
+ if (!this.selection.disabled) {
+ this.done = true;
+ this.aborted = false;
+ this.fire();
+ this.render();
+ this.out.write('\n');
+ this.close();
+ } else this.bell();
+ }
+
+ first() {
+ this.moveCursor(0);
+ this.render();
+ }
+
+ last() {
+ this.moveCursor(this.choices.length - 1);
+ this.render();
+ }
+
+ up() {
+ if (this.cursor === 0) {
+ this.moveCursor(this.choices.length - 1);
+ } else {
+ this.moveCursor(this.cursor - 1);
+ }
+
+ this.render();
+ }
+
+ down() {
+ if (this.cursor === this.choices.length - 1) {
+ this.moveCursor(0);
+ } else {
+ this.moveCursor(this.cursor + 1);
+ }
+
+ this.render();
+ }
+
+ next() {
+ this.moveCursor((this.cursor + 1) % this.choices.length);
+ this.render();
+ }
+
+ _(c, key) {
+ if (c === ' ') return this.submit();
+ }
+
+ get selection() {
+ return this.choices[this.cursor];
+ }
+
+ render() {
+ if (this.closed) return;
+ if (this.firstRender) this.out.write(cursor.hide);else this.out.write(clear(this.outputText, this.out.columns));
+ super.render();
+
+ let _entriesToDisplay = entriesToDisplay(this.cursor, this.choices.length, this.optionsPerPage),
+ startIndex = _entriesToDisplay.startIndex,
+ endIndex = _entriesToDisplay.endIndex; // Print prompt
+
+
+ this.outputText = [style.symbol(this.done, this.aborted), color.bold(this.msg), style.delimiter(false), this.done ? this.selection.title : this.selection.disabled ? color.yellow(this.warn) : color.gray(this.hint)].join(' '); // Print choices
+
+ if (!this.done) {
+ this.outputText += '\n';
+
+ for (let i = startIndex; i < endIndex; i++) {
+ let title,
+ prefix,
+ desc = '',
+ v = this.choices[i]; // Determine whether to display "more choices" indicators
+
+ if (i === startIndex && startIndex > 0) {
+ prefix = figures.arrowUp;
+ } else if (i === endIndex - 1 && endIndex < this.choices.length) {
+ prefix = figures.arrowDown;
+ } else {
+ prefix = ' ';
+ }
+
+ if (v.disabled) {
+ title = this.cursor === i ? color.gray().underline(v.title) : color.strikethrough().gray(v.title);
+ prefix = (this.cursor === i ? color.bold().gray(figures.pointer) + ' ' : ' ') + prefix;
+ } else {
+ title = this.cursor === i ? color.cyan().underline(v.title) : v.title;
+ prefix = (this.cursor === i ? color.cyan(figures.pointer) + ' ' : ' ') + prefix;
+
+ if (v.description && this.cursor === i) {
+ desc = ` - ${v.description}`;
+
+ if (prefix.length + title.length + desc.length >= this.out.columns || v.description.split(/\r?\n/).length > 1) {
+ desc = '\n' + wrap(v.description, {
+ margin: 3,
+ width: this.out.columns
+ });
+ }
+ }
+ }
+
+ this.outputText += `${prefix} ${title}${color.gray(desc)}\n`;
+ }
+ }
+
+ this.out.write(this.outputText);
+ }
+
+}
+
+module.exports = SelectPrompt; \ No newline at end of file
diff --git a/node_modules/prompts/dist/elements/text.js b/node_modules/prompts/dist/elements/text.js
new file mode 100644
index 0000000..c38a070
--- /dev/null
+++ b/node_modules/prompts/dist/elements/text.js
@@ -0,0 +1,245 @@
+"use strict";
+
+function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
+
+function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
+
+const color = require('kleur');
+
+const Prompt = require('./prompt');
+
+const _require = require('sisteransi'),
+ erase = _require.erase,
+ cursor = _require.cursor;
+
+const _require2 = require('../util'),
+ style = _require2.style,
+ clear = _require2.clear,
+ lines = _require2.lines,
+ figures = _require2.figures;
+/**
+ * TextPrompt Base Element
+ * @param {Object} opts Options
+ * @param {String} opts.message Message
+ * @param {String} [opts.style='default'] Render style
+ * @param {String} [opts.initial] Default value
+ * @param {Function} [opts.validate] Validate function
+ * @param {Stream} [opts.stdin] The Readable stream to listen to
+ * @param {Stream} [opts.stdout] The Writable stream to write readline data to
+ * @param {String} [opts.error] The invalid error label
+ */
+
+
+class TextPrompt extends Prompt {
+ constructor(opts = {}) {
+ super(opts);
+ this.transform = style.render(opts.style);
+ this.scale = this.transform.scale;
+ this.msg = opts.message;
+ this.initial = opts.initial || ``;
+
+ this.validator = opts.validate || (() => true);
+
+ this.value = ``;
+ this.errorMsg = opts.error || `Please Enter A Valid Value`;
+ this.cursor = Number(!!this.initial);
+ this.cursorOffset = 0;
+ this.clear = clear(``, this.out.columns);
+ this.render();
+ }
+
+ set value(v) {
+ if (!v && this.initial) {
+ this.placeholder = true;
+ this.rendered = color.gray(this.transform.render(this.initial));
+ } else {
+ this.placeholder = false;
+ this.rendered = this.transform.render(v);
+ }
+
+ this._value = v;
+ this.fire();
+ }
+
+ get value() {
+ return this._value;
+ }
+
+ reset() {
+ this.value = ``;
+ this.cursor = Number(!!this.initial);
+ this.cursorOffset = 0;
+ this.fire();
+ this.render();
+ }
+
+ exit() {
+ this.abort();
+ }
+
+ abort() {
+ this.value = this.value || this.initial;
+ this.done = this.aborted = true;
+ this.error = false;
+ this.red = false;
+ this.fire();
+ this.render();
+ this.out.write('\n');
+ this.close();
+ }
+
+ validate() {
+ var _this = this;
+
+ return _asyncToGenerator(function* () {
+ let valid = yield _this.validator(_this.value);
+
+ if (typeof valid === `string`) {
+ _this.errorMsg = valid;
+ valid = false;
+ }
+
+ _this.error = !valid;
+ })();
+ }
+
+ submit() {
+ var _this2 = this;
+
+ return _asyncToGenerator(function* () {
+ _this2.value = _this2.value || _this2.initial;
+ _this2.cursorOffset = 0;
+ _this2.cursor = _this2.rendered.length;
+ yield _this2.validate();
+
+ if (_this2.error) {
+ _this2.red = true;
+
+ _this2.fire();
+
+ _this2.render();
+
+ return;
+ }
+
+ _this2.done = true;
+ _this2.aborted = false;
+
+ _this2.fire();
+
+ _this2.render();
+
+ _this2.out.write('\n');
+
+ _this2.close();
+ })();
+ }
+
+ next() {
+ if (!this.placeholder) return this.bell();
+ this.value = this.initial;
+ this.cursor = this.rendered.length;
+ this.fire();
+ this.render();
+ }
+
+ moveCursor(n) {
+ if (this.placeholder) return;
+ this.cursor = this.cursor + n;
+ this.cursorOffset += n;
+ }
+
+ _(c, key) {
+ let s1 = this.value.slice(0, this.cursor);
+ let s2 = this.value.slice(this.cursor);
+ this.value = `${s1}${c}${s2}`;
+ this.red = false;
+ this.cursor = this.placeholder ? 0 : s1.length + 1;
+ this.render();
+ }
+
+ delete() {
+ if (this.isCursorAtStart()) return this.bell();
+ let s1 = this.value.slice(0, this.cursor - 1);
+ let s2 = this.value.slice(this.cursor);
+ this.value = `${s1}${s2}`;
+ this.red = false;
+
+ if (this.isCursorAtStart()) {
+ this.cursorOffset = 0;
+ } else {
+ this.cursorOffset++;
+ this.moveCursor(-1);
+ }
+
+ this.render();
+ }
+
+ deleteForward() {
+ if (this.cursor * this.scale >= this.rendered.length || this.placeholder) return this.bell();
+ let s1 = this.value.slice(0, this.cursor);
+ let s2 = this.value.slice(this.cursor + 1);
+ this.value = `${s1}${s2}`;
+ this.red = false;
+
+ if (this.isCursorAtEnd()) {
+ this.cursorOffset = 0;
+ } else {
+ this.cursorOffset++;
+ }
+
+ this.render();
+ }
+
+ first() {
+ this.cursor = 0;
+ this.render();
+ }
+
+ last() {
+ this.cursor = this.value.length;
+ this.render();
+ }
+
+ left() {
+ if (this.cursor <= 0 || this.placeholder) return this.bell();
+ this.moveCursor(-1);
+ this.render();
+ }
+
+ right() {
+ if (this.cursor * this.scale >= this.rendered.length || this.placeholder) return this.bell();
+ this.moveCursor(1);
+ this.render();
+ }
+
+ isCursorAtStart() {
+ return this.cursor === 0 || this.placeholder && this.cursor === 1;
+ }
+
+ isCursorAtEnd() {
+ return this.cursor === this.rendered.length || this.placeholder && this.cursor === this.rendered.length + 1;
+ }
+
+ render() {
+ if (this.closed) return;
+
+ if (!this.firstRender) {
+ if (this.outputError) this.out.write(cursor.down(lines(this.outputError, this.out.columns) - 1) + clear(this.outputError, this.out.columns));
+ this.out.write(clear(this.outputText, this.out.columns));
+ }
+
+ super.render();
+ this.outputError = '';
+ this.outputText = [style.symbol(this.done, this.aborted), color.bold(this.msg), style.delimiter(this.done), this.red ? color.red(this.rendered) : this.rendered].join(` `);
+
+ if (this.error) {
+ this.outputError += this.errorMsg.split(`\n`).reduce((a, l, i) => a + `\n${i ? ' ' : figures.pointerSmall} ${color.red().italic(l)}`, ``);
+ }
+
+ this.out.write(erase.line + cursor.to(0) + this.outputText + cursor.save + this.outputError + cursor.restore + cursor.move(this.cursorOffset, 0));
+ }
+
+}
+
+module.exports = TextPrompt; \ No newline at end of file
diff --git a/node_modules/prompts/dist/elements/toggle.js b/node_modules/prompts/dist/elements/toggle.js
new file mode 100644
index 0000000..d942f60
--- /dev/null
+++ b/node_modules/prompts/dist/elements/toggle.js
@@ -0,0 +1,124 @@
+"use strict";
+
+const color = require('kleur');
+
+const Prompt = require('./prompt');
+
+const _require = require('../util'),
+ style = _require.style,
+ clear = _require.clear;
+
+const _require2 = require('sisteransi'),
+ cursor = _require2.cursor,
+ erase = _require2.erase;
+/**
+ * TogglePrompt Base Element
+ * @param {Object} opts Options
+ * @param {String} opts.message Message
+ * @param {Boolean} [opts.initial=false] Default value
+ * @param {String} [opts.active='no'] Active label
+ * @param {String} [opts.inactive='off'] Inactive label
+ * @param {Stream} [opts.stdin] The Readable stream to listen to
+ * @param {Stream} [opts.stdout] The Writable stream to write readline data to
+ */
+
+
+class TogglePrompt extends Prompt {
+ constructor(opts = {}) {
+ super(opts);
+ this.msg = opts.message;
+ this.value = !!opts.initial;
+ this.active = opts.active || 'on';
+ this.inactive = opts.inactive || 'off';
+ this.initialValue = this.value;
+ this.render();
+ }
+
+ reset() {
+ this.value = this.initialValue;
+ this.fire();
+ this.render();
+ }
+
+ exit() {
+ this.abort();
+ }
+
+ abort() {
+ this.done = this.aborted = true;
+ this.fire();
+ this.render();
+ this.out.write('\n');
+ this.close();
+ }
+
+ submit() {
+ this.done = true;
+ this.aborted = false;
+ this.fire();
+ this.render();
+ this.out.write('\n');
+ this.close();
+ }
+
+ deactivate() {
+ if (this.value === false) return this.bell();
+ this.value = false;
+ this.render();
+ }
+
+ activate() {
+ if (this.value === true) return this.bell();
+ this.value = true;
+ this.render();
+ }
+
+ delete() {
+ this.deactivate();
+ }
+
+ left() {
+ this.deactivate();
+ }
+
+ right() {
+ this.activate();
+ }
+
+ down() {
+ this.deactivate();
+ }
+
+ up() {
+ this.activate();
+ }
+
+ next() {
+ this.value = !this.value;
+ this.fire();
+ this.render();
+ }
+
+ _(c, key) {
+ if (c === ' ') {
+ this.value = !this.value;
+ } else if (c === '1') {
+ this.value = true;
+ } else if (c === '0') {
+ this.value = false;
+ } else return this.bell();
+
+ this.render();
+ }
+
+ render() {
+ if (this.closed) return;
+ if (this.firstRender) this.out.write(cursor.hide);else this.out.write(clear(this.outputText, this.out.columns));
+ super.render();
+ this.outputText = [style.symbol(this.done, this.aborted), color.bold(this.msg), style.delimiter(this.done), this.value ? this.inactive : color.cyan().underline(this.inactive), color.gray('/'), this.value ? color.cyan().underline(this.active) : this.active].join(' ');
+ this.out.write(erase.line + cursor.to(0) + this.outputText);
+ }
+
+}
+
+module.exports = TogglePrompt; \ No newline at end of file
diff --git a/node_modules/prompts/dist/index.js b/node_modules/prompts/dist/index.js
new file mode 100644
index 0000000..f30e9e7
--- /dev/null
+++ b/node_modules/prompts/dist/index.js
@@ -0,0 +1,154 @@
+'use strict';
+
+function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
+
+function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
+
+function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
+
+function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
+
+function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
+
+function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
+
+function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
+
+function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
+
+const prompts = require('./prompts');
+
+const passOn = ['suggest', 'format', 'onState', 'validate', 'onRender', 'type'];
+
+const noop = () => {};
+/**
+ * Prompt for a series of questions
+ * @param {Array|Object} questions Single question object or Array of question objects
+ * @param {Function} [onSubmit] Callback function called on prompt submit
+ * @param {Function} [onCancel] Callback function called on cancel/abort
+ * @returns {Object} Object with values from user input
+ */
+
+
+function prompt() {
+ return _prompt.apply(this, arguments);
+}
+
+function _prompt() {
+ _prompt = _asyncToGenerator(function* (questions = [], {
+ onSubmit = noop,
+ onCancel = noop
+ } = {}) {
+ const answers = {};
+ const override = prompt._override || {};
+ questions = [].concat(questions);
+ let answer, question, quit, name, type, lastPrompt;
+
+ const getFormattedAnswer = /*#__PURE__*/function () {
+ var _ref = _asyncToGenerator(function* (question, answer, skipValidation = false) {
+ if (!skipValidation && question.validate && question.validate(answer) !== true) {
+ return;
+ }
+
+ return question.format ? yield question.format(answer, answers) : answer;
+ });
+
+ return function getFormattedAnswer(_x, _x2) {
+ return _ref.apply(this, arguments);
+ };
+ }();
+
+ var _iterator = _createForOfIteratorHelper(questions),
+ _step;
+
+ try {
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
+ question = _step.value;
+ var _question = question;
+ name = _question.name;
+ type = _question.type;
+
+ // evaluate type first and skip if type is a falsy value
+ if (typeof type === 'function') {
+ type = yield type(answer, _objectSpread({}, answers), question);
+ question['type'] = type;
+ }
+
+ if (!type) continue; // if property is a function, invoke it unless it's a special function
+
+ for (let key in question) {
+ if (passOn.includes(key)) continue;
+ let value = question[key];
+ question[key] = typeof value === 'function' ? yield value(answer, _objectSpread({}, answers), lastPrompt) : value;
+ }
+
+ lastPrompt = question;
+
+ if (typeof question.message !== 'string') {
+ throw new Error('prompt message is required');
+ } // update vars in case they changed
+
+
+ var _question2 = question;
+ name = _question2.name;
+ type = _question2.type;
+
+ if (prompts[type] === void 0) {
+ throw new Error(`prompt type (${type}) is not defined`);
+ }
+
+ if (override[question.name] !== undefined) {
+ answer = yield getFormattedAnswer(question, override[question.name]);
+
+ if (answer !== undefined) {
+ answers[name] = answer;
+ continue;
+ }
+ }
+
+ try {
+ // Get the injected answer if there is one or prompt the user
+ answer = prompt._injected ? getInjectedAnswer(prompt._injected, question.initial) : yield prompts[type](question);
+ answers[name] = answer = yield getFormattedAnswer(question, answer, true);
+ quit = yield onSubmit(question, answer, answers);
+ } catch (err) {
+ quit = !(yield onCancel(question, answers));
+ }
+
+ if (quit) return answers;
+ }
+ } catch (err) {
+ _iterator.e(err);
+ } finally {
+ _iterator.f();
+ }
+
+ return answers;
+ });
+ return _prompt.apply(this, arguments);
+}
+
+function getInjectedAnswer(injected, deafultValue) {
+ const answer = injected.shift();
+
+ if (answer instanceof Error) {
+ throw answer;
+ }
+
+ return answer === undefined ? deafultValue : answer;
+}
+
+function inject(answers) {
+ prompt._injected = (prompt._injected || []).concat(answers);
+}
+
+function override(answers) {
+ prompt._override = Object.assign({}, answers);
+}
+
+module.exports = Object.assign(prompt, {
+ prompt,
+ prompts,
+ inject,
+ override
+}); \ No newline at end of file
diff --git a/node_modules/prompts/dist/prompts.js b/node_modules/prompts/dist/prompts.js
new file mode 100644
index 0000000..31f2648
--- /dev/null
+++ b/node_modules/prompts/dist/prompts.js
@@ -0,0 +1,222 @@
+'use strict';
+
+const $ = exports;
+
+const el = require('./elements');
+
+const noop = v => v;
+
+function toPrompt(type, args, opts = {}) {
+ return new Promise((res, rej) => {
+ const p = new el[type](args);
+ const onAbort = opts.onAbort || noop;
+ const onSubmit = opts.onSubmit || noop;
+ const onExit = opts.onExit || noop;
+ p.on('state', args.onState || noop);
+ p.on('submit', x => res(onSubmit(x)));
+ p.on('exit', x => res(onExit(x)));
+ p.on('abort', x => rej(onAbort(x)));
+ });
+}
+/**
+ * Text prompt
+ * @param {string} args.message Prompt message to display
+ * @param {string} [args.initial] Default string value
+ * @param {string} [args.style="default"] Render style ('default', 'password', 'invisible')
+ * @param {function} [args.onState] On state change callback
+ * @param {function} [args.validate] Function to validate user input
+ * @param {Stream} [args.stdin] The Readable stream to listen to
+ * @param {Stream} [args.stdout] The Writable stream to write readline data to
+ * @returns {Promise} Promise with user input
+ */
+
+
+$.text = args => toPrompt('TextPrompt', args);
+/**
+ * Password prompt with masked input
+ * @param {string} args.message Prompt message to display
+ * @param {string} [args.initial] Default string value
+ * @param {function} [args.onState] On state change callback
+ * @param {function} [args.validate] Function to validate user input
+ * @param {Stream} [args.stdin] The Readable stream to listen to
+ * @param {Stream} [args.stdout] The Writable stream to write readline data to
+ * @returns {Promise} Promise with user input
+ */
+
+
+$.password = args => {
+ args.style = 'password';
+ return $.text(args);
+};
+/**
+ * Prompt where input is invisible, like sudo
+ * @param {string} args.message Prompt message to display
+ * @param {string} [args.initial] Default string value
+ * @param {function} [args.onState] On state change callback
+ * @param {function} [args.validate] Function to validate user input
+ * @param {Stream} [args.stdin] The Readable stream to listen to
+ * @param {Stream} [args.stdout] The Writable stream to write readline data to
+ * @returns {Promise} Promise with user input
+ */
+
+
+$.invisible = args => {
+ args.style = 'invisible';
+ return $.text(args);
+};
+/**
+ * Number prompt
+ * @param {string} args.message Prompt message to display
+ * @param {number} args.initial Default number value
+ * @param {function} [args.onState] On state change callback
+ * @param {number} [args.max] Max value
+ * @param {number} [args.min] Min value
+ * @param {string} [args.style="default"] Render style ('default', 'password', 'invisible')
+ * @param {Boolean} [opts.float=false] Parse input as floats
+ * @param {Number} [opts.round=2] Round floats to x decimals
+ * @param {Number} [opts.increment=1] Number to increment by when using arrow-keys
+ * @param {function} [args.validate] Function to validate user input
+ * @param {Stream} [args.stdin] The Readable stream to listen to
+ * @param {Stream} [args.stdout] The Writable stream to write readline data to
+ * @returns {Promise} Promise with user input
+ */
+
+
+$.number = args => toPrompt('NumberPrompt', args);
+/**
+ * Date prompt
+ * @param {string} args.message Prompt message to display
+ * @param {number} args.initial Default number value
+ * @param {function} [args.onState] On state change callback
+ * @param {number} [args.max] Max value
+ * @param {number} [args.min] Min value
+ * @param {string} [args.style="default"] Render style ('default', 'password', 'invisible')
+ * @param {Boolean} [opts.float=false] Parse input as floats
+ * @param {Number} [opts.round=2] Round floats to x decimals
+ * @param {Number} [opts.increment=1] Number to increment by when using arrow-keys
+ * @param {function} [args.validate] Function to validate user input
+ * @param {Stream} [args.stdin] The Readable stream to listen to
+ * @param {Stream} [args.stdout] The Writable stream to write readline data to
+ * @returns {Promise} Promise with user input
+ */
+
+
+$.date = args => toPrompt('DatePrompt', args);
+/**
+ * Classic yes/no prompt
+ * @param {string} args.message Prompt message to display
+ * @param {boolean} [args.initial=false] Default value
+ * @param {function} [args.onState] On state change callback
+ * @param {Stream} [args.stdin] The Readable stream to listen to
+ * @param {Stream} [args.stdout] The Writable stream to write readline data to
+ * @returns {Promise} Promise with user input
+ */
+
+
+$.confirm = args => toPrompt('ConfirmPrompt', args);
+/**
+ * List prompt, split intput string by `seperator`
+ * @param {string} args.message Prompt message to display
+ * @param {string} [args.initial] Default string value
+ * @param {string} [args.style="default"] Render style ('default', 'password', 'invisible')
+ * @param {string} [args.separator] String separator
+ * @param {function} [args.onState] On state change callback
+ * @param {Stream} [args.stdin] The Readable stream to listen to
+ * @param {Stream} [args.stdout] The Writable stream to write readline data to
+ * @returns {Promise} Promise with user input, in form of an `Array`
+ */
+
+
+$.list = args => {
+ const sep = args.separator || ',';
+ return toPrompt('TextPrompt', args, {
+ onSubmit: str => str.split(sep).map(s => s.trim())
+ });
+};
+/**
+ * Toggle/switch prompt
+ * @param {string} args.message Prompt message to display
+ * @param {boolean} [args.initial=false] Default value
+ * @param {string} [args.active="on"] Text for `active` state
+ * @param {string} [args.inactive="off"] Text for `inactive` state
+ * @param {function} [args.onState] On state change callback
+ * @param {Stream} [args.stdin] The Readable stream to listen to
+ * @param {Stream} [args.stdout] The Writable stream to write readline data to
+ * @returns {Promise} Promise with user input
+ */
+
+
+$.toggle = args => toPrompt('TogglePrompt', args);
+/**
+ * Interactive select prompt
+ * @param {string} args.message Prompt message to display
+ * @param {Array} args.choices Array of choices objects `[{ title, value }, ...]`
+ * @param {number} [args.initial] Index of default value
+ * @param {String} [args.hint] Hint to display
+ * @param {function} [args.onState] On state change callback
+ * @param {Stream} [args.stdin] The Readable stream to listen to
+ * @param {Stream} [args.stdout] The Writable stream to write readline data to
+ * @returns {Promise} Promise with user input
+ */
+
+
+$.select = args => toPrompt('SelectPrompt', args);
+/**
+ * Interactive multi-select / autocompleteMultiselect prompt
+ * @param {string} args.message Prompt message to display
+ * @param {Array} args.choices Array of choices objects `[{ title, value, [selected] }, ...]`
+ * @param {number} [args.max] Max select
+ * @param {string} [args.hint] Hint to display user
+ * @param {Number} [args.cursor=0] Cursor start position
+ * @param {function} [args.onState] On state change callback
+ * @param {Stream} [args.stdin] The Readable stream to listen to
+ * @param {Stream} [args.stdout] The Writable stream to write readline data to
+ * @returns {Promise} Promise with user input
+ */
+
+
+$.multiselect = args => {
+ args.choices = [].concat(args.choices || []);
+
+ const toSelected = items => items.filter(item => item.selected).map(item => item.value);
+
+ return toPrompt('MultiselectPrompt', args, {
+ onAbort: toSelected,
+ onSubmit: toSelected
+ });
+};
+
+$.autocompleteMultiselect = args => {
+ args.choices = [].concat(args.choices || []);
+
+ const toSelected = items => items.filter(item => item.selected).map(item => item.value);
+
+ return toPrompt('AutocompleteMultiselectPrompt', args, {
+ onAbort: toSelected,
+ onSubmit: toSelected
+ });
+};
+
+const byTitle = (input, choices) => Promise.resolve(choices.filter(item => item.title.slice(0, input.length).toLowerCase() === input.toLowerCase()));
+/**
+ * Interactive auto-complete prompt
+ * @param {string} args.message Prompt message to display
+ * @param {Array} args.choices Array of auto-complete choices objects `[{ title, value }, ...]`
+ * @param {Function} [args.suggest] Function to filter results based on user input. Defaults to sort by `title`
+ * @param {number} [args.limit=10] Max number of results to show
+ * @param {string} [args.style="default"] Render style ('default', 'password', 'invisible')
+ * @param {String} [args.initial] Index of the default value
+ * @param {boolean} [opts.clearFirst] The first ESCAPE keypress will clear the input
+ * @param {String} [args.fallback] Fallback message - defaults to initial value
+ * @param {function} [args.onState] On state change callback
+ * @param {Stream} [args.stdin] The Readable stream to listen to
+ * @param {Stream} [args.stdout] The Writable stream to write readline data to
+ * @returns {Promise} Promise with user input
+ */
+
+
+$.autocomplete = args => {
+ args.suggest = args.suggest || byTitle;
+ args.choices = [].concat(args.choices || []);
+ return toPrompt('AutocompletePrompt', args);
+}; \ No newline at end of file
diff --git a/node_modules/prompts/dist/util/action.js b/node_modules/prompts/dist/util/action.js
new file mode 100644
index 0000000..c36b7db
--- /dev/null
+++ b/node_modules/prompts/dist/util/action.js
@@ -0,0 +1,38 @@
+'use strict';
+
+module.exports = (key, isSelect) => {
+ if (key.meta && key.name !== 'escape') return;
+
+ if (key.ctrl) {
+ if (key.name === 'a') return 'first';
+ if (key.name === 'c') return 'abort';
+ if (key.name === 'd') return 'abort';
+ if (key.name === 'e') return 'last';
+ if (key.name === 'g') return 'reset';
+ }
+
+ if (isSelect) {
+ if (key.name === 'j') return 'down';
+ if (key.name === 'k') return 'up';
+ }
+
+ if (key.name === 'return') return 'submit';
+ if (key.name === 'enter') return 'submit'; // ctrl + J
+
+ if (key.name === 'backspace') return 'delete';
+ if (key.name === 'delete') return 'deleteForward';
+ if (key.name === 'abort') return 'abort';
+ if (key.name === 'escape') return 'exit';
+ if (key.name === 'tab') return 'next';
+ if (key.name === 'pagedown') return 'nextPage';
+ if (key.name === 'pageup') return 'prevPage'; // TODO create home() in prompt types (e.g. TextPrompt)
+
+ if (key.name === 'home') return 'home'; // TODO create end() in prompt types (e.g. TextPrompt)
+
+ if (key.name === 'end') return 'end';
+ if (key.name === 'up') return 'up';
+ if (key.name === 'down') return 'down';
+ if (key.name === 'right') return 'right';
+ if (key.name === 'left') return 'left';
+ return false;
+}; \ No newline at end of file
diff --git a/node_modules/prompts/dist/util/clear.js b/node_modules/prompts/dist/util/clear.js
new file mode 100644
index 0000000..5a313be
--- /dev/null
+++ b/node_modules/prompts/dist/util/clear.js
@@ -0,0 +1,42 @@
+'use strict';
+
+function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
+
+function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
+
+function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
+
+const strip = require('./strip');
+
+const _require = require('sisteransi'),
+ erase = _require.erase,
+ cursor = _require.cursor;
+
+const width = str => [...strip(str)].length;
+/**
+ * @param {string} prompt
+ * @param {number} perLine
+ */
+
+
+module.exports = function (prompt, perLine) {
+ if (!perLine) return erase.line + cursor.to(0);
+ let rows = 0;
+ const lines = prompt.split(/\r?\n/);
+
+ var _iterator = _createForOfIteratorHelper(lines),
+ _step;
+
+ try {
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
+ let line = _step.value;
+ rows += 1 + Math.floor(Math.max(width(line) - 1, 0) / perLine);
+ }
+ } catch (err) {
+ _iterator.e(err);
+ } finally {
+ _iterator.f();
+ }
+
+ return erase.lines(rows);
+}; \ No newline at end of file
diff --git a/node_modules/prompts/dist/util/entriesToDisplay.js b/node_modules/prompts/dist/util/entriesToDisplay.js
new file mode 100644
index 0000000..fbb963a
--- /dev/null
+++ b/node_modules/prompts/dist/util/entriesToDisplay.js
@@ -0,0 +1,21 @@
+'use strict';
+/**
+ * Determine what entries should be displayed on the screen, based on the
+ * currently selected index and the maximum visible. Used in list-based
+ * prompts like `select` and `multiselect`.
+ *
+ * @param {number} cursor the currently selected entry
+ * @param {number} total the total entries available to display
+ * @param {number} [maxVisible] the number of entries that can be displayed
+ */
+
+module.exports = (cursor, total, maxVisible) => {
+ maxVisible = maxVisible || total;
+ let startIndex = Math.min(total - maxVisible, cursor - Math.floor(maxVisible / 2));
+ if (startIndex < 0) startIndex = 0;
+ let endIndex = Math.min(startIndex + maxVisible, total);
+ return {
+ startIndex,
+ endIndex
+ };
+}; \ No newline at end of file
diff --git a/node_modules/prompts/dist/util/figures.js b/node_modules/prompts/dist/util/figures.js
new file mode 100644
index 0000000..036ec50
--- /dev/null
+++ b/node_modules/prompts/dist/util/figures.js
@@ -0,0 +1,32 @@
+'use strict';
+
+const main = {
+ arrowUp: '↑',
+ arrowDown: '↓',
+ arrowLeft: '←',
+ arrowRight: '→',
+ radioOn: '◉',
+ radioOff: '◯',
+ tick: '✔',
+ cross: '✖',
+ ellipsis: '…',
+ pointerSmall: '›',
+ line: '─',
+ pointer: '❯'
+};
+const win = {
+ arrowUp: main.arrowUp,
+ arrowDown: main.arrowDown,
+ arrowLeft: main.arrowLeft,
+ arrowRight: main.arrowRight,
+ radioOn: '(*)',
+ radioOff: '( )',
+ tick: '√',
+ cross: '×',
+ ellipsis: '...',
+ pointerSmall: '»',
+ line: '─',
+ pointer: '>'
+};
+const figures = process.platform === 'win32' ? win : main;
+module.exports = figures; \ No newline at end of file
diff --git a/node_modules/prompts/dist/util/index.js b/node_modules/prompts/dist/util/index.js
new file mode 100644
index 0000000..dbfe75e
--- /dev/null
+++ b/node_modules/prompts/dist/util/index.js
@@ -0,0 +1,12 @@
+'use strict';
+
+module.exports = {
+ action: require('./action'),
+ clear: require('./clear'),
+ style: require('./style'),
+ strip: require('./strip'),
+ figures: require('./figures'),
+ lines: require('./lines'),
+ wrap: require('./wrap'),
+ entriesToDisplay: require('./entriesToDisplay')
+}; \ No newline at end of file
diff --git a/node_modules/prompts/dist/util/lines.js b/node_modules/prompts/dist/util/lines.js
new file mode 100644
index 0000000..54a939a
--- /dev/null
+++ b/node_modules/prompts/dist/util/lines.js
@@ -0,0 +1,14 @@
+'use strict';
+
+const strip = require('./strip');
+/**
+ * @param {string} msg
+ * @param {number} perLine
+ */
+
+
+module.exports = function (msg, perLine) {
+ let lines = String(strip(msg) || '').split(/\r?\n/);
+ if (!perLine) return lines.length;
+ return lines.map(l => Math.ceil(l.length / perLine)).reduce((a, b) => a + b);
+}; \ No newline at end of file
diff --git a/node_modules/prompts/dist/util/strip.js b/node_modules/prompts/dist/util/strip.js
new file mode 100644
index 0000000..dd289a0
--- /dev/null
+++ b/node_modules/prompts/dist/util/strip.js
@@ -0,0 +1,7 @@
+'use strict';
+
+module.exports = str => {
+ const pattern = ['[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]+)*|[a-zA-Z\\d]+(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?\\u0007)', '(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PRZcf-ntqry=><~]))'].join('|');
+ const RGX = new RegExp(pattern, 'g');
+ return typeof str === 'string' ? str.replace(RGX, '') : str;
+}; \ No newline at end of file
diff --git a/node_modules/prompts/dist/util/style.js b/node_modules/prompts/dist/util/style.js
new file mode 100644
index 0000000..ed1a49b
--- /dev/null
+++ b/node_modules/prompts/dist/util/style.js
@@ -0,0 +1,51 @@
+'use strict';
+
+const c = require('kleur');
+
+const figures = require('./figures'); // rendering user input.
+
+
+const styles = Object.freeze({
+ password: {
+ scale: 1,
+ render: input => '*'.repeat(input.length)
+ },
+ emoji: {
+ scale: 2,
+ render: input => '😃'.repeat(input.length)
+ },
+ invisible: {
+ scale: 0,
+ render: input => ''
+ },
+ default: {
+ scale: 1,
+ render: input => `${input}`
+ }
+});
+
+const render = type => styles[type] || styles.default; // icon to signalize a prompt.
+
+
+const symbols = Object.freeze({
+ aborted: c.red(figures.cross),
+ done: c.green(figures.tick),
+ exited: c.yellow(figures.cross),
+ default: c.cyan('?')
+});
+
+const symbol = (done, aborted, exited) => aborted ? symbols.aborted : exited ? symbols.exited : done ? symbols.done : symbols.default; // between the question and the user's input.
+
+
+const delimiter = completing => c.gray(completing ? figures.ellipsis : figures.pointerSmall);
+
+const item = (expandable, expanded) => c.gray(expandable ? expanded ? figures.pointerSmall : '+' : figures.line);
+
+module.exports = {
+ styles,
+ render,
+ symbols,
+ symbol,
+ delimiter,
+ item
+}; \ No newline at end of file
diff --git a/node_modules/prompts/dist/util/wrap.js b/node_modules/prompts/dist/util/wrap.js
new file mode 100644
index 0000000..da5e67c
--- /dev/null
+++ b/node_modules/prompts/dist/util/wrap.js
@@ -0,0 +1,16 @@
+'use strict';
+/**
+ * @param {string} msg The message to wrap
+ * @param {object} opts
+ * @param {number|string} [opts.margin] Left margin
+ * @param {number} opts.width Maximum characters per line including the margin
+ */
+
+module.exports = (msg, opts = {}) => {
+ const tab = Number.isSafeInteger(parseInt(opts.margin)) ? new Array(parseInt(opts.margin)).fill(' ').join('') : opts.margin || '';
+ const width = opts.width;
+ return (msg || '').split(/\r?\n/g).map(line => line.split(/\s+/g).reduce((arr, w) => {
+ if (w.length + tab.length >= width || arr[arr.length - 1].length + w.length + 1 < width) arr[arr.length - 1] += ` ${w}`;else arr.push(`${tab}${w}`);
+ return arr;
+ }, [tab]).join('\n')).join('\n');
+}; \ No newline at end of file
diff --git a/node_modules/prompts/index.js b/node_modules/prompts/index.js
new file mode 100644
index 0000000..3479956
--- /dev/null
+++ b/node_modules/prompts/index.js
@@ -0,0 +1,14 @@
+function isNodeLT(tar) {
+ tar = (Array.isArray(tar) ? tar : tar.split('.')).map(Number);
+ let i=0, src=process.versions.node.split('.').map(Number);
+ for (; i < tar.length; i++) {
+ if (src[i] > tar[i]) return false;
+ if (tar[i] > src[i]) return true;
+ }
+ return false;
+}
+
+module.exports =
+ isNodeLT('8.6.0')
+ ? require('./dist/index.js')
+ : require('./lib/index.js');
diff --git a/node_modules/prompts/lib/dateparts/datepart.js b/node_modules/prompts/lib/dateparts/datepart.js
new file mode 100644
index 0000000..62b893b
--- /dev/null
+++ b/node_modules/prompts/lib/dateparts/datepart.js
@@ -0,0 +1,35 @@
+'use strict';
+
+class DatePart {
+ constructor({token, date, parts, locales}) {
+ this.token = token;
+ this.date = date || new Date();
+ this.parts = parts || [this];
+ this.locales = locales || {};
+ }
+
+ up() {}
+
+ down() {}
+
+ next() {
+ const currentIdx = this.parts.indexOf(this);
+ return this.parts.find((part, idx) => idx > currentIdx && part instanceof DatePart);
+ }
+
+ setTo(val) {}
+
+ prev() {
+ let parts = [].concat(this.parts).reverse();
+ const currentIdx = parts.indexOf(this);
+ return parts.find((part, idx) => idx > currentIdx && part instanceof DatePart);
+ }
+
+ toString() {
+ return String(this.date);
+ }
+}
+
+module.exports = DatePart;
+
+
diff --git a/node_modules/prompts/lib/dateparts/day.js b/node_modules/prompts/lib/dateparts/day.js
new file mode 100644
index 0000000..5db84fe
--- /dev/null
+++ b/node_modules/prompts/lib/dateparts/day.js
@@ -0,0 +1,42 @@
+'use strict';
+
+const DatePart = require('./datepart');
+
+const pos = n => {
+ n = n % 10;
+ return n === 1 ? 'st'
+ : n === 2 ? 'nd'
+ : n === 3 ? 'rd'
+ : 'th';
+}
+
+class Day extends DatePart {
+ constructor(opts={}) {
+ super(opts);
+ }
+
+ up() {
+ this.date.setDate(this.date.getDate() + 1);
+ }
+
+ down() {
+ this.date.setDate(this.date.getDate() - 1);
+ }
+
+ setTo(val) {
+ this.date.setDate(parseInt(val.substr(-2)));
+ }
+
+ toString() {
+ let date = this.date.getDate();
+ let day = this.date.getDay();
+ return this.token === 'DD' ? String(date).padStart(2, '0')
+ : this.token === 'Do' ? date + pos(date)
+ : this.token === 'd' ? day + 1
+ : this.token === 'ddd' ? this.locales.weekdaysShort[day]
+ : this.token === 'dddd' ? this.locales.weekdays[day]
+ : date;
+ }
+}
+
+module.exports = Day;
diff --git a/node_modules/prompts/lib/dateparts/hours.js b/node_modules/prompts/lib/dateparts/hours.js
new file mode 100644
index 0000000..171b3d2
--- /dev/null
+++ b/node_modules/prompts/lib/dateparts/hours.js
@@ -0,0 +1,30 @@
+'use strict';
+
+const DatePart = require('./datepart');
+
+class Hours extends DatePart {
+ constructor(opts={}) {
+ super(opts);
+ }
+
+ up() {
+ this.date.setHours(this.date.getHours() + 1);
+ }
+
+ down() {
+ this.date.setHours(this.date.getHours() - 1);
+ }
+
+ setTo(val) {
+ this.date.setHours(parseInt(val.substr(-2)));
+ }
+
+ toString() {
+ let hours = this.date.getHours();
+ if (/h/.test(this.token))
+ hours = (hours % 12) || 12;
+ return this.token.length > 1 ? String(hours).padStart(2, '0') : hours;
+ }
+}
+
+module.exports = Hours;
diff --git a/node_modules/prompts/lib/dateparts/index.js b/node_modules/prompts/lib/dateparts/index.js
new file mode 100644
index 0000000..dc0cc95
--- /dev/null
+++ b/node_modules/prompts/lib/dateparts/index.js
@@ -0,0 +1,13 @@
+'use strict';
+
+module.exports = {
+ DatePart: require('./datepart'),
+ Meridiem: require('./meridiem'),
+ Day: require('./day'),
+ Hours: require('./hours'),
+ Milliseconds: require('./milliseconds'),
+ Minutes: require('./minutes'),
+ Month: require('./month'),
+ Seconds: require('./seconds'),
+ Year: require('./year'),
+}
diff --git a/node_modules/prompts/lib/dateparts/meridiem.js b/node_modules/prompts/lib/dateparts/meridiem.js
new file mode 100644
index 0000000..8488677
--- /dev/null
+++ b/node_modules/prompts/lib/dateparts/meridiem.js
@@ -0,0 +1,24 @@
+'use strict';
+
+const DatePart = require('./datepart');
+
+class Meridiem extends DatePart {
+ constructor(opts={}) {
+ super(opts);
+ }
+
+ up() {
+ this.date.setHours((this.date.getHours() + 12) % 24);
+ }
+
+ down() {
+ this.up();
+ }
+
+ toString() {
+ let meridiem = this.date.getHours() > 12 ? 'pm' : 'am';
+ return /\A/.test(this.token) ? meridiem.toUpperCase() : meridiem;
+ }
+}
+
+module.exports = Meridiem;
diff --git a/node_modules/prompts/lib/dateparts/milliseconds.js b/node_modules/prompts/lib/dateparts/milliseconds.js
new file mode 100644
index 0000000..8984270
--- /dev/null
+++ b/node_modules/prompts/lib/dateparts/milliseconds.js
@@ -0,0 +1,28 @@
+'use strict';
+
+const DatePart = require('./datepart');
+
+class Milliseconds extends DatePart {
+ constructor(opts={}) {
+ super(opts);
+ }
+
+ up() {
+ this.date.setMilliseconds(this.date.getMilliseconds() + 1);
+ }
+
+ down() {
+ this.date.setMilliseconds(this.date.getMilliseconds() - 1);
+ }
+
+ setTo(val) {
+ this.date.setMilliseconds(parseInt(val.substr(-(this.token.length))));
+ }
+
+ toString() {
+ return String(this.date.getMilliseconds()).padStart(4, '0')
+ .substr(0, this.token.length);
+ }
+}
+
+module.exports = Milliseconds;
diff --git a/node_modules/prompts/lib/dateparts/minutes.js b/node_modules/prompts/lib/dateparts/minutes.js
new file mode 100644
index 0000000..aa1d8f7
--- /dev/null
+++ b/node_modules/prompts/lib/dateparts/minutes.js
@@ -0,0 +1,28 @@
+'use strict';
+
+const DatePart = require('./datepart');
+
+class Minutes extends DatePart {
+ constructor(opts={}) {
+ super(opts);
+ }
+
+ up() {
+ this.date.setMinutes(this.date.getMinutes() + 1);
+ }
+
+ down() {
+ this.date.setMinutes(this.date.getMinutes() - 1);
+ }
+
+ setTo(val) {
+ this.date.setMinutes(parseInt(val.substr(-2)));
+ }
+
+ toString() {
+ let m = this.date.getMinutes();
+ return this.token.length > 1 ? String(m).padStart(2, '0') : m;
+ }
+}
+
+module.exports = Minutes;
diff --git a/node_modules/prompts/lib/dateparts/month.js b/node_modules/prompts/lib/dateparts/month.js
new file mode 100644
index 0000000..f656455
--- /dev/null
+++ b/node_modules/prompts/lib/dateparts/month.js
@@ -0,0 +1,33 @@
+'use strict';
+
+const DatePart = require('./datepart');
+
+class Month extends DatePart {
+ constructor(opts={}) {
+ super(opts);
+ }
+
+ up() {
+ this.date.setMonth(this.date.getMonth() + 1);
+ }
+
+ down() {
+ this.date.setMonth(this.date.getMonth() - 1);
+ }
+
+ setTo(val) {
+ val = parseInt(val.substr(-2)) - 1;
+ this.date.setMonth(val < 0 ? 0 : val);
+ }
+
+ toString() {
+ let month = this.date.getMonth();
+ let tl = this.token.length;
+ return tl === 2 ? String(month + 1).padStart(2, '0')
+ : tl === 3 ? this.locales.monthsShort[month]
+ : tl === 4 ? this.locales.months[month]
+ : String(month + 1);
+ }
+}
+
+module.exports = Month;
diff --git a/node_modules/prompts/lib/dateparts/seconds.js b/node_modules/prompts/lib/dateparts/seconds.js
new file mode 100644
index 0000000..0c1a1a4
--- /dev/null
+++ b/node_modules/prompts/lib/dateparts/seconds.js
@@ -0,0 +1,28 @@
+'use strict';
+
+const DatePart = require('./datepart');
+
+class Seconds extends DatePart {
+ constructor(opts={}) {
+ super(opts);
+ }
+
+ up() {
+ this.date.setSeconds(this.date.getSeconds() + 1);
+ }
+
+ down() {
+ this.date.setSeconds(this.date.getSeconds() - 1);
+ }
+
+ setTo(val) {
+ this.date.setSeconds(parseInt(val.substr(-2)));
+ }
+
+ toString() {
+ let s = this.date.getSeconds();
+ return this.token.length > 1 ? String(s).padStart(2, '0') : s;
+ }
+}
+
+module.exports = Seconds;
diff --git a/node_modules/prompts/lib/dateparts/year.js b/node_modules/prompts/lib/dateparts/year.js
new file mode 100644
index 0000000..f068e43
--- /dev/null
+++ b/node_modules/prompts/lib/dateparts/year.js
@@ -0,0 +1,28 @@
+'use strict';
+
+const DatePart = require('./datepart');
+
+class Year extends DatePart {
+ constructor(opts={}) {
+ super(opts);
+ }
+
+ up() {
+ this.date.setFullYear(this.date.getFullYear() + 1);
+ }
+
+ down() {
+ this.date.setFullYear(this.date.getFullYear() - 1);
+ }
+
+ setTo(val) {
+ this.date.setFullYear(val.substr(-4));
+ }
+
+ toString() {
+ let year = String(this.date.getFullYear()).padStart(4, '0');
+ return this.token.length === 2 ? year.substr(-2) : year;
+ }
+}
+
+module.exports = Year;
diff --git a/node_modules/prompts/lib/elements/autocomplete.js b/node_modules/prompts/lib/elements/autocomplete.js
new file mode 100644
index 0000000..8e06da2
--- /dev/null
+++ b/node_modules/prompts/lib/elements/autocomplete.js
@@ -0,0 +1,264 @@
+'use strict';
+
+const color = require('kleur');
+const Prompt = require('./prompt');
+const { erase, cursor } = require('sisteransi');
+const { style, clear, figures, wrap, entriesToDisplay } = require('../util');
+
+const getVal = (arr, i) => arr[i] && (arr[i].value || arr[i].title || arr[i]);
+const getTitle = (arr, i) => arr[i] && (arr[i].title || arr[i].value || arr[i]);
+const getIndex = (arr, valOrTitle) => {
+ const index = arr.findIndex(el => el.value === valOrTitle || el.title === valOrTitle);
+ return index > -1 ? index : undefined;
+};
+
+/**
+ * TextPrompt Base Element
+ * @param {Object} opts Options
+ * @param {String} opts.message Message
+ * @param {Array} opts.choices Array of auto-complete choices objects
+ * @param {Function} [opts.suggest] Filter function. Defaults to sort by title
+ * @param {Number} [opts.limit=10] Max number of results to show
+ * @param {Number} [opts.cursor=0] Cursor start position
+ * @param {String} [opts.style='default'] Render style
+ * @param {String} [opts.fallback] Fallback message - initial to default value
+ * @param {String} [opts.initial] Index of the default value
+ * @param {Boolean} [opts.clearFirst] The first ESCAPE keypress will clear the input
+ * @param {Stream} [opts.stdin] The Readable stream to listen to
+ * @param {Stream} [opts.stdout] The Writable stream to write readline data to
+ * @param {String} [opts.noMatches] The no matches found label
+ */
+class AutocompletePrompt extends Prompt {
+ constructor(opts={}) {
+ super(opts);
+ this.msg = opts.message;
+ this.suggest = opts.suggest;
+ this.choices = opts.choices;
+ this.initial = typeof opts.initial === 'number'
+ ? opts.initial
+ : getIndex(opts.choices, opts.initial);
+ this.select = this.initial || opts.cursor || 0;
+ this.i18n = { noMatches: opts.noMatches || 'no matches found' };
+ this.fallback = opts.fallback || this.initial;
+ this.clearFirst = opts.clearFirst || false;
+ this.suggestions = [];
+ this.input = '';
+ this.limit = opts.limit || 10;
+ this.cursor = 0;
+ this.transform = style.render(opts.style);
+ this.scale = this.transform.scale;
+ this.render = this.render.bind(this);
+ this.complete = this.complete.bind(this);
+ this.clear = clear('', this.out.columns);
+ this.complete(this.render);
+ this.render();
+ }
+
+ set fallback(fb) {
+ this._fb = Number.isSafeInteger(parseInt(fb)) ? parseInt(fb) : fb;
+ }
+
+ get fallback() {
+ let choice;
+ if (typeof this._fb === 'number')
+ choice = this.choices[this._fb];
+ else if (typeof this._fb === 'string')
+ choice = { title: this._fb };
+ return choice || this._fb || { title: this.i18n.noMatches };
+ }
+
+ moveSelect(i) {
+ this.select = i;
+ if (this.suggestions.length > 0)
+ this.value = getVal(this.suggestions, i);
+ else this.value = this.fallback.value;
+ this.fire();
+ }
+
+ async complete(cb) {
+ const p = (this.completing = this.suggest(this.input, this.choices));
+ const suggestions = await p;
+
+ if (this.completing !== p) return;
+ this.suggestions = suggestions
+ .map((s, i, arr) => ({ title: getTitle(arr, i), value: getVal(arr, i), description: s.description }));
+ this.completing = false;
+ const l = Math.max(suggestions.length - 1, 0);
+ this.moveSelect(Math.min(l, this.select));
+
+ cb && cb();
+ }
+
+ reset() {
+ this.input = '';
+ this.complete(() => {
+ this.moveSelect(this.initial !== void 0 ? this.initial : 0);
+ this.render();
+ });
+ this.render();
+ }
+
+ exit() {
+ if (this.clearFirst && this.input.length > 0) {
+ this.reset();
+ } else {
+ this.done = this.exited = true;
+ this.aborted = false;
+ this.fire();
+ this.render();
+ this.out.write('\n');
+ this.close();
+ }
+ }
+
+ abort() {
+ this.done = this.aborted = true;
+ this.exited = false;
+ this.fire();
+ this.render();
+ this.out.write('\n');
+ this.close();
+ }
+
+ submit() {
+ this.done = true;
+ this.aborted = this.exited = false;
+ this.fire();
+ this.render();
+ this.out.write('\n');
+ this.close();
+ }
+
+ _(c, key) {
+ let s1 = this.input.slice(0, this.cursor);
+ let s2 = this.input.slice(this.cursor);
+ this.input = `${s1}${c}${s2}`;
+ this.cursor = s1.length+1;
+ this.complete(this.render);
+ this.render();
+ }
+
+ delete() {
+ if (this.cursor === 0) return this.bell();
+ let s1 = this.input.slice(0, this.cursor-1);
+ let s2 = this.input.slice(this.cursor);
+ this.input = `${s1}${s2}`;
+ this.complete(this.render);
+ this.cursor = this.cursor-1;
+ this.render();
+ }
+
+ deleteForward() {
+ if(this.cursor*this.scale >= this.rendered.length) return this.bell();
+ let s1 = this.input.slice(0, this.cursor);
+ let s2 = this.input.slice(this.cursor+1);
+ this.input = `${s1}${s2}`;
+ this.complete(this.render);
+ this.render();
+ }
+
+ first() {
+ this.moveSelect(0);
+ this.render();
+ }
+
+ last() {
+ this.moveSelect(this.suggestions.length - 1);
+ this.render();
+ }
+
+ up() {
+ if (this.select === 0) {
+ this.moveSelect(this.suggestions.length - 1);
+ } else {
+ this.moveSelect(this.select - 1);
+ }
+ this.render();
+ }
+
+ down() {
+ if (this.select === this.suggestions.length - 1) {
+ this.moveSelect(0);
+ } else {
+ this.moveSelect(this.select + 1);
+ }
+ this.render();
+ }
+
+ next() {
+ if (this.select === this.suggestions.length - 1) {
+ this.moveSelect(0);
+ } else this.moveSelect(this.select + 1);
+ this.render();
+ }
+
+ nextPage() {
+ this.moveSelect(Math.min(this.select + this.limit, this.suggestions.length - 1));
+ this.render();
+ }
+
+ prevPage() {
+ this.moveSelect(Math.max(this.select - this.limit, 0));
+ this.render();
+ }
+
+ left() {
+ if (this.cursor <= 0) return this.bell();
+ this.cursor = this.cursor-1;
+ this.render();
+ }
+
+ right() {
+ if (this.cursor*this.scale >= this.rendered.length) return this.bell();
+ this.cursor = this.cursor+1;
+ this.render();
+ }
+
+ renderOption(v, hovered, isStart, isEnd) {
+ let desc;
+ let prefix = isStart ? figures.arrowUp : isEnd ? figures.arrowDown : ' ';
+ let title = hovered ? color.cyan().underline(v.title) : v.title;
+ prefix = (hovered ? color.cyan(figures.pointer) + ' ' : ' ') + prefix;
+ if (v.description) {
+ desc = ` - ${v.description}`;
+ if (prefix.length + title.length + desc.length >= this.out.columns
+ || v.description.split(/\r?\n/).length > 1) {
+ desc = '\n' + wrap(v.description, { margin: 3, width: this.out.columns })
+ }
+ }
+ return prefix + ' ' + title + color.gray(desc || '');
+ }
+
+ render() {
+ if (this.closed) return;
+ if (this.firstRender) this.out.write(cursor.hide);
+ else this.out.write(clear(this.outputText, this.out.columns));
+ super.render();
+
+ let { startIndex, endIndex } = entriesToDisplay(this.select, this.choices.length, this.limit);
+
+ this.outputText = [
+ style.symbol(this.done, this.aborted, this.exited),
+ color.bold(this.msg),
+ style.delimiter(this.completing),
+ this.done && this.suggestions[this.select]
+ ? this.suggestions[this.select].title
+ : this.rendered = this.transform.render(this.input)
+ ].join(' ');
+
+ if (!this.done) {
+ const suggestions = this.suggestions
+ .slice(startIndex, endIndex)
+ .map((item, i) => this.renderOption(item,
+ this.select === i + startIndex,
+ i === 0 && startIndex > 0,
+ i + startIndex === endIndex - 1 && endIndex < this.choices.length))
+ .join('\n');
+ this.outputText += `\n` + (suggestions || color.gray(this.fallback.title));
+ }
+
+ this.out.write(erase.line + cursor.to(0) + this.outputText);
+ }
+}
+
+module.exports = AutocompletePrompt;
diff --git a/node_modules/prompts/lib/elements/autocompleteMultiselect.js b/node_modules/prompts/lib/elements/autocompleteMultiselect.js
new file mode 100644
index 0000000..b64510f
--- /dev/null
+++ b/node_modules/prompts/lib/elements/autocompleteMultiselect.js
@@ -0,0 +1,194 @@
+'use strict';
+
+const color = require('kleur');
+const { cursor } = require('sisteransi');
+const MultiselectPrompt = require('./multiselect');
+const { clear, style, figures } = require('../util');
+/**
+ * MultiselectPrompt Base Element
+ * @param {Object} opts Options
+ * @param {String} opts.message Message
+ * @param {Array} opts.choices Array of choice objects
+ * @param {String} [opts.hint] Hint to display
+ * @param {String} [opts.warn] Hint shown for disabled choices
+ * @param {Number} [opts.max] Max choices
+ * @param {Number} [opts.cursor=0] Cursor start position
+ * @param {Stream} [opts.stdin] The Readable stream to listen to
+ * @param {Stream} [opts.stdout] The Writable stream to write readline data to
+ */
+class AutocompleteMultiselectPrompt extends MultiselectPrompt {
+ constructor(opts={}) {
+ opts.overrideRender = true;
+ super(opts);
+ this.inputValue = '';
+ this.clear = clear('', this.out.columns);
+ this.filteredOptions = this.value;
+ this.render();
+ }
+
+ last() {
+ this.cursor = this.filteredOptions.length - 1;
+ this.render();
+ }
+ next() {
+ this.cursor = (this.cursor + 1) % this.filteredOptions.length;
+ this.render();
+ }
+
+ up() {
+ if (this.cursor === 0) {
+ this.cursor = this.filteredOptions.length - 1;
+ } else {
+ this.cursor--;
+ }
+ this.render();
+ }
+
+ down() {
+ if (this.cursor === this.filteredOptions.length - 1) {
+ this.cursor = 0;
+ } else {
+ this.cursor++;
+ }
+ this.render();
+ }
+
+ left() {
+ this.filteredOptions[this.cursor].selected = false;
+ this.render();
+ }
+
+ right() {
+ if (this.value.filter(e => e.selected).length >= this.maxChoices) return this.bell();
+ this.filteredOptions[this.cursor].selected = true;
+ this.render();
+ }
+
+ delete() {
+ if (this.inputValue.length) {
+ this.inputValue = this.inputValue.substr(0, this.inputValue.length - 1);
+ this.updateFilteredOptions();
+ }
+ }
+
+ updateFilteredOptions() {
+ const currentHighlight = this.filteredOptions[this.cursor];
+ this.filteredOptions = this.value
+ .filter(v => {
+ if (this.inputValue) {
+ if (typeof v.title === 'string') {
+ if (v.title.toLowerCase().includes(this.inputValue.toLowerCase())) {
+ return true;
+ }
+ }
+ if (typeof v.value === 'string') {
+ if (v.value.toLowerCase().includes(this.inputValue.toLowerCase())) {
+ return true;
+ }
+ }
+ return false;
+ }
+ return true;
+ });
+ const newHighlightIndex = this.filteredOptions.findIndex(v => v === currentHighlight)
+ this.cursor = newHighlightIndex < 0 ? 0 : newHighlightIndex;
+ this.render();
+ }
+
+ handleSpaceToggle() {
+ const v = this.filteredOptions[this.cursor];
+
+ if (v.selected) {
+ v.selected = false;
+ this.render();
+ } else if (v.disabled || this.value.filter(e => e.selected).length >= this.maxChoices) {
+ return this.bell();
+ } else {
+ v.selected = true;
+ this.render();
+ }
+ }
+
+ handleInputChange(c) {
+ this.inputValue = this.inputValue + c;
+ this.updateFilteredOptions();
+ }
+
+ _(c, key) {
+ if (c === ' ') {
+ this.handleSpaceToggle();
+ } else {
+ this.handleInputChange(c);
+ }
+ }
+
+ renderInstructions() {
+ if (this.instructions === undefined || this.instructions) {
+ if (typeof this.instructions === 'string') {
+ return this.instructions;
+ }
+ return `
+Instructions:
+ ${figures.arrowUp}/${figures.arrowDown}: Highlight option
+ ${figures.arrowLeft}/${figures.arrowRight}/[space]: Toggle selection
+ [a,b,c]/delete: Filter choices
+ enter/return: Complete answer
+`;
+ }
+ return '';
+ }
+
+ renderCurrentInput() {
+ return `
+Filtered results for: ${this.inputValue ? this.inputValue : color.gray('Enter something to filter')}\n`;
+ }
+
+ renderOption(cursor, v, i) {
+ let title;
+ if (v.disabled) title = cursor === i ? color.gray().underline(v.title) : color.strikethrough().gray(v.title);
+ else title = cursor === i ? color.cyan().underline(v.title) : v.title;
+ return (v.selected ? color.green(figures.radioOn) : figures.radioOff) + ' ' + title
+ }
+
+ renderDoneOrInstructions() {
+ if (this.done) {
+ return this.value
+ .filter(e => e.selected)
+ .map(v => v.title)
+ .join(', ');
+ }
+
+ const output = [color.gray(this.hint), this.renderInstructions(), this.renderCurrentInput()];
+
+ if (this.filteredOptions.length && this.filteredOptions[this.cursor].disabled) {
+ output.push(color.yellow(this.warn));
+ }
+ return output.join(' ');
+ }
+
+ render() {
+ if (this.closed) return;
+ if (this.firstRender) this.out.write(cursor.hide);
+ super.render();
+
+ // print prompt
+
+ let prompt = [
+ style.symbol(this.done, this.aborted),
+ color.bold(this.msg),
+ style.delimiter(false),
+ this.renderDoneOrInstructions()
+ ].join(' ');
+
+ if (this.showMinError) {
+ prompt += color.red(`You must select a minimum of ${this.minSelected} choices.`);
+ this.showMinError = false;
+ }
+ prompt += this.renderOptions(this.filteredOptions);
+
+ this.out.write(this.clear + prompt);
+ this.clear = clear(prompt, this.out.columns);
+ }
+}
+
+module.exports = AutocompleteMultiselectPrompt;
diff --git a/node_modules/prompts/lib/elements/confirm.js b/node_modules/prompts/lib/elements/confirm.js
new file mode 100644
index 0000000..7a9173f
--- /dev/null
+++ b/node_modules/prompts/lib/elements/confirm.js
@@ -0,0 +1,89 @@
+const color = require('kleur');
+const Prompt = require('./prompt');
+const { style, clear } = require('../util');
+const { erase, cursor } = require('sisteransi');
+
+/**
+ * ConfirmPrompt Base Element
+ * @param {Object} opts Options
+ * @param {String} opts.message Message
+ * @param {Boolean} [opts.initial] Default value (true/false)
+ * @param {Stream} [opts.stdin] The Readable stream to listen to
+ * @param {Stream} [opts.stdout] The Writable stream to write readline data to
+ * @param {String} [opts.yes] The "Yes" label
+ * @param {String} [opts.yesOption] The "Yes" option when choosing between yes/no
+ * @param {String} [opts.no] The "No" label
+ * @param {String} [opts.noOption] The "No" option when choosing between yes/no
+ */
+class ConfirmPrompt extends Prompt {
+ constructor(opts={}) {
+ super(opts);
+ this.msg = opts.message;
+ this.value = opts.initial;
+ this.initialValue = !!opts.initial;
+ this.yesMsg = opts.yes || 'yes';
+ this.yesOption = opts.yesOption || '(Y/n)';
+ this.noMsg = opts.no || 'no';
+ this.noOption = opts.noOption || '(y/N)';
+ this.render();
+ }
+
+ reset() {
+ this.value = this.initialValue;
+ this.fire();
+ this.render();
+ }
+
+ exit() {
+ this.abort();
+ }
+
+ abort() {
+ this.done = this.aborted = true;
+ this.fire();
+ this.render();
+ this.out.write('\n');
+ this.close();
+ }
+
+ submit() {
+ this.value = this.value || false;
+ this.done = true;
+ this.aborted = false;
+ this.fire();
+ this.render();
+ this.out.write('\n');
+ this.close();
+ }
+
+ _(c, key) {
+ if (c.toLowerCase() === 'y') {
+ this.value = true;
+ return this.submit();
+ }
+ if (c.toLowerCase() === 'n') {
+ this.value = false;
+ return this.submit();
+ }
+ return this.bell();
+ }
+
+ render() {
+ if (this.closed) return;
+ if (this.firstRender) this.out.write(cursor.hide);
+ else this.out.write(clear(this.outputText, this.out.columns));
+ super.render();
+
+ this.outputText = [
+ style.symbol(this.done, this.aborted),
+ color.bold(this.msg),
+ style.delimiter(this.done),
+ this.done ? (this.value ? this.yesMsg : this.noMsg)
+ : color.gray(this.initialValue ? this.yesOption : this.noOption)
+ ].join(' ');
+
+ this.out.write(erase.line + cursor.to(0) + this.outputText);
+ }
+}
+
+module.exports = ConfirmPrompt;
diff --git a/node_modules/prompts/lib/elements/date.js b/node_modules/prompts/lib/elements/date.js
new file mode 100644
index 0000000..71ff608
--- /dev/null
+++ b/node_modules/prompts/lib/elements/date.js
@@ -0,0 +1,209 @@
+'use strict';
+
+const color = require('kleur');
+const Prompt = require('./prompt');
+const { style, clear, figures } = require('../util');
+const { erase, cursor } = require('sisteransi');
+const { DatePart, Meridiem, Day, Hours, Milliseconds, Minutes, Month, Seconds, Year } = require('../dateparts');
+
+const regex = /\\(.)|"((?:\\["\\]|[^"])+)"|(D[Do]?|d{3,4}|d)|(M{1,4})|(YY(?:YY)?)|([aA])|([Hh]{1,2})|(m{1,2})|(s{1,2})|(S{1,4})|./g;
+const regexGroups = {
+ 1: ({token}) => token.replace(/\\(.)/g, '$1'),
+ 2: (opts) => new Day(opts), // Day // TODO
+ 3: (opts) => new Month(opts), // Month
+ 4: (opts) => new Year(opts), // Year
+ 5: (opts) => new Meridiem(opts), // AM/PM // TODO (special)
+ 6: (opts) => new Hours(opts), // Hours
+ 7: (opts) => new Minutes(opts), // Minutes
+ 8: (opts) => new Seconds(opts), // Seconds
+ 9: (opts) => new Milliseconds(opts), // Fractional seconds
+}
+
+const dfltLocales = {
+ months: 'January,February,March,April,May,June,July,August,September,October,November,December'.split(','),
+ monthsShort: 'Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec'.split(','),
+ weekdays: 'Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday'.split(','),
+ weekdaysShort: 'Sun,Mon,Tue,Wed,Thu,Fri,Sat'.split(',')
+}
+
+
+/**
+ * DatePrompt Base Element
+ * @param {Object} opts Options
+ * @param {String} opts.message Message
+ * @param {Number} [opts.initial] Index of default value
+ * @param {String} [opts.mask] The format mask
+ * @param {object} [opts.locales] The date locales
+ * @param {String} [opts.error] The error message shown on invalid value
+ * @param {Function} [opts.validate] Function to validate the submitted value
+ * @param {Stream} [opts.stdin] The Readable stream to listen to
+ * @param {Stream} [opts.stdout] The Writable stream to write readline data to
+ */
+class DatePrompt extends Prompt {
+ constructor(opts={}) {
+ super(opts);
+ this.msg = opts.message;
+ this.cursor = 0;
+ this.typed = '';
+ this.locales = Object.assign(dfltLocales, opts.locales);
+ this._date = opts.initial || new Date();
+ this.errorMsg = opts.error || 'Please Enter A Valid Value';
+ this.validator = opts.validate || (() => true);
+ this.mask = opts.mask || 'YYYY-MM-DD HH:mm:ss';
+ this.clear = clear('', this.out.columns);
+ this.render();
+ }
+
+ get value() {
+ return this.date
+ }
+
+ get date() {
+ return this._date;
+ }
+
+ set date(date) {
+ if (date) this._date.setTime(date.getTime());
+ }
+
+ set mask(mask) {
+ let result;
+ this.parts = [];
+ while(result = regex.exec(mask)) {
+ let match = result.shift();
+ let idx = result.findIndex(gr => gr != null);
+ this.parts.push(idx in regexGroups
+ ? regexGroups[idx]({ token: result[idx] || match, date: this.date, parts: this.parts, locales: this.locales })
+ : result[idx] || match);
+ }
+
+ let parts = this.parts.reduce((arr, i) => {
+ if (typeof i === 'string' && typeof arr[arr.length - 1] === 'string')
+ arr[arr.length - 1] += i;
+ else arr.push(i);
+ return arr;
+ }, []);
+
+ this.parts.splice(0);
+ this.parts.push(...parts);
+ this.reset();
+ }
+
+ moveCursor(n) {
+ this.typed = '';
+ this.cursor = n;
+ this.fire();
+ }
+
+ reset() {
+ this.moveCursor(this.parts.findIndex(p => p instanceof DatePart));
+ this.fire();
+ this.render();
+ }
+
+ exit() {
+ this.abort();
+ }
+
+ abort() {
+ this.done = this.aborted = true;
+ this.error = false;
+ this.fire();
+ this.render();
+ this.out.write('\n');
+ this.close();
+ }
+
+ async validate() {
+ let valid = await this.validator(this.value);
+ if (typeof valid === 'string') {
+ this.errorMsg = valid;
+ valid = false;
+ }
+ this.error = !valid;
+ }
+
+ async submit() {
+ await this.validate();
+ if (this.error) {
+ this.color = 'red';
+ this.fire();
+ this.render();
+ return;
+ }
+ this.done = true;
+ this.aborted = false;
+ this.fire();
+ this.render();
+ this.out.write('\n');
+ this.close();
+ }
+
+ up() {
+ this.typed = '';
+ this.parts[this.cursor].up();
+ this.render();
+ }
+
+ down() {
+ this.typed = '';
+ this.parts[this.cursor].down();
+ this.render();
+ }
+
+ left() {
+ let prev = this.parts[this.cursor].prev();
+ if (prev == null) return this.bell();
+ this.moveCursor(this.parts.indexOf(prev));
+ this.render();
+ }
+
+ right() {
+ let next = this.parts[this.cursor].next();
+ if (next == null) return this.bell();
+ this.moveCursor(this.parts.indexOf(next));
+ this.render();
+ }
+
+ next() {
+ let next = this.parts[this.cursor].next();
+ this.moveCursor(next
+ ? this.parts.indexOf(next)
+ : this.parts.findIndex((part) => part instanceof DatePart));
+ this.render();
+ }
+
+ _(c) {
+ if (/\d/.test(c)) {
+ this.typed += c;
+ this.parts[this.cursor].setTo(this.typed);
+ this.render();
+ }
+ }
+
+ render() {
+ if (this.closed) return;
+ if (this.firstRender) this.out.write(cursor.hide);
+ else this.out.write(clear(this.outputText, this.out.columns));
+ super.render();
+
+ // Print prompt
+ this.outputText = [
+ style.symbol(this.done, this.aborted),
+ color.bold(this.msg),
+ style.delimiter(false),
+ this.parts.reduce((arr, p, idx) => arr.concat(idx === this.cursor && !this.done ? color.cyan().underline(p.toString()) : p), [])
+ .join('')
+ ].join(' ');
+
+ // Print error
+ if (this.error) {
+ this.outputText += this.errorMsg.split('\n').reduce(
+ (a, l, i) => a + `\n${i ? ` ` : figures.pointerSmall} ${color.red().italic(l)}`, ``);
+ }
+
+ this.out.write(erase.line + cursor.to(0) + this.outputText);
+ }
+}
+
+module.exports = DatePrompt;
diff --git a/node_modules/prompts/lib/elements/index.js b/node_modules/prompts/lib/elements/index.js
new file mode 100644
index 0000000..2556dd0
--- /dev/null
+++ b/node_modules/prompts/lib/elements/index.js
@@ -0,0 +1,13 @@
+'use strict';
+
+module.exports = {
+ TextPrompt: require('./text'),
+ SelectPrompt: require('./select'),
+ TogglePrompt: require('./toggle'),
+ DatePrompt: require('./date'),
+ NumberPrompt: require('./number'),
+ MultiselectPrompt: require('./multiselect'),
+ AutocompletePrompt: require('./autocomplete'),
+ AutocompleteMultiselectPrompt: require('./autocompleteMultiselect'),
+ ConfirmPrompt: require('./confirm')
+};
diff --git a/node_modules/prompts/lib/elements/multiselect.js b/node_modules/prompts/lib/elements/multiselect.js
new file mode 100644
index 0000000..99b393f
--- /dev/null
+++ b/node_modules/prompts/lib/elements/multiselect.js
@@ -0,0 +1,271 @@
+'use strict';
+
+const color = require('kleur');
+const { cursor } = require('sisteransi');
+const Prompt = require('./prompt');
+const { clear, figures, style, wrap, entriesToDisplay } = require('../util');
+
+/**
+ * MultiselectPrompt Base Element
+ * @param {Object} opts Options
+ * @param {String} opts.message Message
+ * @param {Array} opts.choices Array of choice objects
+ * @param {String} [opts.hint] Hint to display
+ * @param {String} [opts.warn] Hint shown for disabled choices
+ * @param {Number} [opts.max] Max choices
+ * @param {Number} [opts.cursor=0] Cursor start position
+ * @param {Number} [opts.optionsPerPage=10] Max options to display at once
+ * @param {Stream} [opts.stdin] The Readable stream to listen to
+ * @param {Stream} [opts.stdout] The Writable stream to write readline data to
+ */
+class MultiselectPrompt extends Prompt {
+ constructor(opts={}) {
+ super(opts);
+ this.msg = opts.message;
+ this.cursor = opts.cursor || 0;
+ this.scrollIndex = opts.cursor || 0;
+ this.hint = opts.hint || '';
+ this.warn = opts.warn || '- This option is disabled -';
+ this.minSelected = opts.min;
+ this.showMinError = false;
+ this.maxChoices = opts.max;
+ this.instructions = opts.instructions;
+ this.optionsPerPage = opts.optionsPerPage || 10;
+ this.value = opts.choices.map((ch, idx) => {
+ if (typeof ch === 'string')
+ ch = {title: ch, value: idx};
+ return {
+ title: ch && (ch.title || ch.value || ch),
+ description: ch && ch.description,
+ value: ch && (ch.value === undefined ? idx : ch.value),
+ selected: ch && ch.selected,
+ disabled: ch && ch.disabled
+ };
+ });
+ this.clear = clear('', this.out.columns);
+ if (!opts.overrideRender) {
+ this.render();
+ }
+ }
+
+ reset() {
+ this.value.map(v => !v.selected);
+ this.cursor = 0;
+ this.fire();
+ this.render();
+ }
+
+ selected() {
+ return this.value.filter(v => v.selected);
+ }
+
+ exit() {
+ this.abort();
+ }
+
+ abort() {
+ this.done = this.aborted = true;
+ this.fire();
+ this.render();
+ this.out.write('\n');
+ this.close();
+ }
+
+ submit() {
+ const selected = this.value
+ .filter(e => e.selected);
+ if (this.minSelected && selected.length < this.minSelected) {
+ this.showMinError = true;
+ this.render();
+ } else {
+ this.done = true;
+ this.aborted = false;
+ this.fire();
+ this.render();
+ this.out.write('\n');
+ this.close();
+ }
+ }
+
+ first() {
+ this.cursor = 0;
+ this.render();
+ }
+
+ last() {
+ this.cursor = this.value.length - 1;
+ this.render();
+ }
+ next() {
+ this.cursor = (this.cursor + 1) % this.value.length;
+ this.render();
+ }
+
+ up() {
+ if (this.cursor === 0) {
+ this.cursor = this.value.length - 1;
+ } else {
+ this.cursor--;
+ }
+ this.render();
+ }
+
+ down() {
+ if (this.cursor === this.value.length - 1) {
+ this.cursor = 0;
+ } else {
+ this.cursor++;
+ }
+ this.render();
+ }
+
+ left() {
+ this.value[this.cursor].selected = false;
+ this.render();
+ }
+
+ right() {
+ if (this.value.filter(e => e.selected).length >= this.maxChoices) return this.bell();
+ this.value[this.cursor].selected = true;
+ this.render();
+ }
+
+ handleSpaceToggle() {
+ const v = this.value[this.cursor];
+
+ if (v.selected) {
+ v.selected = false;
+ this.render();
+ } else if (v.disabled || this.value.filter(e => e.selected).length >= this.maxChoices) {
+ return this.bell();
+ } else {
+ v.selected = true;
+ this.render();
+ }
+ }
+
+ toggleAll() {
+ if (this.maxChoices !== undefined || this.value[this.cursor].disabled) {
+ return this.bell();
+ }
+
+ const newSelected = !this.value[this.cursor].selected;
+ this.value.filter(v => !v.disabled).forEach(v => v.selected = newSelected);
+ this.render();
+ }
+
+ _(c, key) {
+ if (c === ' ') {
+ this.handleSpaceToggle();
+ } else if (c === 'a') {
+ this.toggleAll();
+ } else {
+ return this.bell();
+ }
+ }
+
+ renderInstructions() {
+ if (this.instructions === undefined || this.instructions) {
+ if (typeof this.instructions === 'string') {
+ return this.instructions;
+ }
+ return '\nInstructions:\n'
+ + ` ${figures.arrowUp}/${figures.arrowDown}: Highlight option\n`
+ + ` ${figures.arrowLeft}/${figures.arrowRight}/[space]: Toggle selection\n`
+ + (this.maxChoices === undefined ? ` a: Toggle all\n` : '')
+ + ` enter/return: Complete answer`;
+ }
+ return '';
+ }
+
+ renderOption(cursor, v, i, arrowIndicator) {
+ const prefix = (v.selected ? color.green(figures.radioOn) : figures.radioOff) + ' ' + arrowIndicator + ' ';
+ let title, desc;
+
+ if (v.disabled) {
+ title = cursor === i ? color.gray().underline(v.title) : color.strikethrough().gray(v.title);
+ } else {
+ title = cursor === i ? color.cyan().underline(v.title) : v.title;
+ if (cursor === i && v.description) {
+ desc = ` - ${v.description}`;
+ if (prefix.length + title.length + desc.length >= this.out.columns
+ || v.description.split(/\r?\n/).length > 1) {
+ desc = '\n' + wrap(v.description, { margin: prefix.length, width: this.out.columns });
+ }
+ }
+ }
+
+ return prefix + title + color.gray(desc || '');
+ }
+
+ // shared with autocompleteMultiselect
+ paginateOptions(options) {
+ if (options.length === 0) {
+ return color.red('No matches for this query.');
+ }
+
+ let { startIndex, endIndex } = entriesToDisplay(this.cursor, options.length, this.optionsPerPage);
+ let prefix, styledOptions = [];
+
+ for (let i = startIndex; i < endIndex; i++) {
+ if (i === startIndex && startIndex > 0) {
+ prefix = figures.arrowUp;
+ } else if (i === endIndex - 1 && endIndex < options.length) {
+ prefix = figures.arrowDown;
+ } else {
+ prefix = ' ';
+ }
+ styledOptions.push(this.renderOption(this.cursor, options[i], i, prefix));
+ }
+
+ return '\n' + styledOptions.join('\n');
+ }
+
+ // shared with autocomleteMultiselect
+ renderOptions(options) {
+ if (!this.done) {
+ return this.paginateOptions(options);
+ }
+ return '';
+ }
+
+ renderDoneOrInstructions() {
+ if (this.done) {
+ return this.value
+ .filter(e => e.selected)
+ .map(v => v.title)
+ .join(', ');
+ }
+
+ const output = [color.gray(this.hint), this.renderInstructions()];
+
+ if (this.value[this.cursor].disabled) {
+ output.push(color.yellow(this.warn));
+ }
+ return output.join(' ');
+ }
+
+ render() {
+ if (this.closed) return;
+ if (this.firstRender) this.out.write(cursor.hide);
+ super.render();
+
+ // print prompt
+ let prompt = [
+ style.symbol(this.done, this.aborted),
+ color.bold(this.msg),
+ style.delimiter(false),
+ this.renderDoneOrInstructions()
+ ].join(' ');
+ if (this.showMinError) {
+ prompt += color.red(`You must select a minimum of ${this.minSelected} choices.`);
+ this.showMinError = false;
+ }
+ prompt += this.renderOptions(this.value);
+
+ this.out.write(this.clear + prompt);
+ this.clear = clear(prompt, this.out.columns);
+ }
+}
+
+module.exports = MultiselectPrompt;
diff --git a/node_modules/prompts/lib/elements/number.js b/node_modules/prompts/lib/elements/number.js
new file mode 100644
index 0000000..dc3efe9
--- /dev/null
+++ b/node_modules/prompts/lib/elements/number.js
@@ -0,0 +1,213 @@
+const color = require('kleur');
+const Prompt = require('./prompt');
+const { cursor, erase } = require('sisteransi');
+const { style, figures, clear, lines } = require('../util');
+
+const isNumber = /[0-9]/;
+const isDef = any => any !== undefined;
+const round = (number, precision) => {
+ let factor = Math.pow(10, precision);
+ return Math.round(number * factor) / factor;
+}
+
+/**
+ * NumberPrompt Base Element
+ * @param {Object} opts Options
+ * @param {String} opts.message Message
+ * @param {String} [opts.style='default'] Render style
+ * @param {Number} [opts.initial] Default value
+ * @param {Number} [opts.max=+Infinity] Max value
+ * @param {Number} [opts.min=-Infinity] Min value
+ * @param {Boolean} [opts.float=false] Parse input as floats
+ * @param {Number} [opts.round=2] Round floats to x decimals
+ * @param {Number} [opts.increment=1] Number to increment by when using arrow-keys
+ * @param {Function} [opts.validate] Validate function
+ * @param {Stream} [opts.stdin] The Readable stream to listen to
+ * @param {Stream} [opts.stdout] The Writable stream to write readline data to
+ * @param {String} [opts.error] The invalid error label
+ */
+class NumberPrompt extends Prompt {
+ constructor(opts={}) {
+ super(opts);
+ this.transform = style.render(opts.style);
+ this.msg = opts.message;
+ this.initial = isDef(opts.initial) ? opts.initial : '';
+ this.float = !!opts.float;
+ this.round = opts.round || 2;
+ this.inc = opts.increment || 1;
+ this.min = isDef(opts.min) ? opts.min : -Infinity;
+ this.max = isDef(opts.max) ? opts.max : Infinity;
+ this.errorMsg = opts.error || `Please Enter A Valid Value`;
+ this.validator = opts.validate || (() => true);
+ this.color = `cyan`;
+ this.value = ``;
+ this.typed = ``;
+ this.lastHit = 0;
+ this.render();
+ }
+
+ set value(v) {
+ if (!v && v !== 0) {
+ this.placeholder = true;
+ this.rendered = color.gray(this.transform.render(`${this.initial}`));
+ this._value = ``;
+ } else {
+ this.placeholder = false;
+ this.rendered = this.transform.render(`${round(v, this.round)}`);
+ this._value = round(v, this.round);
+ }
+ this.fire();
+ }
+
+ get value() {
+ return this._value;
+ }
+
+ parse(x) {
+ return this.float ? parseFloat(x) : parseInt(x);
+ }
+
+ valid(c) {
+ return c === `-` || c === `.` && this.float || isNumber.test(c)
+ }
+
+ reset() {
+ this.typed = ``;
+ this.value = ``;
+ this.fire();
+ this.render();
+ }
+
+ exit() {
+ this.abort();
+ }
+
+ abort() {
+ let x = this.value;
+ this.value = x !== `` ? x : this.initial;
+ this.done = this.aborted = true;
+ this.error = false;
+ this.fire();
+ this.render();
+ this.out.write(`\n`);
+ this.close();
+ }
+
+ async validate() {
+ let valid = await this.validator(this.value);
+ if (typeof valid === `string`) {
+ this.errorMsg = valid;
+ valid = false;
+ }
+ this.error = !valid;
+ }
+
+ async submit() {
+ await this.validate();
+ if (this.error) {
+ this.color = `red`;
+ this.fire();
+ this.render();
+ return;
+ }
+ let x = this.value;
+ this.value = x !== `` ? x : this.initial;
+ this.done = true;
+ this.aborted = false;
+ this.error = false;
+ this.fire();
+ this.render();
+ this.out.write(`\n`);
+ this.close();
+ }
+
+ up() {
+ this.typed = ``;
+ if(this.value === '') {
+ this.value = this.min - this.inc;
+ }
+ if (this.value >= this.max) return this.bell();
+ this.value += this.inc;
+ this.color = `cyan`;
+ this.fire();
+ this.render();
+ }
+
+ down() {
+ this.typed = ``;
+ if(this.value === '') {
+ this.value = this.min + this.inc;
+ }
+ if (this.value <= this.min) return this.bell();
+ this.value -= this.inc;
+ this.color = `cyan`;
+ this.fire();
+ this.render();
+ }
+
+ delete() {
+ let val = this.value.toString();
+ if (val.length === 0) return this.bell();
+ this.value = this.parse((val = val.slice(0, -1))) || ``;
+ if (this.value !== '' && this.value < this.min) {
+ this.value = this.min;
+ }
+ this.color = `cyan`;
+ this.fire();
+ this.render();
+ }
+
+ next() {
+ this.value = this.initial;
+ this.fire();
+ this.render();
+ }
+
+ _(c, key) {
+ if (!this.valid(c)) return this.bell();
+
+ const now = Date.now();
+ if (now - this.lastHit > 1000) this.typed = ``; // 1s elapsed
+ this.typed += c;
+ this.lastHit = now;
+ this.color = `cyan`;
+
+ if (c === `.`) return this.fire();
+
+ this.value = Math.min(this.parse(this.typed), this.max);
+ if (this.value > this.max) this.value = this.max;
+ if (this.value < this.min) this.value = this.min;
+ this.fire();
+ this.render();
+ }
+
+ render() {
+ if (this.closed) return;
+ if (!this.firstRender) {
+ if (this.outputError)
+ this.out.write(cursor.down(lines(this.outputError, this.out.columns) - 1) + clear(this.outputError, this.out.columns));
+ this.out.write(clear(this.outputText, this.out.columns));
+ }
+ super.render();
+ this.outputError = '';
+
+ // Print prompt
+ this.outputText = [
+ style.symbol(this.done, this.aborted),
+ color.bold(this.msg),
+ style.delimiter(this.done),
+ !this.done || (!this.done && !this.placeholder)
+ ? color[this.color]().underline(this.rendered) : this.rendered
+ ].join(` `);
+
+ // Print error
+ if (this.error) {
+ this.outputError += this.errorMsg.split(`\n`)
+ .reduce((a, l, i) => a + `\n${i ? ` ` : figures.pointerSmall} ${color.red().italic(l)}`, ``);
+ }
+
+ this.out.write(erase.line + cursor.to(0) + this.outputText + cursor.save + this.outputError + cursor.restore);
+ }
+}
+
+module.exports = NumberPrompt;
diff --git a/node_modules/prompts/lib/elements/prompt.js b/node_modules/prompts/lib/elements/prompt.js
new file mode 100644
index 0000000..b793330
--- /dev/null
+++ b/node_modules/prompts/lib/elements/prompt.js
@@ -0,0 +1,68 @@
+'use strict';
+
+const readline = require('readline');
+const { action } = require('../util');
+const EventEmitter = require('events');
+const { beep, cursor } = require('sisteransi');
+const color = require('kleur');
+
+/**
+ * Base prompt skeleton
+ * @param {Stream} [opts.stdin] The Readable stream to listen to
+ * @param {Stream} [opts.stdout] The Writable stream to write readline data to
+ */
+class Prompt extends EventEmitter {
+ constructor(opts={}) {
+ super();
+
+ this.firstRender = true;
+ this.in = opts.stdin || process.stdin;
+ this.out = opts.stdout || process.stdout;
+ this.onRender = (opts.onRender || (() => void 0)).bind(this);
+ const rl = readline.createInterface({ input:this.in, escapeCodeTimeout:50 });
+ readline.emitKeypressEvents(this.in, rl);
+
+ if (this.in.isTTY) this.in.setRawMode(true);
+ const isSelect = [ 'SelectPrompt', 'MultiselectPrompt' ].indexOf(this.constructor.name) > -1;
+ const keypress = (str, key) => {
+ let a = action(key, isSelect);
+ if (a === false) {
+ this._ && this._(str, key);
+ } else if (typeof this[a] === 'function') {
+ this[a](key);
+ } else {
+ this.bell();
+ }
+ };
+
+ this.close = () => {
+ this.out.write(cursor.show);
+ this.in.removeListener('keypress', keypress);
+ if (this.in.isTTY) this.in.setRawMode(false);
+ rl.close();
+ this.emit(this.aborted ? 'abort' : this.exited ? 'exit' : 'submit', this.value);
+ this.closed = true;
+ };
+
+ this.in.on('keypress', keypress);
+ }
+
+ fire() {
+ this.emit('state', {
+ value: this.value,
+ aborted: !!this.aborted,
+ exited: !!this.exited
+ });
+ }
+
+ bell() {
+ this.out.write(beep);
+ }
+
+ render() {
+ this.onRender(color);
+ if (this.firstRender) this.firstRender = false;
+ }
+}
+
+module.exports = Prompt;
diff --git a/node_modules/prompts/lib/elements/select.js b/node_modules/prompts/lib/elements/select.js
new file mode 100644
index 0000000..6d6727f
--- /dev/null
+++ b/node_modules/prompts/lib/elements/select.js
@@ -0,0 +1,175 @@
+'use strict';
+
+const color = require('kleur');
+const Prompt = require('./prompt');
+const { style, clear, figures, wrap, entriesToDisplay } = require('../util');
+const { cursor } = require('sisteransi');
+
+/**
+ * SelectPrompt Base Element
+ * @param {Object} opts Options
+ * @param {String} opts.message Message
+ * @param {Array} opts.choices Array of choice objects
+ * @param {String} [opts.hint] Hint to display
+ * @param {Number} [opts.initial] Index of default value
+ * @param {Stream} [opts.stdin] The Readable stream to listen to
+ * @param {Stream} [opts.stdout] The Writable stream to write readline data to
+ * @param {Number} [opts.optionsPerPage=10] Max options to display at once
+ */
+class SelectPrompt extends Prompt {
+ constructor(opts={}) {
+ super(opts);
+ this.msg = opts.message;
+ this.hint = opts.hint || '- Use arrow-keys. Return to submit.';
+ this.warn = opts.warn || '- This option is disabled';
+ this.cursor = opts.initial || 0;
+ this.choices = opts.choices.map((ch, idx) => {
+ if (typeof ch === 'string')
+ ch = {title: ch, value: idx};
+ return {
+ title: ch && (ch.title || ch.value || ch),
+ value: ch && (ch.value === undefined ? idx : ch.value),
+ description: ch && ch.description,
+ selected: ch && ch.selected,
+ disabled: ch && ch.disabled
+ };
+ });
+ this.optionsPerPage = opts.optionsPerPage || 10;
+ this.value = (this.choices[this.cursor] || {}).value;
+ this.clear = clear('', this.out.columns);
+ this.render();
+ }
+
+ moveCursor(n) {
+ this.cursor = n;
+ this.value = this.choices[n].value;
+ this.fire();
+ }
+
+ reset() {
+ this.moveCursor(0);
+ this.fire();
+ this.render();
+ }
+
+ exit() {
+ this.abort();
+ }
+
+ abort() {
+ this.done = this.aborted = true;
+ this.fire();
+ this.render();
+ this.out.write('\n');
+ this.close();
+ }
+
+ submit() {
+ if (!this.selection.disabled) {
+ this.done = true;
+ this.aborted = false;
+ this.fire();
+ this.render();
+ this.out.write('\n');
+ this.close();
+ } else
+ this.bell();
+ }
+
+ first() {
+ this.moveCursor(0);
+ this.render();
+ }
+
+ last() {
+ this.moveCursor(this.choices.length - 1);
+ this.render();
+ }
+
+ up() {
+ if (this.cursor === 0) {
+ this.moveCursor(this.choices.length - 1);
+ } else {
+ this.moveCursor(this.cursor - 1);
+ }
+ this.render();
+ }
+
+ down() {
+ if (this.cursor === this.choices.length - 1) {
+ this.moveCursor(0);
+ } else {
+ this.moveCursor(this.cursor + 1);
+ }
+ this.render();
+ }
+
+ next() {
+ this.moveCursor((this.cursor + 1) % this.choices.length);
+ this.render();
+ }
+
+ _(c, key) {
+ if (c === ' ') return this.submit();
+ }
+
+ get selection() {
+ return this.choices[this.cursor];
+ }
+
+ render() {
+ if (this.closed) return;
+ if (this.firstRender) this.out.write(cursor.hide);
+ else this.out.write(clear(this.outputText, this.out.columns));
+ super.render();
+
+ let { startIndex, endIndex } = entriesToDisplay(this.cursor, this.choices.length, this.optionsPerPage);
+
+ // Print prompt
+ this.outputText = [
+ style.symbol(this.done, this.aborted),
+ color.bold(this.msg),
+ style.delimiter(false),
+ this.done ? this.selection.title : this.selection.disabled
+ ? color.yellow(this.warn) : color.gray(this.hint)
+ ].join(' ');
+
+ // Print choices
+ if (!this.done) {
+ this.outputText += '\n';
+ for (let i = startIndex; i < endIndex; i++) {
+ let title, prefix, desc = '', v = this.choices[i];
+
+ // Determine whether to display "more choices" indicators
+ if (i === startIndex && startIndex > 0) {
+ prefix = figures.arrowUp;
+ } else if (i === endIndex - 1 && endIndex < this.choices.length) {
+ prefix = figures.arrowDown;
+ } else {
+ prefix = ' ';
+ }
+
+ if (v.disabled) {
+ title = this.cursor === i ? color.gray().underline(v.title) : color.strikethrough().gray(v.title);
+ prefix = (this.cursor === i ? color.bold().gray(figures.pointer) + ' ' : ' ') + prefix;
+ } else {
+ title = this.cursor === i ? color.cyan().underline(v.title) : v.title;
+ prefix = (this.cursor === i ? color.cyan(figures.pointer) + ' ' : ' ') + prefix;
+ if (v.description && this.cursor === i) {
+ desc = ` - ${v.description}`;
+ if (prefix.length + title.length + desc.length >= this.out.columns
+ || v.description.split(/\r?\n/).length > 1) {
+ desc = '\n' + wrap(v.description, { margin: 3, width: this.out.columns });
+ }
+ }
+ }
+
+ this.outputText += `${prefix} ${title}${color.gray(desc)}\n`;
+ }
+ }
+
+ this.out.write(this.outputText);
+ }
+}
+
+module.exports = SelectPrompt;
diff --git a/node_modules/prompts/lib/elements/text.js b/node_modules/prompts/lib/elements/text.js
new file mode 100644
index 0000000..ee78181
--- /dev/null
+++ b/node_modules/prompts/lib/elements/text.js
@@ -0,0 +1,208 @@
+const color = require('kleur');
+const Prompt = require('./prompt');
+const { erase, cursor } = require('sisteransi');
+const { style, clear, lines, figures } = require('../util');
+
+/**
+ * TextPrompt Base Element
+ * @param {Object} opts Options
+ * @param {String} opts.message Message
+ * @param {String} [opts.style='default'] Render style
+ * @param {String} [opts.initial] Default value
+ * @param {Function} [opts.validate] Validate function
+ * @param {Stream} [opts.stdin] The Readable stream to listen to
+ * @param {Stream} [opts.stdout] The Writable stream to write readline data to
+ * @param {String} [opts.error] The invalid error label
+ */
+class TextPrompt extends Prompt {
+ constructor(opts={}) {
+ super(opts);
+ this.transform = style.render(opts.style);
+ this.scale = this.transform.scale;
+ this.msg = opts.message;
+ this.initial = opts.initial || ``;
+ this.validator = opts.validate || (() => true);
+ this.value = ``;
+ this.errorMsg = opts.error || `Please Enter A Valid Value`;
+ this.cursor = Number(!!this.initial);
+ this.cursorOffset = 0;
+ this.clear = clear(``, this.out.columns);
+ this.render();
+ }
+
+ set value(v) {
+ if (!v && this.initial) {
+ this.placeholder = true;
+ this.rendered = color.gray(this.transform.render(this.initial));
+ } else {
+ this.placeholder = false;
+ this.rendered = this.transform.render(v);
+ }
+ this._value = v;
+ this.fire();
+ }
+
+ get value() {
+ return this._value;
+ }
+
+ reset() {
+ this.value = ``;
+ this.cursor = Number(!!this.initial);
+ this.cursorOffset = 0;
+ this.fire();
+ this.render();
+ }
+
+ exit() {
+ this.abort();
+ }
+
+ abort() {
+ this.value = this.value || this.initial;
+ this.done = this.aborted = true;
+ this.error = false;
+ this.red = false;
+ this.fire();
+ this.render();
+ this.out.write('\n');
+ this.close();
+ }
+
+ async validate() {
+ let valid = await this.validator(this.value);
+ if (typeof valid === `string`) {
+ this.errorMsg = valid;
+ valid = false;
+ }
+ this.error = !valid;
+ }
+
+ async submit() {
+ this.value = this.value || this.initial;
+ this.cursorOffset = 0;
+ this.cursor = this.rendered.length;
+ await this.validate();
+ if (this.error) {
+ this.red = true;
+ this.fire();
+ this.render();
+ return;
+ }
+ this.done = true;
+ this.aborted = false;
+ this.fire();
+ this.render();
+ this.out.write('\n');
+ this.close();
+ }
+
+ next() {
+ if (!this.placeholder) return this.bell();
+ this.value = this.initial;
+ this.cursor = this.rendered.length;
+ this.fire();
+ this.render();
+ }
+
+ moveCursor(n) {
+ if (this.placeholder) return;
+ this.cursor = this.cursor+n;
+ this.cursorOffset += n;
+ }
+
+ _(c, key) {
+ let s1 = this.value.slice(0, this.cursor);
+ let s2 = this.value.slice(this.cursor);
+ this.value = `${s1}${c}${s2}`;
+ this.red = false;
+ this.cursor = this.placeholder ? 0 : s1.length+1;
+ this.render();
+ }
+
+ delete() {
+ if (this.isCursorAtStart()) return this.bell();
+ let s1 = this.value.slice(0, this.cursor-1);
+ let s2 = this.value.slice(this.cursor);
+ this.value = `${s1}${s2}`;
+ this.red = false;
+ if (this.isCursorAtStart()) {
+ this.cursorOffset = 0
+ } else {
+ this.cursorOffset++;
+ this.moveCursor(-1);
+ }
+ this.render();
+ }
+
+ deleteForward() {
+ if(this.cursor*this.scale >= this.rendered.length || this.placeholder) return this.bell();
+ let s1 = this.value.slice(0, this.cursor);
+ let s2 = this.value.slice(this.cursor+1);
+ this.value = `${s1}${s2}`;
+ this.red = false;
+ if (this.isCursorAtEnd()) {
+ this.cursorOffset = 0;
+ } else {
+ this.cursorOffset++;
+ }
+ this.render();
+ }
+
+ first() {
+ this.cursor = 0;
+ this.render();
+ }
+
+ last() {
+ this.cursor = this.value.length;
+ this.render();
+ }
+
+ left() {
+ if (this.cursor <= 0 || this.placeholder) return this.bell();
+ this.moveCursor(-1);
+ this.render();
+ }
+
+ right() {
+ if (this.cursor*this.scale >= this.rendered.length || this.placeholder) return this.bell();
+ this.moveCursor(1);
+ this.render();
+ }
+
+ isCursorAtStart() {
+ return this.cursor === 0 || (this.placeholder && this.cursor === 1);
+ }
+
+ isCursorAtEnd() {
+ return this.cursor === this.rendered.length || (this.placeholder && this.cursor === this.rendered.length + 1)
+ }
+
+ render() {
+ if (this.closed) return;
+ if (!this.firstRender) {
+ if (this.outputError)
+ this.out.write(cursor.down(lines(this.outputError, this.out.columns) - 1) + clear(this.outputError, this.out.columns));
+ this.out.write(clear(this.outputText, this.out.columns));
+ }
+ super.render();
+ this.outputError = '';
+
+ this.outputText = [
+ style.symbol(this.done, this.aborted),
+ color.bold(this.msg),
+ style.delimiter(this.done),
+ this.red ? color.red(this.rendered) : this.rendered
+ ].join(` `);
+
+ if (this.error) {
+ this.outputError += this.errorMsg.split(`\n`)
+ .reduce((a, l, i) => a + `\n${i ? ' ' : figures.pointerSmall} ${color.red().italic(l)}`, ``);
+ }
+
+ this.out.write(erase.line + cursor.to(0) + this.outputText + cursor.save + this.outputError + cursor.restore + cursor.move(this.cursorOffset, 0));
+ }
+}
+
+module.exports = TextPrompt; \ No newline at end of file
diff --git a/node_modules/prompts/lib/elements/toggle.js b/node_modules/prompts/lib/elements/toggle.js
new file mode 100644
index 0000000..bad612c
--- /dev/null
+++ b/node_modules/prompts/lib/elements/toggle.js
@@ -0,0 +1,118 @@
+const color = require('kleur');
+const Prompt = require('./prompt');
+const { style, clear } = require('../util');
+const { cursor, erase } = require('sisteransi');
+
+/**
+ * TogglePrompt Base Element
+ * @param {Object} opts Options
+ * @param {String} opts.message Message
+ * @param {Boolean} [opts.initial=false] Default value
+ * @param {String} [opts.active='no'] Active label
+ * @param {String} [opts.inactive='off'] Inactive label
+ * @param {Stream} [opts.stdin] The Readable stream to listen to
+ * @param {Stream} [opts.stdout] The Writable stream to write readline data to
+ */
+class TogglePrompt extends Prompt {
+ constructor(opts={}) {
+ super(opts);
+ this.msg = opts.message;
+ this.value = !!opts.initial;
+ this.active = opts.active || 'on';
+ this.inactive = opts.inactive || 'off';
+ this.initialValue = this.value;
+ this.render();
+ }
+
+ reset() {
+ this.value = this.initialValue;
+ this.fire();
+ this.render();
+ }
+
+ exit() {
+ this.abort();
+ }
+
+ abort() {
+ this.done = this.aborted = true;
+ this.fire();
+ this.render();
+ this.out.write('\n');
+ this.close();
+ }
+
+ submit() {
+ this.done = true;
+ this.aborted = false;
+ this.fire();
+ this.render();
+ this.out.write('\n');
+ this.close();
+ }
+
+ deactivate() {
+ if (this.value === false) return this.bell();
+ this.value = false;
+ this.render();
+ }
+
+ activate() {
+ if (this.value === true) return this.bell();
+ this.value = true;
+ this.render();
+ }
+
+ delete() {
+ this.deactivate();
+ }
+ left() {
+ this.deactivate();
+ }
+ right() {
+ this.activate();
+ }
+ down() {
+ this.deactivate();
+ }
+ up() {
+ this.activate();
+ }
+
+ next() {
+ this.value = !this.value;
+ this.fire();
+ this.render();
+ }
+
+ _(c, key) {
+ if (c === ' ') {
+ this.value = !this.value;
+ } else if (c === '1') {
+ this.value = true;
+ } else if (c === '0') {
+ this.value = false;
+ } else return this.bell();
+ this.render();
+ }
+
+ render() {
+ if (this.closed) return;
+ if (this.firstRender) this.out.write(cursor.hide);
+ else this.out.write(clear(this.outputText, this.out.columns));
+ super.render();
+
+ this.outputText = [
+ style.symbol(this.done, this.aborted),
+ color.bold(this.msg),
+ style.delimiter(this.done),
+ this.value ? this.inactive : color.cyan().underline(this.inactive),
+ color.gray('/'),
+ this.value ? color.cyan().underline(this.active) : this.active
+ ].join(' ');
+
+ this.out.write(erase.line + cursor.to(0) + this.outputText);
+ }
+}
+
+module.exports = TogglePrompt;
diff --git a/node_modules/prompts/lib/index.js b/node_modules/prompts/lib/index.js
new file mode 100644
index 0000000..a5374d5
--- /dev/null
+++ b/node_modules/prompts/lib/index.js
@@ -0,0 +1,98 @@
+'use strict';
+
+const prompts = require('./prompts');
+
+const passOn = ['suggest', 'format', 'onState', 'validate', 'onRender', 'type'];
+const noop = () => {};
+
+/**
+ * Prompt for a series of questions
+ * @param {Array|Object} questions Single question object or Array of question objects
+ * @param {Function} [onSubmit] Callback function called on prompt submit
+ * @param {Function} [onCancel] Callback function called on cancel/abort
+ * @returns {Object} Object with values from user input
+ */
+async function prompt(questions=[], { onSubmit=noop, onCancel=noop }={}) {
+ const answers = {};
+ const override = prompt._override || {};
+ questions = [].concat(questions);
+ let answer, question, quit, name, type, lastPrompt;
+
+ const getFormattedAnswer = async (question, answer, skipValidation = false) => {
+ if (!skipValidation && question.validate && question.validate(answer) !== true) {
+ return;
+ }
+ return question.format ? await question.format(answer, answers) : answer
+ };
+
+ for (question of questions) {
+ ({ name, type } = question);
+
+ // evaluate type first and skip if type is a falsy value
+ if (typeof type === 'function') {
+ type = await type(answer, { ...answers }, question)
+ question['type'] = type
+ }
+ if (!type) continue;
+
+ // if property is a function, invoke it unless it's a special function
+ for (let key in question) {
+ if (passOn.includes(key)) continue;
+ let value = question[key];
+ question[key] = typeof value === 'function' ? await value(answer, { ...answers }, lastPrompt) : value;
+ }
+
+ lastPrompt = question;
+
+ if (typeof question.message !== 'string') {
+ throw new Error('prompt message is required');
+ }
+
+ // update vars in case they changed
+ ({ name, type } = question);
+
+ if (prompts[type] === void 0) {
+ throw new Error(`prompt type (${type}) is not defined`);
+ }
+
+ if (override[question.name] !== undefined) {
+ answer = await getFormattedAnswer(question, override[question.name]);
+ if (answer !== undefined) {
+ answers[name] = answer;
+ continue;
+ }
+ }
+
+ try {
+ // Get the injected answer if there is one or prompt the user
+ answer = prompt._injected ? getInjectedAnswer(prompt._injected, question.initial) : await prompts[type](question);
+ answers[name] = answer = await getFormattedAnswer(question, answer, true);
+ quit = await onSubmit(question, answer, answers);
+ } catch (err) {
+ quit = !(await onCancel(question, answers));
+ }
+
+ if (quit) return answers;
+ }
+
+ return answers;
+}
+
+function getInjectedAnswer(injected, deafultValue) {
+ const answer = injected.shift();
+ if (answer instanceof Error) {
+ throw answer;
+ }
+
+ return (answer === undefined) ? deafultValue : answer;
+}
+
+function inject(answers) {
+ prompt._injected = (prompt._injected || []).concat(answers);
+}
+
+function override(answers) {
+ prompt._override = Object.assign({}, answers);
+}
+
+module.exports = Object.assign(prompt, { prompt, prompts, inject, override });
diff --git a/node_modules/prompts/lib/prompts.js b/node_modules/prompts/lib/prompts.js
new file mode 100644
index 0000000..9f62556
--- /dev/null
+++ b/node_modules/prompts/lib/prompts.js
@@ -0,0 +1,206 @@
+'use strict';
+const $ = exports;
+const el = require('./elements');
+const noop = v => v;
+
+function toPrompt(type, args, opts={}) {
+ return new Promise((res, rej) => {
+ const p = new el[type](args);
+ const onAbort = opts.onAbort || noop;
+ const onSubmit = opts.onSubmit || noop;
+ const onExit = opts.onExit || noop;
+ p.on('state', args.onState || noop);
+ p.on('submit', x => res(onSubmit(x)));
+ p.on('exit', x => res(onExit(x)));
+ p.on('abort', x => rej(onAbort(x)));
+ });
+}
+
+/**
+ * Text prompt
+ * @param {string} args.message Prompt message to display
+ * @param {string} [args.initial] Default string value
+ * @param {string} [args.style="default"] Render style ('default', 'password', 'invisible')
+ * @param {function} [args.onState] On state change callback
+ * @param {function} [args.validate] Function to validate user input
+ * @param {Stream} [args.stdin] The Readable stream to listen to
+ * @param {Stream} [args.stdout] The Writable stream to write readline data to
+ * @returns {Promise} Promise with user input
+ */
+$.text = args => toPrompt('TextPrompt', args);
+
+/**
+ * Password prompt with masked input
+ * @param {string} args.message Prompt message to display
+ * @param {string} [args.initial] Default string value
+ * @param {function} [args.onState] On state change callback
+ * @param {function} [args.validate] Function to validate user input
+ * @param {Stream} [args.stdin] The Readable stream to listen to
+ * @param {Stream} [args.stdout] The Writable stream to write readline data to
+ * @returns {Promise} Promise with user input
+ */
+$.password = args => {
+ args.style = 'password';
+ return $.text(args);
+};
+
+/**
+ * Prompt where input is invisible, like sudo
+ * @param {string} args.message Prompt message to display
+ * @param {string} [args.initial] Default string value
+ * @param {function} [args.onState] On state change callback
+ * @param {function} [args.validate] Function to validate user input
+ * @param {Stream} [args.stdin] The Readable stream to listen to
+ * @param {Stream} [args.stdout] The Writable stream to write readline data to
+ * @returns {Promise} Promise with user input
+ */
+$.invisible = args => {
+ args.style = 'invisible';
+ return $.text(args);
+};
+
+/**
+ * Number prompt
+ * @param {string} args.message Prompt message to display
+ * @param {number} args.initial Default number value
+ * @param {function} [args.onState] On state change callback
+ * @param {number} [args.max] Max value
+ * @param {number} [args.min] Min value
+ * @param {string} [args.style="default"] Render style ('default', 'password', 'invisible')
+ * @param {Boolean} [opts.float=false] Parse input as floats
+ * @param {Number} [opts.round=2] Round floats to x decimals
+ * @param {Number} [opts.increment=1] Number to increment by when using arrow-keys
+ * @param {function} [args.validate] Function to validate user input
+ * @param {Stream} [args.stdin] The Readable stream to listen to
+ * @param {Stream} [args.stdout] The Writable stream to write readline data to
+ * @returns {Promise} Promise with user input
+ */
+$.number = args => toPrompt('NumberPrompt', args);
+
+/**
+ * Date prompt
+ * @param {string} args.message Prompt message to display
+ * @param {number} args.initial Default number value
+ * @param {function} [args.onState] On state change callback
+ * @param {number} [args.max] Max value
+ * @param {number} [args.min] Min value
+ * @param {string} [args.style="default"] Render style ('default', 'password', 'invisible')
+ * @param {Boolean} [opts.float=false] Parse input as floats
+ * @param {Number} [opts.round=2] Round floats to x decimals
+ * @param {Number} [opts.increment=1] Number to increment by when using arrow-keys
+ * @param {function} [args.validate] Function to validate user input
+ * @param {Stream} [args.stdin] The Readable stream to listen to
+ * @param {Stream} [args.stdout] The Writable stream to write readline data to
+ * @returns {Promise} Promise with user input
+ */
+$.date = args => toPrompt('DatePrompt', args);
+
+/**
+ * Classic yes/no prompt
+ * @param {string} args.message Prompt message to display
+ * @param {boolean} [args.initial=false] Default value
+ * @param {function} [args.onState] On state change callback
+ * @param {Stream} [args.stdin] The Readable stream to listen to
+ * @param {Stream} [args.stdout] The Writable stream to write readline data to
+ * @returns {Promise} Promise with user input
+ */
+$.confirm = args => toPrompt('ConfirmPrompt', args);
+
+/**
+ * List prompt, split intput string by `seperator`
+ * @param {string} args.message Prompt message to display
+ * @param {string} [args.initial] Default string value
+ * @param {string} [args.style="default"] Render style ('default', 'password', 'invisible')
+ * @param {string} [args.separator] String separator
+ * @param {function} [args.onState] On state change callback
+ * @param {Stream} [args.stdin] The Readable stream to listen to
+ * @param {Stream} [args.stdout] The Writable stream to write readline data to
+ * @returns {Promise} Promise with user input, in form of an `Array`
+ */
+$.list = args => {
+ const sep = args.separator || ',';
+ return toPrompt('TextPrompt', args, {
+ onSubmit: str => str.split(sep).map(s => s.trim())
+ });
+};
+
+/**
+ * Toggle/switch prompt
+ * @param {string} args.message Prompt message to display
+ * @param {boolean} [args.initial=false] Default value
+ * @param {string} [args.active="on"] Text for `active` state
+ * @param {string} [args.inactive="off"] Text for `inactive` state
+ * @param {function} [args.onState] On state change callback
+ * @param {Stream} [args.stdin] The Readable stream to listen to
+ * @param {Stream} [args.stdout] The Writable stream to write readline data to
+ * @returns {Promise} Promise with user input
+ */
+$.toggle = args => toPrompt('TogglePrompt', args);
+
+/**
+ * Interactive select prompt
+ * @param {string} args.message Prompt message to display
+ * @param {Array} args.choices Array of choices objects `[{ title, value }, ...]`
+ * @param {number} [args.initial] Index of default value
+ * @param {String} [args.hint] Hint to display
+ * @param {function} [args.onState] On state change callback
+ * @param {Stream} [args.stdin] The Readable stream to listen to
+ * @param {Stream} [args.stdout] The Writable stream to write readline data to
+ * @returns {Promise} Promise with user input
+ */
+$.select = args => toPrompt('SelectPrompt', args);
+
+/**
+ * Interactive multi-select / autocompleteMultiselect prompt
+ * @param {string} args.message Prompt message to display
+ * @param {Array} args.choices Array of choices objects `[{ title, value, [selected] }, ...]`
+ * @param {number} [args.max] Max select
+ * @param {string} [args.hint] Hint to display user
+ * @param {Number} [args.cursor=0] Cursor start position
+ * @param {function} [args.onState] On state change callback
+ * @param {Stream} [args.stdin] The Readable stream to listen to
+ * @param {Stream} [args.stdout] The Writable stream to write readline data to
+ * @returns {Promise} Promise with user input
+ */
+$.multiselect = args => {
+ args.choices = [].concat(args.choices || []);
+ const toSelected = items => items.filter(item => item.selected).map(item => item.value);
+ return toPrompt('MultiselectPrompt', args, {
+ onAbort: toSelected,
+ onSubmit: toSelected
+ });
+};
+
+$.autocompleteMultiselect = args => {
+ args.choices = [].concat(args.choices || []);
+ const toSelected = items => items.filter(item => item.selected).map(item => item.value);
+ return toPrompt('AutocompleteMultiselectPrompt', args, {
+ onAbort: toSelected,
+ onSubmit: toSelected
+ });
+};
+
+const byTitle = (input, choices) => Promise.resolve(
+ choices.filter(item => item.title.slice(0, input.length).toLowerCase() === input.toLowerCase())
+);
+
+/**
+ * Interactive auto-complete prompt
+ * @param {string} args.message Prompt message to display
+ * @param {Array} args.choices Array of auto-complete choices objects `[{ title, value }, ...]`
+ * @param {Function} [args.suggest] Function to filter results based on user input. Defaults to sort by `title`
+ * @param {number} [args.limit=10] Max number of results to show
+ * @param {string} [args.style="default"] Render style ('default', 'password', 'invisible')
+ * @param {String} [args.initial] Index of the default value
+ * @param {boolean} [opts.clearFirst] The first ESCAPE keypress will clear the input
+ * @param {String} [args.fallback] Fallback message - defaults to initial value
+ * @param {function} [args.onState] On state change callback
+ * @param {Stream} [args.stdin] The Readable stream to listen to
+ * @param {Stream} [args.stdout] The Writable stream to write readline data to
+ * @returns {Promise} Promise with user input
+ */
+$.autocomplete = args => {
+ args.suggest = args.suggest || byTitle;
+ args.choices = [].concat(args.choices || []);
+ return toPrompt('AutocompletePrompt', args);
+};
diff --git a/node_modules/prompts/lib/util/action.js b/node_modules/prompts/lib/util/action.js
new file mode 100644
index 0000000..fefbd94
--- /dev/null
+++ b/node_modules/prompts/lib/util/action.js
@@ -0,0 +1,39 @@
+'use strict';
+
+module.exports = (key, isSelect) => {
+ if (key.meta && key.name !== 'escape') return;
+
+ if (key.ctrl) {
+ if (key.name === 'a') return 'first';
+ if (key.name === 'c') return 'abort';
+ if (key.name === 'd') return 'abort';
+ if (key.name === 'e') return 'last';
+ if (key.name === 'g') return 'reset';
+ }
+
+ if (isSelect) {
+ if (key.name === 'j') return 'down';
+ if (key.name === 'k') return 'up';
+ }
+
+ if (key.name === 'return') return 'submit';
+ if (key.name === 'enter') return 'submit'; // ctrl + J
+ if (key.name === 'backspace') return 'delete';
+ if (key.name === 'delete') return 'deleteForward';
+ if (key.name === 'abort') return 'abort';
+ if (key.name === 'escape') return 'exit';
+ if (key.name === 'tab') return 'next';
+ if (key.name === 'pagedown') return 'nextPage';
+ if (key.name === 'pageup') return 'prevPage';
+ // TODO create home() in prompt types (e.g. TextPrompt)
+ if (key.name === 'home') return 'home';
+ // TODO create end() in prompt types (e.g. TextPrompt)
+ if (key.name === 'end') return 'end';
+
+ if (key.name === 'up') return 'up';
+ if (key.name === 'down') return 'down';
+ if (key.name === 'right') return 'right';
+ if (key.name === 'left') return 'left';
+
+ return false;
+};
diff --git a/node_modules/prompts/lib/util/clear.js b/node_modules/prompts/lib/util/clear.js
new file mode 100644
index 0000000..e4772d5
--- /dev/null
+++ b/node_modules/prompts/lib/util/clear.js
@@ -0,0 +1,22 @@
+'use strict';
+
+const strip = require('./strip');
+const { erase, cursor } = require('sisteransi');
+
+const width = str => [...strip(str)].length;
+
+/**
+ * @param {string} prompt
+ * @param {number} perLine
+ */
+module.exports = function(prompt, perLine) {
+ if (!perLine) return erase.line + cursor.to(0);
+
+ let rows = 0;
+ const lines = prompt.split(/\r?\n/);
+ for (let line of lines) {
+ rows += 1 + Math.floor(Math.max(width(line) - 1, 0) / perLine);
+ }
+
+ return erase.lines(rows);
+};
diff --git a/node_modules/prompts/lib/util/entriesToDisplay.js b/node_modules/prompts/lib/util/entriesToDisplay.js
new file mode 100644
index 0000000..5f6efbb
--- /dev/null
+++ b/node_modules/prompts/lib/util/entriesToDisplay.js
@@ -0,0 +1,21 @@
+'use strict';
+
+/**
+ * Determine what entries should be displayed on the screen, based on the
+ * currently selected index and the maximum visible. Used in list-based
+ * prompts like `select` and `multiselect`.
+ *
+ * @param {number} cursor the currently selected entry
+ * @param {number} total the total entries available to display
+ * @param {number} [maxVisible] the number of entries that can be displayed
+ */
+module.exports = (cursor, total, maxVisible) => {
+ maxVisible = maxVisible || total;
+
+ let startIndex = Math.min(total- maxVisible, cursor - Math.floor(maxVisible / 2));
+ if (startIndex < 0) startIndex = 0;
+
+ let endIndex = Math.min(startIndex + maxVisible, total);
+
+ return { startIndex, endIndex };
+};
diff --git a/node_modules/prompts/lib/util/figures.js b/node_modules/prompts/lib/util/figures.js
new file mode 100644
index 0000000..cd31b88
--- /dev/null
+++ b/node_modules/prompts/lib/util/figures.js
@@ -0,0 +1,33 @@
+'use strict';
+
+ const main = {
+ arrowUp: '↑',
+ arrowDown: '↓',
+ arrowLeft: '←',
+ arrowRight: '→',
+ radioOn: '◉',
+ radioOff: '◯',
+ tick: '✔',
+ cross: '✖',
+ ellipsis: '…',
+ pointerSmall: '›',
+ line: '─',
+ pointer: '❯'
+};
+const win = {
+ arrowUp: main.arrowUp,
+ arrowDown: main.arrowDown,
+ arrowLeft: main.arrowLeft,
+ arrowRight: main.arrowRight,
+ radioOn: '(*)',
+ radioOff: '( )',
+ tick: '√',
+ cross: '×',
+ ellipsis: '...',
+ pointerSmall: '»',
+ line: '─',
+ pointer: '>'
+};
+const figures = process.platform === 'win32' ? win : main;
+
+ module.exports = figures;
diff --git a/node_modules/prompts/lib/util/index.js b/node_modules/prompts/lib/util/index.js
new file mode 100644
index 0000000..f815986
--- /dev/null
+++ b/node_modules/prompts/lib/util/index.js
@@ -0,0 +1,12 @@
+'use strict';
+
+module.exports = {
+ action: require('./action'),
+ clear: require('./clear'),
+ style: require('./style'),
+ strip: require('./strip'),
+ figures: require('./figures'),
+ lines: require('./lines'),
+ wrap: require('./wrap'),
+ entriesToDisplay: require('./entriesToDisplay')
+};
diff --git a/node_modules/prompts/lib/util/lines.js b/node_modules/prompts/lib/util/lines.js
new file mode 100644
index 0000000..de30419
--- /dev/null
+++ b/node_modules/prompts/lib/util/lines.js
@@ -0,0 +1,15 @@
+'use strict';
+
+const strip = require('./strip');
+
+/**
+ * @param {string} msg
+ * @param {number} perLine
+ */
+module.exports = function (msg, perLine) {
+ let lines = String(strip(msg) || '').split(/\r?\n/);
+
+ if (!perLine) return lines.length;
+ return lines.map(l => Math.ceil(l.length / perLine))
+ .reduce((a, b) => a + b);
+};
diff --git a/node_modules/prompts/lib/util/strip.js b/node_modules/prompts/lib/util/strip.js
new file mode 100644
index 0000000..8ebf4cb
--- /dev/null
+++ b/node_modules/prompts/lib/util/strip.js
@@ -0,0 +1,11 @@
+'use strict';
+
+module.exports = str => {
+ const pattern = [
+ '[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]+)*|[a-zA-Z\\d]+(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?\\u0007)',
+ '(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PRZcf-ntqry=><~]))'
+ ].join('|');
+
+ const RGX = new RegExp(pattern, 'g');
+ return typeof str === 'string' ? str.replace(RGX, '') : str;
+};
diff --git a/node_modules/prompts/lib/util/style.js b/node_modules/prompts/lib/util/style.js
new file mode 100644
index 0000000..1851cc7
--- /dev/null
+++ b/node_modules/prompts/lib/util/style.js
@@ -0,0 +1,40 @@
+'use strict';
+
+const c = require('kleur');
+const figures = require('./figures');
+
+// rendering user input.
+const styles = Object.freeze({
+ password: { scale: 1, render: input => '*'.repeat(input.length) },
+ emoji: { scale: 2, render: input => '😃'.repeat(input.length) },
+ invisible: { scale: 0, render: input => '' },
+ default: { scale: 1, render: input => `${input}` }
+});
+const render = type => styles[type] || styles.default;
+
+// icon to signalize a prompt.
+const symbols = Object.freeze({
+ aborted: c.red(figures.cross),
+ done: c.green(figures.tick),
+ exited: c.yellow(figures.cross),
+ default: c.cyan('?')
+});
+
+const symbol = (done, aborted, exited) =>
+ aborted ? symbols.aborted : exited ? symbols.exited : done ? symbols.done : symbols.default;
+
+// between the question and the user's input.
+const delimiter = completing =>
+ c.gray(completing ? figures.ellipsis : figures.pointerSmall);
+
+const item = (expandable, expanded) =>
+ c.gray(expandable ? (expanded ? figures.pointerSmall : '+') : figures.line);
+
+module.exports = {
+ styles,
+ render,
+ symbols,
+ symbol,
+ delimiter,
+ item
+};
diff --git a/node_modules/prompts/lib/util/wrap.js b/node_modules/prompts/lib/util/wrap.js
new file mode 100644
index 0000000..43b5399
--- /dev/null
+++ b/node_modules/prompts/lib/util/wrap.js
@@ -0,0 +1,27 @@
+'use strict';
+
+/**
+ * @param {string} msg The message to wrap
+ * @param {object} opts
+ * @param {number|string} [opts.margin] Left margin
+ * @param {number} opts.width Maximum characters per line including the margin
+ */
+module.exports = (msg, opts = {}) => {
+ const tab = Number.isSafeInteger(parseInt(opts.margin))
+ ? new Array(parseInt(opts.margin)).fill(' ').join('')
+ : (opts.margin || '');
+
+ const width = opts.width;
+
+ return (msg || '').split(/\r?\n/g)
+ .map(line => line
+ .split(/\s+/g)
+ .reduce((arr, w) => {
+ if (w.length + tab.length >= width || arr[arr.length - 1].length + w.length + 1 < width)
+ arr[arr.length - 1] += ` ${w}`;
+ else arr.push(`${tab}${w}`);
+ return arr;
+ }, [ tab ])
+ .join('\n'))
+ .join('\n');
+};
diff --git a/node_modules/prompts/license b/node_modules/prompts/license
new file mode 100644
index 0000000..13dc83c
--- /dev/null
+++ b/node_modules/prompts/license
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2018 Terkel Gjervig Nielsen
+
+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/prompts/package.json b/node_modules/prompts/package.json
new file mode 100644
index 0000000..f7ba84b
--- /dev/null
+++ b/node_modules/prompts/package.json
@@ -0,0 +1,53 @@
+{
+ "name": "prompts",
+ "version": "2.4.2",
+ "description": "Lightweight, beautiful and user-friendly prompts",
+ "license": "MIT",
+ "repository": "terkelg/prompts",
+ "main": "index.js",
+ "author": {
+ "name": "Terkel Gjervig",
+ "email": "terkel@terkel.com",
+ "url": "https://terkel.com"
+ },
+ "files": [
+ "lib",
+ "dist",
+ "index.js"
+ ],
+ "scripts": {
+ "start": "node lib/index.js",
+ "build": "babel lib -d dist",
+ "prepublishOnly": "npm run build",
+ "test": "tape test/*.js | tap-spec"
+ },
+ "keywords": [
+ "ui",
+ "prompts",
+ "cli",
+ "prompt",
+ "interface",
+ "command-line",
+ "input",
+ "command",
+ "stdin",
+ "menu",
+ "ask",
+ "interact"
+ ],
+ "dependencies": {
+ "kleur": "^3.0.3",
+ "sisteransi": "^1.0.5"
+ },
+ "devDependencies": {
+ "@babel/cli": "^7.12.1",
+ "@babel/core": "^7.12.3",
+ "@babel/plugin-proposal-object-rest-spread": "^7.12.1",
+ "@babel/preset-env": "^7.12.1",
+ "tap-spec": "^2.2.2",
+ "tape": "^4.13.3"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+}
diff --git a/node_modules/prompts/readme.md b/node_modules/prompts/readme.md
new file mode 100755
index 0000000..4a8b065
--- /dev/null
+++ b/node_modules/prompts/readme.md
@@ -0,0 +1,882 @@
+<p align="center">
+ <img src="https://github.com/terkelg/prompts/raw/master/prompts.png" alt="Prompts" width="500" />
+</p>
+
+<h1 align="center">❯ Prompts</h1>
+
+<p align="center">
+ <a href="https://npmjs.org/package/prompts">
+ <img src="https://img.shields.io/npm/v/prompts.svg" alt="version" />
+ </a>
+ <a href="https://travis-ci.org/terkelg/prompts">
+ <img src="https://img.shields.io/travis/terkelg/prompts.svg" alt="travis" />
+ </a>
+ <a href="https://npmjs.org/package/prompts">
+ <img src="https://img.shields.io/npm/dm/prompts.svg" alt="downloads" />
+ </a>
+ <!---
+ <a href="https://packagephobia.now.sh/result?p=prompts">
+ <img src="https://packagephobia.now.sh/badge?p=prompts" alt="install size" />
+ </a>
+ --->
+</p>
+
+<p align="center">
+ <b>Lightweight, beautiful and user-friendly interactive prompts</b><br />
+ <sub>>_ Easy to use CLI prompts to enquire users for information▌</sub>
+</p>
+
+<br />
+
+* **Simple**: prompts has [no big dependencies](http://npm.anvaka.com/#/view/2d/prompts) nor is it broken into a [dozen](http://npm.anvaka.com/#/view/2d/inquirer) tiny modules that only work well together.
+* **User friendly**: prompt uses layout and colors to create beautiful cli interfaces.
+* **Promised**: uses promises and `async`/`await`. No callback hell.
+* **Flexible**: all prompts are independent and can be used on their own.
+* **Testable**: provides a way to submit answers programmatically.
+* **Unified**: consistent experience across all [prompts](#-types).
+
+
+![split](https://github.com/terkelg/prompts/raw/master/media/split.png)
+
+
+## ❯ Install
+
+```
+$ npm install --save prompts
+```
+
+> This package supports Node 6 and above
+
+![split](https://github.com/terkelg/prompts/raw/master/media/split.png)
+
+## ❯ Usage
+
+<img src="https://github.com/terkelg/prompts/raw/master/media/example.gif" alt="example prompt" width="499" height="103" />
+
+```js
+const prompts = require('prompts');
+
+(async () => {
+ const response = await prompts({
+ type: 'number',
+ name: 'value',
+ message: 'How old are you?',
+ validate: value => value < 18 ? `Nightclub is 18+ only` : true
+ });
+
+ console.log(response); // => { value: 24 }
+})();
+```
+
+> See [`example.js`](https://github.com/terkelg/prompts/blob/master/example.js) for more options.
+
+
+![split](https://github.com/terkelg/prompts/raw/master/media/split.png)
+
+
+## ❯ Examples
+
+### Single Prompt
+
+Prompt with a single prompt object. Returns an object with the response.
+
+```js
+const prompts = require('prompts');
+
+(async () => {
+ const response = await prompts({
+ type: 'text',
+ name: 'meaning',
+ message: 'What is the meaning of life?'
+ });
+
+ console.log(response.meaning);
+})();
+```
+
+### Prompt Chain
+
+Prompt with a list of prompt objects. Returns an object with the responses.
+Make sure to give each prompt a unique `name` property to prevent overwriting values.
+
+```js
+const prompts = require('prompts');
+
+const questions = [
+ {
+ type: 'text',
+ name: 'username',
+ message: 'What is your GitHub username?'
+ },
+ {
+ type: 'number',
+ name: 'age',
+ message: 'How old are you?'
+ },
+ {
+ type: 'text',
+ name: 'about',
+ message: 'Tell something about yourself',
+ initial: 'Why should I?'
+ }
+];
+
+(async () => {
+ const response = await prompts(questions);
+
+ // => response => { username, age, about }
+})();
+```
+
+### Dynamic Prompts
+
+Prompt properties can be functions too.
+Prompt Objects with `type` set to `falsy` values are skipped.
+
+```js
+const prompts = require('prompts');
+
+const questions = [
+ {
+ type: 'text',
+ name: 'dish',
+ message: 'Do you like pizza?'
+ },
+ {
+ type: prev => prev == 'pizza' ? 'text' : null,
+ name: 'topping',
+ message: 'Name a topping'
+ }
+];
+
+(async () => {
+ const response = await prompts(questions);
+})();
+```
+
+
+![split](https://github.com/terkelg/prompts/raw/master/media/split.png)
+
+
+## ❯ API
+
+### prompts(prompts, options)
+
+Type: `Function`<br>
+Returns: `Object`
+
+Prompter function which takes your [prompt objects](#-prompt-objects) and returns an object with responses.
+
+
+#### prompts
+
+Type: `Array|Object`<br>
+
+Array of [prompt objects](#-prompt-objects).
+ These are the questions the user will be prompted. You can see the list of supported [prompt types here](#-types).
+
+Prompts can be submitted (<kbd>return</kbd>, <kbd>enter</kbd>) or canceled (<kbd>esc</kbd>, <kbd>abort</kbd>, <kbd>ctrl</kbd>+<kbd>c</kbd>, <kbd>ctrl</kbd>+<kbd>d</kbd>). No property is being defined on the returned response object when a prompt is canceled.
+
+#### options.onSubmit
+
+Type: `Function`<br>
+Default: `() => {}`
+
+Callback that's invoked after each prompt submission.
+Its signature is `(prompt, answer, answers)` where `prompt` is the current prompt object, `answer` the user answer to the current question and `answers` the user answers so far. Async functions are supported.
+
+Return `true` to quit the prompt chain and return all collected responses so far, otherwise continue to iterate prompt objects.
+
+**Example:**
+```js
+(async () => {
+ const questions = [{ ... }];
+ const onSubmit = (prompt, answer) => console.log(`Thanks I got ${answer} from ${prompt.name}`);
+ const response = await prompts(questions, { onSubmit });
+})();
+```
+
+#### options.onCancel
+
+Type: `Function`<br>
+Default: `() => {}`
+
+Callback that's invoked when the user cancels/exits the prompt.
+Its signature is `(prompt, answers)` where `prompt` is the current prompt object and `answers` the user answers so far. Async functions are supported.
+
+Return `true` to continue and prevent the prompt loop from aborting.
+On cancel responses collected so far are returned.
+
+**Example:**
+```js
+(async () => {
+ const questions = [{ ... }];
+ const onCancel = prompt => {
+ console.log('Never stop prompting!');
+ return true;
+ }
+ const response = await prompts(questions, { onCancel });
+})();
+```
+
+### override
+
+Type: `Function`
+
+Preanswer questions by passing an object with answers to `prompts.override`.
+Powerful when combined with arguments of process.
+
+**Example**
+```js
+const prompts = require('prompts');
+prompts.override(require('yargs').argv);
+
+(async () => {
+ const response = await prompts([
+ {
+ type: 'text',
+ name: 'twitter',
+ message: `What's your twitter handle?`
+ },
+ {
+ type: 'multiselect',
+ name: 'color',
+ message: 'Pick colors',
+ choices: [
+ { title: 'Red', value: '#ff0000' },
+ { title: 'Green', value: '#00ff00' },
+ { title: 'Blue', value: '#0000ff' }
+ ],
+ }
+ ]);
+
+ console.log(response);
+})();
+```
+
+### inject(values)
+
+Type: `Function`<br>
+
+Programmatically inject responses. This enables you to prepare the responses ahead of time.
+If any injected value is found the prompt is immediately resolved with the injected value.
+This feature is intended for testing only.
+
+#### values
+
+Type: `Array`
+
+Array with values to inject. Resolved values are removed from the internal inject array.
+Each value can be an array of values in order to provide answers for a question asked multiple times.
+If a value is an instance of `Error` it will simulate the user cancelling/exiting the prompt.
+
+**Example:**
+```js
+const prompts = require('prompts');
+
+prompts.inject([ '@terkelg', ['#ff0000', '#0000ff'] ]);
+
+(async () => {
+ const response = await prompts([
+ {
+ type: 'text',
+ name: 'twitter',
+ message: `What's your twitter handle?`
+ },
+ {
+ type: 'multiselect',
+ name: 'color',
+ message: 'Pick colors',
+ choices: [
+ { title: 'Red', value: '#ff0000' },
+ { title: 'Green', value: '#00ff00' },
+ { title: 'Blue', value: '#0000ff' }
+ ],
+ }
+ ]);
+
+ // => { twitter: 'terkelg', color: [ '#ff0000', '#0000ff' ] }
+})();
+```
+
+![split](https://github.com/terkelg/prompts/raw/master/media/split.png)
+
+
+## ❯ Prompt Objects
+
+Prompts Objects are JavaScript objects that define the "questions" and the [type of prompt](#-types).
+Almost all prompt objects have the following properties:
+
+```js
+{
+ type: String | Function,
+ name: String | Function,
+ message: String | Function,
+ initial: String | Function | Async Function
+ format: Function | Async Function,
+ onRender: Function
+ onState: Function
+ stdin: Readable
+ stdout: Writeable
+}
+```
+
+Each property be of type `function` and will be invoked right before prompting the user.
+
+The function signature is `(prev, values, prompt)`, where `prev` is the value from the previous prompt,
+`values` is the response object with all values collected so far and `prompt` is the previous prompt object.
+
+**Function example:**
+```js
+{
+ type: prev => prev > 3 ? 'confirm' : null,
+ name: 'confirm',
+ message: (prev, values) => `Please confirm that you eat ${values.dish} times ${prev} a day?`
+}
+```
+
+The above prompt will be skipped if the value of the previous prompt is less than 3.
+
+### type
+
+Type: `String|Function`
+
+Defines the type of prompt to display. See the list of [prompt types](#-types) for valid values.
+
+If `type` is a falsy value the prompter will skip that question.
+```js
+{
+ type: null,
+ name: 'forgetme',
+ message: `I'll never be shown anyway`,
+}
+```
+
+### name
+
+Type: `String|Function`
+
+The response will be saved under this key/property in the returned response object.
+In case you have multiple prompts with the same name only the latest response will be stored.
+
+> Make sure to give prompts unique names if you don't want to overwrite previous values.
+
+### message
+
+Type: `String|Function`
+
+The message to be displayed to the user.
+
+### initial
+
+Type: `String|Function`
+
+Optional default prompt value. Async functions are supported too.
+
+### format
+
+Type: `Function`
+
+Receive the user input and return the formatted value to be used inside the program.
+The value returned will be added to the response object.
+
+The function signature is `(val, values)`, where `val` is the value from the current prompt and
+`values` is the current response object in case you need to format based on previous responses.
+
+**Example:**
+```js
+{
+ type: 'number',
+ name: 'price',
+ message: 'Enter price',
+ format: val => Intl.NumberFormat(undefined, { style: 'currency', currency: 'USD' }).format(val);
+}
+```
+
+### onRender
+
+Type: `Function`
+
+Callback for when the prompt is rendered.
+The function receives [kleur](https://github.com/lukeed/kleur) as its first argument and `this` refers to the current prompt.
+
+**Example:**
+```js
+{
+ type: 'number',
+ message: 'This message will be overridden',
+ onRender(kleur) {
+ this.msg = kleur.cyan('Enter a number');
+ }
+}
+```
+
+### onState
+
+Type: `Function`
+
+Callback for when the state of the current prompt changes.
+The function signature is `(state)` where `state` is an object with a snapshot of the current state.
+The state object has two properties `value` and `aborted`. E.g `{ value: 'This is ', aborted: false }`
+
+### stdin and stdout
+
+Type: `Stream`
+
+By default, prompts uses `process.stdin` for receiving input and `process.stdout` for writing output.
+If you need to use different streams, for instance `process.stderr`, you can set these with the `stdin` and `stdout` properties.
+
+
+![split](https://github.com/terkelg/prompts/raw/master/media/split.png)
+
+
+## ❯ Types
+
+* [text](#textmessage-initial-style)
+* [password](#passwordmessage-initial)
+* [invisible](#invisiblemessage-initial)
+* [number](#numbermessage-initial-max-min-style)
+* [confirm](#confirmmessage-initial)
+* [list](#listmessage-initial)
+* [toggle](#togglemessage-initial-active-inactive)
+* [select](#selectmessage-choices-initial-hint-warn)
+* [multiselect](#multiselectmessage-choices-initial-max-hint-warn)
+* [autocompleteMultiselect](#multiselectmessage-choices-initial-max-hint-warn)
+* [autocomplete](#autocompletemessage-choices-initial-suggest-limit-style)
+* [date](#datemessage-initial-warn)
+
+***
+
+### text(message, [initial], [style])
+> Text prompt for free text input.
+
+Hit <kbd>tab</kbd> to autocomplete to `initial` value when provided.
+
+#### Example
+<img src="https://github.com/terkelg/prompts/raw/master/media/text.gif" alt="text prompt" width="499" height="103" />
+
+```js
+{
+ type: 'text',
+ name: 'value',
+ message: `What's your twitter handle?`
+}
+```
+
+#### Options
+| Param | Type | Description |
+| ----- | :--: | ----------- |
+| message | `string` | Prompt message to display |
+| initial | `string` | Default string value |
+| style | `string` | Render style (`default`, `password`, `invisible`, `emoji`). Defaults to `default` |
+| format | `function` | Receive user input. The returned value will be added to the response object |
+| validate | `function` | Receive user input. Should return `true` if the value is valid, and an error message `String` otherwise. If `false` is returned, a default error message is shown |
+| onRender | `function` | On render callback. Keyword `this` refers to the current prompt |
+| onState | `function` | On state change callback. Function signature is an `object` with two properties: `value` and `aborted` |
+
+**↑ back to:** [Prompt types](#-types)
+
+***
+
+### password(message, [initial])
+> Password prompt with masked input.
+
+This prompt is a similar to a prompt of type `'text'` with `style` set to `'password'`.
+
+#### Example
+<img src="https://github.com/terkelg/prompts/raw/master/media/password.gif" alt="password prompt" width="499" height="103" />
+
+```js
+{
+ type: 'password',
+ name: 'value',
+ message: 'Tell me a secret'
+}
+```
+
+#### Options
+| Param | Type | Description |
+| ----- | :--: | ----------- |
+| message | `string` | Prompt message to display |
+| initial | `string` | Default string value |
+| format | `function` | Receive user input. The returned value will be added to the response object |
+| validate | `function` | Receive user input. Should return `true` if the value is valid, and an error message `String` otherwise. If `false` is returned, a default error message is shown |
+| onRender | `function` | On render callback. Keyword `this` refers to the current prompt |
+| onState | `function` | On state change callback. Function signature is an `object` with two properties: `value` and `aborted` |
+
+**↑ back to:** [Prompt types](#-types)
+
+***
+
+### invisible(message, [initial])
+> Prompts user for invisible text input.
+
+This prompt is working like `sudo` where the input is invisible.
+This prompt is a similar to a prompt of type `'text'` with style set to `'invisible'`.
+
+#### Example
+<img src="https://github.com/terkelg/prompts/raw/master/media/invisible.gif" alt="invisible prompt" width="499" height="103" />
+
+```js
+{
+ type: 'invisible',
+ name: 'value',
+ message: 'Enter password'
+}
+```
+
+#### Options
+| Param | Type | Description |
+| ----- | :--: | ----------- |
+| message | `string` | Prompt message to display |
+| initial | `string` | Default string value |
+| format | `function` | Receive user input. The returned value will be added to the response object |
+| validate | `function` | Receive user input. Should return `true` if the value is valid, and an error message `String` otherwise. If `false` is returned, a default error message is shown |
+| onRender | `function` | On render callback. Keyword `this` refers to the current prompt |
+| onState | `function` | On state change callback. Function signature is an `object` with two properties: `value` and `aborted` |
+
+**↑ back to:** [Prompt types](#-types)
+
+***
+
+### number(message, initial, [max], [min], [style])
+> Prompts user for number input.
+
+You can type in numbers and use <kbd>up</kbd>/<kbd>down</kbd> to increase/decrease the value. Only numbers are allowed as input. Hit <kbd>tab</kbd> to autocomplete to `initial` value when provided.
+
+#### Example
+<img src="https://github.com/terkelg/prompts/raw/master/media/number.gif" alt="number prompt" width="499" height="103" />
+
+```js
+{
+ type: 'number',
+ name: 'value',
+ message: 'How old are you?',
+ initial: 0,
+ style: 'default',
+ min: 2,
+ max: 10
+}
+```
+
+#### Options
+| Param | Type | Description |
+| ----- | :--: | ----------- |
+| message | `string` | Prompt message to display |
+| initial | `number` | Default number value |
+| format | `function` | Receive user input. The returned value will be added to the response object |
+| validate | `function` | Receive user input. Should return `true` if the value is valid, and an error message `String` otherwise. If `false` is returned, a default error message is shown |
+| max | `number` | Max value. Defaults to `Infinity` |
+| min | `number` | Min value. Defaults to `-infinity` |
+| float | `boolean` | Allow floating point inputs. Defaults to `false` |
+| round | `number` | Round `float` values to x decimals. Defaults to `2` |
+| increment | `number` | Increment step when using <kbd>arrow</kbd> keys. Defaults to `1` |
+| style | `string` | Render style (`default`, `password`, `invisible`, `emoji`). Defaults to `default` |
+| onRender | `function` | On render callback. Keyword `this` refers to the current prompt |
+| onState | `function` | On state change callback. Function signature is an `object` with two properties: `value` and `aborted` |
+
+**↑ back to:** [Prompt types](#-types)
+
+***
+
+### confirm(message, [initial])
+> Classic yes/no prompt.
+
+Hit <kbd>y</kbd> or <kbd>n</kbd> to confirm/reject.
+
+#### Example
+<img src="https://github.com/terkelg/prompts/raw/master/media/confirm.gif" alt="confirm prompt" width="499" height="103" />
+
+```js
+{
+ type: 'confirm',
+ name: 'value',
+ message: 'Can you confirm?',
+ initial: true
+}
+```
+
+
+#### Options
+| Param | Type | Description |
+| ----- | :--: | ----------- |
+| message | `string` | Prompt message to display |
+| initial | `boolean` | Default value. Default is `false` |
+| format | `function` | Receive user input. The returned value will be added to the response object |
+| onRender | `function` | On render callback. Keyword `this` refers to the current prompt |
+| onState | `function` | On state change callback. Function signature is an `object` with two properties: `value` and `aborted` |
+
+**↑ back to:** [Prompt types](#-types)
+
+***
+
+### list(message, [initial])
+> List prompt that return an array.
+
+Similar to the `text` prompt, but the output is an `Array` containing the
+string separated by `separator`.
+
+```js
+{
+ type: 'list',
+ name: 'value',
+ message: 'Enter keywords',
+ initial: '',
+ separator: ','
+}
+```
+
+<img src="https://github.com/terkelg/prompts/raw/master/media/list.gif" alt="list prompt" width="499" height="103" />
+
+
+| Param | Type | Description |
+| ----- | :--: | ----------- |
+| message | `string` | Prompt message to display |
+| initial | `boolean` | Default value |
+| format | `function` | Receive user input. The returned value will be added to the response object |
+| separator | `string` | String separator. Will trim all white-spaces from start and end of string. Defaults to `','` |
+| onRender | `function` | On render callback. Keyword `this` refers to the current prompt |
+| onState | `function` | On state change callback. Function signature is an `object` with two properties: `value` and `aborted` |
+
+**↑ back to:** [Prompt types](#-types)
+
+***
+
+### toggle(message, [initial], [active], [inactive])
+> Interactive toggle/switch prompt.
+
+Use tab or <kbd>arrow keys</kbd>/<kbd>tab</kbd>/<kbd>space</kbd> to switch between options.
+
+#### Example
+<img src="https://github.com/terkelg/prompts/raw/master/media/toggle.gif" alt="toggle prompt" width="499" height="103" />
+
+```js
+{
+ type: 'toggle',
+ name: 'value',
+ message: 'Can you confirm?',
+ initial: true,
+ active: 'yes',
+ inactive: 'no'
+}
+```
+
+#### Options
+| Param | Type | Description |
+| ----- | :--: | ----------- |
+| message | `string` | Prompt message to display |
+| initial | `boolean` | Default value. Defaults to `false` |
+| format | `function` | Receive user input. The returned value will be added to the response object |
+| active | `string` | Text for `active` state. Defaults to `'on'` |
+| inactive | `string` | Text for `inactive` state. Defaults to `'off'` |
+| onRender | `function` | On render callback. Keyword `this` refers to the current prompt |
+| onState | `function` | On state change callback. Function signature is an `object` with two properties: `value` and `aborted` |
+
+**↑ back to:** [Prompt types](#-types)
+
+***
+
+### select(message, choices, [initial], [hint], [warn])
+> Interactive select prompt.
+
+Use <kbd>up</kbd>/<kbd>down</kbd> to navigate. Use <kbd>tab</kbd> to cycle the list.
+
+#### Example
+<img src="https://github.com/terkelg/prompts/raw/master/media/select.gif" alt="select prompt" width="499" height="130" />
+
+```js
+{
+ type: 'select',
+ name: 'value',
+ message: 'Pick a color',
+ choices: [
+ { title: 'Red', description: 'This option has a description', value: '#ff0000' },
+ { title: 'Green', value: '#00ff00', disabled: true },
+ { title: 'Blue', value: '#0000ff' }
+ ],
+ initial: 1
+}
+```
+
+#### Options
+| Param | Type | Description |
+| ----- | :--: | ----------- |
+| message | `string` | Prompt message to display |
+| initial | `number` | Index of default value |
+| format | `function` | Receive user input. The returned value will be added to the response object |
+| hint | `string` | Hint to display to the user |
+| warn | `string` | Message to display when selecting a disabled option |
+| choices | `Array` | Array of strings or choices objects `[{ title, description, value, disabled }, ...]`. The choice's index in the array will be used as its value if it is not specified. |
+| onRender | `function` | On render callback. Keyword `this` refers to the current prompt |
+| onState | `function` | On state change callback. Function signature is an `object` with two properties: `value` and `aborted` |
+
+**↑ back to:** [Prompt types](#-types)
+
+***
+
+### multiselect(message, choices, [initial], [max], [hint], [warn])
+### autocompleteMultiselect(same)
+> Interactive multi-select prompt.
+> Autocomplete is a searchable multiselect prompt with the same options. Useful for long lists.
+
+Use <kbd>space</kbd> to toggle select/unselect and <kbd>up</kbd>/<kbd>down</kbd> to navigate. Use <kbd>tab</kbd> to cycle the list. You can also use <kbd>right</kbd> to select and <kbd>left</kbd> to deselect.
+By default this prompt returns an `array` containing the **values** of the selected items - not their display title.
+
+#### Example
+<img src="https://github.com/terkelg/prompts/raw/master/media/multiselect.gif" alt="multiselect prompt" width="499" height="130" />
+
+```js
+{
+ type: 'multiselect',
+ name: 'value',
+ message: 'Pick colors',
+ choices: [
+ { title: 'Red', value: '#ff0000' },
+ { title: 'Green', value: '#00ff00', disabled: true },
+ { title: 'Blue', value: '#0000ff', selected: true }
+ ],
+ max: 2,
+ hint: '- Space to select. Return to submit'
+}
+```
+
+#### Options
+| Param | Type | Description |
+| ----- | :--: | ----------- |
+| message | `string` | Prompt message to display |
+| format | `function` | Receive user input. The returned value will be added to the response object |
+| instructions | `string` or `boolean` | Prompt instructions to display |
+| choices | `Array` | Array of strings or choices objects `[{ title, value, disabled }, ...]`. The choice's index in the array will be used as its value if it is not specified. |
+| optionsPerPage | `number` | Number of options displayed per page (default: 10) |
+| min | `number` | Min select - will display error |
+| max | `number` | Max select |
+| hint | `string` | Hint to display to the user |
+| warn | `string` | Message to display when selecting a disabled option |
+| onRender | `function` | On render callback. Keyword `this` refers to the current prompt |
+| onState | `function` | On state change callback. Function signature is an `object` with two properties: `value` and `aborted` |
+
+This is one of the few prompts that don't take a initial value.
+If you want to predefine selected values, give the choice object an `selected` property of `true`.
+
+**↑ back to:** [Prompt types](#-types)
+
+***
+
+### autocomplete(message, choices, [initial], [suggest], [limit], [style])
+> Interactive auto complete prompt.
+
+The prompt will list options based on user input. Type to filter the list.
+Use <kbd>⇧</kbd>/<kbd>⇩</kbd> to navigate. Use <kbd>tab</kbd> to cycle the result. Use <kbd>Page Up</kbd>/<kbd>Page Down</kbd> (on Mac: <kbd>fn</kbd> + <kbd>⇧</kbd> / <kbd>⇩</kbd>) to change page. Hit <kbd>enter</kbd> to select the highlighted item below the prompt.
+
+The default suggests function is sorting based on the `title` property of the choices.
+You can overwrite how choices are being filtered by passing your own suggest function.
+
+#### Example
+<img src="https://github.com/terkelg/prompts/raw/master/media/autocomplete.gif" alt="auto complete prompt" width="499" height="163" />
+
+```js
+{
+ type: 'autocomplete',
+ name: 'value',
+ message: 'Pick your favorite actor',
+ choices: [
+ { title: 'Cage' },
+ { title: 'Clooney', value: 'silver-fox' },
+ { title: 'Gyllenhaal' },
+ { title: 'Gibson' },
+ { title: 'Grant' }
+ ]
+}
+```
+
+#### Options
+| Param | Type | Description |
+| ----- | :--: | ----------- |
+| message | `string` | Prompt message to display |
+| format | `function` | Receive user input. The returned value will be added to the response object |
+| choices | `Array` | Array of auto-complete choices objects `[{ title, value }, ...]` |
+| suggest | `function` | Filter function. Defaults to sort by `title` property. `suggest` should always return a promise. Filters using `title` by default |
+| limit | `number` | Max number of results to show. Defaults to `10` |
+| style | `string` | Render style (`default`, `password`, `invisible`, `emoji`). Defaults to `'default'` |
+| initial | `string \| number` | Default initial value |
+| clearFirst | `boolean` | The first ESCAPE keypress will clear the input |
+| fallback | `string` | Fallback message when no match is found. Defaults to `initial` value if provided |
+| onRender | `function` | On render callback. Keyword `this` refers to the current prompt |
+| onState | `function` | On state change callback. Function signature is an `object` with three properties: `value`, `aborted` and `exited` |
+
+Example on what a `suggest` function might look like:
+```js
+const suggestByTitle = (input, choices) =>
+ Promise.resolve(choices.filter(i => i.title.slice(0, input.length) === input))
+```
+
+**↑ back to:** [Prompt types](#-types)
+
+***
+
+### date(message, [initial], [warn])
+> Interactive date prompt.
+
+Use <kbd>left</kbd>/<kbd>right</kbd>/<kbd>tab</kbd> to navigate. Use <kbd>up</kbd>/<kbd>down</kbd> to change date.
+
+#### Example
+<img src="https://github.com/terkelg/prompts/raw/master/media/date.gif" alt="date prompt" width="499" height="103" />
+
+```js
+{
+ type: 'date',
+ name: 'value',
+ message: 'Pick a date',
+ initial: new Date(1997, 09, 12),
+ validate: date => date > Date.now() ? 'Not in the future' : true
+}
+```
+
+#### Options
+| Param | Type | Description |
+| ----- | :--: | ----------- |
+| message | `string` | Prompt message to display |
+| initial | `date` | Default date |
+| locales | `object` | Use to define custom locales. See below for an example. |
+| mask | `string` | The format mask of the date. See below for more information.<br />Default: `YYYY-MM-DD HH:mm:ss` |
+| validate | `function` | Receive user input. Should return `true` if the value is valid, and an error message `String` otherwise. If `false` is returned, a default error message is shown |
+| onRender | `function` | On render callback. Keyword `this` refers to the current prompt |
+| onState | `function` | On state change callback. Function signature is an `object` with two properties: `value` and `aborted` |
+
+Default locales:
+
+```javascript
+{
+ months: [
+ 'January', 'February', 'March', 'April',
+ 'May', 'June', 'July', 'August',
+ 'September', 'October', 'November', 'December'
+ ],
+ monthsShort: [
+ 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
+ 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'
+ ],
+ weekdays: [
+ 'Sunday', 'Monday', 'Tuesday', 'Wednesday',
+ 'Thursday', 'Friday', 'Saturday'
+ ],
+ weekdaysShort: [
+ 'Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'
+ ]
+}
+```
+>**Formatting**: See full list of formatting options in the [wiki](https://github.com/terkelg/prompts/wiki/Date-Time-Formatting)
+
+![split](https://github.com/terkelg/prompts/raw/master/media/split.png)
+
+**↑ back to:** [Prompt types](#-types)
+
+***
+
+## ❯ Credit
+Many of the prompts are based on the work of [derhuerst](https://github.com/derhuerst).
+
+
+## ❯ License
+
+MIT © [Terkel Gjervig](https://terkel.com)
diff --git a/node_modules/proxy-from-env/.eslintrc b/node_modules/proxy-from-env/.eslintrc
new file mode 100644
index 0000000..a51449b
--- /dev/null
+++ b/node_modules/proxy-from-env/.eslintrc
@@ -0,0 +1,29 @@
+{
+ "env": {
+ "node": true
+ },
+ "rules": {
+ "array-bracket-spacing": [2, "never"],
+ "block-scoped-var": 2,
+ "brace-style": [2, "1tbs"],
+ "camelcase": 1,
+ "computed-property-spacing": [2, "never"],
+ "curly": 2,
+ "eol-last": 2,
+ "eqeqeq": [2, "smart"],
+ "max-depth": [1, 3],
+ "max-len": [1, 80],
+ "max-statements": [1, 15],
+ "new-cap": 1,
+ "no-extend-native": 2,
+ "no-mixed-spaces-and-tabs": 2,
+ "no-trailing-spaces": 2,
+ "no-unused-vars": 1,
+ "no-use-before-define": [2, "nofunc"],
+ "object-curly-spacing": [2, "never"],
+ "quotes": [2, "single", "avoid-escape"],
+ "semi": [2, "always"],
+ "keyword-spacing": [2, {"before": true, "after": true}],
+ "space-unary-ops": 2
+ }
+}
diff --git a/node_modules/proxy-from-env/.travis.yml b/node_modules/proxy-from-env/.travis.yml
new file mode 100644
index 0000000..64a05f9
--- /dev/null
+++ b/node_modules/proxy-from-env/.travis.yml
@@ -0,0 +1,10 @@
+language: node_js
+node_js:
+ - node
+ - lts/*
+script:
+ - npm run lint
+ # test-coverage will also run the tests, but does not print helpful output upon test failure.
+ # So we also run the tests separately.
+ - npm run test
+ - npm run test-coverage && cat coverage/lcov.info | ./node_modules/.bin/coveralls && rm -rf coverage
diff --git a/node_modules/proxy-from-env/LICENSE b/node_modules/proxy-from-env/LICENSE
new file mode 100644
index 0000000..8f25097
--- /dev/null
+++ b/node_modules/proxy-from-env/LICENSE
@@ -0,0 +1,20 @@
+The MIT License
+
+Copyright (C) 2016-2018 Rob Wu <rob@robwu.nl>
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+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-from-env/README.md b/node_modules/proxy-from-env/README.md
new file mode 100644
index 0000000..e82520c
--- /dev/null
+++ b/node_modules/proxy-from-env/README.md
@@ -0,0 +1,131 @@
+# proxy-from-env
+
+[![Build Status](https://travis-ci.org/Rob--W/proxy-from-env.svg?branch=master)](https://travis-ci.org/Rob--W/proxy-from-env)
+[![Coverage Status](https://coveralls.io/repos/github/Rob--W/proxy-from-env/badge.svg?branch=master)](https://coveralls.io/github/Rob--W/proxy-from-env?branch=master)
+
+`proxy-from-env` is a Node.js package that exports a function (`getProxyForUrl`)
+that takes an input URL (a string or
+[`url.parse`](https://nodejs.org/docs/latest/api/url.html#url_url_parsing)'s
+return value) and returns the desired proxy URL (also a string) based on
+standard proxy environment variables. If no proxy is set, an empty string is
+returned.
+
+It is your responsibility to actually proxy the request using the given URL.
+
+Installation:
+
+```sh
+npm install proxy-from-env
+```
+
+## Example
+This example shows how the data for a URL can be fetched via the
+[`http` module](https://nodejs.org/api/http.html), in a proxy-aware way.
+
+```javascript
+var http = require('http');
+var parseUrl = require('url').parse;
+var getProxyForUrl = require('proxy-from-env').getProxyForUrl;
+
+var some_url = 'http://example.com/something';
+
+// // Example, if there is a proxy server at 10.0.0.1:1234, then setting the
+// // http_proxy environment variable causes the request to go through a proxy.
+// process.env.http_proxy = 'http://10.0.0.1:1234';
+//
+// // But if the host to be proxied is listed in NO_PROXY, then the request is
+// // not proxied (but a direct request is made).
+// process.env.no_proxy = 'example.com';
+
+var proxy_url = getProxyForUrl(some_url); // <-- Our magic.
+if (proxy_url) {
+ // Should be proxied through proxy_url.
+ var parsed_some_url = parseUrl(some_url);
+ var parsed_proxy_url = parseUrl(proxy_url);
+ // A HTTP proxy is quite simple. It is similar to a normal request, except the
+ // path is an absolute URL, and the proxied URL's host is put in the header
+ // instead of the server's actual host.
+ httpOptions = {
+ protocol: parsed_proxy_url.protocol,
+ hostname: parsed_proxy_url.hostname,
+ port: parsed_proxy_url.port,
+ path: parsed_some_url.href,
+ headers: {
+ Host: parsed_some_url.host, // = host name + optional port.
+ },
+ };
+} else {
+ // Direct request.
+ httpOptions = some_url;
+}
+http.get(httpOptions, function(res) {
+ var responses = [];
+ res.on('data', function(chunk) { responses.push(chunk); });
+ res.on('end', function() { console.log(responses.join('')); });
+});
+
+```
+
+## Environment variables
+The environment variables can be specified in lowercase or uppercase, with the
+lowercase name having precedence over the uppercase variant. A variable that is
+not set has the same meaning as a variable that is set but has no value.
+
+### NO\_PROXY
+
+`NO_PROXY` is a list of host names (optionally with a port). If the input URL
+matches any of the entries in `NO_PROXY`, then the input URL should be fetched
+by a direct request (i.e. without a proxy).
+
+Matching follows the following rules:
+
+- `NO_PROXY=*` disables all proxies.
+- Space and commas may be used to separate the entries in the `NO_PROXY` list.
+- If `NO_PROXY` does not contain any entries, then proxies are never disabled.
+- If a port is added after the host name, then the ports must match. If the URL
+ does not have an explicit port name, the protocol's default port is used.
+- Generally, the proxy is only disabled if the host name is an exact match for
+ an entry in the `NO_PROXY` list. The only exceptions are entries that start
+ with a dot or with a wildcard; then the proxy is disabled if the host name
+ ends with the entry.
+
+See `test.js` for examples of what should match and what does not.
+
+### \*\_PROXY
+
+The environment variable used for the proxy depends on the protocol of the URL.
+For example, `https://example.com` uses the "https" protocol, and therefore the
+proxy to be used is `HTTPS_PROXY` (_NOT_ `HTTP_PROXY`, which is _only_ used for
+http:-URLs).
+
+The library is not limited to http(s), other schemes such as
+`FTP_PROXY` (ftp:),
+`WSS_PROXY` (wss:),
+`WS_PROXY` (ws:)
+are also supported.
+
+If present, `ALL_PROXY` is used as fallback if there is no other match.
+
+
+## External resources
+The exact way of parsing the environment variables is not codified in any
+standard. This library is designed to be compatible with formats as expected by
+existing software.
+The following resources were used to determine the desired behavior:
+
+- cURL:
+ https://curl.haxx.se/docs/manpage.html#ENVIRONMENT
+ https://github.com/curl/curl/blob/4af40b3646d3b09f68e419f7ca866ff395d1f897/lib/url.c#L4446-L4514
+ https://github.com/curl/curl/blob/4af40b3646d3b09f68e419f7ca866ff395d1f897/lib/url.c#L4608-L4638
+
+- wget:
+ https://www.gnu.org/software/wget/manual/wget.html#Proxies
+ http://git.savannah.gnu.org/cgit/wget.git/tree/src/init.c?id=636a5f9a1c508aa39e35a3a8e9e54520a284d93d#n383
+ http://git.savannah.gnu.org/cgit/wget.git/tree/src/retr.c?id=93c1517c4071c4288ba5a4b038e7634e4c6b5482#n1278
+
+- W3:
+ https://www.w3.org/Daemon/User/Proxies/ProxyClients.html
+
+- Python's urllib:
+ https://github.com/python/cpython/blob/936135bb97fe04223aa30ca6e98eac8f3ed6b349/Lib/urllib/request.py#L755-L782
+ https://github.com/python/cpython/blob/936135bb97fe04223aa30ca6e98eac8f3ed6b349/Lib/urllib/request.py#L2444-L2479
diff --git a/node_modules/proxy-from-env/index.js b/node_modules/proxy-from-env/index.js
new file mode 100644
index 0000000..df75004
--- /dev/null
+++ b/node_modules/proxy-from-env/index.js
@@ -0,0 +1,108 @@
+'use strict';
+
+var parseUrl = require('url').parse;
+
+var DEFAULT_PORTS = {
+ ftp: 21,
+ gopher: 70,
+ http: 80,
+ https: 443,
+ ws: 80,
+ wss: 443,
+};
+
+var stringEndsWith = String.prototype.endsWith || function(s) {
+ return s.length <= this.length &&
+ this.indexOf(s, this.length - s.length) !== -1;
+};
+
+/**
+ * @param {string|object} url - The URL, or the result from url.parse.
+ * @return {string} The URL of the proxy that should handle the request to the
+ * given URL. If no proxy is set, this will be an empty string.
+ */
+function getProxyForUrl(url) {
+ var parsedUrl = typeof url === 'string' ? parseUrl(url) : url || {};
+ var proto = parsedUrl.protocol;
+ var hostname = parsedUrl.host;
+ var port = parsedUrl.port;
+ if (typeof hostname !== 'string' || !hostname || typeof proto !== 'string') {
+ return ''; // Don't proxy URLs without a valid scheme or host.
+ }
+
+ proto = proto.split(':', 1)[0];
+ // Stripping ports in this way instead of using parsedUrl.hostname to make
+ // sure that the brackets around IPv6 addresses are kept.
+ hostname = hostname.replace(/:\d*$/, '');
+ port = parseInt(port) || DEFAULT_PORTS[proto] || 0;
+ if (!shouldProxy(hostname, port)) {
+ return ''; // Don't proxy URLs that match NO_PROXY.
+ }
+
+ var proxy =
+ getEnv('npm_config_' + proto + '_proxy') ||
+ getEnv(proto + '_proxy') ||
+ getEnv('npm_config_proxy') ||
+ getEnv('all_proxy');
+ if (proxy && proxy.indexOf('://') === -1) {
+ // Missing scheme in proxy, default to the requested URL's scheme.
+ proxy = proto + '://' + proxy;
+ }
+ return proxy;
+}
+
+/**
+ * Determines whether a given URL should be proxied.
+ *
+ * @param {string} hostname - The host name of the URL.
+ * @param {number} port - The effective port of the URL.
+ * @returns {boolean} Whether the given URL should be proxied.
+ * @private
+ */
+function shouldProxy(hostname, port) {
+ var NO_PROXY =
+ (getEnv('npm_config_no_proxy') || getEnv('no_proxy')).toLowerCase();
+ if (!NO_PROXY) {
+ return true; // Always proxy if NO_PROXY is not set.
+ }
+ if (NO_PROXY === '*') {
+ return false; // Never proxy if wildcard is set.
+ }
+
+ return NO_PROXY.split(/[,\s]/).every(function(proxy) {
+ if (!proxy) {
+ return true; // Skip zero-length hosts.
+ }
+ var parsedProxy = proxy.match(/^(.+):(\d+)$/);
+ var parsedProxyHostname = parsedProxy ? parsedProxy[1] : proxy;
+ var parsedProxyPort = parsedProxy ? parseInt(parsedProxy[2]) : 0;
+ if (parsedProxyPort && parsedProxyPort !== port) {
+ return true; // Skip if ports don't match.
+ }
+
+ if (!/^[.*]/.test(parsedProxyHostname)) {
+ // No wildcards, so stop proxying if there is an exact match.
+ return hostname !== parsedProxyHostname;
+ }
+
+ if (parsedProxyHostname.charAt(0) === '*') {
+ // Remove leading wildcard.
+ parsedProxyHostname = parsedProxyHostname.slice(1);
+ }
+ // Stop proxying if the hostname ends with the no_proxy host.
+ return !stringEndsWith.call(hostname, parsedProxyHostname);
+ });
+}
+
+/**
+ * Get the value for an environment variable.
+ *
+ * @param {string} key - The name of the environment variable.
+ * @return {string} The value of the environment variable.
+ * @private
+ */
+function getEnv(key) {
+ return process.env[key.toLowerCase()] || process.env[key.toUpperCase()] || '';
+}
+
+exports.getProxyForUrl = getProxyForUrl;
diff --git a/node_modules/proxy-from-env/package.json b/node_modules/proxy-from-env/package.json
new file mode 100644
index 0000000..be2b845
--- /dev/null
+++ b/node_modules/proxy-from-env/package.json
@@ -0,0 +1,34 @@
+{
+ "name": "proxy-from-env",
+ "version": "1.1.0",
+ "description": "Offers getProxyForUrl to get the proxy URL for a URL, respecting the *_PROXY (e.g. HTTP_PROXY) and NO_PROXY environment variables.",
+ "main": "index.js",
+ "scripts": {
+ "lint": "eslint *.js",
+ "test": "mocha ./test.js --reporter spec",
+ "test-coverage": "istanbul cover ./node_modules/.bin/_mocha -- --reporter spec"
+ },
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/Rob--W/proxy-from-env.git"
+ },
+ "keywords": [
+ "proxy",
+ "http_proxy",
+ "https_proxy",
+ "no_proxy",
+ "environment"
+ ],
+ "author": "Rob Wu <rob@robwu.nl> (https://robwu.nl/)",
+ "license": "MIT",
+ "bugs": {
+ "url": "https://github.com/Rob--W/proxy-from-env/issues"
+ },
+ "homepage": "https://github.com/Rob--W/proxy-from-env#readme",
+ "devDependencies": {
+ "coveralls": "^3.0.9",
+ "eslint": "^6.8.0",
+ "istanbul": "^0.4.5",
+ "mocha": "^7.1.0"
+ }
+}
diff --git a/node_modules/proxy-from-env/test.js b/node_modules/proxy-from-env/test.js
new file mode 100644
index 0000000..abf6542
--- /dev/null
+++ b/node_modules/proxy-from-env/test.js
@@ -0,0 +1,483 @@
+/* eslint max-statements:0 */
+'use strict';
+
+var assert = require('assert');
+var parseUrl = require('url').parse;
+
+var getProxyForUrl = require('./').getProxyForUrl;
+
+// Runs the callback with process.env temporarily set to env.
+function runWithEnv(env, callback) {
+ var originalEnv = process.env;
+ process.env = env;
+ try {
+ callback();
+ } finally {
+ process.env = originalEnv;
+ }
+}
+
+// Defines a test case that checks whether getProxyForUrl(input) === expected.
+function testProxyUrl(env, expected, input) {
+ assert(typeof env === 'object' && env !== null);
+ // Copy object to make sure that the in param does not get modified between
+ // the call of this function and the use of it below.
+ env = JSON.parse(JSON.stringify(env));
+
+ var title = 'getProxyForUrl(' + JSON.stringify(input) + ')' +
+ ' === ' + JSON.stringify(expected);
+
+ // Save call stack for later use.
+ var stack = {};
+ Error.captureStackTrace(stack, testProxyUrl);
+ // Only use the last stack frame because that shows where this function is
+ // called, and that is sufficient for our purpose. No need to flood the logs
+ // with an uninteresting stack trace.
+ stack = stack.stack.split('\n', 2)[1];
+
+ it(title, function() {
+ var actual;
+ runWithEnv(env, function() {
+ actual = getProxyForUrl(input);
+ });
+ if (expected === actual) {
+ return; // Good!
+ }
+ try {
+ assert.strictEqual(expected, actual); // Create a formatted error message.
+ // Should not happen because previously we determined expected !== actual.
+ throw new Error('assert.strictEqual passed. This is impossible!');
+ } catch (e) {
+ // Use the original stack trace, so we can see a helpful line number.
+ e.stack = e.message + stack;
+ throw e;
+ }
+ });
+}
+
+describe('getProxyForUrl', function() {
+ describe('No proxy variables', function() {
+ var env = {};
+ testProxyUrl(env, '', 'http://example.com');
+ testProxyUrl(env, '', 'https://example.com');
+ testProxyUrl(env, '', 'ftp://example.com');
+ });
+
+ describe('Invalid URLs', function() {
+ var env = {};
+ env.ALL_PROXY = 'http://unexpected.proxy';
+ testProxyUrl(env, '', 'bogus');
+ testProxyUrl(env, '', '//example.com');
+ testProxyUrl(env, '', '://example.com');
+ testProxyUrl(env, '', '://');
+ testProxyUrl(env, '', '/path');
+ testProxyUrl(env, '', '');
+ testProxyUrl(env, '', 'http:');
+ testProxyUrl(env, '', 'http:/');
+ testProxyUrl(env, '', 'http://');
+ testProxyUrl(env, '', 'prototype://');
+ testProxyUrl(env, '', 'hasOwnProperty://');
+ testProxyUrl(env, '', '__proto__://');
+ testProxyUrl(env, '', undefined);
+ testProxyUrl(env, '', null);
+ testProxyUrl(env, '', {});
+ testProxyUrl(env, '', {host: 'x', protocol: 1});
+ testProxyUrl(env, '', {host: 1, protocol: 'x'});
+ });
+
+ describe('http_proxy and HTTP_PROXY', function() {
+ var env = {};
+ env.HTTP_PROXY = 'http://http-proxy';
+
+ testProxyUrl(env, '', 'https://example');
+ testProxyUrl(env, 'http://http-proxy', 'http://example');
+ testProxyUrl(env, 'http://http-proxy', parseUrl('http://example'));
+
+ // eslint-disable-next-line camelcase
+ env.http_proxy = 'http://priority';
+ testProxyUrl(env, 'http://priority', 'http://example');
+ });
+
+ describe('http_proxy with non-sensical value', function() {
+ var env = {};
+ // Crazy values should be passed as-is. It is the responsibility of the
+ // one who launches the application that the value makes sense.
+ // TODO: Should we be stricter and perform validation?
+ env.HTTP_PROXY = 'Crazy \n!() { ::// }';
+ testProxyUrl(env, 'Crazy \n!() { ::// }', 'http://wow');
+
+ // The implementation assumes that the HTTP_PROXY environment variable is
+ // somewhat reasonable, and if the scheme is missing, it is added.
+ // Garbage in, garbage out some would say...
+ env.HTTP_PROXY = 'crazy without colon slash slash';
+ testProxyUrl(env, 'http://crazy without colon slash slash', 'http://wow');
+ });
+
+ describe('https_proxy and HTTPS_PROXY', function() {
+ var env = {};
+ // Assert that there is no fall back to http_proxy
+ env.HTTP_PROXY = 'http://unexpected.proxy';
+ testProxyUrl(env, '', 'https://example');
+
+ env.HTTPS_PROXY = 'http://https-proxy';
+ testProxyUrl(env, 'http://https-proxy', 'https://example');
+
+ // eslint-disable-next-line camelcase
+ env.https_proxy = 'http://priority';
+ testProxyUrl(env, 'http://priority', 'https://example');
+ });
+
+ describe('ftp_proxy', function() {
+ var env = {};
+ // Something else than http_proxy / https, as a sanity check.
+ env.FTP_PROXY = 'http://ftp-proxy';
+
+ testProxyUrl(env, 'http://ftp-proxy', 'ftp://example');
+ testProxyUrl(env, '', 'ftps://example');
+ });
+
+ describe('all_proxy', function() {
+ var env = {};
+ env.ALL_PROXY = 'http://catch-all';
+ testProxyUrl(env, 'http://catch-all', 'https://example');
+
+ // eslint-disable-next-line camelcase
+ env.all_proxy = 'http://priority';
+ testProxyUrl(env, 'http://priority', 'https://example');
+ });
+
+ describe('all_proxy without scheme', function() {
+ var env = {};
+ env.ALL_PROXY = 'noscheme';
+ testProxyUrl(env, 'http://noscheme', 'http://example');
+ testProxyUrl(env, 'https://noscheme', 'https://example');
+
+ // The module does not impose restrictions on the scheme.
+ testProxyUrl(env, 'bogus-scheme://noscheme', 'bogus-scheme://example');
+
+ // But the URL should still be valid.
+ testProxyUrl(env, '', 'bogus');
+ });
+
+ describe('no_proxy empty', function() {
+ var env = {};
+ env.HTTPS_PROXY = 'http://proxy';
+
+ // NO_PROXY set but empty.
+ env.NO_PROXY = '';
+ testProxyUrl(env, 'http://proxy', 'https://example');
+
+ // No entries in NO_PROXY (comma).
+ env.NO_PROXY = ',';
+ testProxyUrl(env, 'http://proxy', 'https://example');
+
+ // No entries in NO_PROXY (whitespace).
+ env.NO_PROXY = ' ';
+ testProxyUrl(env, 'http://proxy', 'https://example');
+
+ // No entries in NO_PROXY (multiple whitespace / commas).
+ env.NO_PROXY = ',\t,,,\n, ,\r';
+ testProxyUrl(env, 'http://proxy', 'https://example');
+ });
+
+ describe('no_proxy=example (single host)', function() {
+ var env = {};
+ env.HTTP_PROXY = 'http://proxy';
+
+ env.NO_PROXY = 'example';
+ testProxyUrl(env, '', 'http://example');
+ testProxyUrl(env, '', 'http://example:80');
+ testProxyUrl(env, '', 'http://example:0');
+ testProxyUrl(env, '', 'http://example:1337');
+ testProxyUrl(env, 'http://proxy', 'http://sub.example');
+ testProxyUrl(env, 'http://proxy', 'http://prefexample');
+ testProxyUrl(env, 'http://proxy', 'http://example.no');
+ testProxyUrl(env, 'http://proxy', 'http://a.b.example');
+ testProxyUrl(env, 'http://proxy', 'http://host/example');
+ });
+
+ describe('no_proxy=sub.example (subdomain)', function() {
+ var env = {};
+ env.HTTP_PROXY = 'http://proxy';
+
+ env.NO_PROXY = 'sub.example';
+ testProxyUrl(env, 'http://proxy', 'http://example');
+ testProxyUrl(env, 'http://proxy', 'http://example:80');
+ testProxyUrl(env, 'http://proxy', 'http://example:0');
+ testProxyUrl(env, 'http://proxy', 'http://example:1337');
+ testProxyUrl(env, '', 'http://sub.example');
+ testProxyUrl(env, 'http://proxy', 'http://no.sub.example');
+ testProxyUrl(env, 'http://proxy', 'http://sub-example');
+ testProxyUrl(env, 'http://proxy', 'http://example.sub');
+ });
+
+ describe('no_proxy=example:80 (host + port)', function() {
+ var env = {};
+ env.HTTP_PROXY = 'http://proxy';
+
+ env.NO_PROXY = 'example:80';
+ testProxyUrl(env, '', 'http://example');
+ testProxyUrl(env, '', 'http://example:80');
+ testProxyUrl(env, '', 'http://example:0');
+ testProxyUrl(env, 'http://proxy', 'http://example:1337');
+ testProxyUrl(env, 'http://proxy', 'http://sub.example');
+ testProxyUrl(env, 'http://proxy', 'http://prefexample');
+ testProxyUrl(env, 'http://proxy', 'http://example.no');
+ testProxyUrl(env, 'http://proxy', 'http://a.b.example');
+ });
+
+ describe('no_proxy=.example (host suffix)', function() {
+ var env = {};
+ env.HTTP_PROXY = 'http://proxy';
+
+ env.NO_PROXY = '.example';
+ testProxyUrl(env, 'http://proxy', 'http://example');
+ testProxyUrl(env, 'http://proxy', 'http://example:80');
+ testProxyUrl(env, 'http://proxy', 'http://example:1337');
+ testProxyUrl(env, '', 'http://sub.example');
+ testProxyUrl(env, '', 'http://sub.example:80');
+ testProxyUrl(env, '', 'http://sub.example:1337');
+ testProxyUrl(env, 'http://proxy', 'http://prefexample');
+ testProxyUrl(env, 'http://proxy', 'http://example.no');
+ testProxyUrl(env, '', 'http://a.b.example');
+ });
+
+ describe('no_proxy=*', function() {
+ var env = {};
+ env.HTTP_PROXY = 'http://proxy';
+ env.NO_PROXY = '*';
+ testProxyUrl(env, '', 'http://example.com');
+ });
+
+ describe('no_proxy=*.example (host suffix with *.)', function() {
+ var env = {};
+ env.HTTP_PROXY = 'http://proxy';
+
+ env.NO_PROXY = '*.example';
+ testProxyUrl(env, 'http://proxy', 'http://example');
+ testProxyUrl(env, 'http://proxy', 'http://example:80');
+ testProxyUrl(env, 'http://proxy', 'http://example:1337');
+ testProxyUrl(env, '', 'http://sub.example');
+ testProxyUrl(env, '', 'http://sub.example:80');
+ testProxyUrl(env, '', 'http://sub.example:1337');
+ testProxyUrl(env, 'http://proxy', 'http://prefexample');
+ testProxyUrl(env, 'http://proxy', 'http://example.no');
+ testProxyUrl(env, '', 'http://a.b.example');
+ });
+
+ describe('no_proxy=*example (substring suffix)', function() {
+ var env = {};
+ env.HTTP_PROXY = 'http://proxy';
+
+ env.NO_PROXY = '*example';
+ testProxyUrl(env, '', 'http://example');
+ testProxyUrl(env, '', 'http://example:80');
+ testProxyUrl(env, '', 'http://example:1337');
+ testProxyUrl(env, '', 'http://sub.example');
+ testProxyUrl(env, '', 'http://sub.example:80');
+ testProxyUrl(env, '', 'http://sub.example:1337');
+ testProxyUrl(env, '', 'http://prefexample');
+ testProxyUrl(env, '', 'http://a.b.example');
+ testProxyUrl(env, 'http://proxy', 'http://example.no');
+ testProxyUrl(env, 'http://proxy', 'http://host/example');
+ });
+
+ describe('no_proxy=.*example (arbitrary wildcards are NOT supported)',
+ function() {
+ var env = {};
+ env.HTTP_PROXY = 'http://proxy';
+
+ env.NO_PROXY = '.*example';
+ testProxyUrl(env, 'http://proxy', 'http://example');
+ testProxyUrl(env, 'http://proxy', 'http://sub.example');
+ testProxyUrl(env, 'http://proxy', 'http://sub.example');
+ testProxyUrl(env, 'http://proxy', 'http://prefexample');
+ testProxyUrl(env, 'http://proxy', 'http://x.prefexample');
+ testProxyUrl(env, 'http://proxy', 'http://a.b.example');
+ });
+
+ describe('no_proxy=[::1],[::2]:80,10.0.0.1,10.0.0.2:80 (IP addresses)',
+ function() {
+ var env = {};
+ env.HTTP_PROXY = 'http://proxy';
+
+ env.NO_PROXY = '[::1],[::2]:80,10.0.0.1,10.0.0.2:80';
+ testProxyUrl(env, '', 'http://[::1]/');
+ testProxyUrl(env, '', 'http://[::1]:80/');
+ testProxyUrl(env, '', 'http://[::1]:1337/');
+
+ testProxyUrl(env, '', 'http://[::2]/');
+ testProxyUrl(env, '', 'http://[::2]:80/');
+ testProxyUrl(env, 'http://proxy', 'http://[::2]:1337/');
+
+ testProxyUrl(env, '', 'http://10.0.0.1/');
+ testProxyUrl(env, '', 'http://10.0.0.1:80/');
+ testProxyUrl(env, '', 'http://10.0.0.1:1337/');
+
+ testProxyUrl(env, '', 'http://10.0.0.2/');
+ testProxyUrl(env, '', 'http://10.0.0.2:80/');
+ testProxyUrl(env, 'http://proxy', 'http://10.0.0.2:1337/');
+ });
+
+ describe('no_proxy=127.0.0.1/32 (CIDR is NOT supported)', function() {
+ var env = {};
+ env.HTTP_PROXY = 'http://proxy';
+
+ env.NO_PROXY = '127.0.0.1/32';
+ testProxyUrl(env, 'http://proxy', 'http://127.0.0.1');
+ testProxyUrl(env, 'http://proxy', 'http://127.0.0.1/32');
+ });
+
+ describe('no_proxy=127.0.0.1 does NOT match localhost', function() {
+ var env = {};
+ env.HTTP_PROXY = 'http://proxy';
+
+ env.NO_PROXY = '127.0.0.1';
+ testProxyUrl(env, '', 'http://127.0.0.1');
+ // We're not performing DNS queries, so this shouldn't match.
+ testProxyUrl(env, 'http://proxy', 'http://localhost');
+ });
+
+ describe('no_proxy with protocols that have a default port', function() {
+ var env = {};
+ env.WS_PROXY = 'http://ws';
+ env.WSS_PROXY = 'http://wss';
+ env.HTTP_PROXY = 'http://http';
+ env.HTTPS_PROXY = 'http://https';
+ env.GOPHER_PROXY = 'http://gopher';
+ env.FTP_PROXY = 'http://ftp';
+ env.ALL_PROXY = 'http://all';
+
+ env.NO_PROXY = 'xxx:21,xxx:70,xxx:80,xxx:443';
+
+ testProxyUrl(env, '', 'http://xxx');
+ testProxyUrl(env, '', 'http://xxx:80');
+ testProxyUrl(env, 'http://http', 'http://xxx:1337');
+
+ testProxyUrl(env, '', 'ws://xxx');
+ testProxyUrl(env, '', 'ws://xxx:80');
+ testProxyUrl(env, 'http://ws', 'ws://xxx:1337');
+
+ testProxyUrl(env, '', 'https://xxx');
+ testProxyUrl(env, '', 'https://xxx:443');
+ testProxyUrl(env, 'http://https', 'https://xxx:1337');
+
+ testProxyUrl(env, '', 'wss://xxx');
+ testProxyUrl(env, '', 'wss://xxx:443');
+ testProxyUrl(env, 'http://wss', 'wss://xxx:1337');
+
+ testProxyUrl(env, '', 'gopher://xxx');
+ testProxyUrl(env, '', 'gopher://xxx:70');
+ testProxyUrl(env, 'http://gopher', 'gopher://xxx:1337');
+
+ testProxyUrl(env, '', 'ftp://xxx');
+ testProxyUrl(env, '', 'ftp://xxx:21');
+ testProxyUrl(env, 'http://ftp', 'ftp://xxx:1337');
+ });
+
+ describe('no_proxy should not be case-sensitive', function() {
+ var env = {};
+ env.HTTP_PROXY = 'http://proxy';
+ env.NO_PROXY = 'XXX,YYY,ZzZ';
+
+ testProxyUrl(env, '', 'http://xxx');
+ testProxyUrl(env, '', 'http://XXX');
+ testProxyUrl(env, '', 'http://yyy');
+ testProxyUrl(env, '', 'http://YYY');
+ testProxyUrl(env, '', 'http://ZzZ');
+ testProxyUrl(env, '', 'http://zZz');
+ });
+
+ describe('NPM proxy configuration', function() {
+ describe('npm_config_http_proxy should work', function() {
+ var env = {};
+ // eslint-disable-next-line camelcase
+ env.npm_config_http_proxy = 'http://http-proxy';
+
+ testProxyUrl(env, '', 'https://example');
+ testProxyUrl(env, 'http://http-proxy', 'http://example');
+
+ // eslint-disable-next-line camelcase
+ env.npm_config_http_proxy = 'http://priority';
+ testProxyUrl(env, 'http://priority', 'http://example');
+ });
+ // eslint-disable-next-line max-len
+ describe('npm_config_http_proxy should take precedence over HTTP_PROXY and npm_config_proxy', function() {
+ var env = {};
+ // eslint-disable-next-line camelcase
+ env.npm_config_http_proxy = 'http://http-proxy';
+ // eslint-disable-next-line camelcase
+ env.npm_config_proxy = 'http://unexpected-proxy';
+ env.HTTP_PROXY = 'http://unexpected-proxy';
+
+ testProxyUrl(env, 'http://http-proxy', 'http://example');
+ });
+ describe('npm_config_https_proxy should work', function() {
+ var env = {};
+ // eslint-disable-next-line camelcase
+ env.npm_config_http_proxy = 'http://unexpected.proxy';
+ testProxyUrl(env, '', 'https://example');
+
+ // eslint-disable-next-line camelcase
+ env.npm_config_https_proxy = 'http://https-proxy';
+ testProxyUrl(env, 'http://https-proxy', 'https://example');
+
+ // eslint-disable-next-line camelcase
+ env.npm_config_https_proxy = 'http://priority';
+ testProxyUrl(env, 'http://priority', 'https://example');
+ });
+ // eslint-disable-next-line max-len
+ describe('npm_config_https_proxy should take precedence over HTTPS_PROXY and npm_config_proxy', function() {
+ var env = {};
+ // eslint-disable-next-line camelcase
+ env.npm_config_https_proxy = 'http://https-proxy';
+ // eslint-disable-next-line camelcase
+ env.npm_config_proxy = 'http://unexpected-proxy';
+ env.HTTPS_PROXY = 'http://unexpected-proxy';
+
+ testProxyUrl(env, 'http://https-proxy', 'https://example');
+ });
+ describe('npm_config_proxy should work', function() {
+ var env = {};
+ // eslint-disable-next-line camelcase
+ env.npm_config_proxy = 'http://http-proxy';
+ testProxyUrl(env, 'http://http-proxy', 'http://example');
+ testProxyUrl(env, 'http://http-proxy', 'https://example');
+
+ // eslint-disable-next-line camelcase
+ env.npm_config_proxy = 'http://priority';
+ testProxyUrl(env, 'http://priority', 'http://example');
+ testProxyUrl(env, 'http://priority', 'https://example');
+ });
+ // eslint-disable-next-line max-len
+ describe('HTTP_PROXY and HTTPS_PROXY should take precedence over npm_config_proxy', function() {
+ var env = {};
+ env.HTTP_PROXY = 'http://http-proxy';
+ env.HTTPS_PROXY = 'http://https-proxy';
+ // eslint-disable-next-line camelcase
+ env.npm_config_proxy = 'http://unexpected-proxy';
+ testProxyUrl(env, 'http://http-proxy', 'http://example');
+ testProxyUrl(env, 'http://https-proxy', 'https://example');
+ });
+ describe('npm_config_no_proxy should work', function() {
+ var env = {};
+ env.HTTP_PROXY = 'http://proxy';
+ // eslint-disable-next-line camelcase
+ env.npm_config_no_proxy = 'example';
+
+ testProxyUrl(env, '', 'http://example');
+ testProxyUrl(env, 'http://proxy', 'http://otherwebsite');
+ });
+ // eslint-disable-next-line max-len
+ describe('npm_config_no_proxy should take precedence over NO_PROXY', function() {
+ var env = {};
+ env.HTTP_PROXY = 'http://proxy';
+ env.NO_PROXY = 'otherwebsite';
+ // eslint-disable-next-line camelcase
+ env.npm_config_no_proxy = 'example';
+
+ testProxyUrl(env, '', 'http://example');
+ testProxyUrl(env, 'http://proxy', 'http://otherwebsite');
+ });
+ });
+});
diff --git a/node_modules/reduce-flatten/.travis.yml b/node_modules/reduce-flatten/.travis.yml
new file mode 100644
index 0000000..0517f82
--- /dev/null
+++ b/node_modules/reduce-flatten/.travis.yml
@@ -0,0 +1,7 @@
+language: node_js
+node_js:
+ - 6
+ - 7
+ - 8
+ - 9
+ - 10
diff --git a/node_modules/reduce-flatten/LICENSE b/node_modules/reduce-flatten/LICENSE
new file mode 100644
index 0000000..fb6a17a
--- /dev/null
+++ b/node_modules/reduce-flatten/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2016-18 Lloyd Brookes <75pound@gmail.com>
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/node_modules/reduce-flatten/README.hbs b/node_modules/reduce-flatten/README.hbs
new file mode 100644
index 0000000..aecf981
--- /dev/null
+++ b/node_modules/reduce-flatten/README.hbs
@@ -0,0 +1,11 @@
+[![view on npm](http://img.shields.io/npm/v/reduce-flatten.svg)](https://www.npmjs.org/package/reduce-flatten)
+[![npm module downloads](http://img.shields.io/npm/dt/reduce-flatten.svg)](https://www.npmjs.org/package/reduce-flatten)
+[![Build Status](https://travis-ci.org/75lb/reduce-flatten.svg?branch=master)](https://travis-ci.org/75lb/reduce-flatten)
+[![Dependency Status](https://david-dm.org/75lb/reduce-flatten.svg)](https://david-dm.org/75lb/reduce-flatten)
+[![js-standard-style](https://img.shields.io/badge/code%20style-standard-brightgreen.svg)](https://github.com/feross/standard)
+
+{{>main}}
+
+* * *
+
+&copy; 2016-18 Lloyd Brookes \<75pound@gmail.com\>. Documented by [jsdoc-to-markdown](https://github.com/jsdoc2md/jsdoc-to-markdown).
diff --git a/node_modules/reduce-flatten/README.md b/node_modules/reduce-flatten/README.md
new file mode 100644
index 0000000..a320006
--- /dev/null
+++ b/node_modules/reduce-flatten/README.md
@@ -0,0 +1,29 @@
+[![view on npm](http://img.shields.io/npm/v/reduce-flatten.svg)](https://www.npmjs.org/package/reduce-flatten)
+[![npm module downloads](http://img.shields.io/npm/dt/reduce-flatten.svg)](https://www.npmjs.org/package/reduce-flatten)
+[![Build Status](https://travis-ci.org/75lb/reduce-flatten.svg?branch=master)](https://travis-ci.org/75lb/reduce-flatten)
+[![Dependency Status](https://david-dm.org/75lb/reduce-flatten.svg)](https://david-dm.org/75lb/reduce-flatten)
+[![js-standard-style](https://img.shields.io/badge/code%20style-standard-brightgreen.svg)](https://github.com/feross/standard)
+
+<a name="module_reduce-flatten"></a>
+
+## reduce-flatten
+Flatten an array into the supplied array.
+
+**Example**
+```js
+const flatten = require('reduce-flatten')
+```
+<a name="exp_module_reduce-flatten--flatten"></a>
+
+### flatten() ⏏
+**Kind**: Exported function
+**Example**
+```js
+> numbers = [ 1, 2, [ 3, 4 ], 5 ]
+> numbers.reduce(flatten, [])
+[ 1, 2, 3, 4, 5 ]
+```
+
+* * *
+
+&copy; 2016-18 Lloyd Brookes \<75pound@gmail.com\>. Documented by [jsdoc-to-markdown](https://github.com/jsdoc2md/jsdoc-to-markdown).
diff --git a/node_modules/reduce-flatten/index.js b/node_modules/reduce-flatten/index.js
new file mode 100644
index 0000000..f2ee9ed
--- /dev/null
+++ b/node_modules/reduce-flatten/index.js
@@ -0,0 +1,19 @@
+/**
+ * Flatten an array into the supplied array.
+ *
+ * @module reduce-flatten
+ * @example
+ * const flatten = require('reduce-flatten')
+ */
+module.exports = flatten
+
+/**
+ * @alias module:reduce-flatten
+ * @example
+ * > numbers = [ 1, 2, [ 3, 4 ], 5 ]
+ * > numbers.reduce(flatten, [])
+ * [ 1, 2, 3, 4, 5 ]
+ */
+function flatten (prev, curr) {
+ return prev.concat(curr)
+}
diff --git a/node_modules/reduce-flatten/package.json b/node_modules/reduce-flatten/package.json
new file mode 100644
index 0000000..fcb9e50
--- /dev/null
+++ b/node_modules/reduce-flatten/package.json
@@ -0,0 +1,24 @@
+{
+ "name": "reduce-flatten",
+ "author": "Lloyd Brookes <75pound@gmail.com>",
+ "version": "2.0.0",
+ "description": "Flatten an array into the supplied array.",
+ "repository": "https://github.com/75lb/reduce-flatten.git",
+ "license": "MIT",
+ "keywords": [
+ "array",
+ "reduce",
+ "flatten"
+ ],
+ "engines": {
+ "node": ">=6"
+ },
+ "scripts": {
+ "test": "test-runner test.js",
+ "docs": "jsdoc2md -t README.hbs index.js > README.md; echo"
+ },
+ "devDependencies": {
+ "jsdoc-to-markdown": "^4.0.1",
+ "test-runner": "^0.5.0"
+ }
+}
diff --git a/node_modules/reduce-flatten/test.js b/node_modules/reduce-flatten/test.js
new file mode 100644
index 0000000..db2fe68
--- /dev/null
+++ b/node_modules/reduce-flatten/test.js
@@ -0,0 +1,11 @@
+const flatten = require('./')
+const TestRunner = require('test-runner')
+const a = require('assert')
+
+const runner = new TestRunner()
+
+runner.test('flatten', function () {
+ const numbers = [ 1, 2, [ 3, 4 ], 5 ]
+ const result = numbers.reduce(flatten, [])
+ a.deepStrictEqual(result, [ 1, 2, 3, 4, 5 ])
+})
diff --git a/node_modules/sisteransi/license b/node_modules/sisteransi/license
new file mode 100644
index 0000000..13dc83c
--- /dev/null
+++ b/node_modules/sisteransi/license
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2018 Terkel Gjervig Nielsen
+
+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/sisteransi/package.json b/node_modules/sisteransi/package.json
new file mode 100755
index 0000000..55a6476
--- /dev/null
+++ b/node_modules/sisteransi/package.json
@@ -0,0 +1,34 @@
+{
+ "name": "sisteransi",
+ "version": "1.0.5",
+ "description": "ANSI escape codes for some terminal swag",
+ "main": "src/index.js",
+ "license": "MIT",
+ "author": {
+ "name": "Terkel Gjervig",
+ "email": "terkel@terkel.com",
+ "url": "https://terkel.com"
+ },
+ "scripts": {
+ "test": "tape test/*.js | tap-spec"
+ },
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/terkelg/sisteransi"
+ },
+ "files": [
+ "src"
+ ],
+ "types": "./src/sisteransi.d.ts",
+ "keywords": [
+ "ansi",
+ "escape codes",
+ "escape",
+ "terminal",
+ "style"
+ ],
+ "devDependencies": {
+ "tap-spec": "^5.0.0",
+ "tape": "^4.13.2"
+ }
+}
diff --git a/node_modules/sisteransi/readme.md b/node_modules/sisteransi/readme.md
new file mode 100755
index 0000000..632f0d7
--- /dev/null
+++ b/node_modules/sisteransi/readme.md
@@ -0,0 +1,113 @@
+# sister ANSI [![Version](https://img.shields.io/npm/v/sisteransi.svg)](https://www.npmjs.com/package/sisteransi) [![Build Status](https://travis-ci.org/terkelg/sisteransi.svg?branch=master)](https://travis-ci.org/terkelg/sisteransi) [![Downloads](https://img.shields.io/npm/dm/sisteransi.svg)](https://www.npmjs.com/package/sisteransi)
+
+> Ansi escape codes faster than you can say "[Bam bam](https://www.youtube.com/watch?v=OcaPu9JPenU)".
+
+## Installation
+
+```
+npm install sisteransi
+```
+
+
+## Usage
+
+```js
+const ansi = require('sisteransi');
+// or const { cursor } = require('sisteransi');
+
+const p = str => process.stdout.write(str);
+
+// move cursor to 2, 1
+p(ansi.cursor.to(2, 1));
+
+// to up, one down
+p(ansi.cursor.up(2)+ansi.cursor.down(1));
+```
+
+## API
+
+### cursor
+
+#### to(x, y)
+Set the absolute position of the cursor. `x0` `y0` is the top left of the screen.
+
+#### move(x, y)
+Set the position of the cursor relative to its current position.
+
+#### up(count = 1)
+Move cursor up a specific amount of rows. Default is `1`.
+
+#### down(count = 1)
+Move cursor down a specific amount of rows. Default is `1`.
+
+#### forward(count = 1)
+Move cursor forward a specific amount of rows. Default is `1`.
+
+#### backward(count = 1)
+Move cursor backward a specific amount of rows. Default is `1`.
+
+#### nextLine(count = 1)
+Move cursor to the next line a specific amount of lines. Default is `1`.
+
+#### prevLine(count = 1)
+Move cursor to the previous a specific amount of lines. Default is `1`.
+
+#### left
+Move cursor to the left side.
+
+#### hide
+Hide cursor.
+
+#### show
+Show cursor.
+
+#### save
+
+Save cursor position.
+
+#### restore
+
+Restore cursor position.
+
+
+### scroll
+
+#### up(count = 1)
+Scroll display up a specific amount of lines. Default to `1`.
+
+#### down(count = 1)
+Scroll display down a specific amount of lines. Default to `1`.
+
+
+### erase
+
+#### screen
+Erase the screen and move the cursor the top left position.
+
+#### up(count = 1)
+Erase the screen from the current line up to the top of the screen. Default to `1`.
+
+#### down(count = 2)
+Erase the screen from the current line down to the bottom of the screen. Default to `1`.
+
+#### line
+Erase the entire current line.
+
+#### lineEnd
+Erase from the current cursor position to the end of the current line.
+
+#### lineStart
+Erase from the current cursor position to the start of the current line.
+
+#### lines(count)
+Erase from the current cursor position up the specified amount of rows.
+
+
+## Credit
+
+This is a fork of [ansi-escapes](https://github.com/sindresorhus/ansi-escapes).
+
+
+## License
+
+MIT © [Terkel Gjervig](https://terkel.com)
diff --git a/node_modules/sisteransi/src/index.js b/node_modules/sisteransi/src/index.js
new file mode 100644
index 0000000..7034e2e
--- /dev/null
+++ b/node_modules/sisteransi/src/index.js
@@ -0,0 +1,58 @@
+'use strict';
+
+const ESC = '\x1B';
+const CSI = `${ESC}[`;
+const beep = '\u0007';
+
+const cursor = {
+ to(x, y) {
+ if (!y) return `${CSI}${x + 1}G`;
+ return `${CSI}${y + 1};${x + 1}H`;
+ },
+ move(x, y) {
+ let ret = '';
+
+ if (x < 0) ret += `${CSI}${-x}D`;
+ else if (x > 0) ret += `${CSI}${x}C`;
+
+ if (y < 0) ret += `${CSI}${-y}A`;
+ else if (y > 0) ret += `${CSI}${y}B`;
+
+ return ret;
+ },
+ up: (count = 1) => `${CSI}${count}A`,
+ down: (count = 1) => `${CSI}${count}B`,
+ forward: (count = 1) => `${CSI}${count}C`,
+ backward: (count = 1) => `${CSI}${count}D`,
+ nextLine: (count = 1) => `${CSI}E`.repeat(count),
+ prevLine: (count = 1) => `${CSI}F`.repeat(count),
+ left: `${CSI}G`,
+ hide: `${CSI}?25l`,
+ show: `${CSI}?25h`,
+ save: `${ESC}7`,
+ restore: `${ESC}8`
+}
+
+const scroll = {
+ up: (count = 1) => `${CSI}S`.repeat(count),
+ down: (count = 1) => `${CSI}T`.repeat(count)
+}
+
+const erase = {
+ screen: `${CSI}2J`,
+ up: (count = 1) => `${CSI}1J`.repeat(count),
+ down: (count = 1) => `${CSI}J`.repeat(count),
+ line: `${CSI}2K`,
+ lineEnd: `${CSI}K`,
+ lineStart: `${CSI}1K`,
+ lines(count) {
+ let clear = '';
+ for (let i = 0; i < count; i++)
+ clear += this.line + (i < count - 1 ? cursor.up() : '');
+ if (count)
+ clear += cursor.left;
+ return clear;
+ }
+}
+
+module.exports = { cursor, scroll, erase, beep };
diff --git a/node_modules/sisteransi/src/sisteransi.d.ts b/node_modules/sisteransi/src/sisteransi.d.ts
new file mode 100644
index 0000000..113da2f
--- /dev/null
+++ b/node_modules/sisteransi/src/sisteransi.d.ts
@@ -0,0 +1,35 @@
+export const beep: string;
+export const clear: string;
+
+export namespace cursor {
+ export const left: string;
+ export const hide: string;
+ export const show: string;
+ export const save: string;
+ export const restore: string;
+
+ export function to(x: number, y?: number): string;
+ export function move(x: number, y: number): string;
+ export function up(count?: number): string;
+ export function down(count?: number): string;
+ export function forward(count?: number): string;
+ export function backward(count?: number): string;
+ export function nextLine(count?: number): string;
+ export function prevLine(count?: number): string;
+}
+
+export namespace scroll {
+ export function up(count?: number): string;
+ export function down(count?: number): string;
+}
+
+export namespace erase {
+ export const screen: string;
+ export const line: string;
+ export const lineEnd: string;
+ export const lineStart: string;
+
+ export function up(count?: number): string;
+ export function down(count?: number): string;
+ export function lines(count: number): string;
+}
diff --git a/node_modules/supports-color/browser.js b/node_modules/supports-color/browser.js
new file mode 100644
index 0000000..62afa3a
--- /dev/null
+++ b/node_modules/supports-color/browser.js
@@ -0,0 +1,5 @@
+'use strict';
+module.exports = {
+ stdout: false,
+ stderr: false
+};
diff --git a/node_modules/supports-color/index.js b/node_modules/supports-color/index.js
new file mode 100644
index 0000000..6fada39
--- /dev/null
+++ b/node_modules/supports-color/index.js
@@ -0,0 +1,135 @@
+'use strict';
+const os = require('os');
+const tty = require('tty');
+const hasFlag = require('has-flag');
+
+const {env} = process;
+
+let forceColor;
+if (hasFlag('no-color') ||
+ hasFlag('no-colors') ||
+ hasFlag('color=false') ||
+ hasFlag('color=never')) {
+ forceColor = 0;
+} else if (hasFlag('color') ||
+ hasFlag('colors') ||
+ hasFlag('color=true') ||
+ hasFlag('color=always')) {
+ forceColor = 1;
+}
+
+if ('FORCE_COLOR' in env) {
+ if (env.FORCE_COLOR === 'true') {
+ forceColor = 1;
+ } else if (env.FORCE_COLOR === 'false') {
+ forceColor = 0;
+ } else {
+ forceColor = env.FORCE_COLOR.length === 0 ? 1 : Math.min(parseInt(env.FORCE_COLOR, 10), 3);
+ }
+}
+
+function translateLevel(level) {
+ if (level === 0) {
+ return false;
+ }
+
+ return {
+ level,
+ hasBasic: true,
+ has256: level >= 2,
+ has16m: level >= 3
+ };
+}
+
+function supportsColor(haveStream, streamIsTTY) {
+ if (forceColor === 0) {
+ return 0;
+ }
+
+ if (hasFlag('color=16m') ||
+ hasFlag('color=full') ||
+ hasFlag('color=truecolor')) {
+ return 3;
+ }
+
+ if (hasFlag('color=256')) {
+ return 2;
+ }
+
+ if (haveStream && !streamIsTTY && forceColor === undefined) {
+ return 0;
+ }
+
+ const min = forceColor || 0;
+
+ if (env.TERM === 'dumb') {
+ return min;
+ }
+
+ if (process.platform === 'win32') {
+ // 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(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', 'GITHUB_ACTIONS', 'BUILDKITE'].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;
+ }
+
+ return min;
+}
+
+function getSupportLevel(stream) {
+ const level = supportsColor(stream, stream && stream.isTTY);
+ return translateLevel(level);
+}
+
+module.exports = {
+ supportsColor: getSupportLevel,
+ stdout: translateLevel(supportsColor(true, tty.isatty(1))),
+ stderr: translateLevel(supportsColor(true, tty.isatty(2)))
+};
diff --git a/node_modules/supports-color/license b/node_modules/supports-color/license
new file mode 100644
index 0000000..e7af2f7
--- /dev/null
+++ b/node_modules/supports-color/license
@@ -0,0 +1,9 @@
+MIT License
+
+Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/node_modules/supports-color/package.json b/node_modules/supports-color/package.json
new file mode 100644
index 0000000..f7182ed
--- /dev/null
+++ b/node_modules/supports-color/package.json
@@ -0,0 +1,53 @@
+{
+ "name": "supports-color",
+ "version": "7.2.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": ">=8"
+ },
+ "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": "^4.0.0"
+ },
+ "devDependencies": {
+ "ava": "^1.4.1",
+ "import-fresh": "^3.0.0",
+ "xo": "^0.24.0"
+ },
+ "browser": "browser.js"
+}
diff --git a/node_modules/supports-color/readme.md b/node_modules/supports-color/readme.md
new file mode 100644
index 0000000..3654228
--- /dev/null
+++ b/node_modules/supports-color/readme.md
@@ -0,0 +1,76 @@
+# 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.
+
+For situations where using `--color` is not possible, use the environment variable `FORCE_COLOR=1` (level 1), `FORCE_COLOR=2` (level 2), or `FORCE_COLOR=3` (level 3) 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-)
+
+
+---
+
+<div align="center">
+ <b>
+ <a href="https://tidelift.com/subscription/pkg/npm-supports-color?utm_source=npm-supports-color&utm_medium=referral&utm_campaign=readme">Get professional support for this package with a Tidelift subscription</a>
+ </b>
+ <br>
+ <sub>
+ Tidelift helps make open source sustainable for maintainers while giving companies<br>assurances about security, maintenance, and licensing for their dependencies.
+ </sub>
+</div>
+
+---
diff --git a/node_modules/systeminformation/LICENSE b/node_modules/systeminformation/LICENSE
new file mode 100644
index 0000000..1ef622c
--- /dev/null
+++ b/node_modules/systeminformation/LICENSE
@@ -0,0 +1,20 @@
+The MIT License (MIT)
+
+Copyright (c) 2014-2022 Sebastian Hildebrandt
+
+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/systeminformation/README.md b/node_modules/systeminformation/README.md
new file mode 100644
index 0000000..13e9008
--- /dev/null
+++ b/node_modules/systeminformation/README.md
@@ -0,0 +1,1088 @@
+<p align="center">
+ <a href="https://systeminformation.io/">
+ <img src="https://systeminformation.io/assets/logo_inv.png" alt="systeminformation logo" width="102" height="72">
+ </a>
+</p>
+
+<h3 align="center">systeminformation</h3>
+
+<p align="center">
+ System and OS information library for node.js
+ <br>
+ <a href="https://systeminformation.io/"><strong>Explore Systeminformation docs »</strong></a>
+ <br>
+ <br>
+ <a href="https://github.com/sebhildebrandt/systeminformation/issues/new?template=bug_report.md">Report bug</a>
+ ·
+ <a href="https://github.com/sebhildebrandt/systeminformation/issues/new?template=feature_request.md&labels=feature">Request feature</a>
+ ·
+ <a href="https://github.com/sebhildebrandt/systeminformation/blob/master/CHANGELOG.md">Changelog</a>
+</p>
+
+ [![NPM Version][npm-image]][npm-url]
+ [![NPM Downloads][downloads-image]][downloads-url]
+ [![Git Issues][issues-img]][issues-url]
+ [![Closed Issues][closed-issues-img]][closed-issues-url]
+ <img src="docs/assets/no-dependencies.svg" alt="no dependencies">
+ [![Code Quality: Javascript][lgtm-badge]][lgtm-badge-url]
+ [![Total alerts][lgtm-alerts]][lgtm-alerts-url]
+ [![Caretaker][caretaker-image]][caretaker-url]
+ [![Sponsoring][sponsor-badge]][sponsor-url]
+ [![MIT license][license-img]][license-url]
+
+This is amazing. Started as a small project just for myself, it now has > 15,000 lines of code, > 500 versions published, up to 5 mio downloads per month, > 100 mio downloads overall. #1 NPM ranking for backend packages. Thank you to all who contributed to this project!
+
+## New Version 5.0
+
+The new Version 5 is here - I spend several weeks finalizing this new version. Any support is highly appreciated - [Buy me a coffee](https://www.buymeacoffee.com/systeminfo)
+
+This next major version release 5.0 comes with new functionality and several improvements and changes (some of them are breaking changes!):
+
+- added audio: get detailed audio device information
+- added bluetooth: get detailed bluetooth device information
+- added dockerImages, dockerVolumes: get detailed information about docker images and volumes
+- added printer: get information from detected printers
+- added usb: get detailed usb controller and device information
+- added wifi interfaces ans connections: extended wifi information
+- better uuid function to get unique hardware and OS UUIDs
+- better/extended cpu info detection
+- better/extended system info detection
+- Apple Silicon M1 support
+- better Raspberry-PI detection
+- systeminformation website updated and extendet with full documentation and examples [systeminformation.io][systeminformation-url]
+- lot of minor improvements
+
+Breaking Changes in version 5: you will see several breaking changes for the sake of a more consistent API interface and to be future proof. Read the [detailed version 5 changes][changes5-url].
+
+I did a lot of testing on different platforms and machines but of course there might be some issues that I am not aware of. I would be happy if you inform me when you discover any issues. Issues can be [opened here][new-issue].
+
+## Quick Start
+
+Lightweight collection of 50+ functions to retrieve detailed hardware, system and OS information.
+
+- simple to use
+- get detailed information about system, cpu, baseboard, battery, memory, disks/filesystem, network, docker, software, services and processes
+- supports Linux, macOS, partial Windows, FreeBSD, OpenBSD, NetBSD, SunOS and Android support
+- no npm dependencies
+
+**Attention**: this is a `node.js` library. It is supposed to be used as a backend/server-side library and will definitely not work within a browser.
+
+### Installation
+
+```bash
+npm install systeminformation --save
+```
+
+or simpler
+
+```bash
+npm install systeminformation
+```
+
+#### Still need Version 4?
+
+If you need version 4 (for compatibility reasons), you can install version 4 (latest release) like this
+
+```bash
+npm install systeminformation@4 —save
+```
+
+or simpler
+
+```bash
+npm install systeminformation@4
+```
+
+### Usage
+
+All functions (except `version` and `time`) are implemented as asynchronous functions. Here a small example how to use them:
+
+```js
+const si = require('systeminformation');
+
+// promises style - new since version 3
+si.cpu()
+ .then(data => console.log(data))
+ .catch(error => console.error(error));
+```
+
+## News and Changes
+
+### Latest Activity
+
+(last 7 major and minor version releases)
+
+- Version 5.12.0: `cpu()` added performance and efficiency cores
+- Version 5.11.0: `networkInterfaces()` added default property and default parameter
+- Version 5.10.0: basic `android` support
+- Version 5.9.0: `graphics()` added properties (macOS)
+- Version 5.8.0: `disksIO()` added waitTime, waitPercent (linux)
+- Version 5.7.0: `diskLayout()` added S.M.A.R.T for Windows (if installed)
+- Version 5.6.0: `cpuTemperature()` added added socket and chipset temp (linux)
+- Version 5.5.0: `dockerVolumes()` added
+- Version 5.4.0: `dockerImages()` added
+- Version 5.3.0: `osInfo()` added remoteSession (win only)
+- Version 5.2.0: `wifiInterfaces()` and `wifiConnections()` added
+- Version 5.1.0: `memLayout()` added ECC flag, `bios()` added language, features (linux)
+- Version 5.0.0: new version 5 - attention there are some breaking changes. See [detailed version 5 changes here][changes5-url].
+- ...
+
+You can find all changes here: [detailed changelog][changelog-url]
+
+## Core concept
+
+[Node.js][nodejs-url] comes with some basic OS information, but I always wanted a little more. So I came up to write this little library. This library is still work in progress. It is supposed to be used as a backend/server-side library (will definitely not work within a browser). It requires node.js version 4.0 and above.
+
+I was able to test it on several Debian, Raspbian, Ubuntu distributions as well as macOS (Mavericks, Yosemite, El Captain, Sierra, High Sierra, Mojave, Catalina, Big Sur) and some Windows 7, Windows 8, Windows 10, FreeBSD, OpenBSD, NetBSD and SunOS machines. Not all functions are supported on all operating systems. Have a look at the function reference in the docs to get further details.
+
+If you have comments, suggestions & reports, please feel free to contact me!
+
+
+I also created a nice little command line tool called [mmon][mmon-github-url] (micro-monitor) for Linux and macOS, also available via [github][mmon-github-url] and [npm][mmon-npm-url]
+
+
+## Reference
+
+### Function Reference and OS Support
+
+Full function reference with examples can be found at [https://systeminformation.io][systeminformation-url].
+
+#### 1. General
+
+| Function | Result object | Linux | BSD | Mac | Win | Sun | Comments |
+| --------------- | ------------- | ----- | ------- | --- | --- | --- | -------- |
+| si.version() | : string | X | X | X | X | X | lib version (no callback/promise) |
+| si.time() | {...} | X | X | X | X | X | (no callback/promise) |
+| | current | X | X | X | X | X | local (server) time |
+| | uptime | X | X | X | X | X | uptime in number of seconds |
+| | timezone | X | X | X | X | X | e.g. GMT+0200 |
+| | timezoneName | X | X | X | X | X | e.g. CEST |
+
+#### 2. System (HW)
+
+| Function | Result object | Linux | BSD | Mac | Win | Sun | Comments |
+| --------------- | ------------- | ----- | ------- | --- | --- | --- | -------- |
+| si.system(cb) | {...} | X | X | X | X | | hardware information |
+| | manufacturer | X | X | X | X | | e.g. 'MSI' |
+| | model | X | X | X | X | | model/product e.g. 'MS-7823' |
+| | version | X | X | X | X | | version e.g. '1.0' |
+| | serial | X | X | X | X | | serial number |
+| | uuid | X | X | X | X | | UUID |
+| | sku | X | X | X | X | | SKU number |
+| | virtual | X | X | | X | | is virtual machine |
+| | virtualHost | X | X | | X | | virtual host (if virtual) |
+| | raspberry | X | | | | | optional raspberry revision data |
+| si.bios(cb) | {...} | X | X | X | X | | bios information |
+| | vendor | X | X | X | X | | e.g. 'AMI' |
+| | version | X | X | X | X | | version |
+| | releaseDate | X | X | | X | | release date |
+| | revision | X | X | | X | | revision |
+| | serial | X | | | X | | serial |
+| si.baseboard(cb) | {...} | X | X | X | X | | baseboard information |
+| | manufacturer | X | X | X | X | | e.g. 'ASUS' |
+| | model | X | X | X | X | | model / product name |
+| | version | X | X | X | X | | version |
+| | serial | X | X | X | X | | serial number |
+| | assetTag | X | X | X | X | | asset tag |
+| | memMax | X | | X | X | | max memory in bytes |
+| | memSlots | X | | X | X | | memory slots on baseboard |
+| si.chassis(cb) | {...} | X | X | X | X | | chassis information |
+| | manufacturer | X | X | X | X | | e.g. 'MSI' |
+| | model | X | X | X | X | | model / product name |
+| | type | X | X | X | X | | model / product name |
+| | version | X | X | X | X | | version |
+| | serial | X | X | X | X | | serial number |
+| | assetTag | X | X | X | X | | asset tag |
+| | sku | | | | X | | SKU number |
+
+#### 3. CPU
+
+| Function | Result object | Linux | BSD | Mac | Win | Sun | Comments |
+| --------------- | ------------- | ----- | ------- | --- | --- | --- | -------- |
+| si.cpu(cb) | {...} | X | X | X | X | | CPU information|
+| | manufacturer | X | X | X | X | | e.g. 'Intel(R)' |
+| | brand | X | X | X | X | | e.g. 'Core(TM)2 Duo' |
+| | speed | X | X | X | X | | in GHz e.g. '3.40' |
+| | speedMin | X | | X | X | | in GHz e.g. '0.80' |
+| | speedMax | X | X | X | X | | in GHz e.g. '3.90' |
+| | governor | X | | | | | e.g. 'powersave' |
+| | cores | X | X | X | X | | # cores |
+| | physicalCores | X | X | X | X | | # physical cores |
+| | efficiencyCores | X | | X | | | # efficiency cores |
+| | performanceCores | X | | X | | | # performance cores |
+| | processors | X | X | X | X | | # processors |
+| | socket | X | X | | X | | socket type e.g. "LGA1356" |
+| | vendor | X | X | X | X | | vendor ID |
+| | family | X | X | X | X | | processor family |
+| | model | X | X | X | X | | processor model |
+| | stepping | X | X | X | X | | processor stepping |
+| | revision | X | | X | X | | revision |
+| | voltage | | X | | | | voltage |
+| | flags | X | X | X | X | | CPU flags |
+| | virtualization | X | X | X | X | | virtualization supported |
+| | cache | X | X | X | X | | cache in bytes (object) |
+| | cache.l1d | X | X | X | X | | L1D (data) size |
+| | cache.l1i | X | X | X | X | | L1I (instruction) size |
+| | cache.l2 | X | X | X | X | | L2 size |
+| | cache.l3 | X | X | X | X | | L3 size |
+| si.cpuFlags(cb) | : string | X | X | X | X | | CPU flags|
+| si.cpuCache(cb) | {...} | X | X | X | X | | CPU cache sizes |
+| | l1d | X | X | X | X | | L1D size |
+| | l1i | X | X | X | X | | L1I size |
+| | l2 | X | X | X | X | | L2 size |
+| | l3 | X | X | X | X | | L3 size |
+| si.cpuCurrentSpeed(cb) | {...} | X | X | X | X | X | current CPU speed (in GHz)|
+| | avg | X | X | X | X | X | avg CPU speed (all cores) |
+| | min | X | X | X | X | X | min CPU speed (all cores) |
+| | max | X | X | X | X | X | max CPU speed (all cores) |
+| | cores | X | X | X | X | X | CPU speed per core (array) |
+| si.cpuTemperature(cb) | {...} | X | X | X* | X | | CPU temperature in C (if supported) |
+| | main | X | X | X | X | | main temperature (avg) |
+| | cores | X | X | X | X | | array of temperatures |
+| | max | X | X | X | X | | max temperature |
+| | socket | X | | | | | array socket temperatures |
+| | chipset | X | | | | | chipset temperature |
+
+#### 4. Memory
+
+| Function | Result object | Linux | BSD | Mac | Win | Sun | Comments |
+| --------------- | ------------- | ----- | ------- | --- | --- | --- | -------- |
+| si.mem(cb) | {...} | X | X | X | X | X | Memory information (in bytes)|
+| | total | X | X | X | X | X | total memory in bytes |
+| | free | X | X | X | X | X | not used in bytes |
+| | used | X | X | X | X | X | used (incl. buffers/cache) |
+| | active | X | X | X | X | X | used actively (excl. buffers/cache) |
+| | buffcache | X | X | X | | X | used by buffers+cache |
+| | buffers | X | | | | | used by buffers |
+| | cached | X | | | | | used by cache |
+| | slab | X | | | | | used by slab |
+| | available | X | X | X | X | X | potentially available (total - active) |
+| | swaptotal | X | X | X | X | X | |
+| | swapused | X | X | X | X | X | |
+| | swapfree | X | X | X | X | X | |
+| si.memLayout(cb) | [{...}] | X | X | X | X | | Memory Layout (array) |
+| | [0].size | X | X | X | X | | size in bytes |
+| | [0].bank | X | X | | X | | memory bank |
+| | [0].type | X | X | X | X | | memory type |
+| | [0].clockSpeed | X | X | X | X | | clock speed |
+| | [0].formFactor | X | X | | X | | form factor |
+| | [0].manufacturer | X | X | X | X | | manufacturer |
+| | [0].partNum | X | X | X | X | | part number |
+| | [0].serialNum | X | X | X | X | | serial number |
+| | [0].voltageConfigured | X | X | | X | | voltage conf. |
+| | [0].voltageMin | X | X | | X | | voltage min |
+| | [0].voltageMax | X | X | | X | | voltage max |
+
+#### 5. Battery
+
+| Function | Result object | Linux | BSD | Mac | Win | Sun | Comments |
+| --------------- | ------------- | ----- | ------- | --- | --- | --- | -------- |
+| si.battery(cb) | {...} | X | X | X | X | | battery information |
+| | hasBattery | X | X | X | X | | indicates presence of battery |
+| | cycleCount | X | | X | | | numbers of recharges |
+| | isCharging | X | X | X | X | | indicates if battery is charging |
+| | designedCapacity | X | | X | X | | max capacity of battery (mWh) |
+| | maxCapacity | X | | X | X | | max capacity of battery (mWh) |
+| | currentCapacity | X | | X | X | | current capacity of battery (mWh) |
+| | capacityUnit | X | | X | X | | capacity unit (mWh) |
+| | voltage | X | | X | X | | current voltage of battery (V) |
+| | percent | X | X | X | X | | charging level in percent |
+| | timeRemaining | X | | X | | | minutes left (if discharging) |
+| | acConnected | X | X | X | X | | AC connected |
+| | type | X | | X | | | battery type |
+| | model | X | | X | | | model |
+| | manufacturer | X | | X | | | manufacturer |
+| | serial | X | | X | | | battery serial |
+
+* See known issues if you have problem with macOS temperature or windows temperature
+
+#### 6. Graphics
+
+| Function | Result object | Linux | BSD | Mac | Win | Sun | Comments |
+| --------------- | ------------- | ----- | ------- | --- | --- | --- | -------- |
+| si.graphics(cb) | {...} | X | | X | X | | arrays of graphics controllers and displays |
+| | controllers[]| X | | X | X | | graphics controllers array |
+| | ...[0].vendor | X | | X | X | | e.g. ATI |
+| | ...[0].vendorId | | | X | | | vendor ID |
+| | ...[0].model | X | | X | X | | graphics controller model |
+| | ...[0].deviceId | | | X | | | device ID |
+| | ...[0].bus | X | | X | X | | on which bus (e.g. PCIe) |
+| | ...[0].vram | X | | X | X | | VRAM size (in MB) |
+| | ...[0].vramDynamic | X | | X | X | | true if dynamicly allocated ram |
+| | ...[0].external | | | X | | | is external GPU |
+| | ...[0].cores | | | X | | | Apple silicon only |
+| | ...[0].metalVersion | | | X | | | Apple Metal Version |
+| | displays[] | X | | X | X | | monitor/display array |
+| | ...[0].vendor | | | | X | | monitor/display vendor |
+| | ...[0].vendorId | | | X | | | vendor ID |
+| | ...[0].deviceName | | | | X | | e.g. \\\\.\\DISPLAY1 |
+| | ...[0].model | X | | X | X | | monitor/display model |
+| | ...[0].productionYear | | | X | | | production year |
+| | ...[0].serial | | | X | | | serial number |
+| | ...[0].displayId | | | X | | | display ID |
+| | ...[0].main | X | | X | X| | true if main monitor |
+| | ...[0].builtin | X | | X | | | true if built in monitor |
+| | ...[0].connection | X | | X | X | | e.g. DisplayPort or HDMI |
+| | ...[0].sizeX | X | | | X | | size in mm horizontal |
+| | ...[0].sizeY | X | | | X | | size in mm vertical |
+| | ...[0].pixelDepth | X | | X | X | | color depth in bits |
+| | ...[0].resolutionX | X | | X | X | | pixel horizontal |
+| | ...[0].resolutionY | X | | X | X | | pixel vertical |
+| | ...[0].currentResX | X | | X | X | | current pixel horizontal |
+| | ...[0].currentResY | X | | X | X | | current pixel vertical |
+| | ...[0].positionX | | | | X | | display position X |
+| | ...[0].positionY | | | | X | | display position Y |
+| | ...[0].currentRefreshRate | X | | X | X | | current screen refresh rate |
+
+#### 7. Operating System
+
+| Function | Result object | Linux | BSD | Mac | Win | Sun | Comments |
+| --------------- | ------------- | ----- | ------- | --- | --- | --- | -------- |
+| si.osInfo(cb) | {...} | X | X | X | X | X | OS information |
+| | platform | X | X | X | X | X | 'linux', 'darwin', 'win32', ... |
+| | distro | X | X | X | X | X | |
+| | release | X | X | X | X | X | |
+| | codename | | | X | | | |
+| | kernel | X | X | X | X | X | kernel release - same as os.release() |
+| | arch | X | X | X | X | X | same as os.arch() |
+| | hostname | X | X | X | X | X | same as os.hostname() |
+| | fqdn | X | X | X | X | X | FQDN fully qualified domain name |
+| | codepage | X | X | X | X | | OS build version |
+| | logofile | X | X | X | X | X | e.g. 'apple', 'debian', 'fedora', ... |
+| | serial | X | X | X | X | | OS/Host serial number |
+| | build | X | | X | X | | OS build version |
+| | servicepack | | | | X | | service pack version |
+| | uefi | X | X | X | X | | OS started via UEFI |
+| | hypervisor | | | | X | | hyper-v enabled? (win only) |
+| | remoteSession | | | | X | | runs in remote session (win only) |
+| si.uuid(cb) | {...} | X | X | X | X | X | object of several UUIDs |
+| | os | X | X | X | X | | os specific UUID |
+| | hardware | X | X | X | X | | hardware specific UUID |
+| | macs | X | X | X | X | | MAC addresses |
+| si.versions(apps, cb) | {...} | X | X | X | X | X | version information (kernel, ssl, node, ...)<br />apps param is optional for detecting<br />only specific apps/libs<br />(string, comma separated) |
+| si.shell(cb) | : string | X | X | X | X | | standard shell |
+| si.users(cb) | [{...}] | X | X | X | X | X | array of users online |
+| | [0].user | X | X | X | X | X | user name |
+| | [0].tty | X | X | X | X | X | terminal |
+| | [0].date | X | X | X | X | X | login date |
+| | [0].time | X | X | X | X | X | login time |
+| | [0].ip | X | X | X | | X | ip address (remote login) |
+| | [0].command | X | X | X | | X | last command or shell |
+
+#### 8. Current Load, Processes & Services
+
+| Function | Result object | Linux | BSD | Mac | Win | Sun | Comments |
+| --------------- | ------------- | ----- | ------- | --- | --- | --- | -------- |
+| si.currentLoad(cb) | {...} | X | | X | X | X | CPU-Load |
+| | avgLoad | X | | X | | X | average load |
+| | currentLoad | X | | X | X | X | CPU load in % |
+| | currentLoadUser | X | | X | X | X | CPU load user in % |
+| | currentLoadSystem | X | | X | X | X | CPU load system in % |
+| | currentLoadNice | X | | X | X | X | CPU load nice in % |
+| | currentLoadIdle | X | | X | X | X | CPU load idle in % |
+| | currentLoadIrq | X | | X | X | X | CPU load system in % |
+| | rawCurrentLoad... | X | | X | X | X | CPU load raw values (ticks) |
+| | cpus[] | X | | X | X | X | current loads per CPU in % + raw ticks |
+| si.fullLoad(cb) | : integer | X | | X | X | | CPU full load since bootup in % |
+| si.processes(cb) | {...} | X | X | X | X | X | # running processes |
+| | all | X | X | X | X | X | # of all processes |
+| | running | X | X | X | | X | # of all processes running |
+| | blocked | X | X | X | | X | # of all processes blocked |
+| | sleeping | X | X | X | | X | # of all processes sleeping |
+| | unknown | | | | X | | # of all processes unknown status |
+| | list[] | X | X | X | X | X | list of all processes incl. details |
+| | ...[0].pid | X | X | X | X | X | process PID |
+| | ...[0].parentPid | X | X | X | X | X | parent process PID |
+| | ...[0].name | X | X | X | X | X | process name |
+| | ...[0].cpu | X | X | X | X | X | process % CPU usage |
+| | ...[0].cpuu | X | X | | X | | process % CPU usage (user) |
+| | ...[0].cpus | X | X | | X | | process % CPU usage (system) |
+| | ...[0].mem | X | X | X | X | X | process memory % |
+| | ...[0].priority | X | X | X | X | X | process priotity |
+| | ...[0].memVsz | X | X | X | X | X | process virtual memory size |
+| | ...[0].memRss | X | X | X | X | X | process mem resident set size |
+| | ...[0].nice | X | X | X | | X | process nice value |
+| | ...[0].started | X | X | X | X | X | process start time |
+| | ...[0].state | X | X | X | X | X | process state (e.g. sleeping) |
+| | ...[0].tty | X | X | X | | X | tty from which process was started |
+| | ...[0].user | X | X | X | | X | user who started process |
+| | ...[0].command | X | X | X | X | X | process starting command |
+| | ...[0].params | X | X | X | | X | process params |
+| | ...[0].path | X | X | X | X | X | process path |
+| | proc | X | X | X | X | | process name |
+| | pid | X | X | X | X | | PID |
+| | pids | X | X | X | X | | additional pids |
+| | cpu | X | X | X | X | | process % CPU |
+| | mem | X | X | X | X | | process % MEM |
+| si.services('mysql, apache2', cb) | [{...}] | X | X | X | X | | pass comma separated string of services<br>pass "*" for ALL services (linux/win only) |
+| | [0].name | X | X | X | X | | name of service |
+| | [0].running | X | X | X | X | | true / false |
+| | [0].startmode | | | | X | | manual, automatic, ... |
+| | [0].pids | X | X | X | X | | pids |
+| | [0].cpu | X | X | X | | | process % CPU |
+| | [0].mem | X | X | X | | | process % MEM |
+| si.processLoad('mysql, apache2', cb) | [{...}] | X | X | X | X | | pass comma separated string of processes<br>pass "*" for ALL processes (linux/win only) |
+| | [0].proc | X | X | X | X | | name of process |
+| | [0].pids | X | X | X | X | | pids |
+| | [0].cpu | X | X | X | | | process % CPU |
+| | [0].mem | X | X | X | | | process % MEM |
+
+#### 9. File System
+
+| Function | Result object | Linux | BSD | Mac | Win | Sun | Comments |
+| --------------- | ------------- | ----- | ------- | --- | --- | --- | -------- |
+| si.diskLayout(cb) | [{...}] | X | | X | X | | physical disk layout (array) |
+| | [0].device | X | | X | | | e.g. /dev/sda |
+| | [0].type | X | | X | X | | HD, SSD, NVMe |
+| | [0].name | X | | X | X | | disk name |
+| | [0].vendor | X | | | X | | vendor/producer |
+| | [0].size | X | | X | X | | size in bytes |
+| | [0].bytesPerSector | | | | X | | bytes per sector |
+| | [0].totalCylinders | | | | X | | total cylinders |
+| | [0].totalHeads | | | | X | | total heads |
+| | [0].totalSectors | | | | X | | total sectors |
+| | [0].totalTracks | | | | X | | total tracks |
+| | [0].tracksPerCylinder | | | | X | | tracks per cylinder |
+| | [0].sectorsPerTrack | | | | X | | sectors per track |
+| | [0].firmwareRevision | X | | X | X | | firmware revision |
+| | [0].serialNum | X | | X | X | | serial number |
+| | [0].interfaceType | X | | | X | | SATA, PCIe, ... |
+| | [0].smartStatus | X | | X | X | | S.M.A.R.T Status (see Known Issues) |
+| | [0].temperature | X | | | | | S.M.A.R.T temperature |
+| | [0].smartData | X | | | X | | full S.M.A.R.T data from smartctl<br>requires at least smartmontools 7.0 |
+| si.blockDevices(cb) | [{...}] | X | | X | X | | returns array of disks, partitions,<br>raids and roms |
+| | [0].name | X | | X | X | | name |
+| | [0].type | X | | X | X | | type |
+| | [0].fstype | X | | X | X | | file system type (e.g. ext4) |
+| | [0].mount | X | | X | X | | mount point |
+| | [0].size | X | | X | X | | size in bytes |
+| | [0].physical | X | | X | X | | physical type (HDD, SSD, CD/DVD) |
+| | [0].uuid | X | | X | X | | UUID |
+| | [0].label | X | | X | X | | label |
+| | [0].model | X | | X | | | model |
+| | [0].serial | X | | | X | | serial |
+| | [0].removable | X | | X | X | | serial |
+| | [0].protocol | X | | X | | | protocol (SATA, PCI-Express, ...) |
+| si.disksIO(cb) | {...} | X | | X | | | current transfer stats |
+| | rIO | X | | X | | | read IOs on all mounted drives |
+| | wIO | X | | X | | | write IOs on all mounted drives |
+| | tIO | X | | X | | | write IOs on all mounted drives |
+| | rIO_sec | X | | X | | | read IO per sec (* see notes) |
+| | wIO_sec | X | | X | | | write IO per sec (* see notes) |
+| | tIO_sec | X | | X | | | total IO per sec (* see notes) |
+| | rWaitTime | X | | | | | read IO request time (* see notes) |
+| | wWaitTime | X | | | | | write IO request time (* see notes) |
+| | tWaitTime | X | | | | | total IO request time (* see notes) |
+| | rWaitPercent | X | | | | | read IO request time percent (* see notes) |
+| | wWaitPercent | X | | | | | write IO request time percent (* see notes) |
+| | tWaitPercent | X | | | | | total IO request time percent (* see notes) |
+| | ms | X | | X | | | interval length (for per second values) |
+| si.fsSize(cb) | [{...}] | X | X | X | X | | returns array of mounted file systems |
+| | [0].fs | X | X | X | X | | name of file system |
+| | [0].type | X | X | X | X | | type of file system |
+| | [0].size | X | X | X | X | | sizes in bytes |
+| | [0].used | X | X | X | X | | used in bytes |
+| | [0].available | X | X | X | X | | used in bytes |
+| | [0].use | X | X | X | X | | used in % |
+| | [0].mount | X | X | X | X | | mount point |
+| si.fsOpenFiles(cb) | {...} | X | X | X | | | count max/allocated file descriptors |
+| | max | X | X | X | | | max file descriptors |
+| | allocated | X | X | X | | | current open files count |
+| | available | X | X | X | | | count available |
+| si.fsStats(cb) | {...} | X | | X | | | current transfer stats |
+| | rx | X | | X | | | bytes read since startup |
+| | wx | X | | X | | | bytes written since startup |
+| | tx | X | | X | | | total bytes read + written since startup |
+| | rx_sec | X | | X | | | bytes read / second (* see notes) |
+| | wx_sec | X | | X | | | bytes written / second (* see notes) |
+| | tx_sec | X | | X | | | total bytes reads + written / second |
+| | ms | X | | X | | | interval length (for per second values) |
+
+#### 10. USB
+
+| Function | Result object | Linux | BSD | Mac | Win | Sun | Comments |
+| --------------- | ------------- | ----- | ------- | --- | --- | --- | -------- |
+| si.usb(cb) | [{...}] | X | X | X | X | | get detected USB devices |
+| | [0].bus | X | | | | | USB bus |
+| | [0].deviceId | X | | | | | bus device id |
+| | [0].id | X | | X | X | | internal id |
+| | [0].name | X | | X | X | | name |
+| | [0].type | X | | X | X | | name |
+| | [0].removable | | | X | | | is removable |
+| | [0].vendor | X | | X | | | vendor |
+| | [0].manufacturer | X | | X | X | | manifacturer |
+| | [0].maxPower | X | | | | | max power |
+| | [0].default | X | | X | X | | is default printer |
+| | [0].serialNumber | | | X | | | serial number |
+
+#### 11. Printer
+
+| Function | Result object | Linux | BSD | Mac | Win | Sun | Comments |
+| --------------- | ------------- | ----- | ------- | --- | --- | --- | -------- |
+| si.printer(cb) | [{...}] | X | X | X | X | | get printer information |
+| | [0].id | X | | X | X | | internal id |
+| | [0].name | X | | X | X | | name |
+| | [0].model | X | | X | X | | model |
+| | [0].uri | X | | X | | | printer URI |
+| | [0].uuid | X | | | | | printer UUID |
+| | [0].status | X | | X | X | | printer status (e.g. idle) |
+| | [0].local | X | | X | X | | is local printer |
+| | [0].default | | | X | X | | is default printer |
+| | [0].shared | X | | X | X | | is shared printer |
+
+#### 12. Audio
+
+| Function | Result object | Linux | BSD | Mac | Win | Sun | Comments |
+| --------------- | ------------- | ----- | ------- | --- | --- | --- | -------- |
+| si.audio(cb) | [{...}] | X | X | X | X | | get printer information |
+| | [0].id | X | | X | X | | internal id |
+| | [0].name | X | | X | X | | name |
+| | [0].manufacturer | X | | X | X | | manufacturer |
+| | [0].revision | X | | | | | revision |
+| | [0].driver | X | | | | | driver |
+| | [0].default | | | X | X | | is default |
+| | [0].channel | X | | X | | | channel e.g. USB, HDMI, ... |
+| | [0].type | X | | X | X | | type e.g. Speaker |
+| | [0].in | | | X | X | | is input channel |
+| | [0].out | | | X | X | | is output channel |
+| | [0].interfaceType | X | | X | X | | interface type (PCIe, USB, HDMI, ...) |
+| | [0].status | X | | X | X | | printer status (e.g. idle) |
+
+#### 13. Network related functions
+
+| Function | Result object | Linux | BSD | Mac | Win | Sun | Comments |
+| --------------- | ------------- | ----- | ------- | --- | --- | --- | -------- |
+| si.networkInterfaces(cb) | [{...}] | X | X | X | X | X | array of network interfaces<br>With the 'default' parameter it returns<br>only the default interface |
+| | [0].iface | X | X | X | X | X | interface |
+| | [0].ifaceName | X | X | X | X | X | interface name (differs on Windows) |
+| | [0].default | X | X | X | X | X | true if this is the default interface |
+| | [0].ip4 | X | X | X | X | X | ip4 address |
+| | [0].ip4subnet | X | X | X | X | X | ip4 subnet mask |
+| | [0].ip6 | X | X | X | X | X | ip6 address |
+| | [0].ip6subnet | X | X | X | X | X | ip6 subnet mask |
+| | [0].mac | X | X | X | X | X | MAC address |
+| | [0].internal | X | X | X | X | X | true if internal interface |
+| | [0].virtual | X | X | X | X | X | true if virtual interface |
+| | [0].operstate | X | | X | X | | up / down |
+| | [0].type | X | | X | X | | wireless / wired |
+| | [0].duplex | X | | X | | | duplex |
+| | [0].mtu | X | | X | | | maximum transmission unit |
+| | [0].speed | X | | X | X | | speed in MBit / s |
+| | [0].dhcp | X | | X | X | | IP address obtained by DHCP |
+| | [0].dnsSuffix | X | | | X | | DNS suffix |
+| | [0].ieee8021xAuth | X | | | X | | IEEE 802.1x auth |
+| | [0].ieee8021xState | X | | | X | | IEEE 802.1x state |
+| | [0].carrierChanges | X | | | | | # changes up/down |
+| si.networkInterfaceDefault(cb) | : string | X | X | X | X | X | get name of default network interface |
+| si.networkGatewayDefault(cb) | : string | X | X | X | X | X | get default network gateway |
+| si.networkStats(ifaces,cb) | [{...}] | X | X | X | X | | current network stats of given interfaces<br>iface list: space or comma separated<br>iface parameter is optional<br>defaults to first external network interface,<br />Pass '*' for all interfaces |
+| | [0].iface | X | X | X | X | | interface |
+| | [0].operstate | X | X | X | X | | up / down |
+| | [0].rx_bytes | X | X | X | X | | received bytes overall |
+| | [0].rx_dropped | X | X | X | X | | received dropped overall |
+| | [0].rx_errors | X | X | X | X | | received errors overall |
+| | [0].tx_bytes | X | X | X | X | | transferred bytes overall |
+| | [0].tx_dropped | X | X | X | X | | transferred dropped overall |
+| | [0].tx_errors | X | X | X | X | | transferred errors overall |
+| | [0].rx_sec | X | X | X | X | | received bytes / second (* see notes) |
+| | [0].tx_sec | X | X | X | X | | transferred bytes per second (* see notes) |
+| | [0].ms | X | X | X | X | | interval length (for per second values) |
+| si.networkConnections(cb) | [{...}] | X | X | X | X | | current network network connections<br>returns an array of all connections|
+| | [0].protocol | X | X | X | X | | tcp or udp |
+| | [0].localAddress | X | X | X | X | | local address |
+| | [0].localPort | X | X | X | X | | local port |
+| | [0].peerAddress | X | X | X | X | | peer address |
+| | [0].peerPort | X | X | X | X | | peer port |
+| | [0].state | X | X | X | X | | like ESTABLISHED, TIME_WAIT, ... |
+| | [0].pid | X | X | X | X | | process ID |
+| | [0].process | X | X | | | | process name |
+| si.inetChecksite(url, cb) | {...} | X | X | X | X | X | response-time (ms) to fetch given URL |
+| | url | X | X | X | X | X | given url |
+| | ok | X | X | X | X | X | status code OK (2xx, 3xx) |
+| | status | X | X | X | X | X | status code |
+| | ms | X | X | X | X | X | response time in ms |
+| si.inetLatency(host, cb) | : number | X | X | X | X | X | response-time (ms) to external resource<br>host parameter is optional (default 8.8.8.8)|
+
+#### 14. Wifi
+
+| Function | Result object | Linux | BSD | Mac | Win | Sun | Comments |
+| --------------- | ------------- | ----- | ------- | --- | --- | --- | -------- |
+| si.wifiNetworks(cb) | [{...}] | X | | X | X | | array of available wifi networks |
+| | [0].ssid | X | | X | X | | Wifi network SSID |
+| | [0].bssid | X | | X | X | | BSSID (mac) |
+| | [0].mode | X | | | | | mode |
+| | [0].channel | X | | X | X | | channel |
+| | [0].frequency | X | | X | X | | frequengy in MHz |
+| | [0].signalLevel | X | | X | X | | signal level in dB |
+| | [0].quality | X | | X | X | | quaility in % |
+| | [0].security | X | | X | X | | array e.g. WPA, WPA-2 |
+| | [0].wpaFlags | X | | X | X | | array of WPA flags |
+| | [0].rsnFlags | X | | | | | array of RDN flags |
+| si.wifiInterfaces(cb) | [{...}] | X | | X | X | | array of detected wifi interfaces |
+| | [0].id | X | | X | X | | ID |
+| | [0].iface | X | | X | X | | interface |
+| | [0].model | X | | X | X | | model |
+| | [0].vendor | X | | X | X | | vendor |
+| | [0].mac | X | | X | X | | MAC address |
+| si.wifiConnections(cb) | [{...}] | X | | X | X | | array of active wifi connections |
+| | [0].id | X | | X | X | | ID |
+| | [0].iface | X | | X | X | | interface |
+| | [0].name | X | | X | X | | name |
+| | [0].mode | X | | X | X | | model |
+| | [0].bssid | X | | X | X | | BSSID (mac) |
+| | [0].mode | X | | | | | mode |
+| | [0].channel | X | | X | X | | channel |
+| | [0].frequency | X | | X | X | | frequengy in MHz |
+| | [0].signalLevel | X | | X | X | | signal level in dB |
+| | [0].quality | X | | X | X | | quaility in % |
+| | [0].security | X | | X | X | | array e.g. WPA, WPA-2 |
+| | [0].txRate | X | | X | X | | transfer rate MBit/s |
+
+#### 15. Bluetooth
+
+| Function | Result object | Linux | BSD | Mac | Win | Sun | Comments |
+| --------------- | ------------- | ----- | ------- | --- | --- | --- | -------- |
+| si.bluetoothDevices(cb) | [{...}] | X | | X | X | | ... |
+| | [0].device | | | X | | | device name |
+| | [0].name | X | | X | X | | name |
+| | [0].macDevice | X | | X | | | MAC address device |
+| | [0].macHost | X | | X | | | MAC address host |
+| | [0].batteryPercent | | | X | | | battery level percent |
+| | [0].manufacturer | | | X | X | | manufacturer |
+| | [0].type | X | | X | X | | typoe of bluetooth device |
+| | [0].connected | X | | X | | | is connected |
+
+#### 16. Docker
+
+| Function | Result object | Linux | BSD | Mac | Win | Sun | Comments |
+| --------------- | ------------- | ----- | ------- | --- | --- | --- | -------- |
+| si.dockerInfo(cb) | {...} | X | X | X | X | X | returns general docker info |
+| | id | X | X | X | X | X | Docker ID |
+| | containers | X | X | X | X | X | number of containers |
+| | containersRunning | X | X | X | X | X | number of running containers |
+| | containersPaused | X | X | X | X | X | number of paused containers |
+| | containersStopped | X | X | X | X | X | number of stopped containers |
+| | images | X | X | X | X | X | number of images |
+| | driver | X | X | X | X | X | driver (e.g. 'devicemapper', 'overlay2') |
+| | memoryLimit | X | X | X | X | X | has memory limit |
+| | swapLimit | X | X | X | X | X | has swap limit |
+| | kernelMemory | X | X | X | X | X | has kernal memory |
+| | cpuCfsPeriod | X | X | X | X | X | has CpuCfsPeriod |
+| | cpuCfsQuota | X | X | X | X | X | has CpuCfsQuota |
+| | cpuShares | X | X | X | X | X | has CPUShares |
+| | cpuSet | X | X | X | X | X | has CPUShares |
+| | ipv4Forwarding | X | X | X | X | X | has IPv4Forwarding |
+| | bridgeNfIptables | X | X | X | X | X | has BridgeNfIptables |
+| | bridgeNfIp6tables | X | X | X | X | X | has BridgeNfIp6tables |
+| | debug | X | X | X | X | X | Debug on |
+| | nfd | X | X | X | X | X | named data networking forwarding daemon |
+| | oomKillDisable | X | X | X | X | X | out-of-memory kill disabled |
+| | ngoroutines | X | X | X | X | X | number NGoroutines |
+| | systemTime | X | X | X | X | X | docker SystemTime |
+| | loggingDriver | X | X | X | X | X | logging driver e.g. 'json-file' |
+| | cgroupDriver | X | X | X | X | X | cgroup driver e.g. 'cgroupfs' |
+| | nEventsListener | X | X | X | X | X | number NEventsListeners |
+| | kernelVersion | X | X | X | X | X | docker kernel version |
+| | operatingSystem | X | X | X | X | X | docker OS e.g. 'Docker for Mac' |
+| | osType | X | X | X | X | X | OSType e.g. 'linux' |
+| | architecture | X | X | X | X | X | architecture e.g. x86_64 |
+| | ncpu | X | X | X | X | X | number of CPUs |
+| | memTotal | X | X | X | X | X | memory total |
+| | dockerRootDir | X | X | X | X | X | docker root directory |
+| | httpProxy | X | X | X | X | X | http proxy |
+| | httpsProxy | X | X | X | X | X | https proxy |
+| | noProxy | X | X | X | X | X | NoProxy |
+| | name | X | X | X | X | X | Name |
+| | labels | X | X | X | X | X | array of labels |
+| | experimentalBuild | X | X | X | X | X | is experimental build |
+| | serverVersion | X | X | X | X | X | server version |
+| | clusterStore | X | X | X | X | X | cluster store |
+| | clusterAdvertise | X | X | X | X | X | cluster advertise |
+| | defaultRuntime | X | X | X | X | X | default runtime e.g. 'runc' |
+| | liveRestoreEnabled | X | X | X | X | X | live store enabled |
+| | isolation | X | X | X | X | X | isolation |
+| | initBinary | X | X | X | X | X | init binary |
+| | productLicense | X | X | X | X | X | product license |
+| si.dockerImages(all, cb) | [{...}] | X | X | X | X | X | returns array of top level/all docker images |
+| | [0].id | X | X | X | X | X | image ID |
+| | [0].container | X | X | X | X | X | container ID |
+| | [0].comment | X | X | X | X | X | comment |
+| | [0].os | X | X | X | X | X | OS |
+| | [0].architecture | X | X | X | X | X | architecture |
+| | [0].parent | X | X | X | X | X | parent ID |
+| | [0].dockerVersion | X | X | X | X | X | docker version |
+| | [0].size | X | X | X | X | X | image size |
+| | [0].sharedSize | X | X | X | X | X | shared size |
+| | [0].virtualSize | X | X | X | X | X | virtual size |
+| | [0].author | X | X | X | X | X | author |
+| | [0].created | X | X | X | X | X | created date / time |
+| | [0].containerConfig | X | X | X | X | X | container config object |
+| | [0].graphDriver | X | X | X | X | X | graph driver object |
+| | [0].repoDigests | X | X | X | X | X | repo digests array |
+| | [0].repoTags | X | X | X | X | X | repo tags array |
+| | [0].config | X | X | X | X | X | config object |
+| | [0].rootFS | X | X | X | X | X | root fs object |
+| si.dockerContainers(all, cb) | [{...}] | X | X | X | X | X | returns array of active/all docker containers |
+| | [0].id | X | X | X | X | X | ID of container |
+| | [0].name | X | X | X | X | X | name of container |
+| | [0].image | X | X | X | X | X | name of image |
+| | [0].imageID | X | X | X | X | X | ID of image |
+| | [0].command | X | X | X | X | X | command |
+| | [0].created | X | X | X | X | X | creation time (unix) |
+| | [0].started | X | X | X | X | X | creation time (unix) |
+| | [0].finished | X | X | X | X | X | creation time (unix) |
+| | [0].createdAt | X | X | X | X | X | creation date time string |
+| | [0].startedAt | X | X | X | X | X | creation date time string |
+| | [0].finishedAt | X | X | X | X | X | creation date time string |
+| | [0].state | X | X | X | X | X | created, running, exited |
+| | [0].ports | X | X | X | X | X | array of ports |
+| | [0].mounts | X | X | X | X | X | array of mounts |
+| si.dockerContainerStats(ids, cb) | [{...}] | X | X | X | X | X | statistics for specific containers<br>container IDs: space or comma separated,<br>pass '*' for all containers|
+| | [0].id | X | X | X | X | X | Container ID |
+| | [0].memUsage | X | X | X | X | X | memory usage in bytes |
+| | [0].memLimit | X | X | X | X | X | memory limit (max mem) in bytes |
+| | [0].memPercent | X | X | X | X | X | memory usage in percent |
+| | [0].cpuPercent | X | X | X | X | X | cpu usage in percent |
+| | [0].pids | X | X | X | X | X | number of processes |
+| | [0].netIO.rx | X | X | X | X | X | received bytes via network |
+| | [0].netIO.wx | X | X | X | X | X | sent bytes via network |
+| | [0].blockIO.r | X | X | X | X | X | bytes read from BlockIO |
+| | [0].blockIO.w | X | X | X | X | X | bytes written to BlockIO |
+| | [0].cpuStats | X | X | X | X | X | detailed cpu stats |
+| | [0].percpuStats | X | X | X | X | X | detailed per cpu stats |
+| | [0].memoryStats | X | X | X | X | X | detailed memory stats |
+| | [0].networks | X | X | X | X | X | detailed network stats per interface |
+| si.dockerContainerProcesses(id, cb) | [{...}] | X | X | X | X | X | array of processes inside a container |
+| | [0].pidHost | X | X | X | X | X | process ID (host) |
+| | [0].ppid | X | X | X | X | X | parent process ID |
+| | [0].pgid | X | X | X | X | X | process group ID |
+| | [0].user | X | X | X | X | X | effective user name |
+| | [0].ruser | X | X | X | X | X | real user name |
+| | [0].group | X | X | X | X | X | effective group name |
+| | [0].rgroup | X | X | X | X | X | real group name |
+| | [0].stat | X | X | X | X | X | process state |
+| | [0].time | X | X | X | X | X | accumulated CPU time |
+| | [0].elapsed | X | X | X | X | X | elapsed running time |
+| | [0].nice | X | X | X | X | X | nice value |
+| | [0].rss | X | X | X | X | X | resident set size |
+| | [0].vsz | X | X | X | X | X | virtual size in Kbytes |
+| | [0].command | X | X | X | X | X | command and arguments |
+| si.dockerVolumes(cb) | [{...}] | returns array of all docker volumes |
+| | [0].name | X | X | X | X | X | volume name |
+| | [0].driver | X | X | X | X | X | driver |
+| | [0].labels | X | X | X | X | X | labels object |
+| | [0].mountpoint | X | X | X | X | X | mountpoint |
+| | [0].options | X | X | X | X | X | options |
+| | [0].scope | X | X | X | X | X | scope |
+| | [0].created | X | X | X | X | X | created at |
+| si.dockerAll(cb) | {...} | X | X | X | X | X | list of all containers including their stats<br>and processes in one single array |
+
+#### 17. Virtual Box
+
+| Function | Result object | Linux | BSD | Mac | Win | Sun | Comments |
+| --------------- | ------------- | ----- | ------- | --- | --- | --- | -------- |
+| si.vboxInfo(cb) | [{...}] | X | X | X | X | X | returns array general virtual box info |
+| | [0].id | X | X | X | X | X | virtual box ID |
+| | [0].name | X | X | X | X | X | name |
+| | [0].running | X | X | X | X | X | vbox is running |
+| | [0].started | X | X | X | X | X | started date time |
+| | [0].runningSince | X | X | X | X | X | running since (secs) |
+| | [0].stopped | X | X | X | X | X | stopped date time |
+| | [0].stoppedSince | X | X | X | X | X | stopped since (secs) |
+| | [0].guestOS | X | X | X | X | X | Guest OS |
+| | [0].hardwareUUID | X | X | X | X | X | Hardware UUID |
+| | [0].memory | X | X | X | X | X | Memory in MB |
+| | [0].vram | X | X | X | X | X | VRAM in MB |
+| | [0].cpus | X | X | X | X | X | CPUs |
+| | [0].cpuExepCap | X | X | X | X | X | CPU exec cap |
+| | [0].cpuProfile | X | X | X | X | X | CPU profile |
+| | [0].chipset | X | X | X | X | X | chipset |
+| | [0].firmware | X | X | X | X | X | firmware |
+| | [0].pageFusion | X | X | X | X | X | page fusion |
+| | [0].configFile | X | X | X | X | X | config file |
+| | [0].snapshotFolder | X | X | X | X | X | snapshot folder |
+| | [0].logFolder | X | X | X | X | X | log folder path |
+| | [0].hpet | X | X | X | X | X | HPET |
+| | [0].pae | X | X | X | X | X | PAE |
+| | [0].longMode | X | X | X | X | X | long mode |
+| | [0].tripleFaultReset | X | X | X | X | X | triple fault reset |
+| | [0].apic | X | X | X | X | X | APIC |
+| | [0].x2Apic | X | X | X | X | X | X2APIC |
+| | [0].acpi | X | X | X | X | X | ACPI |
+| | [0].ioApic | X | X | X | X | X | IOAPIC |
+| | [0].biosApicMode | X | X | X | X | X | BIOS APIC mode |
+| | [0].bootMenuMode | X | X | X | X | X | boot menu Mode |
+| | [0].bootDevice1 | X | X | X | X | X | bootDevice1 |
+| | [0].bootDevice2 | X | X | X | X | X | bootDevice2 |
+| | [0].bootDevice3 | X | X | X | X | X | bootDevice3 |
+| | [0].bootDevice4 | X | X | X | X | X | bootDevice4 |
+| | [0].timeOffset | X | X | X | X | X | time Offset |
+| | [0].rtc | X | X | X | X | X | RTC |
+
+#### 16. "Get All / Observe" - functions
+
+| Function | Result object | Linux | BSD | Mac | Win | Sun | Comments |
+| --------------- | ------------- | ----- | ------- | --- | --- | --- | -------- |
+| si.getStaticData(cb) | {...} | X | X | X | X | X | all static data at once |
+| si.getDynamicData(srv,iface,cb) | {...} | X | X | X | X | X | all dynamic data at once<br>Specify services and interfaces to monitor<br>Defaults to first external network interface<br>Pass "*" for ALL services (linux/win only)<br>Pass "*" for ALL network interfaces |
+| si.getAllData(srv,iface,cb) | {...} | X | X | X | X | X | all data at once<br>Specify services and interfaces to monitor<br>Defaults to first external network interface<br>Pass "*" for ALL services (linux/win only)<br>Pass "*" for ALL network interfaces |
+| si.get(valueObject,cb) | {...} | X | X | X | X | X | get partial system info data at once<br>In valueObject you can define<br>all values, you want to get back <br>(see documentation for details) |
+| si.observe(valueObject,interval,cb) | - | X | X | X | X | X | Observe a defined value object<br>call callback on changes<br>polling interval in milliseconds |
+
+### cb: Asynchronous Function Calls (callback)
+
+Remember: all functions (except `version` and `time`) are implemented as asynchronous functions! There are now three ways to consume them:
+
+**Callback Style**
+
+```js
+const si = require('systeminformation');
+
+si.cpu(function(data) {
+ console.log('CPU Information:');
+ console.log('- manufucturer: ' + data.manufacturer);
+ console.log('- brand: ' + data.brand);
+ console.log('- speed: ' + data.speed);
+ console.log('- cores: ' + data.cores);
+ console.log('- physical cores: ' + data.physicalCores);
+ console.log('...');
+})
+```
+
+### Promises
+
+**Promises Style** is new in version 3.0.
+
+When omitting callback parameter (cb), then you can use all function in a promise oriented way. All functions (except of `version` and `time`) are returning a promise, that you can consume:
+
+```js
+const si = require('systeminformation');
+
+si.cpu()
+ .then(data => {
+ console.log('CPU Information:');
+ console.log('- manufucturer: ' + data.manufacturer);
+ console.log('- brand: ' + data.brand);
+ console.log('- speed: ' + data.speed);
+ console.log('- cores: ' + data.cores);
+ console.log('- physical cores: ' + data.physicalCores);
+ console.log('...');
+ })
+ .catch(error => console.error(error));
+```
+
+### Async / Await
+
+**Using async / await** (available since node v7.6)
+
+Since node v7.6 you can also use the `async` / `await` pattern. The above example would then look like this:
+
+```js
+const si = require('systeminformation');
+
+async function cpuData() {
+ try {
+ const data = await si.cpu();
+ console.log('CPU Information:');
+ console.log('- manufucturer: ' + data.manufacturer);
+ console.log('- brand: ' + data.brand);
+ console.log('- speed: ' + data.speed);
+ console.log('- cores: ' + data.cores);
+ console.log('- physical cores: ' + data.physicalCores);
+ console.log('...');
+ } catch (e) {
+ console.log(e)
+ }
+}
+```
+
+## Known Issues
+
+#### macOS - Temperature Sensor
+
+To be able to measure temperature on macOS I created a little additional package. Due to some difficulties
+in NPM with `optionalDependencies` I unfortunately was getting unexpected warnings on other platforms.
+So I decided to drop this optional dependency for macOS - so by default, you will not get correct values.
+
+This additional package is now also supporting Apple Silicon M1 machines.
+
+But if you need to detect macOS temperature just run the following additional
+installation command:
+
+```bash
+$ npm install osx-temperature-sensor --save
+```
+
+`systeminformation` will then detect this additional library and return the temperature when calling systeminformations standard function `cpuTemperature()`
+
+#### Windows Temperature, Battery, ...
+
+`get-WmiObject` - which is used to determine temperature and battery sometimes needs to be run with admin
+privileges. So if you do not get any values, try to run it again with according
+privileges. If you still do not get any values, your system might not support this feature.
+In some cases we also discovered that `get-WmiObject` returned incorrect temperature values.
+
+#### Linux Temperature
+
+In some cases you need to install the Linux `sensors` package to be able to measure temperature
+e.g. on DEBIAN based systems by running `sudo apt-get install lm-sensors`
+
+#### Linux S.M.A.R.T. Status
+
+To be able to detect S.M.A.R.T. status on Linux you need to install `smartmontools`. On DEBIAN based Linux distributions you can install it by running `sudo apt-get install smartmontools`
+
+#### Windows Encoding Issues
+I now reimplemented all windows functions to avoid encoding problems (special chacarters). And as Windows 11 now droppend `wmic` support, I had to move completely to `powershell`. Be sure that powershell version 5+ is installed on your machine. On older Windows versions (7, 8) you might still see encoding problems due to the old powershell version.
+## *: Additional Notes
+
+In `fsStats()`, `disksIO()` and `networkStats()` the results / sec. values (rx_sec, IOPS, ...) are calculated correctly beginning
+with the second call of the function. It is determined by calculating the difference of transferred bytes / IOs
+divided by the time between two calls of the function.
+
+The first time you are calling one of these functions, you will get `null` for transfer rates. The second time, you should then get statistics based on the time between the two calls ...
+
+So basically, if you e.g. need a value for network stats every second, your code should look like this:
+
+```js
+const si = require('systeminformation');
+
+setInterval(function() {
+ si.networkStats().then(data => {
+ console.log(data);
+ })
+}, 1000)
+```
+
+Beginning with the second call, you get network transfer values per second.
+
+## Finding new issues
+
+I am happy to discuss any comments and suggestions. Please feel free to contact me if you see any possibility of improvement!
+
+
+## Comments
+
+If you have ideas or comments, please do not hesitate to contact me.
+
+
+Happy monitoring!
+
+Sincerely,
+
+Sebastian Hildebrandt, [+innovations](http://www.plus-innovations.com)
+
+## Credits
+
+Written by Sebastian Hildebrandt [sebhildebrandt](https://github.com/sebhildebrandt)
+
+#### Contributors
+
+- Guillaume Legrain [glegrain](https://github.com/glegrain)
+- Riccardo Novaglia [richy24](https://github.com/richy24)
+- Quentin Busuttil [Buzut](https://github.com/Buzut)
+- lapsio [lapsio](https://github.com/lapsio)
+- csy [csy](https://github.com/csy1983)
+- Tiago Roldão [tiagoroldao](https://github.com/tiagoroldao)
+- dragonjet [dragonjet](https://github.com/dragonjet)
+- Adam Reis [adamreisnz](https://github.com/adamreisnz)
+- Jimi M [ItsJimi](https://github.com/ItsJimi)
+- Git² [GitSquared](https://github.com/GitSquared)
+- weiyin [weiyin](https://github.com/weiyin)
+- Jorai Rijsdijk [Erackron](https://github.com/Erackron)
+- Rasmus Porsager [porsager](https://github.com/porsager)
+- Nathan Patten [nrpatten](https://github.com/nrpatten)
+- Juan Campuzano [juancampuzano](https://github.com/juancampuzano)
+- Ricardo Polo [ricardopolo](https://github.com/ricardopolo)
+- Miłosz Dźwigała [mily20001](https://github.com/mily20001)
+- cconley717 [cconley717](https://github.com/cconley717)
+- Maria Camila Cubides [MariaCamilaCubides](https://github.com/MariaCamilaCubides)
+- Aleksander Krasnicki [plakak](https://github.com/plakak)
+- Alexis Tyler [OmgImAlexis](https://github.com/OmgImAlexis)
+- Simon Smith [si458](https://github.com/si458)
+
+OSX Temperature: credits here are going to:
+
+- Frank Stock [pcafstockf](https://github.com/pcafstockf) - for his work on [smc-code][smc-code-url]
+
+## Copyright Information
+
+Linux is a registered trademark of Linus Torvalds. Apple, macOS, OS X are registered trademarks of Apple Inc.,
+Windows is a registered trademark of Microsoft Corporation. Node.js is a trademark of Joyent Inc.,
+Intel is a trademark of Intel Corporation, AMD is a trademark of Advanced Micro Devices Inc.,
+Raspberry Pi is a trademark of the Raspberry Pi Foundation, Debian is a trademark owned by Software in the Public Interest, Inc.,
+Ubuntu is a trademark of Canonical Ltd., FreeBSD is a registered trademark of The FreeBSD Foundation,
+NetBSD is a registered trademark of The NetBSD Foundation, Docker is a trademark of Docker, Inc., Sun,
+Solaris, OpenSolaris and registered trademarks of Sun Microsystems, VMware is a trademark of VMware Inc,
+Virtual Box is a trademark of Oracle Corporation, Xen is a registered trademark of Xen Project,
+QEMU is a trademark of Fabrice Bellard, bochs is a trademark of The Bochs Project, USB and USB Logo
+are trademarks of USB Implementation Forum, Bluetooth and Bluetooth Logo are trademarks of Bluetooth SIG,
+Android is a trademark of Google LLC.
+
+All other trademarks are the property of their respective owners.
+
+## License [![MIT license][license-img]][license-url]
+
+>The [`MIT`][license-url] License (MIT)
+>
+>Copyright &copy; 2014-2022 Sebastian Hildebrandt, [+innovations](http://www.plus-innovations.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.
+>
+>Further details see [LICENSE](LICENSE) file.
+
+
+[npm-image]: https://img.shields.io/npm/v/systeminformation.svg?style=flat-square
+[npm-url]: https://npmjs.org/package/systeminformation
+[downloads-image]: https://img.shields.io/npm/dm/systeminformation.svg?style=flat-square
+[downloads-url]: https://npmjs.org/package/systeminformation
+
+[lgtm-badge]: https://img.shields.io/lgtm/grade/javascript/g/sebhildebrandt/systeminformation.svg?style=flat-square
+[lgtm-badge-url]: https://lgtm.com/projects/g/sebhildebrandt/systeminformation/context:javascript
+[lgtm-alerts]: https://img.shields.io/lgtm/alerts/g/sebhildebrandt/systeminformation.svg?style=flat-square
+[lgtm-alerts-url]: https://lgtm.com/projects/g/sebhildebrandt/systeminformation/alerts
+
+[sponsor-badge]: https://img.shields.io/badge/-Buy%20me%20a%20coffee-blue?style=flat-square
+[sponsor-url]: https://www.buymeacoffee.com/systeminfo
+
+[license-url]: https://github.com/sebhildebrandt/systeminformation/blob/master/LICENSE
+[license-img]: https://img.shields.io/badge/license-MIT-blue.svg?style=flat-square
+[npmjs-license]: https://img.shields.io/npm/l/systeminformation.svg?style=flat-square
+[changelog-url]: https://github.com/sebhildebrandt/systeminformation/blob/master/CHANGELOG.md
+[changes5-url]: https://systeminformation.io/changes.html
+[caretaker-url]: https://github.com/sebhildebrandt
+[caretaker-image]: https://img.shields.io/badge/caretaker-sebhildebrandt-blue.svg?style=flat-square
+
+[nodejs-url]: https://nodejs.org/en/
+[docker-url]: https://www.docker.com/
+[systeminformation-url]: https://systeminformation.io
+
+[daviddm-img]: https://img.shields.io/david/sebhildebrandt/systeminformation.svg?style=flat-square
+[daviddm-url]: https://david-dm.org/sebhildebrandt/systeminformation
+
+[issues-img]: https://img.shields.io/github/issues/sebhildebrandt/systeminformation.svg?style=flat-square
+[issues-url]: https://github.com/sebhildebrandt/systeminformation/issues
+[closed-issues-img]: https://img.shields.io/github/issues-closed-raw/sebhildebrandt/systeminformation.svg?style=flat-square&color=brightgreen
+[closed-issues-url]: https://github.com/sebhildebrandt/systeminformation/issues?q=is%3Aissue+is%3Aclosed
+
+[new-issue]: https://github.com/sebhildebrandt/systeminformation/issues/new/choose
+
+[mmon-npm-url]: https://npmjs.org/package/mmon
+[mmon-github-url]: https://github.com/sebhildebrandt/mmon
+
+[smc-code-url]: https://github.com/pcafstockf/smc-reader
diff --git a/node_modules/systeminformation/lib/audio.js b/node_modules/systeminformation/lib/audio.js
new file mode 100644
index 0000000..ac57194
--- /dev/null
+++ b/node_modules/systeminformation/lib/audio.js
@@ -0,0 +1,216 @@
+'use strict';
+// @ts-check
+// ==================================================================================
+// audio.js
+// ----------------------------------------------------------------------------------
+// Description: System Information - library
+// for Node.js
+// Copyright: (c) 2014 - 2022
+// Author: Sebastian Hildebrandt
+// ----------------------------------------------------------------------------------
+// License: MIT
+// ==================================================================================
+// 16. audio
+// ----------------------------------------------------------------------------------
+
+const exec = require('child_process').exec;
+const execSync = require('child_process').execSync;
+const util = require('./util');
+
+let _platform = process.platform;
+
+const _linux = (_platform === 'linux' || _platform === 'android');
+const _darwin = (_platform === 'darwin');
+const _windows = (_platform === 'win32');
+const _freebsd = (_platform === 'freebsd');
+const _openbsd = (_platform === 'openbsd');
+const _netbsd = (_platform === 'netbsd');
+const _sunos = (_platform === 'sunos');
+
+function parseAudioType(str, input, output) {
+ let result = '';
+
+ if (str.indexOf('speak') >= 0) { result = 'Speaker'; }
+ if (str.indexOf('laut') >= 0) { result = 'Speaker'; }
+ if (str.indexOf('loud') >= 0) { result = 'Speaker'; }
+ if (str.indexOf('head') >= 0) { result = 'Headset'; }
+ if (str.indexOf('mic') >= 0) { result = 'Microphone'; }
+ if (str.indexOf('mikr') >= 0) { result = 'Microphone'; }
+ if (str.indexOf('phone') >= 0) { result = 'Phone'; }
+ if (str.indexOf('controll') >= 0) { result = 'Controller'; }
+ if (str.indexOf('line o') >= 0) { result = 'Line Out'; }
+ if (str.indexOf('digital o') >= 0) { result = 'Digital Out'; }
+
+ if (!result && output) {
+ result = 'Speaker';
+ } else if (!result && input) {
+ result = 'Microphone';
+ }
+ return result;
+}
+
+
+function getLinuxAudioPci() {
+ let cmd = 'lspci -v 2>/dev/null';
+ let result = [];
+ try {
+ const parts = execSync(cmd).toString().split('\n\n');
+ for (let i = 0; i < parts.length; i++) {
+ const lines = parts[i].split('\n');
+ if (lines && lines.length && lines[0].toLowerCase().indexOf('audio') >= 0) {
+ const audio = {};
+ audio.slotId = lines[0].split(' ')[0];
+ audio.driver = util.getValue(lines, 'Kernel driver in use', ':', true) || util.getValue(lines, 'Kernel modules', ':', true);
+ result.push(audio);
+ }
+ }
+ return result;
+ } catch (e) {
+ return result;
+ }
+}
+
+function parseLinuxAudioPciMM(lines, audioPCI) {
+ const result = {};
+ const slotId = util.getValue(lines, 'Slot');
+
+ const pciMatch = audioPCI.filter(function (item) { return item.slotId === slotId; });
+
+ result.id = slotId;
+ result.name = util.getValue(lines, 'SDevice');
+ result.manufacturer = util.getValue(lines, 'SVendor');
+ result.revision = util.getValue(lines, 'Rev');
+ result.driver = pciMatch && pciMatch.length === 1 && pciMatch[0].driver ? pciMatch[0].driver : '';
+ result.default = null;
+ result.channel = 'PCIe';
+ result.type = parseAudioType(result.name, null, null);
+ result.in = null;
+ result.out = null;
+ result.status = 'online';
+
+ return result;
+}
+
+function parseDarwinChannel(str) {
+ let result = '';
+
+ if (str.indexOf('builtin') >= 0) { result = 'Built-In'; }
+ if (str.indexOf('extern') >= 0) { result = 'Audio-Jack'; }
+ if (str.indexOf('hdmi') >= 0) { result = 'HDMI'; }
+ if (str.indexOf('displayport') >= 0) { result = 'Display-Port'; }
+ if (str.indexOf('usb') >= 0) { result = 'USB'; }
+ if (str.indexOf('pci') >= 0) { result = 'PCIe'; }
+
+ return result;
+}
+
+function parseDarwinAudio(audioObject, id) {
+ const result = {};
+ const channelStr = ((audioObject.coreaudio_device_transport || '') + ' ' + (audioObject._name || '')).toLowerCase();
+
+ result.id = id;
+ result.name = audioObject._name;
+ result.manufacturer = audioObject.coreaudio_device_manufacturer;
+ result.revision = null;
+ result.driver = null;
+ result.default = !!(audioObject.coreaudio_default_audio_input_device || '') || !!(audioObject.coreaudio_default_audio_output_device || '');
+ result.channel = parseDarwinChannel(channelStr);
+ result.type = parseAudioType(result.name, !!(audioObject.coreaudio_device_input || ''), !!(audioObject.coreaudio_device_output || ''));
+ result.in = !!(audioObject.coreaudio_device_input || '');
+ result.out = !!(audioObject.coreaudio_device_output || '');
+ result.status = 'online';
+
+ return result;
+}
+
+function parseWindowsAudio(lines) {
+ const result = {};
+ const status = util.getValue(lines, 'StatusInfo', ':');
+
+ result.id = util.getValue(lines, 'DeviceID', ':'); // PNPDeviceID??
+ result.name = util.getValue(lines, 'name', ':');
+ result.manufacturer = util.getValue(lines, 'manufacturer', ':');
+ result.revision = null;
+ result.driver = null;
+ result.default = null;
+ result.channel = null;
+ result.type = parseAudioType(result.name, null, null);
+ result.in = null;
+ result.out = null;
+ result.status = status;
+
+ return result;
+}
+
+function audio(callback) {
+
+ return new Promise((resolve) => {
+ process.nextTick(() => {
+ let result = [];
+ if (_linux || _freebsd || _openbsd || _netbsd) {
+ let cmd = 'lspci -vmm 2>/dev/null';
+ exec(cmd, function (error, stdout) {
+ // PCI
+ if (!error) {
+ const audioPCI = getLinuxAudioPci();
+ const parts = stdout.toString().split('\n\n');
+ for (let i = 0; i < parts.length; i++) {
+ const lines = parts[i].split('\n');
+ if (util.getValue(lines, 'class', ':', true).toLowerCase().indexOf('audio') >= 0) {
+ const audio = parseLinuxAudioPciMM(lines, audioPCI);
+ result.push(audio);
+ }
+ }
+ }
+ if (callback) {
+ callback(result);
+ }
+ resolve(result);
+ });
+ }
+ if (_darwin) {
+ let cmd = 'system_profiler SPAudioDataType -json';
+ exec(cmd, function (error, stdout) {
+ if (!error) {
+ try {
+ const outObj = JSON.parse(stdout.toString());
+ if (outObj.SPAudioDataType && outObj.SPAudioDataType.length && outObj.SPAudioDataType[0] && outObj.SPAudioDataType[0]['_items'] && outObj.SPAudioDataType[0]['_items'].length) {
+ for (let i = 0; i < outObj.SPAudioDataType[0]['_items'].length; i++) {
+ const audio = parseDarwinAudio(outObj.SPAudioDataType[0]['_items'][i], i);
+ result.push(audio);
+ }
+ }
+ } catch (e) {
+ util.noop();
+ }
+ }
+ if (callback) {
+ callback(result);
+ }
+ resolve(result);
+ });
+ }
+ if (_windows) {
+ util.powerShell('Get-WmiObject Win32_SoundDevice | select DeviceID,StatusInfo,Name,Manufacturer | fl').then((stdout, error) => {
+ if (!error) {
+ const parts = stdout.toString().split(/\n\s*\n/);
+ for (let i = 0; i < parts.length; i++) {
+ if (util.getValue(parts[i].split('\n'), 'name', ':')) {
+ result.push(parseWindowsAudio(parts[i].split('\n')));
+ }
+ }
+ }
+ if (callback) {
+ callback(result);
+ }
+ resolve(result);
+ });
+ }
+ if (_sunos) {
+ resolve(null);
+ }
+ });
+ });
+}
+
+exports.audio = audio;
diff --git a/node_modules/systeminformation/lib/battery.js b/node_modules/systeminformation/lib/battery.js
new file mode 100644
index 0000000..05f7d5c
--- /dev/null
+++ b/node_modules/systeminformation/lib/battery.js
@@ -0,0 +1,308 @@
+'use strict';
+// @ts-check;
+// ==================================================================================
+// battery.js
+// ----------------------------------------------------------------------------------
+// Description: System Information - library
+// for Node.js
+// Copyright: (c) 2014 - 2022
+// Author: Sebastian Hildebrandt
+// ----------------------------------------------------------------------------------
+// License: MIT
+// ==================================================================================
+// 6. Battery
+// ----------------------------------------------------------------------------------
+
+const exec = require('child_process').exec;
+const fs = require('fs');
+const util = require('./util');
+
+let _platform = process.platform;
+
+const _linux = (_platform === 'linux' || _platform === 'android');
+const _darwin = (_platform === 'darwin');
+const _windows = (_platform === 'win32');
+const _freebsd = (_platform === 'freebsd');
+const _openbsd = (_platform === 'openbsd');
+const _netbsd = (_platform === 'netbsd');
+const _sunos = (_platform === 'sunos');
+
+function parseWinBatteryPart(lines, designedCapacity, fullChargeCapacity) {
+ const result = {};
+ let status = util.getValue(lines, 'BatteryStatus', ':').trim();
+ // 1 = "Discharging"
+ // 2 = "On A/C"
+ // 3 = "Fully Charged"
+ // 4 = "Low"
+ // 5 = "Critical"
+ // 6 = "Charging"
+ // 7 = "Charging High"
+ // 8 = "Charging Low"
+ // 9 = "Charging Critical"
+ // 10 = "Undefined"
+ // 11 = "Partially Charged"
+ if (status >= 0) {
+ const statusValue = status ? parseInt(status) : 0;
+ result.status = statusValue;
+ result.hasBattery = true;
+ result.maxCapacity = fullChargeCapacity || parseInt(util.getValue(lines, 'DesignCapacity', ':') || 0);
+ result.designedCapacity = parseInt(util.getValue(lines, 'DesignCapacity', ':') || designedCapacity);
+ result.voltage = parseInt(util.getValue(lines, 'DesignVoltage', ':') || 0) / 1000.0;
+ result.capacityUnit = 'mWh';
+ result.percent = parseInt(util.getValue(lines, 'EstimatedChargeRemaining', ':') || 0);
+ result.currentCapacity = parseInt(result.maxCapacity * result.percent / 100);
+ result.isCharging = (statusValue >= 6 && statusValue <= 9) || statusValue === 11 || ((statusValue !== 3) && (statusValue !== 1) && result.percent < 100);
+ result.acConnected = result.isCharging || statusValue === 2;
+ result.model = util.getValue(lines, 'DeviceID', ':');
+ } else {
+ result.status = -1;
+ }
+
+ return result;
+}
+
+module.exports = function (callback) {
+
+ return new Promise((resolve) => {
+ process.nextTick(() => {
+ let result = {
+ hasBattery: false,
+ cycleCount: 0,
+ isCharging: false,
+ designedCapacity: 0,
+ maxCapacity: 0,
+ currentCapacity: 0,
+ voltage: 0,
+ capacityUnit: '',
+ percent: 0,
+ timeRemaining: null,
+ acConnected: true,
+ type: '',
+ model: '',
+ manufacturer: '',
+ serial: ''
+ };
+
+ if (_linux) {
+ let battery_path = '';
+ if (fs.existsSync('/sys/class/power_supply/BAT1/uevent')) {
+ battery_path = '/sys/class/power_supply/BAT1/';
+ } else if (fs.existsSync('/sys/class/power_supply/BAT0/uevent')) {
+ battery_path = '/sys/class/power_supply/BAT0/';
+ }
+
+ let acConnected = false;
+ let acPath = '';
+ if (fs.existsSync('/sys/class/power_supply/AC/online')) {
+ acPath = '/sys/class/power_supply/AC/online';
+ } else if (fs.existsSync('/sys/class/power_supply/AC0/online')) {
+ acPath = '/sys/class/power_supply/AC0/online';
+ }
+
+ if (acPath) {
+ const file = fs.readFileSync(acPath);
+ acConnected = file.toString().trim() === '1';
+ }
+
+ if (battery_path) {
+ fs.readFile(battery_path + 'uevent', function (error, stdout) {
+ if (!error) {
+ let lines = stdout.toString().split('\n');
+
+ result.isCharging = (util.getValue(lines, 'POWER_SUPPLY_STATUS', '=').toLowerCase() === 'charging');
+ result.acConnected = acConnected || result.isCharging;
+ result.voltage = parseInt('0' + util.getValue(lines, 'POWER_SUPPLY_VOLTAGE_NOW', '='), 10) / 1000000.0;
+ result.capacityUnit = result.voltage ? 'mWh' : 'mAh';
+ result.cycleCount = parseInt('0' + util.getValue(lines, 'POWER_SUPPLY_CYCLE_COUNT', '='), 10);
+ result.maxCapacity = Math.round(parseInt('0' + util.getValue(lines, 'POWER_SUPPLY_CHARGE_FULL', '=', true, true), 10) / 1000.0 * (result.voltage || 1));
+ const desingedMinVoltage = parseInt('0' + util.getValue(lines, 'POWER_SUPPLY_VOLTAGE_MIN_DESIGN', '='), 10) / 1000000.0;
+ result.designedCapacity = Math.round(parseInt('0' + util.getValue(lines, 'POWER_SUPPLY_CHARGE_FULL_DESIGN', '=', true, true), 10) / 1000.0 * (desingedMinVoltage || result.voltage || 1));
+ result.currentCapacity = Math.round(parseInt('0' + util.getValue(lines, 'POWER_SUPPLY_CHARGE_NOW', '='), 10) / 1000.0 * (result.voltage || 1));
+ if (!result.maxCapacity) {
+ result.maxCapacity = parseInt('0' + util.getValue(lines, 'POWER_SUPPLY_ENERGY_FULL', '=', true, true), 10) / 1000.0;
+ result.designedCapacity = parseInt('0' + util.getValue(lines, 'POWER_SUPPLY_ENERGY_FULL_DESIGN', '=', true, true), 10) / 1000.0 | result.maxCapacity;
+ result.currentCapacity = parseInt('0' + util.getValue(lines, 'POWER_SUPPLY_ENERGY_NOW', '='), 10) / 1000.0;
+ }
+ const percent = util.getValue(lines, 'POWER_SUPPLY_CAPACITY', '=');
+ const energy = parseInt('0' + util.getValue(lines, 'POWER_SUPPLY_ENERGY_NOW', '='), 10);
+ const power = parseInt('0' + util.getValue(lines, 'POWER_SUPPLY_POWER_NOW', '='), 10);
+ const current = parseInt('0' + util.getValue(lines, 'POWER_SUPPLY_CURRENT_NOW', '='), 10);
+
+ result.percent = parseInt('0' + percent, 10);
+ if (result.maxCapacity && result.currentCapacity) {
+ result.hasBattery = true;
+ if (!percent) {
+ result.percent = 100.0 * result.currentCapacity / result.maxCapacity;
+ }
+ }
+ if (result.isCharging) {
+ result.hasBattery = true;
+ }
+ if (energy && power) {
+ result.timeRemaining = Math.floor(energy / power * 60);
+ } else if (current && result.currentCapacity) {
+ result.timeRemaining = Math.floor(result.currentCapacity / current * 60);
+ }
+ result.type = util.getValue(lines, 'POWER_SUPPLY_TECHNOLOGY', '=');
+ result.model = util.getValue(lines, 'POWER_SUPPLY_MODEL_NAME', '=');
+ result.manufacturer = util.getValue(lines, 'POWER_SUPPLY_MANUFACTURER', '=');
+ result.serial = util.getValue(lines, 'POWER_SUPPLY_SERIAL_NUMBER', '=');
+ if (callback) { callback(result); }
+ resolve(result);
+ } else {
+ if (callback) { callback(result); }
+ resolve(result);
+ }
+ });
+ } else {
+ if (callback) { callback(result); }
+ resolve(result);
+ }
+ }
+ if (_freebsd || _openbsd || _netbsd) {
+ exec('sysctl -i hw.acpi.battery hw.acpi.acline', function (error, stdout) {
+ let lines = stdout.toString().split('\n');
+ const batteries = parseInt('0' + util.getValue(lines, 'hw.acpi.battery.units'), 10);
+ const percent = parseInt('0' + util.getValue(lines, 'hw.acpi.battery.life'), 10);
+ result.hasBattery = (batteries > 0);
+ result.cycleCount = null;
+ result.isCharging = util.getValue(lines, 'hw.acpi.acline') !== '1';
+ result.acConnected = result.isCharging;
+ result.maxCapacity = null;
+ result.currentCapacity = null;
+ result.capacityUnit = 'unknown';
+ result.percent = batteries ? percent : null;
+ if (callback) { callback(result); }
+ resolve(result);
+ });
+ }
+
+ if (_darwin) {
+ exec('ioreg -n AppleSmartBattery -r | egrep "CycleCount|IsCharging|DesignCapacity|MaxCapacity|CurrentCapacity|BatterySerialNumber|TimeRemaining|Voltage"; pmset -g batt | grep %', function (error, stdout) {
+ if (stdout) {
+ let lines = stdout.toString().replace(/ +/g, '').replace(/"+/g, '').replace(/-/g, '').split('\n');
+ result.cycleCount = parseInt('0' + util.getValue(lines, 'cyclecount', '='), 10);
+ result.voltage = parseInt('0' + util.getValue(lines, 'voltage', '='), 10) / 1000.0;
+ result.capacityUnit = result.voltage ? 'mWh' : 'mAh';
+ result.maxCapacity = Math.round(parseInt('0' + util.getValue(lines, 'applerawmaxcapacity', '='), 10) * (result.voltage || 1));
+ result.currentCapacity = Math.round(parseInt('0' + util.getValue(lines, 'applerawcurrentcapacity', '='), 10) * (result.voltage || 1));
+ result.designedCapacity = Math.round(parseInt('0' + util.getValue(lines, 'DesignCapacity', '='), 10) * (result.voltage || 1));
+ result.manufacturer = 'Apple';
+ result.serial = util.getValue(lines, 'BatterySerialNumber', '=');
+ let percent = null;
+ const line = util.getValue(lines, 'internal', 'Battery');
+ let parts = line.split(';');
+ if (parts && parts[0]) {
+ let parts2 = parts[0].split('\t');
+ if (parts2 && parts2[1]) {
+ percent = parseFloat(parts2[1].trim().replace(/%/g, ''));
+ }
+ }
+ if (parts && parts[1]) {
+ result.isCharging = (parts[1].trim() === 'charging');
+ result.acConnected = (parts[1].trim() !== 'discharging');
+ } else {
+ result.isCharging = util.getValue(lines, 'ischarging', '=').toLowerCase() === 'yes';
+ result.acConnected = result.isCharging;
+ }
+ if (result.maxCapacity && result.currentCapacity) {
+ result.hasBattery = true;
+ result.type = 'Li-ion';
+ result.percent = percent !== null ? percent : Math.round(100.0 * result.currentCapacity / result.maxCapacity);
+ if (!result.isCharging) {
+ result.timeRemaining = parseInt('0' + util.getValue(lines, 'TimeRemaining', '='), 10);
+ }
+ }
+ }
+ if (callback) { callback(result); }
+ resolve(result);
+ });
+ }
+ if (_sunos) {
+ if (callback) { callback(result); }
+ resolve(result);
+ }
+ if (_windows) {
+ try {
+ const workload = [];
+ workload.push(util.powerShell('Get-WmiObject Win32_Battery | select BatteryStatus, DesignCapacity, DesignVoltage, EstimatedChargeRemaining, DeviceID | fl'));
+ workload.push(util.powerShell('(Get-WmiObject -Class BatteryStaticData -Namespace ROOT/WMI).DesignedCapacity'));
+ workload.push(util.powerShell('(Get-WmiObject -Class BatteryFullChargedCapacity -Namespace ROOT/WMI).FullChargedCapacity'));
+ util.promiseAll(
+ workload
+ ).then((data) => {
+ if (data) {
+ let parts = data.results[0].split(/\n\s*\n/);
+ let batteries = [];
+ const hasValue = value => /\S/.test(value);
+ for (let i = 0; i < parts.length; i++) {
+ if (hasValue(parts[i]) && (!batteries.length || !hasValue(parts[i - 1]))) {
+ batteries.push([]);
+ }
+ if (hasValue(parts[i])) {
+ batteries[batteries.length - 1].push(parts[i]);
+ }
+ }
+ let designCapacities = data.results[1].split('\r\n').filter(e => e);
+ let fullChargeCapacities = data.results[2].split('\r\n').filter(e => e);
+ if (batteries.length) {
+ let first = false;
+ let additionalBatteries = [];
+ for (let i = 0; i < batteries.length; i++) {
+ let lines = batteries[i][0].split('\r\n');
+ const designedCapacity = designCapacities && designCapacities.length >= (i + 1) && designCapacities[i] ? util.toInt(designCapacities[i]) : 0;
+ const fullChargeCapacity = fullChargeCapacities && fullChargeCapacities.length >= (i + 1) && fullChargeCapacities[i] ? util.toInt(fullChargeCapacities[i]) : 0;
+ const parsed = parseWinBatteryPart(lines, designedCapacity, fullChargeCapacity);
+ if (!first && parsed.status > 0 && parsed.status !== 10) {
+ result.hasBattery = parsed.hasBattery;
+ result.maxCapacity = parsed.maxCapacity;
+ result.designedCapacity = parsed.designedCapacity;
+ result.voltage = parsed.voltage;
+ result.capacityUnit = parsed.capacityUnit;
+ result.percent = parsed.percent;
+ result.currentCapacity = parsed.currentCapacity;
+ result.isCharging = parsed.isCharging;
+ result.acConnected = parsed.acConnected;
+ result.model = parsed.model;
+ first = true;
+ } else if (parsed.status !== -1) {
+ additionalBatteries.push(
+ {
+ hasBattery: parsed.hasBattery,
+ maxCapacity: parsed.maxCapacity,
+ designedCapacity: parsed.designedCapacity,
+ voltage: parsed.voltage,
+ capacityUnit: parsed.capacityUnit,
+ percent: parsed.percent,
+ currentCapacity: parsed.currentCapacity,
+ isCharging: parsed.isCharging,
+ timeRemaining: null,
+ acConnected: parsed.acConnected,
+ model: parsed.model,
+ type: '',
+ manufacturer: '',
+ serial: ''
+ }
+ );
+ }
+ }
+ if (!first && additionalBatteries.length) {
+ result = additionalBatteries[0];
+ additionalBatteries.shift();
+ }
+ if (additionalBatteries.length) {
+ result.additionalBatteries = additionalBatteries;
+ }
+ }
+ }
+ if (callback) { callback(result); }
+ resolve(result);
+ });
+ } catch (e) {
+ if (callback) { callback(result); }
+ resolve(result);
+ }
+ }
+ });
+ });
+};
diff --git a/node_modules/systeminformation/lib/bluetooth.js b/node_modules/systeminformation/lib/bluetooth.js
new file mode 100644
index 0000000..ad0866f
--- /dev/null
+++ b/node_modules/systeminformation/lib/bluetooth.js
@@ -0,0 +1,229 @@
+'use strict';
+// @ts-check
+// ==================================================================================
+// audio.js
+// ----------------------------------------------------------------------------------
+// Description: System Information - library
+// for Node.js
+// Copyright: (c) 2014 - 2022
+// Author: Sebastian Hildebrandt
+// ----------------------------------------------------------------------------------
+// License: MIT
+// ==================================================================================
+// 17. bluetooth
+// ----------------------------------------------------------------------------------
+
+const exec = require('child_process').exec;
+const execSync = require('child_process').execSync;
+const path = require('path');
+const util = require('./util');
+const fs = require('fs');
+
+let _platform = process.platform;
+
+const _linux = (_platform === 'linux' || _platform === 'android');
+const _darwin = (_platform === 'darwin');
+const _windows = (_platform === 'win32');
+const _freebsd = (_platform === 'freebsd');
+const _openbsd = (_platform === 'openbsd');
+const _netbsd = (_platform === 'netbsd');
+const _sunos = (_platform === 'sunos');
+
+function parseBluetoothType(str) {
+ let result = '';
+
+ if (str.indexOf('keyboard') >= 0) { result = 'Keyboard'; }
+ if (str.indexOf('mouse') >= 0) { result = 'Mouse'; }
+ if (str.indexOf('speaker') >= 0) { result = 'Speaker'; }
+ if (str.indexOf('headset') >= 0) { result = 'Headset'; }
+ if (str.indexOf('phone') >= 0) { result = 'Phone'; }
+ if (str.indexOf('macbook') >= 0) { result = 'Computer'; }
+ if (str.indexOf('imac') >= 0) { result = 'Computer'; }
+ if (str.indexOf('ipad') >= 0) { result = 'Tablet'; }
+ if (str.indexOf('watch') >= 0) { result = 'Watch'; }
+ if (str.indexOf('headphone') >= 0) { result = 'Headset'; }
+ // to be continued ...
+
+ return result;
+}
+
+function parseBluetoothManufacturer(str) {
+ let result = str.split(' ')[0];
+ str = str.toLowerCase();
+ if (str.indexOf('apple') >= 0) { result = 'Apple'; }
+ if (str.indexOf('ipad') >= 0) { result = 'Apple'; }
+ if (str.indexOf('imac') >= 0) { result = 'Apple'; }
+ if (str.indexOf('iphone') >= 0) { result = 'Apple'; }
+ if (str.indexOf('magic mouse') >= 0) { result = 'Apple'; }
+ if (str.indexOf('macbook') >= 0) { result = 'Apple'; }
+ // to be continued ...
+
+ return result;
+}
+
+function parseLinuxBluetoothInfo(lines, macAddr1, macAddr2) {
+ const result = {};
+
+ result.device = null;
+ result.name = util.getValue(lines, 'name', '=');
+ result.manufacturer = null;
+ result.macDevice = macAddr1;
+ result.macHost = macAddr2;
+ result.batteryPercent = null;
+ result.type = parseBluetoothType(result.name.toLowerCase());
+ result.connected = false;
+
+ return result;
+}
+
+function parseDarwinBluetoothDevices(bluetoothObject, macAddr2) {
+ const result = {};
+ const typeStr = ((bluetoothObject.device_minorClassOfDevice_string || bluetoothObject.device_majorClassOfDevice_string || bluetoothObject.device_minorType || '') + (bluetoothObject.device_name || '')).toLowerCase();
+
+ result.device = bluetoothObject.device_services || '';
+ result.name = bluetoothObject.device_name || '';
+ result.manufacturer = bluetoothObject.device_manufacturer || parseBluetoothManufacturer(bluetoothObject.device_name || '') || '';
+ result.macDevice = (bluetoothObject.device_addr || bluetoothObject.device_address || '').toLowerCase().replace(/-/g, ':');
+ result.macHost = macAddr2;
+ result.batteryPercent = bluetoothObject.device_batteryPercent || null;
+ result.type = parseBluetoothType(typeStr);
+ result.connected = bluetoothObject.device_isconnected === 'attrib_Yes' || false;
+
+ return result;
+}
+
+function parseWindowsBluetooth(lines) {
+ const result = {};
+
+ result.device = null;
+ result.name = util.getValue(lines, 'name', ':');
+ result.manufacturer = util.getValue(lines, 'manufacturer', ':');
+ result.macDevice = null;
+ result.macHost = null;
+ result.batteryPercent = null;
+ result.type = parseBluetoothType(result.name.toLowerCase());
+ result.connected = null;
+
+ return result;
+}
+
+function bluetoothDevices(callback) {
+
+ return new Promise((resolve) => {
+ process.nextTick(() => {
+ let result = [];
+ if (_linux) {
+ // get files in /var/lib/bluetooth/ recursive
+ const btFiles = util.getFilesInPath('/var/lib/bluetooth/');
+ btFiles.forEach((element) => {
+ const filename = path.basename(element);
+ const pathParts = element.split('/');
+ const macAddr1 = pathParts.length >= 6 ? pathParts[pathParts.length - 2] : null;
+ const macAddr2 = pathParts.length >= 7 ? pathParts[pathParts.length - 3] : null;
+ if (filename === 'info') {
+ const infoFile = fs.readFileSync(element, { encoding: 'utf8' }).split('\n');
+ result.push(parseLinuxBluetoothInfo(infoFile, macAddr1, macAddr2));
+ }
+ });
+ // determine "connected" with hcitool con
+ try {
+ const hdicon = execSync('hcitool con').toString().toLowerCase();
+ for (let i = 0; i < result.length; i++) {
+ if (result[i].macDevice && result[i].macDevice.length > 10 && hdicon.indexOf(result[i].macDevice.toLowerCase()) >= 0) {
+ result[i].connected = true;
+ }
+ }
+ } catch (e) {
+ util.noop();
+ }
+
+ if (callback) {
+ callback(result);
+ }
+ resolve(result);
+ }
+ if (_darwin) {
+ let cmd = 'system_profiler SPBluetoothDataType -json';
+ exec(cmd, function (error, stdout) {
+ if (!error) {
+ try {
+ const outObj = JSON.parse(stdout.toString());
+ if (outObj.SPBluetoothDataType && outObj.SPBluetoothDataType.length && outObj.SPBluetoothDataType[0] && outObj.SPBluetoothDataType[0]['device_title'] && outObj.SPBluetoothDataType[0]['device_title'].length) {
+ // missing: host BT Adapter macAddr ()
+ let macAddr2 = null;
+ if (outObj.SPBluetoothDataType[0]['local_device_title'] && outObj.SPBluetoothDataType[0].local_device_title.general_address) {
+ macAddr2 = outObj.SPBluetoothDataType[0].local_device_title.general_address.toLowerCase().replace(/-/g, ':');
+ }
+ outObj.SPBluetoothDataType[0]['device_title'].forEach((element) => {
+ const obj = element;
+ const objKey = Object.keys(obj);
+ if (objKey && objKey.length === 1) {
+ const innerObject = obj[objKey[0]];
+ innerObject.device_name = objKey[0];
+ const bluetoothDevice = parseDarwinBluetoothDevices(innerObject, macAddr2);
+ result.push(bluetoothDevice);
+ }
+ });
+ }
+ if (outObj.SPBluetoothDataType && outObj.SPBluetoothDataType.length && outObj.SPBluetoothDataType[0] && outObj.SPBluetoothDataType[0]['device_connected'] && outObj.SPBluetoothDataType[0]['device_connected'].length) {
+ const macAddr2 = outObj.SPBluetoothDataType[0].controller_properties && outObj.SPBluetoothDataType[0].controller_properties.controller_address ? outObj.SPBluetoothDataType[0].controller_properties.controller_address.toLowerCase().replace(/-/g, ':') : null;
+ outObj.SPBluetoothDataType[0]['device_connected'].forEach((element) => {
+ const obj = element;
+ const objKey = Object.keys(obj);
+ if (objKey && objKey.length === 1) {
+ const innerObject = obj[objKey[0]];
+ innerObject.device_name = objKey[0];
+ innerObject.device_isconnected = 'attrib_Yes';
+ const bluetoothDevice = parseDarwinBluetoothDevices(innerObject, macAddr2);
+ result.push(bluetoothDevice);
+ }
+ });
+ }
+ if (outObj.SPBluetoothDataType && outObj.SPBluetoothDataType.length && outObj.SPBluetoothDataType[0] && outObj.SPBluetoothDataType[0]['device_not_connected'] && outObj.SPBluetoothDataType[0]['device_not_connected'].length) {
+ const macAddr2 = outObj.SPBluetoothDataType[0].controller_properties && outObj.SPBluetoothDataType[0].controller_properties.controller_address ? outObj.SPBluetoothDataType[0].controller_properties.controller_address.toLowerCase().replace(/-/g, ':') : null;
+ outObj.SPBluetoothDataType[0]['device_not_connected'].forEach((element) => {
+ const obj = element;
+ const objKey = Object.keys(obj);
+ if (objKey && objKey.length === 1) {
+ const innerObject = obj[objKey[0]];
+ innerObject.device_name = objKey[0];
+ innerObject.device_isconnected = 'attrib_No';
+ const bluetoothDevice = parseDarwinBluetoothDevices(innerObject, macAddr2);
+ result.push(bluetoothDevice);
+ }
+ });
+ }
+ } catch (e) {
+ util.noop();
+ }
+ }
+ if (callback) {
+ callback(result);
+ }
+ resolve(result);
+ });
+ }
+ if (_windows) {
+ util.powerShell('Get-WmiObject Win32_PNPEntity | select PNPClass, Name, Manufacturer | fl').then((stdout, error) => {
+ if (!error) {
+ const parts = stdout.toString().split(/\n\s*\n/);
+ parts.forEach((part) => {
+ if (util.getValue(part.split('\n'), 'PNPClass', ':') === 'Bluetooth') {
+ result.push(parseWindowsBluetooth(part.split('\n')));
+ }
+ });
+ }
+ if (callback) {
+ callback(result);
+ }
+ resolve(result);
+ });
+ }
+ if (_freebsd || _netbsd || _openbsd || _sunos) {
+ resolve(null);
+ }
+ });
+ });
+}
+
+exports.bluetoothDevices = bluetoothDevices;
diff --git a/node_modules/systeminformation/lib/cli.js b/node_modules/systeminformation/lib/cli.js
new file mode 100755
index 0000000..48ed458
--- /dev/null
+++ b/node_modules/systeminformation/lib/cli.js
@@ -0,0 +1,31 @@
+#!/usr/bin/env node
+
+'use strict';
+// @ts-check
+// ==================================================================================
+// cli.js
+// ----------------------------------------------------------------------------------
+// Description: System Information - library
+// for Node.js
+// Copyright: (c) 2014 - 2022
+// Author: Sebastian Hildebrandt
+// ----------------------------------------------------------------------------------
+// License: MIT
+// ==================================================================================
+
+// ----------------------------------------------------------------------------------
+// Dependencies
+// ----------------------------------------------------------------------------------
+const si = require('./index');
+
+// ----------------------------------------------------------------------------------
+// Main
+// ----------------------------------------------------------------------------------
+(function () {
+ si.getStaticData().then(
+ ((data) => {
+ data.time = si.time();
+ console.log(JSON.stringify(data, null, 2));
+ }
+ ));
+})();
diff --git a/node_modules/systeminformation/lib/cpu.js b/node_modules/systeminformation/lib/cpu.js
new file mode 100644
index 0000000..eea5dbf
--- /dev/null
+++ b/node_modules/systeminformation/lib/cpu.js
@@ -0,0 +1,1702 @@
+'use strict';
+// @ts-check
+// ==================================================================================
+// cpu.js
+// ----------------------------------------------------------------------------------
+// Description: System Information - library
+// for Node.js
+// Copyright: (c) 2014 - 2022
+// Author: Sebastian Hildebrandt
+// ----------------------------------------------------------------------------------
+// License: MIT
+// ==================================================================================
+// 4. CPU
+// ----------------------------------------------------------------------------------
+
+const os = require('os');
+const exec = require('child_process').exec;
+const execSync = require('child_process').execSync;
+const fs = require('fs');
+const util = require('./util');
+
+let _platform = process.platform;
+
+const _linux = (_platform === 'linux' || _platform === 'android');
+const _darwin = (_platform === 'darwin');
+const _windows = (_platform === 'win32');
+const _freebsd = (_platform === 'freebsd');
+const _openbsd = (_platform === 'openbsd');
+const _netbsd = (_platform === 'netbsd');
+const _sunos = (_platform === 'sunos');
+
+let _cpu_speed = 0;
+let _current_cpu = {
+ user: 0,
+ nice: 0,
+ system: 0,
+ idle: 0,
+ irq: 0,
+ load: 0,
+ tick: 0,
+ ms: 0,
+ currentLoad: 0,
+ currentLoadUser: 0,
+ currentLoadSystem: 0,
+ currentLoadNice: 0,
+ currentLoadIdle: 0,
+ currentLoadIrq: 0,
+ rawCurrentLoad: 0,
+ rawCurrentLoadUser: 0,
+ rawCurrentLoadSystem: 0,
+ rawCurrentLoadNice: 0,
+ rawCurrentLoadIdle: 0,
+ rawCurrentLoadIrq: 0
+};
+let _cpus = [];
+let _corecount = 0;
+
+const AMDBaseFrequencies = {
+ '8346': '1.8',
+ '8347': '1.9',
+ '8350': '2.0',
+ '8354': '2.2',
+ '8356|SE': '2.4',
+ '8356': '2.3',
+ '8360': '2.5',
+ '2372': '2.1',
+ '2373': '2.1',
+ '2374': '2.2',
+ '2376': '2.3',
+ '2377': '2.3',
+ '2378': '2.4',
+ '2379': '2.4',
+ '2380': '2.5',
+ '2381': '2.5',
+ '2382': '2.6',
+ '2384': '2.7',
+ '2386': '2.8',
+ '2387': '2.8',
+ '2389': '2.9',
+ '2393': '3.1',
+ '8374': '2.2',
+ '8376': '2.3',
+ '8378': '2.4',
+ '8379': '2.4',
+ '8380': '2.5',
+ '8381': '2.5',
+ '8382': '2.6',
+ '8384': '2.7',
+ '8386': '2.8',
+ '8387': '2.8',
+ '8389': '2.9',
+ '8393': '3.1',
+ '2419EE': '1.8',
+ '2423HE': '2.0',
+ '2425HE': '2.1',
+ '2427': '2.2',
+ '2431': '2.4',
+ '2435': '2.6',
+ '2439SE': '2.8',
+ '8425HE': '2.1',
+ '8431': '2.4',
+ '8435': '2.6',
+ '8439SE': '2.8',
+ '4122': '2.2',
+ '4130': '2.6',
+ '4162EE': '1.7',
+ '4164EE': '1.8',
+ '4170HE': '2.1',
+ '4174HE': '2.3',
+ '4176HE': '2.4',
+ '4180': '2.6',
+ '4184': '2.8',
+ '6124HE': '1.8',
+ '6128HE': '2.0',
+ '6132HE': '2.2',
+ '6128': '2.0',
+ '6134': '2.3',
+ '6136': '2.4',
+ '6140': '2.6',
+ '6164HE': '1.7',
+ '6166HE': '1.8',
+ '6168': '1.9',
+ '6172': '2.1',
+ '6174': '2.2',
+ '6176': '2.3',
+ '6176SE': '2.3',
+ '6180SE': '2.5',
+ '3250': '2.5',
+ '3260': '2.7',
+ '3280': '2.4',
+ '4226': '2.7',
+ '4228': '2.8',
+ '4230': '2.9',
+ '4234': '3.1',
+ '4238': '3.3',
+ '4240': '3.4',
+ '4256': '1.6',
+ '4274': '2.5',
+ '4276': '2.6',
+ '4280': '2.8',
+ '4284': '3.0',
+ '6204': '3.3',
+ '6212': '2.6',
+ '6220': '3.0',
+ '6234': '2.4',
+ '6238': '2.6',
+ '6262HE': '1.6',
+ '6272': '2.1',
+ '6274': '2.2',
+ '6276': '2.3',
+ '6278': '2.4',
+ '6282SE': '2.6',
+ '6284SE': '2.7',
+ '6308': '3.5',
+ '6320': '2.8',
+ '6328': '3.2',
+ '6338P': '2.3',
+ '6344': '2.6',
+ '6348': '2.8',
+ '6366': '1.8',
+ '6370P': '2.0',
+ '6376': '2.3',
+ '6378': '2.4',
+ '6380': '2.5',
+ '6386': '2.8',
+ 'FX|4100': '3.6',
+ 'FX|4120': '3.9',
+ 'FX|4130': '3.8',
+ 'FX|4150': '3.8',
+ 'FX|4170': '4.2',
+ 'FX|6100': '3.3',
+ 'FX|6120': '3.6',
+ 'FX|6130': '3.6',
+ 'FX|6200': '3.8',
+ 'FX|8100': '2.8',
+ 'FX|8120': '3.1',
+ 'FX|8140': '3.2',
+ 'FX|8150': '3.6',
+ 'FX|8170': '3.9',
+ 'FX|4300': '3.8',
+ 'FX|4320': '4.0',
+ 'FX|4350': '4.2',
+ 'FX|6300': '3.5',
+ 'FX|6350': '3.9',
+ 'FX|8300': '3.3',
+ 'FX|8310': '3.4',
+ 'FX|8320': '3.5',
+ 'FX|8350': '4.0',
+ 'FX|8370': '4.0',
+ 'FX|9370': '4.4',
+ 'FX|9590': '4.7',
+ 'FX|8320E': '3.2',
+ 'FX|8370E': '3.3',
+
+ // ZEN Desktop CPUs
+ '1200': '3.1',
+ 'Pro 1200': '3.1',
+ '1300X': '3.5',
+ 'Pro 1300': '3.5',
+ '1400': '3.2',
+ '1500X': '3.5',
+ 'Pro 1500': '3.5',
+ '1600': '3.2',
+ '1600X': '3.6',
+ 'Pro 1600': '3.2',
+ '1700': '3.0',
+ 'Pro 1700': '3.0',
+ '1700X': '3.4',
+ 'Pro 1700X': '3.4',
+ '1800X': '3.6',
+ '1900X': '3.8',
+ '1920': '3.2',
+ '1920X': '3.5',
+ '1950X': '3.4',
+
+ // ZEN Desktop APUs
+ '200GE': '3.2',
+ 'Pro 200GE': '3.2',
+ '220GE': '3.4',
+ '240GE': '3.5',
+ '3000G': '3.5',
+ '300GE': '3.4',
+ '3050GE': '3.4',
+ '2200G': '3.5',
+ 'Pro 2200G': '3.5',
+ '2200GE': '3.2',
+ 'Pro 2200GE': '3.2',
+ '2400G': '3.6',
+ 'Pro 2400G': '3.6',
+ '2400GE': '3.2',
+ 'Pro 2400GE': '3.2',
+
+ // ZEN Mobile APUs
+ 'Pro 200U': '2.3',
+ '300U': '2.4',
+ '2200U': '2.5',
+ '3200U': '2.6',
+ '2300U': '2.0',
+ 'Pro 2300U': '2.0',
+ '2500U': '2.0',
+ 'Pro 2500U': '2.2',
+ '2600H': '3.2',
+ '2700U': '2.0',
+ 'Pro 2700U': '2.2',
+ '2800H': '3.3',
+
+ // ZEN Server Processors
+ '7351': '2.4',
+ '7351P': '2.4',
+ '7401': '2.0',
+ '7401P': '2.0',
+ '7551P': '2.0',
+ '7551': '2.0',
+ '7251': '2.1',
+ '7261': '2.5',
+ '7281': '2.1',
+ '7301': '2.2',
+ '7371': '3.1',
+ '7451': '2.3',
+ '7501': '2.0',
+ '7571': '2.2',
+ '7601': '2.2',
+
+ // ZEN Embedded Processors
+ 'V1500B': '2.2',
+ 'V1780B': '3.35',
+ 'V1202B': '2.3',
+ 'V1404I': '2.0',
+ 'V1605B': '2.0',
+ 'V1756B': '3.25',
+ 'V1807B': '3.35',
+
+ '3101': '2.1',
+ '3151': '2.7',
+ '3201': '1.5',
+ '3251': '2.5',
+ '3255': '2.5',
+ '3301': '2.0',
+ '3351': '1.9',
+ '3401': '1.85',
+ '3451': '2.15',
+
+ // ZEN+ Desktop
+ '1200|AF': '3.1',
+ '2300X': '3.5',
+ '2500X': '3.6',
+ '2600': '3.4',
+ '2600E': '3.1',
+ '1600|AF': '3.2',
+ '2600X': '3.6',
+ '2700': '3.2',
+ '2700E': '2.8',
+ 'Pro 2700': '3.2',
+ '2700X': '3.7',
+ 'Pro 2700X': '3.6',
+ '2920X': '3.5',
+ '2950X': '3.5',
+ '2970WX': '3.0',
+ '2990WX': '3.0',
+
+ // ZEN+ Desktop APU
+ 'Pro 300GE': '3.4',
+ 'Pro 3125GE': '3.4',
+ '3150G': '3.5',
+ 'Pro 3150G': '3.5',
+ '3150GE': '3.3',
+ 'Pro 3150GE': '3.3',
+ '3200G': '3.6',
+ 'Pro 3200G': '3.6',
+ '3200GE': '3.3',
+ 'Pro 3200GE': '3.3',
+ '3350G': '3.6',
+ 'Pro 3350G': '3.6',
+ '3350GE': '3.3',
+ 'Pro 3350GE': '3.3',
+ '3400G': '3.7',
+ 'Pro 3400G': '3.7',
+ '3400GE': '3.3',
+ 'Pro 3400GE': '3.3',
+
+ // ZEN+ Mobile
+ '3300U': '2.1',
+ 'PRO 3300U': '2.1',
+ '3450U': '2.1',
+ '3500U': '2.1',
+ 'PRO 3500U': '2.1',
+ '3500C': '2.1',
+ '3550H': '2.1',
+ '3580U': '2.1',
+ '3700U': '2.3',
+ 'PRO 3700U': '2.3',
+ '3700C': '2.3',
+ '3750H': '2.3',
+ '3780U': '2.3',
+
+ // ZEN2 Desktop CPUS
+ '3100': '3.6',
+ '3300X': '3.8',
+ '3500': '3.6',
+ '3500X': '3.6',
+ '3600': '3.6',
+ 'Pro 3600': '3.6',
+ '3600X': '3.8',
+ '3600XT': '3.8',
+ 'Pro 3700': '3.6',
+ '3700X': '3.6',
+ '3800X': '3.9',
+ '3800XT': '3.9',
+ '3900': '3.1',
+ 'Pro 3900': '3.1',
+ '3900X': '3.8',
+ '3900XT': '3.8',
+ '3950X': '3.5',
+ '3960X': '3.8',
+ '3970X': '3.7',
+ '3990X': '2.9',
+ '3945WX': '4.0',
+ '3955WX': '3.9',
+ '3975WX': '3.5',
+ '3995WX': '2.7',
+
+ // ZEN2 Desktop APUs
+ '4300GE': '3.5',
+ 'Pro 4300GE': '3.5',
+ '4300G': '3.8',
+ 'Pro 4300G': '3.8',
+ '4600GE': '3.3',
+ 'Pro 4650GE': '3.3',
+ '4600G': '3.7',
+ 'Pro 4650G': '3.7',
+ '4700GE': '3.1',
+ 'Pro 4750GE': '3.1',
+ '4700G': '3.6',
+ 'Pro 4750G': '3.6',
+ '4300U': '2.7',
+ '4450U': '2.5',
+ 'Pro 4450U': '2.5',
+ '4500U': '2.3',
+ '4600U': '2.1',
+ 'PRO 4650U': '2.1',
+ '4680U': '2.1',
+ '4600HS': '3.0',
+ '4600H': '3.0',
+ '4700U': '2.0',
+ 'PRO 4750U': '1.7',
+ '4800U': '1.8',
+ '4800HS': '2.9',
+ '4800H': '2.9',
+ '4900HS': '3.0',
+ '4900H': '3.3',
+ '5300U': '2.6',
+ '5500U': '2.1',
+ '5700U': '1.8',
+
+ // ZEN2 - EPYC
+ '7232P': '3.1',
+ '7302P': '3.0',
+ '7402P': '2.8',
+ '7502P': '2.5',
+ '7702P': '2.0',
+ '7252': '3.1',
+ '7262': '3.2',
+ '7272': '2.9',
+ '7282': '2.8',
+ '7302': '3.0',
+ '7352': '2.3',
+ '7402': '2.8',
+ '7452': '2.35',
+ '7502': '2.5',
+ '7532': '2.4',
+ '7542': '2.9',
+ '7552': '2.2',
+ '7642': '2.3',
+ '7662': '2.0',
+ '7702': '2.0',
+ '7742': '2.25',
+ '7H12': '2.6',
+ '7F32': '3.7',
+ '7F52': '3.5',
+ '7F72': '3.2',
+
+ // Epyc (Milan)
+
+ '7763': '2.45',
+ '7713': '2.0',
+ '7713P': '2.0',
+ '7663': '2.0',
+ '7643': '2.3',
+ '75F3': '2.95',
+ '7543': '2.8',
+ '7543P': '2.8',
+ '7513': '2.6',
+ '7453': '2.75',
+ '74F3': '3.2',
+ '7443': '2.85',
+ '7443P': '2.85',
+ '7413': '2.65',
+ '73F3': '3.5',
+ '7343': '3.2',
+ '7313': '3.0',
+ '7313P': '3.0',
+ '72F3': '3.7',
+
+ // ZEN3
+ '5600X': '3.7',
+ '5800X': '3.8',
+ '5900X': '3.7',
+ '5950X': '3.4'
+};
+
+
+const socketTypes = {
+ 1: 'Other',
+ 2: 'Unknown',
+ 3: 'Daughter Board',
+ 4: 'ZIF Socket',
+ 5: 'Replacement/Piggy Back',
+ 6: 'None',
+ 7: 'LIF Socket',
+ 8: 'Slot 1',
+ 9: 'Slot 2',
+ 10: '370 Pin Socket',
+ 11: 'Slot A',
+ 12: 'Slot M',
+ 13: '423',
+ 14: 'A (Socket 462)',
+ 15: '478',
+ 16: '754',
+ 17: '940',
+ 18: '939',
+ 19: 'mPGA604',
+ 20: 'LGA771',
+ 21: 'LGA775',
+ 22: 'S1',
+ 23: 'AM2',
+ 24: 'F (1207)',
+ 25: 'LGA1366',
+ 26: 'G34',
+ 27: 'AM3',
+ 28: 'C32',
+ 29: 'LGA1156',
+ 30: 'LGA1567',
+ 31: 'PGA988A',
+ 32: 'BGA1288',
+ 33: 'rPGA988B',
+ 34: 'BGA1023',
+ 35: 'BGA1224',
+ 36: 'LGA1155',
+ 37: 'LGA1356',
+ 38: 'LGA2011',
+ 39: 'FS1',
+ 40: 'FS2',
+ 41: 'FM1',
+ 42: 'FM2',
+ 43: 'LGA2011-3',
+ 44: 'LGA1356-3',
+ 45: 'LGA1150',
+ 46: 'BGA1168',
+ 47: 'BGA1234',
+ 48: 'BGA1364',
+ 49: 'AM4',
+ 50: 'LGA1151',
+ 51: 'BGA1356',
+ 52: 'BGA1440',
+ 53: 'BGA1515',
+ 54: 'LGA3647-1',
+ 55: 'SP3',
+ 56: 'SP3r2',
+ 57: 'LGA2066',
+ 58: 'BGA1392',
+ 59: 'BGA1510',
+ 60: 'BGA1528',
+ 61: 'LGA4189',
+ 62: 'LGA1200',
+ 63: 'LGA4677',
+};
+
+const socketTypesByName = {
+ 'LGA1150': 'i7-5775C i3-4340 i3-4170 G3250 i3-4160T i3-4160 E3-1231 G3258 G3240 i7-4790S i7-4790K i7-4790 i5-4690K i5-4690 i5-4590T i5-4590S i5-4590 i5-4460 i3-4360 i3-4150 G1820 G3420 G3220 i7-4771 i5-4440 i3-4330 i3-4130T i3-4130 E3-1230 i7-4770S i7-4770K i7-4770 i5-4670K i5-4670 i5-4570T i5-4570S i5-4570 i5-4430',
+ 'LGA1151': 'i9-9900KS E-2288G E-2224 G5420 i9-9900T i9-9900 i7-9700T i7-9700F i7-9700E i7-9700 i5-9600 i5-9500T i5-9500F i5-9500 i5-9400T i3-9350K i3-9300 i3-9100T i3-9100F i3-9100 G4930 i9-9900KF i7-9700KF i5-9600KF i5-9400F i5-9400 i3-9350KF i9-9900K i7-9700K i5-9600K G5500 G5400 i7-8700T i7-8086K i5-8600 i5-8500T i5-8500 i5-8400T i3-8300 i3-8100T G4900 i7-8700K i7-8700 i5-8600K i5-8400 i3-8350K i3-8100 E3-1270 G4600 G4560 i7-7700T i7-7700K i7-7700 i5-7600K i5-7600 i5-7500T i5-7500 i5-7400 i3-7350K i3-7300 i3-7100T i3-7100 G3930 G3900 G4400 i7-6700T i7-6700K i7-6700 i5-6600K i5-6600 i5-6500T i5-6500 i5-6400T i5-6400 i3-6300 i3-6100T i3-6100 E3-1270 E3-1270 T4500 T4400',
+ '1155': 'G440 G460 G465 G470 G530T G540T G550T G1610T G1620T G530 G540 G1610 G550 G1620 G555 G1630 i3-2100T i3-2120T i3-3220T i3-3240T i3-3250T i3-2100 i3-2105 i3-2102 i3-3210 i3-3220 i3-2125 i3-2120 i3-3225 i3-2130 i3-3245 i3-3240 i3-3250 i5-3570T i5-2500T i5-2400S i5-2405S i5-2390T i5-3330S i5-2500S i5-3335S i5-2300 i5-3450S i5-3340S i5-3470S i5-3475S i5-3470T i5-2310 i5-3550S i5-2320 i5-3330 i5-3350P i5-3450 i5-2400 i5-3340 i5-3570S i5-2380P i5-2450P i5-3470 i5-2500K i5-3550 i5-2500 i5-3570 i5-3570K i5-2550K i7-3770T i7-2600S i7-3770S i7-2600K i7-2600 i7-3770 i7-3770K i7-2700K G620T G630T G640T G2020T G645T G2100T G2030T G622 G860T G620 G632 G2120T G630 G640 G2010 G840 G2020 G850 G645 G2030 G860 G2120 G870 G2130 G2140 E3-1220L E3-1220L E3-1260L E3-1265L E3-1220 E3-1225 E3-1220 E3-1235 E3-1225 E3-1230 E3-1230 E3-1240 E3-1245 E3-1270 E3-1275 E3-1240 E3-1245 E3-1270 E3-1280 E3-1275 E3-1290 E3-1280 E3-1290'
+};
+
+function getSocketTypesByName(str) {
+ let result = '';
+ for (const key in socketTypesByName) {
+ const names = socketTypesByName[key].split(' ');
+ for (let i = 0; i < names.length; i++) {
+ if (str.indexOf(names[i]) >= 0) {
+ result = key;
+ }
+ }
+ }
+ return result;
+}
+
+function cpuManufacturer(str) {
+ let result = str;
+ str = str.toLowerCase();
+
+ if (str.indexOf('intel') >= 0) { result = 'Intel'; }
+ if (str.indexOf('amd') >= 0) { result = 'AMD'; }
+ if (str.indexOf('qemu') >= 0) { result = 'QEMU'; }
+ if (str.indexOf('hygon') >= 0) { result = 'Hygon'; }
+ if (str.indexOf('centaur') >= 0) { result = 'WinChip/Via'; }
+ if (str.indexOf('vmware') >= 0) { result = 'VMware'; }
+ if (str.indexOf('Xen') >= 0) { result = 'Xen Hypervisor'; }
+ if (str.indexOf('tcg') >= 0) { result = 'QEMU'; }
+ if (str.indexOf('apple') >= 0) { result = 'Apple'; }
+
+ return result;
+}
+
+function cpuBrandManufacturer(res) {
+ res.brand = res.brand.replace(/\(R\)+/g, '®').replace(/\s+/g, ' ').trim();
+ res.brand = res.brand.replace(/\(TM\)+/g, '™').replace(/\s+/g, ' ').trim();
+ res.brand = res.brand.replace(/\(C\)+/g, '©').replace(/\s+/g, ' ').trim();
+ res.brand = res.brand.replace(/CPU+/g, '').replace(/\s+/g, ' ').trim();
+ res.manufacturer = cpuManufacturer(res.brand);
+
+ let parts = res.brand.split(' ');
+ parts.shift();
+ res.brand = parts.join(' ');
+ return res;
+}
+
+function getAMDSpeed(brand) {
+ let result = '0';
+ for (let key in AMDBaseFrequencies) {
+ if ({}.hasOwnProperty.call(AMDBaseFrequencies, key)) {
+ let parts = key.split('|');
+ let found = 0;
+ parts.forEach(item => {
+ if (brand.indexOf(item) > -1) {
+ found++;
+ }
+ });
+ if (found === parts.length) {
+ result = AMDBaseFrequencies[key];
+ }
+ }
+ }
+ return parseFloat(result);
+}
+
+// --------------------------
+// CPU - brand, speed
+
+function getCpu() {
+
+ return new Promise((resolve) => {
+ process.nextTick(() => {
+ const UNKNOWN = 'unknown';
+ let result = {
+ manufacturer: UNKNOWN,
+ brand: UNKNOWN,
+ vendor: '',
+ family: '',
+ model: '',
+ stepping: '',
+ revision: '',
+ voltage: '',
+ speed: 0,
+ speedMin: 0,
+ speedMax: 0,
+ governor: '',
+ cores: util.cores(),
+ physicalCores: util.cores(),
+ performanceCores: util.cores(),
+ efficiencyCores: 0,
+ processors: 1,
+ socket: '',
+ flags: '',
+ virtualization: false,
+ cache: {}
+ };
+ cpuFlags().then(flags => {
+ result.flags = flags;
+ result.virtualization = flags.indexOf('vmx') > -1 || flags.indexOf('svm') > -1;
+ if (_darwin) {
+ exec('sysctl machdep.cpu hw.cpufrequency_max hw.cpufrequency_min hw.packages hw.physicalcpu_max hw.ncpu hw.tbfrequency hw.cpufamily hw.cpusubfamily', function (error, stdout) {
+ let lines = stdout.toString().split('\n');
+ const modelline = util.getValue(lines, 'machdep.cpu.brand_string');
+ const modellineParts = modelline.split('@');
+ result.brand = modellineParts[0].trim();
+ const speed = modellineParts[1] ? modellineParts[1].trim() : '0';
+ result.speed = parseFloat(speed.replace(/GHz+/g, ''));
+ let tbFrequency = util.getValue(lines, 'hw.tbfrequency') / 1000000000.0;
+ tbFrequency = tbFrequency < 0.1 ? tbFrequency * 100 : tbFrequency;
+ result.speed = result.speed === 0 ? tbFrequency : result.speed;
+
+ _cpu_speed = result.speed;
+ result = cpuBrandManufacturer(result);
+ result.speedMin = util.getValue(lines, 'hw.cpufrequency_min') ? (util.getValue(lines, 'hw.cpufrequency_min') / 1000000000.0) : result.speed;
+ result.speedMax = util.getValue(lines, 'hw.cpufrequency_max') ? (util.getValue(lines, 'hw.cpufrequency_max') / 1000000000.0) : result.speed;
+ result.vendor = util.getValue(lines, 'machdep.cpu.vendor') || 'Apple';
+ result.family = util.getValue(lines, 'machdep.cpu.family') || util.getValue(lines, 'hw.cpufamily');
+ result.model = util.getValue(lines, 'machdep.cpu.model');
+ result.stepping = util.getValue(lines, 'machdep.cpu.stepping') || util.getValue(lines, 'hw.cpusubfamily');
+ result.virtualization = true;
+ const countProcessors = util.getValue(lines, 'hw.packages');
+ const countCores = util.getValue(lines, 'hw.physicalcpu_max');
+ const countThreads = util.getValue(lines, 'hw.ncpu');
+ if (os.arch() === 'arm64') {
+ const clusters = execSync('ioreg -c IOPlatformDevice -d 3 -r | grep cluster-type').toString().split('\n');
+ const efficiencyCores = clusters.filter(line => line.indexOf('"E"') >= 0).length;
+ const performanceCores = clusters.filter(line => line.indexOf('"P"') >= 0).length;
+ result.socket = 'SOC';
+ result.efficiencyCores = efficiencyCores;
+ result.performanceCores = performanceCores;
+ }
+ if (countProcessors) {
+ result.processors = parseInt(countProcessors) || 1;
+ }
+ if (countCores && countThreads) {
+ result.cores = parseInt(countThreads) || util.cores();
+ result.physicalCores = parseInt(countCores) || util.cores();
+ }
+ cpuCache().then((res) => {
+ result.cache = res;
+ resolve(result);
+ });
+ });
+ }
+ if (_linux) {
+ let modelline = '';
+ let lines = [];
+ if (os.cpus()[0] && os.cpus()[0].model) { modelline = os.cpus()[0].model; }
+ exec('export LC_ALL=C; lscpu; echo -n "Governor: "; cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor 2>/dev/null; echo; unset LC_ALL', function (error, stdout) {
+ if (!error) {
+ lines = stdout.toString().split('\n');
+ }
+ modelline = util.getValue(lines, 'model name') || modelline;
+ const modellineParts = modelline.split('@');
+ result.brand = modellineParts[0].trim();
+ result.speed = modellineParts[1] ? parseFloat(modellineParts[1].trim()) : 0;
+ if (result.speed === 0 && (result.brand.indexOf('AMD') > -1 || result.brand.toLowerCase().indexOf('ryzen') > -1)) {
+ result.speed = getAMDSpeed(result.brand);
+ }
+ if (result.speed === 0) {
+ const current = getCpuCurrentSpeedSync();
+ if (current.avg !== 0) { result.speed = current.avg; }
+ }
+ _cpu_speed = result.speed;
+ result.speedMin = Math.round(parseFloat(util.getValue(lines, 'cpu min mhz').replace(/,/g, '.')) / 10.0) / 100;
+ result.speedMax = Math.round(parseFloat(util.getValue(lines, 'cpu max mhz').replace(/,/g, '.')) / 10.0) / 100;
+
+ result = cpuBrandManufacturer(result);
+ result.vendor = cpuManufacturer(util.getValue(lines, 'vendor id'));
+
+ result.family = util.getValue(lines, 'cpu family');
+ result.model = util.getValue(lines, 'model:');
+ result.stepping = util.getValue(lines, 'stepping');
+ result.revision = util.getValue(lines, 'cpu revision');
+ result.cache.l1d = util.getValue(lines, 'l1d cache');
+ if (result.cache.l1d) { result.cache.l1d = parseInt(result.cache.l1d) * (result.cache.l1d.indexOf('M') !== -1 ? 1024 * 1024 : (result.cache.l1d.indexOf('K') !== -1 ? 1024 : 1)); }
+ result.cache.l1i = util.getValue(lines, 'l1i cache');
+ if (result.cache.l1i) { result.cache.l1i = parseInt(result.cache.l1i) * (result.cache.l1i.indexOf('M') !== -1 ? 1024 * 1024 : (result.cache.l1i.indexOf('K') !== -1 ? 1024 : 1)); }
+ result.cache.l2 = util.getValue(lines, 'l2 cache');
+ if (result.cache.l2) { result.cache.l2 = parseInt(result.cache.l2) * (result.cache.l2.indexOf('M') !== -1 ? 1024 * 1024 : (result.cache.l2.indexOf('K') !== -1 ? 1024 : 1)); }
+ result.cache.l3 = util.getValue(lines, 'l3 cache');
+ if (result.cache.l3) { result.cache.l3 = parseInt(result.cache.l3) * (result.cache.l3.indexOf('M') !== -1 ? 1024 * 1024 : (result.cache.l3.indexOf('K') !== -1 ? 1024 : 1)); }
+
+ const threadsPerCore = util.getValue(lines, 'thread(s) per core') || '1';
+ const processors = util.getValue(lines, 'socket(s)') || '1';
+ let threadsPerCoreInt = parseInt(threadsPerCore, 10); // threads per code (normally only for performance cores)
+ let processorsInt = parseInt(processors, 10) || 1; // number of sockets / processor units in machine (normally 1)
+ const coresPerSocket = parseInt(util.getValue(lines, 'core(s) per socket'), 10); // number of cores (e.g. 16 on i12900)
+ result.physicalCores = coresPerSocket ? coresPerSocket * processorsInt : result.cores / threadsPerCoreInt;
+ result.performanceCores = threadsPerCoreInt > 1 ? result.cores - result.physicalCores : result.cores;
+ result.efficiencyCores = threadsPerCoreInt > 1 ? result.cores - (threadsPerCoreInt * result.performanceCores) : 0;
+ result.processors = processorsInt;
+ result.governor = util.getValue(lines, 'governor') || '';
+
+ // Test Raspberry
+ if (result.vendor === 'ARM') {
+ const linesRpi = fs.readFileSync('/proc/cpuinfo').toString().split('\n');
+ const rPIRevision = util.decodePiCpuinfo(linesRpi);
+ if (rPIRevision.model.toLowerCase().indexOf('raspberry') >= 0) {
+ result.family = result.manufacturer;
+ result.manufacturer = rPIRevision.manufacturer;
+ result.brand = rPIRevision.processor;
+ result.revision = rPIRevision.revisionCode;
+ result.socket = 'SOC';
+ }
+ }
+
+ // socket type
+ let lines2 = [];
+ exec('export LC_ALL=C; dmidecode –t 4 2>/dev/null | grep "Upgrade: Socket"; unset LC_ALL', function (error2, stdout2) {
+ lines2 = stdout2.toString().split('\n');
+ if (lines2 && lines2.length) {
+ result.socket = util.getValue(lines2, 'Upgrade').replace('Socket', '').trim() || result.socket;
+ }
+ resolve(result);
+ });
+ });
+ }
+ if (_freebsd || _openbsd || _netbsd) {
+ let modelline = '';
+ let lines = [];
+ if (os.cpus()[0] && os.cpus()[0].model) { modelline = os.cpus()[0].model; }
+ exec('export LC_ALL=C; dmidecode -t 4; dmidecode -t 7 unset LC_ALL', function (error, stdout) {
+ let cache = [];
+ if (!error) {
+ const data = stdout.toString().split('# dmidecode');
+ const processor = data.length > 1 ? data[1] : '';
+ cache = data.length > 2 ? data[2].split('Cache Information') : [];
+
+ lines = processor.split('\n');
+ }
+ result.brand = modelline.split('@')[0].trim();
+ result.speed = modelline.split('@')[1] ? parseFloat(modelline.split('@')[1].trim()) : 0;
+ if (result.speed === 0 && (result.brand.indexOf('AMD') > -1 || result.brand.toLowerCase().indexOf('ryzen') > -1)) {
+ result.speed = getAMDSpeed(result.brand);
+ }
+ if (result.speed === 0) {
+ const current = getCpuCurrentSpeedSync();
+ if (current.avg !== 0) { result.speed = current.avg; }
+ }
+ _cpu_speed = result.speed;
+ result.speedMin = result.speed;
+ result.speedMax = Math.round(parseFloat(util.getValue(lines, 'max speed').replace(/Mhz/g, '')) / 10.0) / 100;
+
+ result = cpuBrandManufacturer(result);
+ result.vendor = cpuManufacturer(util.getValue(lines, 'manufacturer'));
+ let sig = util.getValue(lines, 'signature');
+ sig = sig.split(',');
+ for (let i = 0; i < sig.length; i++) {
+ sig[i] = sig[i].trim();
+ }
+ result.family = util.getValue(sig, 'Family', ' ', true);
+ result.model = util.getValue(sig, 'Model', ' ', true);
+ result.stepping = util.getValue(sig, 'Stepping', ' ', true);
+ result.revision = '';
+ const voltage = parseFloat(util.getValue(lines, 'voltage'));
+ result.voltage = isNaN(voltage) ? '' : voltage.toFixed(2);
+ for (let i = 0; i < cache.length; i++) {
+ lines = cache[i].split('\n');
+ let cacheType = util.getValue(lines, 'Socket Designation').toLowerCase().replace(' ', '-').split('-');
+ cacheType = cacheType.length ? cacheType[0] : '';
+ const sizeParts = util.getValue(lines, 'Installed Size').split(' ');
+ let size = parseInt(sizeParts[0], 10);
+ const unit = sizeParts.length > 1 ? sizeParts[1] : 'kb';
+ size = size * (unit === 'kb' ? 1024 : (unit === 'mb' ? 1024 * 1024 : (unit === 'gb' ? 1024 * 1024 * 1024 : 1)));
+ if (cacheType) {
+ if (cacheType === 'l1') {
+ result.cache[cacheType + 'd'] = size / 2;
+ result.cache[cacheType + 'i'] = size / 2;
+ } else {
+ result.cache[cacheType] = size;
+ }
+ }
+ }
+ // socket type
+ result.socket = util.getValue(lines, 'Upgrade').replace('Socket', '').trim();
+ // # threads / # cores
+ const threadCount = util.getValue(lines, 'thread count').trim();
+ const coreCount = util.getValue(lines, 'core count').trim();
+ if (coreCount && threadCount) {
+ result.cores = parseInt(threadCount, 10);
+ result.physicalCores = parseInt(coreCount, 10);
+ }
+ resolve(result);
+ });
+ }
+ if (_sunos) {
+ resolve(result);
+ }
+ if (_windows) {
+ try {
+ const workload = [];
+ workload.push(util.powerShell('Get-WmiObject Win32_processor | select Name, Revision, L2CacheSize, L3CacheSize, Manufacturer, MaxClockSpeed, Description, UpgradeMethod, Caption, NumberOfLogicalProcessors, NumberOfCores | fl'));
+ workload.push(util.powerShell('Get-WmiObject Win32_CacheMemory | select CacheType,InstalledSize,Level | fl'));
+ workload.push(util.powerShell('(Get-CimInstance Win32_ComputerSystem).HypervisorPresent'));
+
+ Promise.all(
+ workload
+ ).then((data) => {
+ let lines = data[0].split('\r\n');
+ let name = util.getValue(lines, 'name', ':') || '';
+ if (name.indexOf('@') >= 0) {
+ result.brand = name.split('@')[0].trim();
+ result.speed = name.split('@')[1] ? parseFloat(name.split('@')[1].trim()) : 0;
+ _cpu_speed = result.speed;
+ } else {
+ result.brand = name.trim();
+ result.speed = 0;
+ }
+ result = cpuBrandManufacturer(result);
+ result.revision = util.getValue(lines, 'revision', ':');
+ result.cache.l1d = 0;
+ result.cache.l1i = 0;
+ result.cache.l2 = util.getValue(lines, 'l2cachesize', ':');
+ result.cache.l3 = util.getValue(lines, 'l3cachesize', ':');
+ if (result.cache.l2) { result.cache.l2 = parseInt(result.cache.l2, 10) * 1024; }
+ if (result.cache.l3) { result.cache.l3 = parseInt(result.cache.l3, 10) * 1024; }
+ result.vendor = util.getValue(lines, 'manufacturer', ':');
+ result.speedMax = Math.round(parseFloat(util.getValue(lines, 'maxclockspeed', ':').replace(/,/g, '.')) / 10.0) / 100;
+ if (result.speed === 0 && (result.brand.indexOf('AMD') > -1 || result.brand.toLowerCase().indexOf('ryzen') > -1)) {
+ result.speed = getAMDSpeed(result.brand);
+ }
+ if (result.speed === 0) {
+ result.speed = result.speedMax;
+ }
+ result.speedMin = result.speed;
+
+ let description = util.getValue(lines, 'description', ':').split(' ');
+ for (let i = 0; i < description.length; i++) {
+ if (description[i].toLowerCase().startsWith('family') && (i + 1) < description.length && description[i + 1]) {
+ result.family = description[i + 1];
+ }
+ if (description[i].toLowerCase().startsWith('model') && (i + 1) < description.length && description[i + 1]) {
+ result.model = description[i + 1];
+ }
+ if (description[i].toLowerCase().startsWith('stepping') && (i + 1) < description.length && description[i + 1]) {
+ result.stepping = description[i + 1];
+ }
+ }
+ // socket type
+ const socketId = util.getValue(lines, 'UpgradeMethod', ':');
+ if (socketTypes[socketId]) {
+ result.socket = socketTypes[socketId];
+ }
+ const socketByName = getSocketTypesByName(name);
+ if (socketByName) {
+ result.socket = socketByName;
+ }
+ // # threads / # cores
+ const countProcessors = util.countLines(lines, 'Caption');
+ const countThreads = util.getValue(lines, 'NumberOfLogicalProcessors', ':');
+ const countCores = util.getValue(lines, 'NumberOfCores', ':');
+ if (countProcessors) {
+ result.processors = parseInt(countProcessors) || 1;
+ }
+ if (countCores && countThreads) {
+ result.cores = parseInt(countThreads) || util.cores();
+ result.physicalCores = parseInt(countCores) || util.cores();
+ }
+ if (countProcessors > 1) {
+ result.cores = result.cores * countProcessors;
+ result.physicalCores = result.physicalCores * countProcessors;
+ }
+ const parts = data[1].split(/\n\s*\n/);
+ parts.forEach(function (part) {
+ lines = part.split('\r\n');
+ const cacheType = util.getValue(lines, 'CacheType');
+ const level = util.getValue(lines, 'Level');
+ const installedSize = util.getValue(lines, 'InstalledSize');
+ // L1 Instructions
+ if (level === '3' && cacheType === '3') {
+ result.cache.l1i = parseInt(installedSize, 10);
+ }
+ // L1 Data
+ if (level === '3' && cacheType === '4') {
+ result.cache.l1d = parseInt(installedSize, 10);
+ }
+ // L1 all
+ if (level === '3' && cacheType === '5' && !result.cache.l1i && !result.cache.l1d) {
+ result.cache.l1i = parseInt(installedSize, 10) / 2;
+ result.cache.l1d = parseInt(installedSize, 10) / 2;
+ }
+ });
+ const hyperv = data[2] ? data[2].toString().toLowerCase() : '';
+ result.virtualization = hyperv.indexOf('true') !== -1;
+
+ resolve(result);
+ });
+ } catch (e) {
+ resolve(result);
+ }
+ }
+ });
+ });
+ });
+}
+
+// --------------------------
+// CPU - Processor Data
+
+function cpu(callback) {
+
+ return new Promise((resolve) => {
+ process.nextTick(() => {
+ getCpu().then(result => {
+ if (callback) { callback(result); }
+ resolve(result);
+ });
+ });
+ });
+}
+
+exports.cpu = cpu;
+
+// --------------------------
+// CPU - current speed - in GHz
+
+function getCpuCurrentSpeedSync() {
+
+ let cpus = os.cpus();
+ let minFreq = 999999999;
+ let maxFreq = 0;
+ let avgFreq = 0;
+ let cores = [];
+
+ if (cpus && cpus.length) {
+ for (let i in cpus) {
+ if ({}.hasOwnProperty.call(cpus, i)) {
+ let freq = cpus[i].speed > 100 ? (cpus[i].speed + 1) / 1000 : cpus[i].speed / 10;
+ avgFreq = avgFreq + freq;
+ if (freq > maxFreq) { maxFreq = freq; }
+ if (freq < minFreq) { minFreq = freq; }
+ cores.push(parseFloat(freq.toFixed(2)));
+ }
+ }
+ avgFreq = avgFreq / cpus.length;
+ return {
+ min: parseFloat(minFreq.toFixed(2)),
+ max: parseFloat(maxFreq.toFixed(2)),
+ avg: parseFloat((avgFreq).toFixed(2)),
+ cores: cores
+ };
+ } else {
+ return {
+ min: 0,
+ max: 0,
+ avg: 0,
+ cores: cores
+ };
+ }
+}
+
+function cpuCurrentSpeed(callback) {
+
+ return new Promise((resolve) => {
+ process.nextTick(() => {
+ let result = getCpuCurrentSpeedSync();
+ if (result.avg === 0 && _cpu_speed !== 0) {
+ const currCpuSpeed = parseFloat(_cpu_speed);
+ result = {
+ min: currCpuSpeed,
+ max: currCpuSpeed,
+ avg: currCpuSpeed,
+ cores: []
+ };
+ }
+ if (callback) { callback(result); }
+ resolve(result);
+ });
+ });
+}
+
+exports.cpuCurrentSpeed = cpuCurrentSpeed;
+
+// --------------------------
+// CPU - temperature
+// if sensors are installed
+
+function cpuTemperature(callback) {
+
+ return new Promise((resolve) => {
+ process.nextTick(() => {
+ let result = {
+ main: null,
+ cores: [],
+ max: null,
+ socket: [],
+ chipset: null
+ };
+ if (_linux) {
+ // CPU Chipset, Socket
+ try {
+ const cmd = 'cat /sys/class/thermal/thermal_zone*/type 2>/dev/null; echo "-----"; cat /sys/class/thermal/thermal_zone*/temp 2>/dev/null;';
+ const parts = execSync(cmd).toString().split('-----\n');
+ if (parts.length === 2) {
+ const lines = parts[0].split('\n');
+ const lines2 = parts[1].split('\n');
+ for (let i = 0; i < lines.length; i++) {
+ const line = lines[i].trim();
+ if (line.startsWith('acpi') && lines2[i]) {
+ result.socket.push(Math.round(parseInt(lines2[i], 10) / 100) / 10);
+ }
+ if (line.startsWith('pch') && lines2[i]) {
+ result.chipset = Math.round(parseInt(lines2[i], 10) / 100) / 10;
+ }
+ }
+ }
+ } catch (e) {
+ util.noop();
+ }
+
+ const cmd = 'for mon in /sys/class/hwmon/hwmon*; do for label in "$mon"/temp*_label; do if [ -f $label ]; then value=${label%_*}_input; echo $(cat "$label")___$(cat "$value"); fi; done; done;';
+ try {
+ exec(cmd, function (error, stdout) {
+ stdout = stdout.toString();
+ const tdiePos = stdout.toLowerCase().indexOf('tdie');
+ if (tdiePos !== -1) {
+ stdout = stdout.substring(tdiePos);
+ }
+ let lines = stdout.split('\n');
+ lines.forEach(line => {
+ const parts = line.split('___');
+ const label = parts[0];
+ const value = parts.length > 1 && parts[1] ? parts[1] : '0';
+ if (value && (label === undefined || (label && label.toLowerCase().startsWith('core')))) {
+ result.cores.push(Math.round(parseInt(value, 10) / 100) / 10);
+ } else if (value && label && result.main === null) {
+ result.main = Math.round(parseInt(value, 10) / 100) / 10;
+ }
+ });
+
+ if (result.cores.length > 0) {
+ result.main = Math.round(result.cores.reduce((a, b) => a + b, 0) / result.cores.length);
+ let maxtmp = Math.max.apply(Math, result.cores);
+ result.max = (maxtmp > result.main) ? maxtmp : result.main;
+ }
+ if (result.main !== null) {
+ if (result.max === null) {
+ result.max = result.main;
+ }
+ if (callback) { callback(result); }
+ resolve(result);
+ return;
+ }
+ exec('sensors', function (error, stdout) {
+ if (!error) {
+ let lines = stdout.toString().split('\n');
+ let tdieTemp = null;
+ let newSectionStarts = true;
+ let section = '';
+ lines.forEach(function (line) {
+ // determine section
+ if (line.trim() === '') {
+ newSectionStarts = true;
+ } else if (newSectionStarts) {
+ if (line.trim().toLowerCase().startsWith('acpi')) { section = 'acpi'; }
+ if (line.trim().toLowerCase().startsWith('pch')) { section = 'pch'; }
+ if (line.trim().toLowerCase().startsWith('core')) { section = 'core'; }
+ newSectionStarts = false;
+ }
+ let regex = /[+-]([^°]*)/g;
+ let temps = line.match(regex);
+ let firstPart = line.split(':')[0].toUpperCase();
+ if (section === 'acpi') {
+ // socket temp
+ if (firstPart.indexOf('TEMP') !== -1) {
+ result.socket.push(parseFloat(temps));
+ }
+ } else if (section === 'pch') {
+ // chipset temp
+ if (firstPart.indexOf('TEMP') !== -1) {
+ result.chipset = parseFloat(temps);
+ }
+ }
+ // cpu temp
+ if (firstPart.indexOf('PHYSICAL') !== -1 || firstPart.indexOf('PACKAGE') !== -1) {
+ result.main = parseFloat(temps);
+ }
+ if (firstPart.indexOf('CORE ') !== -1) {
+ result.cores.push(parseFloat(temps));
+ }
+ if (firstPart.indexOf('TDIE') !== -1 && tdieTemp === null) {
+ tdieTemp = parseFloat(temps);
+ }
+ });
+ if (result.cores.length > 0) {
+ result.main = Math.round(result.cores.reduce((a, b) => a + b, 0) / result.cores.length);
+ let maxtmp = Math.max.apply(Math, result.cores);
+ result.max = (maxtmp > result.main) ? maxtmp : result.main;
+ } else {
+ if (result.main === null && tdieTemp !== null) {
+ result.main = tdieTemp;
+ result.max = tdieTemp;
+ }
+ }
+ if (result.main !== null || result.max !== null) {
+ if (callback) { callback(result); }
+ resolve(result);
+ return;
+ }
+ }
+ fs.stat('/sys/class/thermal/thermal_zone0/temp', function (err) {
+ if (err === null) {
+ fs.readFile('/sys/class/thermal/thermal_zone0/temp', function (error, stdout) {
+ if (!error) {
+ let lines = stdout.toString().split('\n');
+ if (lines.length > 0) {
+ result.main = parseFloat(lines[0]) / 1000.0;
+ result.max = result.main;
+ }
+ }
+ if (callback) { callback(result); }
+ resolve(result);
+ });
+ } else {
+ exec('/opt/vc/bin/vcgencmd measure_temp', function (error, stdout) {
+ if (!error) {
+ let lines = stdout.toString().split('\n');
+ if (lines.length > 0 && lines[0].indexOf('=')) {
+ result.main = parseFloat(lines[0].split('=')[1]);
+ result.max = result.main;
+ }
+ }
+ if (callback) { callback(result); }
+ resolve(result);
+ });
+ }
+ });
+ });
+ });
+ } catch (er) {
+ if (callback) { callback(result); }
+ resolve(result);
+ }
+ }
+ if (_freebsd || _openbsd || _netbsd) {
+ exec('sysctl dev.cpu | grep temp', function (error, stdout) {
+ if (!error) {
+ let lines = stdout.toString().split('\n');
+ let sum = 0;
+ lines.forEach(function (line) {
+ const parts = line.split(':');
+ if (parts.length > 1) {
+ const temp = parseFloat(parts[1].replace(',', '.'));
+ if (temp > result.max) { result.max = temp; }
+ sum = sum + temp;
+ result.cores.push(temp);
+ }
+ });
+ if (result.cores.length) {
+ result.main = Math.round(sum / result.cores.length * 100) / 100;
+ }
+ }
+ if (callback) { callback(result); }
+ resolve(result);
+ });
+ }
+ if (_darwin) {
+ let osxTemp = null;
+ try {
+ osxTemp = require('osx-temperature-sensor');
+ } catch (er) {
+ osxTemp = null;
+ }
+ if (osxTemp) {
+ result = osxTemp.cpuTemperature();
+ // round to 2 digits
+ if (result.main) {
+ result.main = Math.round(result.main * 100) / 100;
+ }
+ if (result.max) {
+ result.max = Math.round(result.max * 100) / 100;
+ }
+ if (result.cores && result.cores.length) {
+ for (let i = 0; i < result.cores.length; i++) {
+ result.cores[i] = Math.round(result.cores[i] * 100) / 100;
+ }
+ }
+ }
+
+ if (callback) { callback(result); }
+ resolve(result);
+ }
+ if (_sunos) {
+ if (callback) { callback(result); }
+ resolve(result);
+ }
+ if (_windows) {
+ try {
+ util.powerShell('Get-WmiObject MSAcpi_ThermalZoneTemperature -Namespace "root/wmi" | Select CurrentTemperature').then((stdout, error) => {
+ if (!error) {
+ let sum = 0;
+ let lines = stdout.split('\r\n').filter(line => line.trim() !== '').filter((line, idx) => idx > 0);
+ lines.forEach(function (line) {
+ let value = (parseInt(line, 10) - 2732) / 10;
+ if (!isNaN(value)) {
+ sum = sum + value;
+ if (value > result.max) { result.max = value; }
+ result.cores.push(value);
+ }
+ });
+ if (result.cores.length) {
+ result.main = sum / result.cores.length;
+ }
+ }
+ if (callback) { callback(result); }
+ resolve(result);
+ });
+ } catch (e) {
+ if (callback) { callback(result); }
+ resolve(result);
+ }
+ }
+ });
+ });
+}
+
+exports.cpuTemperature = cpuTemperature;
+
+// --------------------------
+// CPU Flags
+
+function cpuFlags(callback) {
+
+ return new Promise((resolve) => {
+ process.nextTick(() => {
+ let result = '';
+ if (_windows) {
+ try {
+ exec('reg query "HKEY_LOCAL_MACHINE\\HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\0" /v FeatureSet', util.execOptsWin, function (error, stdout) {
+ if (!error) {
+ let flag_hex = stdout.split('0x').pop().trim();
+ let flag_bin_unpadded = parseInt(flag_hex, 16).toString(2);
+ let flag_bin = '0'.repeat(32 - flag_bin_unpadded.length) + flag_bin_unpadded;
+ // empty flags are the reserved fields in the CPUID feature bit list
+ // as found on wikipedia:
+ // https://en.wikipedia.org/wiki/CPUID
+ let all_flags = [
+ 'fpu', 'vme', 'de', 'pse', 'tsc', 'msr', 'pae', 'mce', 'cx8', 'apic',
+ '', 'sep', 'mtrr', 'pge', 'mca', 'cmov', 'pat', 'pse-36', 'psn', 'clfsh',
+ '', 'ds', 'acpi', 'mmx', 'fxsr', 'sse', 'sse2', 'ss', 'htt', 'tm', 'ia64', 'pbe'
+ ];
+ for (let f = 0; f < all_flags.length; f++) {
+ if (flag_bin[f] === '1' && all_flags[f] !== '') {
+ result += ' ' + all_flags[f];
+ }
+ }
+ result = result.trim().toLowerCase();
+ }
+ if (callback) { callback(result); }
+ resolve(result);
+ });
+ } catch (e) {
+ if (callback) { callback(result); }
+ resolve(result);
+ }
+ }
+ if (_linux) {
+ try {
+
+ exec('export LC_ALL=C; lscpu; unset LC_ALL', function (error, stdout) {
+ if (!error) {
+ let lines = stdout.toString().split('\n');
+ lines.forEach(function (line) {
+ if (line.split(':')[0].toUpperCase().indexOf('FLAGS') !== -1) {
+ result = line.split(':')[1].trim().toLowerCase();
+ }
+ });
+ }
+ if (!result) {
+ fs.readFile('/proc/cpuinfo', function (error, stdout) {
+ if (!error) {
+ let lines = stdout.toString().split('\n');
+ result = util.getValue(lines, 'features', ':', true).toLowerCase();
+ }
+ if (callback) { callback(result); }
+ resolve(result);
+ });
+ } else {
+ if (callback) { callback(result); }
+ resolve(result);
+ }
+ });
+ } catch (e) {
+ if (callback) { callback(result); }
+ resolve(result);
+ }
+ }
+ if (_freebsd || _openbsd || _netbsd) {
+ exec('export LC_ALL=C; dmidecode -t 4 2>/dev/null; unset LC_ALL', function (error, stdout) {
+ let flags = [];
+ if (!error) {
+ let parts = stdout.toString().split('\tFlags:');
+ const lines = parts.length > 1 ? parts[1].split('\tVersion:')[0].split('\n') : [];
+ lines.forEach(function (line) {
+ let flag = (line.indexOf('(') ? line.split('(')[0].toLowerCase() : '').trim().replace(/\t/g, '');
+ if (flag) {
+ flags.push(flag);
+ }
+ });
+ }
+ result = flags.join(' ').trim().toLowerCase();
+ if (callback) { callback(result); }
+ resolve(result);
+ });
+ }
+ if (_darwin) {
+ exec('sysctl machdep.cpu.features', function (error, stdout) {
+ if (!error) {
+ let lines = stdout.toString().split('\n');
+ if (lines.length > 0 && lines[0].indexOf('machdep.cpu.features:') !== -1) {
+ result = lines[0].split(':')[1].trim().toLowerCase();
+ }
+ }
+ if (callback) { callback(result); }
+ resolve(result);
+ });
+ }
+ if (_sunos) {
+ if (callback) { callback(result); }
+ resolve(result);
+ }
+ });
+ });
+}
+
+exports.cpuFlags = cpuFlags;
+
+// --------------------------
+// CPU Cache
+
+function cpuCache(callback) {
+
+ return new Promise((resolve) => {
+ process.nextTick(() => {
+
+ let result = {
+ l1d: null,
+ l1i: null,
+ l2: null,
+ l3: null,
+ };
+ if (_linux) {
+ try {
+ exec('export LC_ALL=C; lscpu; unset LC_ALL', function (error, stdout) {
+ if (!error) {
+ let lines = stdout.toString().split('\n');
+ lines.forEach(function (line) {
+ let parts = line.split(':');
+ if (parts[0].toUpperCase().indexOf('L1D CACHE') !== -1) {
+ result.l1d = parseInt(parts[1].trim()) * (parts[1].indexOf('M') !== -1 ? 1024 * 1024 : (parts[1].indexOf('K') !== -1 ? 1024 : 1));
+ }
+ if (parts[0].toUpperCase().indexOf('L1I CACHE') !== -1) {
+ result.l1i = parseInt(parts[1].trim()) * (parts[1].indexOf('M') !== -1 ? 1024 * 1024 : (parts[1].indexOf('K') !== -1 ? 1024 : 1));
+ }
+ if (parts[0].toUpperCase().indexOf('L2 CACHE') !== -1) {
+ result.l2 = parseInt(parts[1].trim()) * (parts[1].indexOf('M') !== -1 ? 1024 * 1024 : (parts[1].indexOf('K') !== -1 ? 1024 : 1));
+ }
+ if (parts[0].toUpperCase().indexOf('L3 CACHE') !== -1) {
+ result.l3 = parseInt(parts[1].trim()) * (parts[1].indexOf('M') !== -1 ? 1024 * 1024 : (parts[1].indexOf('K') !== -1 ? 1024 : 1));
+ }
+ });
+ }
+ if (callback) { callback(result); }
+ resolve(result);
+ });
+ } catch (e) {
+ if (callback) { callback(result); }
+ resolve(result);
+ }
+ }
+ if (_freebsd || _openbsd || _netbsd) {
+ exec('export LC_ALL=C; dmidecode -t 7 2>/dev/null; unset LC_ALL', function (error, stdout) {
+ let cache = [];
+ if (!error) {
+ const data = stdout.toString();
+ cache = data.split('Cache Information');
+ cache.shift();
+ }
+ for (let i = 0; i < cache.length; i++) {
+ const lines = cache[i].split('\n');
+ let cacheType = util.getValue(lines, 'Socket Designation').toLowerCase().replace(' ', '-').split('-');
+ cacheType = cacheType.length ? cacheType[0] : '';
+ const sizeParts = util.getValue(lines, 'Installed Size').split(' ');
+ let size = parseInt(sizeParts[0], 10);
+ const unit = sizeParts.length > 1 ? sizeParts[1] : 'kb';
+ size = size * (unit === 'kb' ? 1024 : (unit === 'mb' ? 1024 * 1024 : (unit === 'gb' ? 1024 * 1024 * 1024 : 1)));
+ if (cacheType) {
+ if (cacheType === 'l1') {
+ result.cache[cacheType + 'd'] = size / 2;
+ result.cache[cacheType + 'i'] = size / 2;
+ } else {
+ result.cache[cacheType] = size;
+ }
+ }
+ }
+ if (callback) { callback(result); }
+ resolve(result);
+ });
+ }
+ if (_darwin) {
+ exec('sysctl hw.l1icachesize hw.l1dcachesize hw.l2cachesize hw.l3cachesize', function (error, stdout) {
+ if (!error) {
+ let lines = stdout.toString().split('\n');
+ lines.forEach(function (line) {
+ let parts = line.split(':');
+ if (parts[0].toLowerCase().indexOf('hw.l1icachesize') !== -1) {
+ result.l1d = parseInt(parts[1].trim()) * (parts[1].indexOf('K') !== -1 ? 1024 : 1);
+ }
+ if (parts[0].toLowerCase().indexOf('hw.l1dcachesize') !== -1) {
+ result.l1i = parseInt(parts[1].trim()) * (parts[1].indexOf('K') !== -1 ? 1024 : 1);
+ }
+ if (parts[0].toLowerCase().indexOf('hw.l2cachesize') !== -1) {
+ result.l2 = parseInt(parts[1].trim()) * (parts[1].indexOf('K') !== -1 ? 1024 : 1);
+ }
+ if (parts[0].toLowerCase().indexOf('hw.l3cachesize') !== -1) {
+ result.l3 = parseInt(parts[1].trim()) * (parts[1].indexOf('K') !== -1 ? 1024 : 1);
+ }
+ });
+ }
+ if (callback) { callback(result); }
+ resolve(result);
+ });
+ }
+ if (_sunos) {
+ if (callback) { callback(result); }
+ resolve(result);
+ }
+ if (_windows) {
+ try {
+ util.powerShell('Get-WmiObject Win32_processor | select L2CacheSize, L3CacheSize | fl').then((stdout, error) => {
+ if (!error) {
+ let lines = stdout.split('\r\n');
+ result.l1d = 0;
+ result.l1i = 0;
+ result.l2 = util.getValue(lines, 'l2cachesize', ':');
+ result.l3 = util.getValue(lines, 'l3cachesize', ':');
+ if (result.l2) { result.l2 = parseInt(result.l2, 10) * 1024; }
+ if (result.l3) { result.l3 = parseInt(result.l3, 10) * 1024; }
+ }
+ util.powerShell('Get-WmiObject Win32_CacheMemory | select CacheType,InstalledSize,Level | fl').then((stdout, error) => {
+ if (!error) {
+ const parts = stdout.split(/\n\s*\n/);
+ parts.forEach(function (part) {
+ const lines = part.split('\r\n');
+ const cacheType = util.getValue(lines, 'CacheType');
+ const level = util.getValue(lines, 'Level');
+ const installedSize = util.getValue(lines, 'InstalledSize');
+ // L1 Instructions
+ if (level === '3' && cacheType === '3') {
+ result.l1i = parseInt(installedSize, 10);
+ }
+ // L1 Data
+ if (level === '3' && cacheType === '4') {
+ result.l1d = parseInt(installedSize, 10);
+ }
+ // L1 all
+ if (level === '3' && cacheType === '5' && !result.l1i && !result.l1d) {
+ result.l1i = parseInt(installedSize, 10) / 2;
+ result.l1d = parseInt(installedSize, 10) / 2;
+ }
+ });
+ }
+ if (callback) { callback(result); }
+ resolve(result);
+ });
+ });
+ } catch (e) {
+ if (callback) { callback(result); }
+ resolve(result);
+ }
+ }
+ });
+ });
+}
+
+exports.cpuCache = cpuCache;
+
+// --------------------------
+// CPU - current load - in %
+
+function getLoad() {
+
+ return new Promise((resolve) => {
+ process.nextTick(() => {
+ let loads = os.loadavg().map(function (x) { return x / util.cores(); });
+ let avgLoad = parseFloat((Math.max.apply(Math, loads)).toFixed(2));
+ let result = {};
+
+ let now = Date.now() - _current_cpu.ms;
+ if (now >= 200) {
+ _current_cpu.ms = Date.now();
+ const cpus = os.cpus();
+ let totalUser = 0;
+ let totalSystem = 0;
+ let totalNice = 0;
+ let totalIrq = 0;
+ let totalIdle = 0;
+ let cores = [];
+ _corecount = (cpus && cpus.length) ? cpus.length : 0;
+
+ for (let i = 0; i < _corecount; i++) {
+ const cpu = cpus[i].times;
+ totalUser += cpu.user;
+ totalSystem += cpu.sys;
+ totalNice += cpu.nice;
+ totalIdle += cpu.idle;
+ totalIrq += cpu.irq;
+ let tmpTick = (_cpus && _cpus[i] && _cpus[i].totalTick ? _cpus[i].totalTick : 0);
+ let tmpLoad = (_cpus && _cpus[i] && _cpus[i].totalLoad ? _cpus[i].totalLoad : 0);
+ let tmpUser = (_cpus && _cpus[i] && _cpus[i].user ? _cpus[i].user : 0);
+ let tmpSystem = (_cpus && _cpus[i] && _cpus[i].sys ? _cpus[i].sys : 0);
+ let tmpNice = (_cpus && _cpus[i] && _cpus[i].nice ? _cpus[i].nice : 0);
+ let tmpIdle = (_cpus && _cpus[i] && _cpus[i].idle ? _cpus[i].idle : 0);
+ let tmpIrq = (_cpus && _cpus[i] && _cpus[i].irq ? _cpus[i].irq : 0);
+ _cpus[i] = cpu;
+ _cpus[i].totalTick = _cpus[i].user + _cpus[i].sys + _cpus[i].nice + _cpus[i].irq + _cpus[i].idle;
+ _cpus[i].totalLoad = _cpus[i].user + _cpus[i].sys + _cpus[i].nice + _cpus[i].irq;
+ _cpus[i].currentTick = _cpus[i].totalTick - tmpTick;
+ _cpus[i].load = (_cpus[i].totalLoad - tmpLoad);
+ _cpus[i].loadUser = (_cpus[i].user - tmpUser);
+ _cpus[i].loadSystem = (_cpus[i].sys - tmpSystem);
+ _cpus[i].loadNice = (_cpus[i].nice - tmpNice);
+ _cpus[i].loadIdle = (_cpus[i].idle - tmpIdle);
+ _cpus[i].loadIrq = (_cpus[i].irq - tmpIrq);
+ cores[i] = {};
+ cores[i].load = _cpus[i].load / _cpus[i].currentTick * 100;
+ cores[i].loadUser = _cpus[i].loadUser / _cpus[i].currentTick * 100;
+ cores[i].loadSystem = _cpus[i].loadSystem / _cpus[i].currentTick * 100;
+ cores[i].loadNice = _cpus[i].loadNice / _cpus[i].currentTick * 100;
+ cores[i].loadIdle = _cpus[i].loadIdle / _cpus[i].currentTick * 100;
+ cores[i].loadIrq = _cpus[i].loadIrq / _cpus[i].currentTick * 100;
+ cores[i].rawLoad = _cpus[i].load;
+ cores[i].rawLoadUser = _cpus[i].loadUser;
+ cores[i].rawLoadSystem = _cpus[i].loadSystem;
+ cores[i].rawLoadNice = _cpus[i].loadNice;
+ cores[i].rawLoadIdle = _cpus[i].loadIdle;
+ cores[i].rawLoadIrq = _cpus[i].loadIrq;
+ }
+ let totalTick = totalUser + totalSystem + totalNice + totalIrq + totalIdle;
+ let totalLoad = totalUser + totalSystem + totalNice + totalIrq;
+ let currentTick = totalTick - _current_cpu.tick;
+ result = {
+ avgLoad: avgLoad,
+ currentLoad: (totalLoad - _current_cpu.load) / currentTick * 100,
+ currentLoadUser: (totalUser - _current_cpu.user) / currentTick * 100,
+ currentLoadSystem: (totalSystem - _current_cpu.system) / currentTick * 100,
+ currentLoadNice: (totalNice - _current_cpu.nice) / currentTick * 100,
+ currentLoadIdle: (totalIdle - _current_cpu.idle) / currentTick * 100,
+ currentLoadIrq: (totalIrq - _current_cpu.irq) / currentTick * 100,
+ rawCurrentLoad: (totalLoad - _current_cpu.load),
+ rawCurrentLoadUser: (totalUser - _current_cpu.user),
+ rawCurrentLoadSystem: (totalSystem - _current_cpu.system),
+ rawCurrentLoadNice: (totalNice - _current_cpu.nice),
+ rawCurrentLoadIdle: (totalIdle - _current_cpu.idle),
+ rawCurrentLoadIrq: (totalIrq - _current_cpu.irq),
+ cpus: cores
+ };
+ _current_cpu = {
+ user: totalUser,
+ nice: totalNice,
+ system: totalSystem,
+ idle: totalIdle,
+ irq: totalIrq,
+ tick: totalTick,
+ load: totalLoad,
+ ms: _current_cpu.ms,
+ currentLoad: result.currentLoad,
+ currentLoadUser: result.currentLoadUser,
+ currentLoadSystem: result.currentLoadSystem,
+ currentLoadNice: result.currentLoadNice,
+ currentLoadIdle: result.currentLoadIdle,
+ currentLoadIrq: result.currentLoadIrq,
+ rawCurrentLoad: result.rawCurrentLoad,
+ rawCurrentLoadUser: result.rawCurrentLoadUser,
+ rawCurrentLoadSystem: result.rawCurrentLoadSystem,
+ rawCurrentLoadNice: result.rawCurrentLoadNice,
+ rawCurrentLoadIdle: result.rawCurrentLoadIdle,
+ rawCurrentLoadIrq: result.rawCurrentLoadIrq,
+ };
+ } else {
+ let cores = [];
+ for (let i = 0; i < _corecount; i++) {
+ cores[i] = {};
+ cores[i].load = _cpus[i].load / _cpus[i].currentTick * 100;
+ cores[i].loadUser = _cpus[i].loadUser / _cpus[i].currentTick * 100;
+ cores[i].loadSystem = _cpus[i].loadSystem / _cpus[i].currentTick * 100;
+ cores[i].loadNice = _cpus[i].loadNice / _cpus[i].currentTick * 100;
+ cores[i].loadIdle = _cpus[i].loadIdle / _cpus[i].currentTick * 100;
+ cores[i].loadIrq = _cpus[i].loadIrq / _cpus[i].currentTick * 100;
+ cores[i].rawLoad = _cpus[i].load;
+ cores[i].rawLoadUser = _cpus[i].loadUser;
+ cores[i].rawLoadSystem = _cpus[i].loadSystem;
+ cores[i].rawLoadNice = _cpus[i].loadNice;
+ cores[i].rawLoadIdle = _cpus[i].loadIdle;
+ cores[i].rawLoadIrq = _cpus[i].loadIrq;
+ }
+ result = {
+ avgLoad: avgLoad,
+ currentLoad: _current_cpu.currentLoad,
+ currentLoadUser: _current_cpu.currentLoadUser,
+ currentLoadSystem: _current_cpu.currentLoadSystem,
+ currentLoadNice: _current_cpu.currentLoadNice,
+ currentLoadIdle: _current_cpu.currentLoadIdle,
+ currentLoadIrq: _current_cpu.currentLoadIrq,
+ rawCurrentLoad: _current_cpu.rawCurrentLoad,
+ rawCurrentLoadUser: _current_cpu.rawCurrentLoadUser,
+ rawCurrentLoadSystem: _current_cpu.rawCurrentLoadSystem,
+ rawCurrentLoadNice: _current_cpu.rawCurrentLoadNice,
+ rawCurrentLoadIdle: _current_cpu.rawCurrentLoadIdle,
+ rawCurrentLoadIrq: _current_cpu.rawCurrentLoadIrq,
+ cpus: cores
+ };
+ }
+ resolve(result);
+ });
+ });
+}
+
+function currentLoad(callback) {
+
+ return new Promise((resolve) => {
+ process.nextTick(() => {
+ getLoad().then(result => {
+ if (callback) { callback(result); }
+ resolve(result);
+ });
+ });
+ });
+}
+
+exports.currentLoad = currentLoad;
+
+// --------------------------
+// PS - full load
+// since bootup
+
+function getFullLoad() {
+
+ return new Promise((resolve) => {
+ process.nextTick(() => {
+
+ const cpus = os.cpus();
+ let totalUser = 0;
+ let totalSystem = 0;
+ let totalNice = 0;
+ let totalIrq = 0;
+ let totalIdle = 0;
+
+ let result = 0;
+
+ if (cpus && cpus.length) {
+ for (let i = 0, len = cpus.length; i < len; i++) {
+ const cpu = cpus[i].times;
+ totalUser += cpu.user;
+ totalSystem += cpu.sys;
+ totalNice += cpu.nice;
+ totalIrq += cpu.irq;
+ totalIdle += cpu.idle;
+ }
+ let totalTicks = totalIdle + totalIrq + totalNice + totalSystem + totalUser;
+ result = (totalTicks - totalIdle) / totalTicks * 100.0;
+
+ }
+ resolve(result);
+ });
+ });
+}
+
+function fullLoad(callback) {
+
+ return new Promise((resolve) => {
+ process.nextTick(() => {
+ getFullLoad().then(result => {
+ if (callback) { callback(result); }
+ resolve(result);
+ });
+ });
+ });
+}
+
+exports.fullLoad = fullLoad;
diff --git a/node_modules/systeminformation/lib/docker.js b/node_modules/systeminformation/lib/docker.js
new file mode 100644
index 0000000..8125fc5
--- /dev/null
+++ b/node_modules/systeminformation/lib/docker.js
@@ -0,0 +1,751 @@
+'use strict';
+// @ts-check
+// ==================================================================================
+// docker.js
+// ----------------------------------------------------------------------------------
+// Description: System Information - library
+// for Node.js
+// Copyright: (c) 2014 - 2022
+// Author: Sebastian Hildebrandt
+// ----------------------------------------------------------------------------------
+// License: MIT
+// ==================================================================================
+// 13. Docker
+// ----------------------------------------------------------------------------------
+
+const util = require('./util');
+const DockerSocket = require('./dockerSocket');
+
+let _platform = process.platform;
+const _windows = (_platform === 'win32');
+
+let _docker_container_stats = {};
+let _docker_socket;
+let _docker_last_read = 0;
+
+
+// --------------------------
+// get containers (parameter all: get also inactive/exited containers)
+
+function dockerInfo(callback) {
+ return new Promise((resolve) => {
+ process.nextTick(() => {
+ if (!_docker_socket) {
+ _docker_socket = new DockerSocket();
+ }
+ const result = {};
+
+ _docker_socket.getInfo((data) => {
+ result.id = data.ID;
+ result.containers = data.Containers;
+ result.containersRunning = data.ContainersRunning;
+ result.containersPaused = data.ContainersPaused;
+ result.containersStopped = data.ContainersStopped;
+ result.images = data.Images;
+ result.driver = data.Driver;
+ result.memoryLimit = data.MemoryLimit;
+ result.swapLimit = data.SwapLimit;
+ result.kernelMemory = data.KernelMemory;
+ result.cpuCfsPeriod = data.CpuCfsPeriod;
+ result.cpuCfsQuota = data.CpuCfsQuota;
+ result.cpuShares = data.CPUShares;
+ result.cpuSet = data.CPUSet;
+ result.ipv4Forwarding = data.IPv4Forwarding;
+ result.bridgeNfIptables = data.BridgeNfIptables;
+ result.bridgeNfIp6tables = data.BridgeNfIp6tables;
+ result.debug = data.Debug;
+ result.nfd = data.NFd;
+ result.oomKillDisable = data.OomKillDisable;
+ result.ngoroutines = data.NGoroutines;
+ result.systemTime = data.SystemTime;
+ result.loggingDriver = data.LoggingDriver;
+ result.cgroupDriver = data.CgroupDriver;
+ result.nEventsListener = data.NEventsListener;
+ result.kernelVersion = data.KernelVersion;
+ result.operatingSystem = data.OperatingSystem;
+ result.osType = data.OSType;
+ result.architecture = data.Architecture;
+ result.ncpu = data.NCPU;
+ result.memTotal = data.MemTotal;
+ result.dockerRootDir = data.DockerRootDir;
+ result.httpProxy = data.HttpProxy;
+ result.httpsProxy = data.HttpsProxy;
+ result.noProxy = data.NoProxy;
+ result.name = data.Name;
+ result.labels = data.Labels;
+ result.experimentalBuild = data.ExperimentalBuild;
+ result.serverVersion = data.ServerVersion;
+ result.clusterStore = data.ClusterStore;
+ result.clusterAdvertise = data.ClusterAdvertise;
+ result.defaultRuntime = data.DefaultRuntime;
+ result.liveRestoreEnabled = data.LiveRestoreEnabled;
+ result.isolation = data.Isolation;
+ result.initBinary = data.InitBinary;
+ result.productLicense = data.ProductLicense;
+ if (callback) { callback(result); }
+ resolve(result);
+ });
+ });
+ });
+}
+
+exports.dockerInfo = dockerInfo;
+
+function dockerImages(all, callback) {
+
+ // fallback - if only callback is given
+ if (util.isFunction(all) && !callback) {
+ callback = all;
+ all = false;
+ }
+ if (typeof all === 'string' && all === 'true') {
+ all = true;
+ }
+ if (typeof all !== 'boolean' && all !== undefined) {
+ all = false;
+ }
+
+ all = all || false;
+ let result = [];
+ return new Promise((resolve) => {
+ process.nextTick(() => {
+ if (!_docker_socket) {
+ _docker_socket = new DockerSocket();
+ }
+ const workload = [];
+
+ _docker_socket.listImages(all, data => {
+ let dockerImages = {};
+ try {
+ dockerImages = data;
+ if (dockerImages && Object.prototype.toString.call(dockerImages) === '[object Array]' && dockerImages.length > 0) {
+
+ dockerImages.forEach(function (element) {
+
+ if (element.Names && Object.prototype.toString.call(element.Names) === '[object Array]' && element.Names.length > 0) {
+ element.Name = element.Names[0].replace(/^\/|\/$/g, '');
+ }
+ workload.push(dockerImagesInspect(element.Id.trim(), element));
+ });
+ if (workload.length) {
+ Promise.all(
+ workload
+ ).then((data) => {
+ if (callback) { callback(data); }
+ resolve(data);
+ });
+ } else {
+ if (callback) { callback(result); }
+ resolve(result);
+ }
+ } else {
+ if (callback) { callback(result); }
+ resolve(result);
+ }
+ } catch (err) {
+ if (callback) { callback(result); }
+ resolve(result);
+ }
+ });
+ });
+ });
+}
+
+// --------------------------
+// container inspect (for one container)
+
+function dockerImagesInspect(imageID, payload) {
+ return new Promise((resolve) => {
+ process.nextTick(() => {
+ imageID = imageID || '';
+ if (typeof imageID !== 'string') {
+ return resolve();
+ }
+ const imageIDSanitized = (util.isPrototypePolluted() ? '' : util.sanitizeShellString(imageID, true)).trim();
+ if (imageIDSanitized) {
+
+ if (!_docker_socket) {
+ _docker_socket = new DockerSocket();
+ }
+
+ _docker_socket.inspectImage(imageIDSanitized.trim(), data => {
+ try {
+ resolve({
+ id: payload.Id,
+ container: data.Container,
+ comment: data.Comment,
+ os: data.Os,
+ architecture: data.Architecture,
+ parent: data.Parent,
+ dockerVersion: data.DockerVersion,
+ size: data.Size,
+ sharedSize: payload.SharedSize,
+ virtualSize: data.VirtualSize,
+ author: data.Author,
+ created: data.Created ? Math.round(new Date(data.Created).getTime() / 1000) : 0,
+ containerConfig: data.ContainerConfig ? data.ContainerConfig : {},
+ graphDriver: data.GraphDriver ? data.GraphDriver : {},
+ repoDigests: data.RepoDigests ? data.RepoDigests : {},
+ repoTags: data.RepoTags ? data.RepoTags : {},
+ config: data.Config ? data.Config : {},
+ rootFS: data.RootFS ? data.RootFS : {},
+ });
+ } catch (err) {
+ resolve();
+ }
+ });
+ } else {
+ resolve();
+ }
+ });
+ });
+}
+
+exports.dockerImages = dockerImages;
+
+function dockerContainers(all, callback) {
+
+ function inContainers(containers, id) {
+ let filtered = containers.filter(obj => {
+ /**
+ * @namespace
+ * @property {string} Id
+ */
+ return (obj.Id && (obj.Id === id));
+ });
+ return (filtered.length > 0);
+ }
+
+ // fallback - if only callback is given
+ if (util.isFunction(all) && !callback) {
+ callback = all;
+ all = false;
+ }
+ if (typeof all === 'string' && all === 'true') {
+ all = true;
+ }
+ if (typeof all !== 'boolean' && all !== undefined) {
+ all = false;
+ }
+
+ all = all || false;
+ let result = [];
+ return new Promise((resolve) => {
+ process.nextTick(() => {
+ if (!_docker_socket) {
+ _docker_socket = new DockerSocket();
+ }
+ const workload = [];
+
+ _docker_socket.listContainers(all, data => {
+ let docker_containers = {};
+ try {
+ docker_containers = data;
+ if (docker_containers && Object.prototype.toString.call(docker_containers) === '[object Array]' && docker_containers.length > 0) {
+ // GC in _docker_container_stats
+ for (let key in _docker_container_stats) {
+ if ({}.hasOwnProperty.call(_docker_container_stats, key)) {
+ if (!inContainers(docker_containers, key)) { delete _docker_container_stats[key]; }
+ }
+ }
+
+ docker_containers.forEach(function (element) {
+
+ if (element.Names && Object.prototype.toString.call(element.Names) === '[object Array]' && element.Names.length > 0) {
+ element.Name = element.Names[0].replace(/^\/|\/$/g, '');
+ }
+ workload.push(dockerContainerInspect(element.Id.trim(), element));
+ });
+ if (workload.length) {
+ Promise.all(
+ workload
+ ).then((data) => {
+ if (callback) { callback(data); }
+ resolve(data);
+ });
+ } else {
+ if (callback) { callback(result); }
+ resolve(result);
+ }
+ } else {
+ if (callback) { callback(result); }
+ resolve(result);
+ }
+ } catch (err) {
+ // GC in _docker_container_stats
+ for (let key in _docker_container_stats) {
+ if ({}.hasOwnProperty.call(_docker_container_stats, key)) {
+ if (!inContainers(docker_containers, key)) { delete _docker_container_stats[key]; }
+ }
+ }
+ if (callback) { callback(result); }
+ resolve(result);
+ }
+ });
+ });
+ });
+}
+
+// --------------------------
+// container inspect (for one container)
+
+function dockerContainerInspect(containerID, payload) {
+ return new Promise((resolve) => {
+ process.nextTick(() => {
+ containerID = containerID || '';
+ if (typeof containerID !== 'string') {
+ return resolve();
+ }
+ const containerIdSanitized = (util.isPrototypePolluted() ? '' : util.sanitizeShellString(containerID, true)).trim();
+ if (containerIdSanitized) {
+
+ if (!_docker_socket) {
+ _docker_socket = new DockerSocket();
+ }
+
+ _docker_socket.getInspect(containerIdSanitized.trim(), data => {
+ try {
+ resolve({
+ id: payload.Id,
+ name: payload.Name,
+ image: payload.Image,
+ imageID: payload.ImageID,
+ command: payload.Command,
+ created: payload.Created,
+ started: data.State && data.State.StartedAt ? Math.round(new Date(data.State.StartedAt).getTime() / 1000) : 0,
+ finished: data.State && data.State.FinishedAt && !data.State.FinishedAt.startsWith('0001-01-01') ? Math.round(new Date(data.State.FinishedAt).getTime() / 1000) : 0,
+ createdAt: data.Created ? data.Created : '',
+ startedAt: data.State && data.State.StartedAt ? data.State.StartedAt : '',
+ finishedAt: data.State && data.State.FinishedAt && !data.State.FinishedAt.startsWith('0001-01-01') ? data.State.FinishedAt : '',
+ state: payload.State,
+ restartCount: data.RestartCount || 0,
+ platform: data.Platform || '',
+ driver: data.Driver || '',
+ ports: payload.Ports,
+ mounts: payload.Mounts,
+ // hostconfig: payload.HostConfig,
+ // network: payload.NetworkSettings
+ });
+ } catch (err) {
+ resolve();
+ }
+ });
+ } else {
+ resolve();
+ }
+ });
+ });
+}
+
+exports.dockerContainers = dockerContainers;
+
+// --------------------------
+// helper functions for calculation of docker stats
+
+function docker_calcCPUPercent(cpu_stats, precpu_stats) {
+ /**
+ * @namespace
+ * @property {object} cpu_usage
+ * @property {number} cpu_usage.total_usage
+ * @property {number} system_cpu_usage
+ * @property {object} cpu_usage
+ * @property {Array} cpu_usage.percpu_usage
+ */
+
+ if (!_windows) {
+ let cpuPercent = 0.0;
+ // calculate the change for the cpu usage of the container in between readings
+ let cpuDelta = cpu_stats.cpu_usage.total_usage - precpu_stats.cpu_usage.total_usage;
+ // calculate the change for the entire system between readings
+ let systemDelta = cpu_stats.system_cpu_usage - precpu_stats.system_cpu_usage;
+
+ if (systemDelta > 0.0 && cpuDelta > 0.0) {
+ // calculate the change for the cpu usage of the container in between readings
+ cpuPercent = (cpuDelta / systemDelta) * cpu_stats.cpu_usage.percpu_usage.length * 100.0;
+ }
+
+ return cpuPercent;
+ } else {
+ let nanoSecNow = util.nanoSeconds();
+ let cpuPercent = 0.0;
+ if (_docker_last_read > 0) {
+ let possIntervals = (nanoSecNow - _docker_last_read); // / 100 * os.cpus().length;
+ let intervalsUsed = cpu_stats.cpu_usage.total_usage - precpu_stats.cpu_usage.total_usage;
+ if (possIntervals > 0) {
+ cpuPercent = 100.0 * intervalsUsed / possIntervals;
+ }
+ }
+ _docker_last_read = nanoSecNow;
+ return cpuPercent;
+ }
+}
+
+function docker_calcNetworkIO(networks) {
+ let rx;
+ let wx;
+ for (let key in networks) {
+ // skip loop if the property is from prototype
+ if (!{}.hasOwnProperty.call(networks, key)) { continue; }
+
+ /**
+ * @namespace
+ * @property {number} rx_bytes
+ * @property {number} tx_bytes
+ */
+ let obj = networks[key];
+ rx = +obj.rx_bytes;
+ wx = +obj.tx_bytes;
+ }
+ return {
+ rx,
+ wx
+ };
+}
+
+function docker_calcBlockIO(blkio_stats) {
+ let result = {
+ r: 0,
+ w: 0
+ };
+
+ /**
+ * @namespace
+ * @property {Array} io_service_bytes_recursive
+ */
+ if (blkio_stats && blkio_stats.io_service_bytes_recursive && Object.prototype.toString.call(blkio_stats.io_service_bytes_recursive) === '[object Array]' && blkio_stats.io_service_bytes_recursive.length > 0) {
+ blkio_stats.io_service_bytes_recursive.forEach(function (element) {
+ /**
+ * @namespace
+ * @property {string} op
+ * @property {number} value
+ */
+
+ if (element.op && element.op.toLowerCase() === 'read' && element.value) {
+ result.r += element.value;
+ }
+ if (element.op && element.op.toLowerCase() === 'write' && element.value) {
+ result.w += element.value;
+ }
+ });
+ }
+ return result;
+}
+
+function dockerContainerStats(containerIDs, callback) {
+
+ let containerArray = [];
+ return new Promise((resolve) => {
+ process.nextTick(() => {
+
+ // fallback - if only callback is given
+ if (util.isFunction(containerIDs) && !callback) {
+ callback = containerIDs;
+ containerArray = ['*'];
+ } else {
+ containerIDs = containerIDs || '*';
+ if (typeof containerIDs !== 'string') {
+ if (callback) { callback([]); }
+ return resolve([]);
+ }
+ let containerIDsSanitized = '';
+ containerIDsSanitized.__proto__.toLowerCase = util.stringToLower;
+ containerIDsSanitized.__proto__.replace = util.stringReplace;
+ containerIDsSanitized.__proto__.trim = util.stringTrim;
+
+ containerIDsSanitized = containerIDs;
+ containerIDsSanitized = containerIDsSanitized.trim();
+ if (containerIDsSanitized !== '*') {
+ containerIDsSanitized = '';
+ const s = (util.isPrototypePolluted() ? '' : util.sanitizeShellString(containerIDs, true)).trim();
+ for (let i = 0; i <= util.mathMin(s.length, 2000); i++) {
+ if (!(s[i] === undefined)) {
+ s[i].__proto__.toLowerCase = util.stringToLower;
+ const sl = s[i].toLowerCase();
+ if (sl && sl[0] && !sl[1]) {
+ containerIDsSanitized = containerIDsSanitized + sl[0];
+ }
+ }
+ }
+ }
+
+ containerIDsSanitized = containerIDsSanitized.trim().toLowerCase().replace(/,+/g, '|');
+ containerArray = containerIDsSanitized.split('|');
+ }
+
+ const result = [];
+
+ const workload = [];
+ if (containerArray.length && containerArray[0].trim() === '*') {
+ containerArray = [];
+ dockerContainers().then(allContainers => {
+ for (let container of allContainers) {
+ containerArray.push(container.id);
+ }
+ if (containerArray.length) {
+ dockerContainerStats(containerArray.join(',')).then(result => {
+ if (callback) { callback(result); }
+ resolve(result);
+ });
+ } else {
+ if (callback) { callback(result); }
+ resolve(result);
+ }
+ });
+ } else {
+ for (let containerID of containerArray) {
+ workload.push(dockerContainerStatsSingle(containerID.trim()));
+ }
+ if (workload.length) {
+ Promise.all(
+ workload
+ ).then((data) => {
+ if (callback) { callback(data); }
+ resolve(data);
+ });
+ } else {
+ if (callback) { callback(result); }
+ resolve(result);
+ }
+ }
+ });
+ });
+}
+
+// --------------------------
+// container stats (for one container)
+
+function dockerContainerStatsSingle(containerID) {
+ containerID = containerID || '';
+ let result = {
+ id: containerID,
+ memUsage: 0,
+ memLimit: 0,
+ memPercent: 0,
+ cpuPercent: 0,
+ pids: 0,
+ netIO: {
+ rx: 0,
+ wx: 0
+ },
+ blockIO: {
+ r: 0,
+ w: 0
+ },
+ restartCount: 0,
+ cpuStats: {},
+ precpuStats: {},
+ memoryStats: {},
+ networks: {},
+ };
+ return new Promise((resolve) => {
+ process.nextTick(() => {
+ if (containerID) {
+
+ if (!_docker_socket) {
+ _docker_socket = new DockerSocket();
+ }
+
+ _docker_socket.getInspect(containerID, dataInspect => {
+ try {
+ _docker_socket.getStats(containerID, data => {
+ try {
+ let stats = data;
+
+ if (!stats.message) {
+ result.memUsage = (stats.memory_stats && stats.memory_stats.usage ? stats.memory_stats.usage : 0);
+ result.memLimit = (stats.memory_stats && stats.memory_stats.limit ? stats.memory_stats.limit : 0);
+ result.memPercent = (stats.memory_stats && stats.memory_stats.usage && stats.memory_stats.limit ? stats.memory_stats.usage / stats.memory_stats.limit * 100.0 : 0);
+ result.cpuPercent = (stats.cpu_stats && stats.precpu_stats ? docker_calcCPUPercent(stats.cpu_stats, stats.precpu_stats) : 0);
+ result.pids = (stats.pids_stats && stats.pids_stats.current ? stats.pids_stats.current : 0);
+ result.restartCount = (dataInspect.RestartCount ? dataInspect.RestartCount : 0);
+ if (stats.networks) { result.netIO = docker_calcNetworkIO(stats.networks); }
+ if (stats.blkio_stats) { result.blockIO = docker_calcBlockIO(stats.blkio_stats); }
+ result.cpuStats = (stats.cpu_stats ? stats.cpu_stats : {});
+ result.precpuStats = (stats.precpu_stats ? stats.precpu_stats : {});
+ result.memoryStats = (stats.memory_stats ? stats.memory_stats : {});
+ result.networks = (stats.networks ? stats.networks : {});
+ }
+ } catch (err) {
+ util.noop();
+ }
+ // }
+ resolve(result);
+ });
+ } catch (err) {
+ util.noop();
+ }
+ });
+ } else {
+ resolve(result);
+ }
+ });
+ });
+}
+
+exports.dockerContainerStats = dockerContainerStats;
+
+// --------------------------
+// container processes (for one container)
+
+function dockerContainerProcesses(containerID, callback) {
+ let result = [];
+ return new Promise((resolve) => {
+ process.nextTick(() => {
+ containerID = containerID || '';
+ if (typeof containerID !== 'string') {
+ return resolve(result);
+ }
+ const containerIdSanitized = (util.isPrototypePolluted() ? '' : util.sanitizeShellString(containerID, true)).trim();
+
+ if (containerIdSanitized) {
+
+ if (!_docker_socket) {
+ _docker_socket = new DockerSocket();
+ }
+
+ _docker_socket.getProcesses(containerIdSanitized, data => {
+ /**
+ * @namespace
+ * @property {Array} Titles
+ * @property {Array} Processes
+ **/
+ try {
+ if (data && data.Titles && data.Processes) {
+ let titles = data.Titles.map(function (value) {
+ return value.toUpperCase();
+ });
+ let pos_pid = titles.indexOf('PID');
+ let pos_ppid = titles.indexOf('PPID');
+ let pos_pgid = titles.indexOf('PGID');
+ let pos_vsz = titles.indexOf('VSZ');
+ let pos_time = titles.indexOf('TIME');
+ let pos_elapsed = titles.indexOf('ELAPSED');
+ let pos_ni = titles.indexOf('NI');
+ let pos_ruser = titles.indexOf('RUSER');
+ let pos_user = titles.indexOf('USER');
+ let pos_rgroup = titles.indexOf('RGROUP');
+ let pos_group = titles.indexOf('GROUP');
+ let pos_stat = titles.indexOf('STAT');
+ let pos_rss = titles.indexOf('RSS');
+ let pos_command = titles.indexOf('COMMAND');
+
+ data.Processes.forEach(process => {
+ result.push({
+ pidHost: (pos_pid >= 0 ? process[pos_pid] : ''),
+ ppid: (pos_ppid >= 0 ? process[pos_ppid] : ''),
+ pgid: (pos_pgid >= 0 ? process[pos_pgid] : ''),
+ user: (pos_user >= 0 ? process[pos_user] : ''),
+ ruser: (pos_ruser >= 0 ? process[pos_ruser] : ''),
+ group: (pos_group >= 0 ? process[pos_group] : ''),
+ rgroup: (pos_rgroup >= 0 ? process[pos_rgroup] : ''),
+ stat: (pos_stat >= 0 ? process[pos_stat] : ''),
+ time: (pos_time >= 0 ? process[pos_time] : ''),
+ elapsed: (pos_elapsed >= 0 ? process[pos_elapsed] : ''),
+ nice: (pos_ni >= 0 ? process[pos_ni] : ''),
+ rss: (pos_rss >= 0 ? process[pos_rss] : ''),
+ vsz: (pos_vsz >= 0 ? process[pos_vsz] : ''),
+ command: (pos_command >= 0 ? process[pos_command] : '')
+ });
+ });
+ }
+ } catch (err) {
+ util.noop();
+ }
+ if (callback) { callback(result); }
+ resolve(result);
+ });
+ } else {
+ if (callback) { callback(result); }
+ resolve(result);
+ }
+ });
+ });
+}
+
+exports.dockerContainerProcesses = dockerContainerProcesses;
+
+function dockerVolumes(callback) {
+
+ let result = [];
+ return new Promise((resolve) => {
+ process.nextTick(() => {
+ if (!_docker_socket) {
+ _docker_socket = new DockerSocket();
+ }
+ _docker_socket.listVolumes((data) => {
+ let dockerVolumes = {};
+ try {
+ dockerVolumes = data;
+ if (dockerVolumes && dockerVolumes.Volumes && Object.prototype.toString.call(dockerVolumes.Volumes) === '[object Array]' && dockerVolumes.Volumes.length > 0) {
+
+ dockerVolumes.Volumes.forEach(function (element) {
+
+ result.push({
+ name: element.Name,
+ driver: element.Driver,
+ labels: element.Labels,
+ mountpoint: element.Mountpoint,
+ options: element.Options,
+ scope: element.Scope,
+ created: element.CreatedAt ? Math.round(new Date(element.CreatedAt).getTime() / 1000) : 0,
+ });
+ });
+ if (callback) { callback(result); }
+ resolve(result);
+ } else {
+ if (callback) { callback(result); }
+ resolve(result);
+ }
+ } catch (err) {
+ if (callback) { callback(result); }
+ resolve(result);
+ }
+ });
+ });
+ });
+}
+
+exports.dockerVolumes = dockerVolumes;
+function dockerAll(callback) {
+ return new Promise((resolve) => {
+ process.nextTick(() => {
+ dockerContainers(true).then(result => {
+ if (result && Object.prototype.toString.call(result) === '[object Array]' && result.length > 0) {
+ let l = result.length;
+ result.forEach(function (element) {
+ dockerContainerStats(element.id).then((res) => {
+ // include stats in array
+ element.memUsage = res[0].memUsage;
+ element.memLimit = res[0].memLimit;
+ element.memPercent = res[0].memPercent;
+ element.cpuPercent = res[0].cpuPercent;
+ element.pids = res[0].pids;
+ element.netIO = res[0].netIO;
+ element.blockIO = res[0].blockIO;
+ element.cpuStats = res[0].cpuStats;
+ element.precpuStats = res[0].precpuStats;
+ element.memoryStats = res[0].memoryStats;
+ element.networks = res[0].networks;
+
+ dockerContainerProcesses(element.id).then(processes => {
+ element.processes = processes;
+
+ l -= 1;
+ if (l === 0) {
+ if (callback) { callback(result); }
+ resolve(result);
+ }
+ });
+ // all done??
+ });
+ });
+ } else {
+ if (callback) { callback(result); }
+ resolve(result);
+ }
+ });
+ });
+ });
+}
+
+exports.dockerAll = dockerAll;
diff --git a/node_modules/systeminformation/lib/dockerSocket.js b/node_modules/systeminformation/lib/dockerSocket.js
new file mode 100644
index 0000000..6508dd1
--- /dev/null
+++ b/node_modules/systeminformation/lib/dockerSocket.js
@@ -0,0 +1,327 @@
+'use strict';
+// @ts-check
+// ==================================================================================
+// dockerSockets.js
+// ----------------------------------------------------------------------------------
+// Description: System Information - library
+// for Node.js
+// Copyright: (c) 2014 - 2022
+// Author: Sebastian Hildebrandt
+// ----------------------------------------------------------------------------------
+// License: MIT
+// ==================================================================================
+// 13. DockerSockets
+// ----------------------------------------------------------------------------------
+
+const net = require('net');
+const isWin = require('os').type() === 'Windows_NT';
+const socketPath = isWin ? '//./pipe/docker_engine' : '/var/run/docker.sock';
+
+class DockerSocket {
+
+ getInfo(callback) {
+ try {
+
+ let socket = net.createConnection({ path: socketPath });
+ let alldata = '';
+ let data;
+
+ socket.on('connect', () => {
+ socket.write('GET http:/info HTTP/1.0\r\n\r\n');
+ });
+
+ socket.on('data', data => {
+ alldata = alldata + data.toString();
+ });
+
+ socket.on('error', () => {
+ socket = false;
+ callback({});
+ });
+
+ socket.on('end', () => {
+ let startbody = alldata.indexOf('\r\n\r\n');
+ alldata = alldata.substring(startbody + 4);
+ socket = false;
+ try {
+ data = JSON.parse(alldata);
+ callback(data);
+ } catch (err) {
+ callback({});
+ }
+ });
+ } catch (err) {
+ callback({});
+ }
+ }
+
+ listImages(all, callback) {
+ try {
+
+ let socket = net.createConnection({ path: socketPath });
+ let alldata = '';
+ let data;
+
+ socket.on('connect', () => {
+ socket.write('GET http:/images/json' + (all ? '?all=1' : '') + ' HTTP/1.0\r\n\r\n');
+ });
+
+ socket.on('data', data => {
+ alldata = alldata + data.toString();
+ });
+
+ socket.on('error', () => {
+ socket = false;
+ callback({});
+ });
+
+ socket.on('end', () => {
+ let startbody = alldata.indexOf('\r\n\r\n');
+ alldata = alldata.substring(startbody + 4);
+ socket = false;
+ try {
+ data = JSON.parse(alldata);
+ callback(data);
+ } catch (err) {
+ callback({});
+ }
+ });
+ } catch (err) {
+ callback({});
+ }
+ }
+
+ inspectImage(id, callback) {
+ id = id || '';
+ if (id) {
+ try {
+ let socket = net.createConnection({ path: socketPath });
+ let alldata = '';
+ let data;
+
+ socket.on('connect', () => {
+ socket.write('GET http:/images/' + id + '/json?stream=0 HTTP/1.0\r\n\r\n');
+ });
+
+ socket.on('data', data => {
+ alldata = alldata + data.toString();
+ });
+
+ socket.on('error', () => {
+ socket = false;
+ callback({});
+ });
+
+ socket.on('end', () => {
+ let startbody = alldata.indexOf('\r\n\r\n');
+ alldata = alldata.substring(startbody + 4);
+ socket = false;
+ try {
+ data = JSON.parse(alldata);
+ callback(data);
+ } catch (err) {
+ callback({});
+ }
+ });
+ } catch (err) {
+ callback({});
+ }
+ } else {
+ callback({});
+ }
+ }
+
+ listContainers(all, callback) {
+ try {
+
+ let socket = net.createConnection({ path: socketPath });
+ let alldata = '';
+ let data;
+
+ socket.on('connect', () => {
+ socket.write('GET http:/containers/json' + (all ? '?all=1' : '') + ' HTTP/1.0\r\n\r\n');
+ });
+
+ socket.on('data', data => {
+ alldata = alldata + data.toString();
+ });
+
+ socket.on('error', () => {
+ socket = false;
+ callback({});
+ });
+
+ socket.on('end', () => {
+ let startbody = alldata.indexOf('\r\n\r\n');
+ alldata = alldata.substring(startbody + 4);
+ socket = false;
+ try {
+ data = JSON.parse(alldata);
+ callback(data);
+ } catch (err) {
+ callback({});
+ }
+ });
+ } catch (err) {
+ callback({});
+ }
+ }
+
+ getStats(id, callback) {
+ id = id || '';
+ if (id) {
+ try {
+ let socket = net.createConnection({ path: socketPath });
+ let alldata = '';
+ let data;
+
+ socket.on('connect', () => {
+ socket.write('GET http:/containers/' + id + '/stats?stream=0 HTTP/1.0\r\n\r\n');
+ });
+
+ socket.on('data', data => {
+ alldata = alldata + data.toString();
+ });
+
+ socket.on('error', () => {
+ socket = false;
+ callback({});
+ });
+
+ socket.on('end', () => {
+ let startbody = alldata.indexOf('\r\n\r\n');
+ alldata = alldata.substring(startbody + 4);
+ socket = false;
+ try {
+ data = JSON.parse(alldata);
+ callback(data);
+ } catch (err) {
+ callback({});
+ }
+ });
+ } catch (err) {
+ callback({});
+ }
+ } else {
+ callback({});
+ }
+ }
+
+ getInspect(id, callback) {
+ id = id || '';
+ if (id) {
+ try {
+ let socket = net.createConnection({ path: socketPath });
+ let alldata = '';
+ let data;
+
+ socket.on('connect', () => {
+ socket.write('GET http:/containers/' + id + '/json?stream=0 HTTP/1.0\r\n\r\n');
+ });
+
+ socket.on('data', data => {
+ alldata = alldata + data.toString();
+ });
+
+ socket.on('error', () => {
+ socket = false;
+ callback({});
+ });
+
+ socket.on('end', () => {
+ let startbody = alldata.indexOf('\r\n\r\n');
+ alldata = alldata.substring(startbody + 4);
+ socket = false;
+ try {
+ data = JSON.parse(alldata);
+ callback(data);
+ } catch (err) {
+ callback({});
+ }
+ });
+ } catch (err) {
+ callback({});
+ }
+ } else {
+ callback({});
+ }
+ }
+
+ getProcesses(id, callback) {
+ id = id || '';
+ if (id) {
+ try {
+ let socket = net.createConnection({ path: socketPath });
+ let alldata = '';
+ let data;
+
+ socket.on('connect', () => {
+ socket.write('GET http:/containers/' + id + '/top?ps_args=-opid,ppid,pgid,vsz,time,etime,nice,ruser,user,rgroup,group,stat,rss,args HTTP/1.0\r\n\r\n');
+ });
+
+ socket.on('data', data => {
+ alldata = alldata + data.toString();
+ });
+
+ socket.on('error', () => {
+ socket = false;
+ callback({});
+ });
+
+ socket.on('end', () => {
+ let startbody = alldata.indexOf('\r\n\r\n');
+ alldata = alldata.substring(startbody + 4);
+ socket = false;
+ try {
+ data = JSON.parse(alldata);
+ callback(data);
+ } catch (err) {
+ callback({});
+ }
+ });
+ } catch (err) {
+ callback({});
+ }
+ } else {
+ callback({});
+ }
+ }
+
+ listVolumes(callback) {
+ try {
+
+ let socket = net.createConnection({ path: socketPath });
+ let alldata = '';
+ let data;
+
+ socket.on('connect', () => {
+ socket.write('GET http:/volumes HTTP/1.0\r\n\r\n');
+ });
+
+ socket.on('data', data => {
+ alldata = alldata + data.toString();
+ });
+
+ socket.on('error', () => {
+ socket = false;
+ callback({});
+ });
+
+ socket.on('end', () => {
+ let startbody = alldata.indexOf('\r\n\r\n');
+ alldata = alldata.substring(startbody + 4);
+ socket = false;
+ try {
+ data = JSON.parse(alldata);
+ callback(data);
+ } catch (err) {
+ callback({});
+ }
+ });
+ } catch (err) {
+ callback({});
+ }
+ }
+}
+
+module.exports = DockerSocket;
diff --git a/node_modules/systeminformation/lib/filesystem.js b/node_modules/systeminformation/lib/filesystem.js
new file mode 100644
index 0000000..419caa1
--- /dev/null
+++ b/node_modules/systeminformation/lib/filesystem.js
@@ -0,0 +1,1301 @@
+'use strict';
+// @ts-check
+// ==================================================================================
+// filesystem.js
+// ----------------------------------------------------------------------------------
+// Description: System Information - library
+// for Node.js
+// Copyright: (c) 2014 - 2022
+// Author: Sebastian Hildebrandt
+// ----------------------------------------------------------------------------------
+// License: MIT
+// ==================================================================================
+// 8. File System
+// ----------------------------------------------------------------------------------
+
+const util = require('./util');
+const fs = require('fs');
+
+const exec = require('child_process').exec;
+const execSync = require('child_process').execSync;
+const execPromiseSave = util.promisifySave(require('child_process').exec);
+
+let _platform = process.platform;
+
+const _linux = (_platform === 'linux' || _platform === 'android');
+const _darwin = (_platform === 'darwin');
+const _windows = (_platform === 'win32');
+const _freebsd = (_platform === 'freebsd');
+const _openbsd = (_platform === 'openbsd');
+const _netbsd = (_platform === 'netbsd');
+const _sunos = (_platform === 'sunos');
+
+let _fs_speed = {};
+let _disk_io = {};
+
+// --------------------------
+// FS - mounted file systems
+
+function fsSize(callback) {
+
+ let macOsDisks = [];
+
+ function getmacOsFsType(fs) {
+ if (!fs.startsWith('/')) { return 'NFS'; }
+ const parts = fs.split('/');
+ const fsShort = parts[parts.length - 1];
+ const macOsDisksSingle = macOsDisks.filter(item => item.indexOf(fsShort) >= 0);
+ if (macOsDisksSingle.length === 1 && macOsDisksSingle[0].indexOf('APFS') >= 0) { return 'APFS'; }
+ return 'HFS';
+ }
+
+ function isLinuxTmpFs(fs) {
+ const linuxTmpFileSystems = ['rootfs', 'unionfs', 'squashfs', 'cramfs', 'initrd', 'initramfs', 'devtmpfs', 'tmpfs', 'udev', 'devfs', 'specfs', 'type', 'appimaged'];
+ let result = false;
+ linuxTmpFileSystems.forEach(linuxFs => {
+ if (fs.toLowerCase().indexOf(linuxFs) >= 0) { result = true; }
+ });
+ return result;
+ }
+
+ function filterLines(stdout) {
+ let lines = stdout.toString().split('\n');
+ if (stdout.toString().toLowerCase().indexOf('filesystem')) {
+ let removeLines = 0;
+ for (let i = 0; i < lines.length; i++) {
+ if (lines[i] && lines[i].toLowerCase().startsWith('filesystem')) {
+ removeLines = i;
+ }
+ }
+ for (let i = 0; i < removeLines; i++) {
+ lines.shift();
+ }
+ }
+ return lines;
+ }
+
+ function parseDf(lines) {
+ let data = [];
+ lines.forEach(function (line) {
+ if (line !== '') {
+ line = line.replace(/ +/g, ' ').split(' ');
+ if (line && ((line[0].startsWith('/')) || (line[6] && line[6] === '/') || (line[0].indexOf('/') > 0) || (line[0].indexOf(':') === 1) || !_darwin && !isLinuxTmpFs(line[1]))) {
+ const fs = line[0];
+ const fsType = ((_linux || _freebsd || _openbsd || _netbsd) ? line[1] : getmacOsFsType(line[0]));
+ const size = parseInt(((_linux || _freebsd || _openbsd || _netbsd) ? line[2] : line[1])) * 1024;
+ const used = parseInt(((_linux || _freebsd || _openbsd || _netbsd) ? line[3] : line[2])) * 1024;
+ const available = parseInt(((_linux || _freebsd || _openbsd || _netbsd) ? line[4] : line[3])) * 1024;
+ const use = parseFloat((100.0 * (used / (used + available))).toFixed(2));
+ line.splice(0, (_linux || _freebsd || _openbsd || _netbsd) ? 6 : 5);
+ const mount = line.join(' ');
+ // const mount = line[line.length - 1];
+ if (!data.find(el => (el.fs === fs && el.type === fsType))) {
+ data.push({
+ fs,
+ type: fsType,
+ size,
+ used,
+ available,
+ use,
+ mount
+ });
+ }
+ }
+ }
+ });
+ return data;
+ }
+
+ return new Promise((resolve) => {
+ process.nextTick(() => {
+ let data = [];
+ if (_linux || _freebsd || _openbsd || _netbsd || _darwin) {
+ let cmd = '';
+ if (_darwin) {
+ cmd = 'df -kP';
+ try {
+ macOsDisks = execSync('diskutil list').toString().split('\n').filter(line => {
+ return !line.startsWith('/') && line.indexOf(':') > 0;
+ });
+ } catch (e) {
+ macOsDisks = [];
+ }
+ }
+ if (_linux) { cmd = 'df -lkPTx squashfs'; } // cmd = 'df -lkPTx squashfs | grep -E "^/|^.\\:"';
+ if (_freebsd || _openbsd || _netbsd) { cmd = 'df -lkPT'; }
+ exec(cmd, { maxBuffer: 1024 * 1024 }, function (error, stdout) {
+ let lines = filterLines(stdout);
+ data = parseDf(lines);
+ if (!error || data.length) {
+ if (callback) {
+ callback(data);
+ }
+ resolve(data);
+ } else {
+ exec('df -kPT', { maxBuffer: 1024 * 1024 }, function (error, stdout) {
+ if (!error) {
+ let lines = filterLines(stdout);
+ data = parseDf(lines);
+ }
+ if (callback) {
+ callback(data);
+ }
+ resolve(data);
+ });
+ }
+ });
+ }
+ if (_sunos) {
+ if (callback) { callback(data); }
+ resolve(data);
+ }
+ if (_windows) {
+ try {
+ // util.wmic('logicaldisk get Caption,FileSystem,FreeSpace,Size').then((stdout) => {
+ util.powerShell('Get-WmiObject Win32_logicaldisk | select Caption,FileSystem,FreeSpace,Size | fl').then((stdout, error) => {
+ if (!error) {
+ let devices = stdout.toString().split(/\n\s*\n/);
+ devices.forEach(function (device) {
+ let lines = device.split('\r\n');
+ const size = util.toInt(util.getValue(lines, 'size', ':'));
+ const free = util.toInt(util.getValue(lines, 'freespace', ':'));
+ const caption = util.getValue(lines, 'caption', ':');
+ if (size) {
+ data.push({
+ fs: caption,
+ type: util.getValue(lines, 'filesystem', ':'),
+ size,
+ used: size - free,
+ available: free,
+ use: parseFloat(((100.0 * (size - free)) / size).toFixed(2)),
+ mount: caption
+ });
+ }
+ });
+ }
+ if (callback) {
+ callback(data);
+ }
+ resolve(data);
+ });
+ } catch (e) {
+ if (callback) { callback(data); }
+ resolve(data);
+ }
+ }
+ });
+ });
+}
+
+exports.fsSize = fsSize;
+
+// --------------------------
+// FS - open files count
+
+function fsOpenFiles(callback) {
+
+ return new Promise((resolve) => {
+ process.nextTick(() => {
+ const result = {
+ max: null,
+ allocated: null,
+ available: null
+ };
+ if (_freebsd || _openbsd || _netbsd || _darwin) {
+ let cmd = 'sysctl -i kern.maxfiles kern.num_files kern.open_files';
+ exec(cmd, { maxBuffer: 1024 * 1024 }, function (error, stdout) {
+ if (!error) {
+ let lines = stdout.toString().split('\n');
+ result.max = parseInt(util.getValue(lines, 'kern.maxfiles', ':'), 10);
+ result.allocated = parseInt(util.getValue(lines, 'kern.num_files', ':'), 10) || parseInt(util.getValue(lines, 'kern.open_files', ':'), 10);
+ result.available = result.max - result.allocated;
+ }
+ if (callback) {
+ callback(result);
+ }
+ resolve(result);
+ });
+ }
+ if (_linux) {
+ fs.readFile('/proc/sys/fs/file-nr', function (error, stdout) {
+ if (!error) {
+ let lines = stdout.toString().split('\n');
+ if (lines[0]) {
+ const parts = lines[0].replace(/\s+/g, ' ').split(' ');
+ if (parts.length === 3) {
+ result.allocated = parseInt(parts[0], 10);
+ result.available = parseInt(parts[1], 10);
+ result.max = parseInt(parts[2], 10);
+ if (!result.available) { result.available = result.max - result.allocated; }
+ }
+ }
+ if (callback) {
+ callback(result);
+ }
+ resolve(result);
+ } else {
+ fs.readFile('/proc/sys/fs/file-max', function (error, stdout) {
+ if (!error) {
+ let lines = stdout.toString().split('\n');
+ if (lines[0]) {
+ result.max = parseInt(lines[0], 10);
+ }
+ }
+ if (callback) {
+ callback(result);
+ }
+ resolve(result);
+ });
+ }
+ });
+ }
+ if (_sunos) {
+ if (callback) { callback(null); }
+ resolve(null);
+ }
+ if (_windows) {
+ if (callback) { callback(null); }
+ resolve(null);
+ }
+ });
+ });
+}
+
+exports.fsOpenFiles = fsOpenFiles;
+
+// --------------------------
+// disks
+
+function parseBytes(s) {
+ return parseInt(s.substr(s.indexOf(' (') + 2, s.indexOf(' Bytes)') - 10));
+}
+
+function parseDevices(lines) {
+ let devices = [];
+ let i = 0;
+ lines.forEach(line => {
+ if (line.length > 0) {
+ if (line[0] === '*') {
+ i++;
+ } else {
+ let parts = line.split(':');
+ if (parts.length > 1) {
+ if (!devices[i]) {
+ devices[i] = {
+ name: '',
+ identifier: '',
+ type: 'disk',
+ fsType: '',
+ mount: '',
+ size: 0,
+ physical: 'HDD',
+ uuid: '',
+ label: '',
+ model: '',
+ serial: '',
+ removable: false,
+ protocol: ''
+ };
+ }
+ parts[0] = parts[0].trim().toUpperCase().replace(/ +/g, '');
+ parts[1] = parts[1].trim();
+ if ('DEVICEIDENTIFIER' === parts[0]) { devices[i].identifier = parts[1]; }
+ if ('DEVICENODE' === parts[0]) { devices[i].name = parts[1]; }
+ if ('VOLUMENAME' === parts[0]) {
+ if (parts[1].indexOf('Not applicable') === -1) { devices[i].label = parts[1]; }
+ }
+ if ('PROTOCOL' === parts[0]) { devices[i].protocol = parts[1]; }
+ if ('DISKSIZE' === parts[0]) { devices[i].size = parseBytes(parts[1]); }
+ if ('FILESYSTEMPERSONALITY' === parts[0]) { devices[i].fsType = parts[1]; }
+ if ('MOUNTPOINT' === parts[0]) { devices[i].mount = parts[1]; }
+ if ('VOLUMEUUID' === parts[0]) { devices[i].uuid = parts[1]; }
+ if ('READ-ONLYMEDIA' === parts[0] && parts[1] === 'Yes') { devices[i].physical = 'CD/DVD'; }
+ if ('SOLIDSTATE' === parts[0] && parts[1] === 'Yes') { devices[i].physical = 'SSD'; }
+ if ('VIRTUAL' === parts[0]) { devices[i].type = 'virtual'; }
+ if ('REMOVABLEMEDIA' === parts[0]) { devices[i].removable = (parts[1] === 'Removable'); }
+ if ('PARTITIONTYPE' === parts[0]) { devices[i].type = 'part'; }
+ if ('DEVICE/MEDIANAME' === parts[0]) { devices[i].model = parts[1]; }
+ }
+ }
+ }
+ });
+ return devices;
+}
+
+function parseBlk(lines) {
+ let data = [];
+
+ lines.filter(line => line !== '').forEach((line) => {
+ try {
+ line = decodeURIComponent(line.replace(/\\x/g, '%'));
+ line = line.replace(/\\/g, '\\\\');
+ let disk = JSON.parse(line);
+ data.push({
+ 'name': disk.name,
+ 'type': disk.type,
+ 'fsType': disk.fsType,
+ 'mount': disk.mountpoint,
+ 'size': parseInt(disk.size),
+ 'physical': (disk.type === 'disk' ? (disk.rota === '0' ? 'SSD' : 'HDD') : (disk.type === 'rom' ? 'CD/DVD' : '')),
+ 'uuid': disk.uuid,
+ 'label': disk.label,
+ 'model': disk.model,
+ 'serial': disk.serial,
+ 'removable': disk.rm === '1',
+ 'protocol': disk.tran,
+ 'group': disk.group,
+ });
+ } catch (e) {
+ util.noop();
+ }
+ });
+ data = util.unique(data);
+ data = util.sortByKey(data, ['type', 'name']);
+ return data;
+}
+
+function blkStdoutToObject(stdout) {
+ return stdout.toString()
+ .replace(/NAME=/g, '{"name":')
+ .replace(/FSTYPE=/g, ',"fsType":')
+ .replace(/TYPE=/g, ',"type":')
+ .replace(/SIZE=/g, ',"size":')
+ .replace(/MOUNTPOINT=/g, ',"mountpoint":')
+ .replace(/UUID=/g, ',"uuid":')
+ .replace(/ROTA=/g, ',"rota":')
+ .replace(/RO=/g, ',"ro":')
+ .replace(/RM=/g, ',"rm":')
+ .replace(/TRAN=/g, ',"tran":')
+ .replace(/SERIAL=/g, ',"serial":')
+ .replace(/LABEL=/g, ',"label":')
+ .replace(/MODEL=/g, ',"model":')
+ .replace(/OWNER=/g, ',"owner":')
+ .replace(/GROUP=/g, ',"group":')
+ .replace(/\n/g, '}\n');
+}
+
+function blockDevices(callback) {
+
+ return new Promise((resolve) => {
+ process.nextTick(() => {
+ let data = [];
+ if (_linux) {
+ // see https://wiki.ubuntuusers.de/lsblk/
+ // exec("lsblk -bo NAME,TYPE,SIZE,FSTYPE,MOUNTPOINT,UUID,ROTA,RO,TRAN,SERIAL,LABEL,MODEL,OWNER,GROUP,MODE,ALIGNMENT,MIN-IO,OPT-IO,PHY-SEC,LOG-SEC,SCHED,RQ-SIZE,RA,WSAME", function (error, stdout) {
+ exec('lsblk -bPo NAME,TYPE,SIZE,FSTYPE,MOUNTPOINT,UUID,ROTA,RO,RM,TRAN,SERIAL,LABEL,MODEL,OWNER 2>/dev/null', { maxBuffer: 1024 * 1024 }, function (error, stdout) {
+ if (!error) {
+ let lines = blkStdoutToObject(stdout).split('\n');
+ data = parseBlk(lines);
+ if (callback) {
+ callback(data);
+ }
+ resolve(data);
+ } else {
+ exec('lsblk -bPo NAME,TYPE,SIZE,FSTYPE,MOUNTPOINT,UUID,ROTA,RO,RM,LABEL,MODEL,OWNER 2>/dev/null', { maxBuffer: 1024 * 1024 }, function (error, stdout) {
+ if (!error) {
+ let lines = blkStdoutToObject(stdout).split('\n');
+ data = parseBlk(lines);
+ }
+ if (callback) {
+ callback(data);
+ }
+ resolve(data);
+ });
+ }
+ });
+ }
+ if (_darwin) {
+ exec('diskutil info -all', { maxBuffer: 1024 * 1024 }, function (error, stdout) {
+ if (!error) {
+ let lines = stdout.toString().split('\n');
+ // parse lines into temp array of devices
+ data = parseDevices(lines);
+ }
+ if (callback) {
+ callback(data);
+ }
+ resolve(data);
+ });
+ }
+ if (_sunos) {
+ if (callback) { callback(data); }
+ resolve(data);
+ }
+ if (_windows) {
+ let drivetypes = ['Unknown', 'NoRoot', 'Removable', 'Local', 'Network', 'CD/DVD', 'RAM'];
+ try {
+ // util.wmic('logicaldisk get Caption,Description,DeviceID,DriveType,FileSystem,FreeSpace,Name,Size,VolumeName,VolumeSerialNumber /value').then((stdout, error) => {
+ // util.powerShell('Get-WmiObject Win32_logicaldisk | select Caption,DriveType,Name,FileSystem,Size,VolumeSerialNumber,VolumeName | fl').then((stdout, error) => {
+ util.powerShell('Get-CimInstance -ClassName Win32_LogicalDisk | select Caption,DriveType,Name,FileSystem,Size,VolumeSerialNumber,VolumeName | fl').then((stdout, error) => {
+ if (!error) {
+ let devices = stdout.toString().split(/\n\s*\n/);
+ devices.forEach(function (device) {
+ let lines = device.split('\r\n');
+ let drivetype = util.getValue(lines, 'drivetype', ':');
+ if (drivetype) {
+ data.push({
+ name: util.getValue(lines, 'name', ':'),
+ identifier: util.getValue(lines, 'caption', ':'),
+ type: 'disk',
+ fsType: util.getValue(lines, 'filesystem', ':').toLowerCase(),
+ mount: util.getValue(lines, 'caption', ':'),
+ size: util.getValue(lines, 'size', ':'),
+ physical: (drivetype >= 0 && drivetype <= 6) ? drivetypes[drivetype] : drivetypes[0],
+ uuid: util.getValue(lines, 'volumeserialnumber', ':'),
+ label: util.getValue(lines, 'volumename', ':'),
+ model: '',
+ serial: util.getValue(lines, 'volumeserialnumber', ':'),
+ removable: drivetype === '2',
+ protocol: ''
+ });
+ }
+ });
+ }
+ if (callback) {
+ callback(data);
+ }
+ resolve(data);
+ });
+ } catch (e) {
+ if (callback) { callback(data); }
+ resolve(data);
+ }
+ }
+ if (_freebsd || _openbsd || _netbsd) {
+ // will follow
+ if (callback) { callback(null); }
+ resolve(null);
+ }
+
+ });
+ });
+}
+
+exports.blockDevices = blockDevices;
+
+// --------------------------
+// FS - speed
+
+function calcFsSpeed(rx, wx) {
+ let result = {
+ rx: 0,
+ wx: 0,
+ tx: 0,
+ rx_sec: null,
+ wx_sec: null,
+ tx_sec: null,
+ ms: 0
+ };
+
+ if (_fs_speed && _fs_speed.ms) {
+ result.rx = rx;
+ result.wx = wx;
+ result.tx = result.rx + result.wx;
+ result.ms = Date.now() - _fs_speed.ms;
+ result.rx_sec = (result.rx - _fs_speed.bytes_read) / (result.ms / 1000);
+ result.wx_sec = (result.wx - _fs_speed.bytes_write) / (result.ms / 1000);
+ result.tx_sec = result.rx_sec + result.wx_sec;
+ _fs_speed.rx_sec = result.rx_sec;
+ _fs_speed.wx_sec = result.wx_sec;
+ _fs_speed.tx_sec = result.tx_sec;
+ _fs_speed.bytes_read = result.rx;
+ _fs_speed.bytes_write = result.wx;
+ _fs_speed.bytes_overall = result.rx + result.wx;
+ _fs_speed.ms = Date.now();
+ _fs_speed.last_ms = result.ms;
+ } else {
+ result.rx = rx;
+ result.wx = wx;
+ result.tx = result.rx + result.wx;
+ _fs_speed.rx_sec = null;
+ _fs_speed.wx_sec = null;
+ _fs_speed.tx_sec = null;
+ _fs_speed.bytes_read = result.rx;
+ _fs_speed.bytes_write = result.wx;
+ _fs_speed.bytes_overall = result.rx + result.wx;
+ _fs_speed.ms = Date.now();
+ _fs_speed.last_ms = 0;
+ }
+ return result;
+}
+
+function fsStats(callback) {
+
+ return new Promise((resolve) => {
+ process.nextTick(() => {
+ if (_windows || _freebsd || _openbsd || _netbsd || _sunos) {
+ return resolve(null);
+ }
+
+ let result = {
+ rx: 0,
+ wx: 0,
+ tx: 0,
+ rx_sec: null,
+ wx_sec: null,
+ tx_sec: null,
+ ms: 0
+ };
+
+ let rx = 0;
+ let wx = 0;
+ if ((_fs_speed && !_fs_speed.ms) || (_fs_speed && _fs_speed.ms && Date.now() - _fs_speed.ms >= 500)) {
+ if (_linux) {
+ // exec("df -k | grep /dev/", function(error, stdout) {
+ exec('lsblk -r 2>/dev/null | grep /', { maxBuffer: 1024 * 1024 }, function (error, stdout) {
+ if (!error) {
+ let lines = stdout.toString().split('\n');
+ let fs_filter = [];
+ lines.forEach(function (line) {
+ if (line !== '') {
+ line = line.trim().split(' ');
+ if (fs_filter.indexOf(line[0]) === -1) { fs_filter.push(line[0]); }
+ }
+ });
+
+ let output = fs_filter.join('|');
+ exec('cat /proc/diskstats | egrep "' + output + '"', { maxBuffer: 1024 * 1024 }, function (error, stdout) {
+ if (!error) {
+ let lines = stdout.toString().split('\n');
+ lines.forEach(function (line) {
+ line = line.trim();
+ if (line !== '') {
+ line = line.replace(/ +/g, ' ').split(' ');
+
+ rx += parseInt(line[5]) * 512;
+ wx += parseInt(line[9]) * 512;
+ }
+ });
+ result = calcFsSpeed(rx, wx);
+ }
+ if (callback) {
+ callback(result);
+ }
+ resolve(result);
+ });
+ } else {
+ if (callback) {
+ callback(result);
+ }
+ resolve(result);
+ }
+ });
+ }
+ if (_darwin) {
+ exec('ioreg -c IOBlockStorageDriver -k Statistics -r -w0 | sed -n "/IOBlockStorageDriver/,/Statistics/p" | grep "Statistics" | tr -cd "01234567890,\n"', { maxBuffer: 1024 * 1024 }, function (error, stdout) {
+ if (!error) {
+ let lines = stdout.toString().split('\n');
+ lines.forEach(function (line) {
+ line = line.trim();
+ if (line !== '') {
+ line = line.split(',');
+
+ rx += parseInt(line[2]);
+ wx += parseInt(line[9]);
+ }
+ });
+ result = calcFsSpeed(rx, wx);
+ }
+ if (callback) {
+ callback(result);
+ }
+ resolve(result);
+ });
+ }
+ } else {
+ result.ms = _fs_speed.last_ms;
+ result.rx = _fs_speed.bytes_read;
+ result.wx = _fs_speed.bytes_write;
+ result.tx = _fs_speed.bytes_read + _fs_speed.bytes_write;
+ result.rx_sec = _fs_speed.rx_sec;
+ result.wx_sec = _fs_speed.wx_sec;
+ result.tx_sec = _fs_speed.tx_sec;
+ if (callback) {
+ callback(result);
+ }
+ resolve(result);
+ }
+ });
+ });
+}
+
+exports.fsStats = fsStats;
+
+function calcDiskIO(rIO, wIO, rWaitTime, wWaitTime, tWaitTime) {
+ let result = {
+ rIO: 0,
+ wIO: 0,
+ tIO: 0,
+ rIO_sec: null,
+ wIO_sec: null,
+ tIO_sec: null,
+ rWaitTime: 0,
+ wWaitTime: 0,
+ tWaitTime: 0,
+ rWaitPercent: null,
+ wWaitPercent: null,
+ tWaitPercent: null,
+ ms: 0
+ };
+ if (_disk_io && _disk_io.ms) {
+ result.rIO = rIO;
+ result.wIO = wIO;
+ result.tIO = rIO + wIO;
+ result.ms = Date.now() - _disk_io.ms;
+ result.rIO_sec = (result.rIO - _disk_io.rIO) / (result.ms / 1000);
+ result.wIO_sec = (result.wIO - _disk_io.wIO) / (result.ms / 1000);
+ result.tIO_sec = result.rIO_sec + result.wIO_sec;
+ result.rWaitTime = rWaitTime;
+ result.wWaitTime = wWaitTime;
+ result.tWaitTime = tWaitTime;
+ result.rWaitPercent = (result.rWaitTime - _disk_io.rWaitTime) * 100 / (result.ms);
+ result.wWaitPercent = (result.wWaitTime - _disk_io.wWaitTime) * 100 / (result.ms);
+ result.tWaitPercent = (result.tWaitTime - _disk_io.tWaitTime) * 100 / (result.ms);
+ _disk_io.rIO = rIO;
+ _disk_io.wIO = wIO;
+ _disk_io.rIO_sec = result.rIO_sec;
+ _disk_io.wIO_sec = result.wIO_sec;
+ _disk_io.tIO_sec = result.tIO_sec;
+ _disk_io.rWaitTime = rWaitTime;
+ _disk_io.wWaitTime = wWaitTime;
+ _disk_io.tWaitTime = tWaitTime;
+ _disk_io.rWaitPercent = result.rWaitPercent;
+ _disk_io.wWaitPercent = result.wWaitPercent;
+ _disk_io.tWaitPercent = result.tWaitPercent;
+ _disk_io.last_ms = result.ms;
+ _disk_io.ms = Date.now();
+ } else {
+ result.rIO = rIO;
+ result.wIO = wIO;
+ result.tIO = rIO + wIO;
+ result.rWaitTime = rWaitTime;
+ result.wWaitTime = wWaitTime;
+ result.tWaitTime = tWaitTime;
+ _disk_io.rIO = rIO;
+ _disk_io.wIO = wIO;
+ _disk_io.rIO_sec = null;
+ _disk_io.wIO_sec = null;
+ _disk_io.tIO_sec = null;
+ _disk_io.rWaitTime = rWaitTime;
+ _disk_io.wWaitTime = wWaitTime;
+ _disk_io.tWaitTime = tWaitTime;
+ _disk_io.rWaitPercent = null;
+ _disk_io.wWaitPercent = null;
+ _disk_io.tWaitPercent = null;
+ _disk_io.last_ms = 0;
+ _disk_io.ms = Date.now();
+ }
+ return result;
+}
+
+function disksIO(callback) {
+
+ return new Promise((resolve) => {
+ process.nextTick(() => {
+ if (_windows) {
+ return resolve(null);
+ }
+ if (_sunos) {
+ return resolve(null);
+ }
+
+ let result = {
+ rIO: 0,
+ wIO: 0,
+ tIO: 0,
+ rIO_sec: null,
+ wIO_sec: null,
+ tIO_sec: null,
+ rWaitTime: 0,
+ wWaitTime: 0,
+ tWaitTime: 0,
+ rWaitPercent: null,
+ wWaitPercent: null,
+ tWaitPercent: null,
+ ms: 0
+ };
+ let rIO = 0;
+ let wIO = 0;
+ let rWaitTime = 0;
+ let wWaitTime = 0;
+ let tWaitTime = 0;
+
+ if ((_disk_io && !_disk_io.ms) || (_disk_io && _disk_io.ms && Date.now() - _disk_io.ms >= 500)) {
+ if (_linux || _freebsd || _openbsd || _netbsd) {
+ // prints Block layer statistics for all mounted volumes
+ // var cmd = "for mount in `lsblk | grep / | sed -r 's/│ └─//' | cut -d ' ' -f 1`; do cat /sys/block/$mount/stat | sed -r 's/ +/;/g' | sed -r 's/^;//'; done";
+ // var cmd = "for mount in `lsblk | grep / | sed 's/[│└─├]//g' | awk '{$1=$1};1' | cut -d ' ' -f 1 | sort -u`; do cat /sys/block/$mount/stat | sed -r 's/ +/;/g' | sed -r 's/^;//'; done";
+ let cmd = 'for mount in `lsblk 2>/dev/null | grep " disk " | sed "s/[│└─├]//g" | awk \'{$1=$1};1\' | cut -d " " -f 1 | sort -u`; do cat /sys/block/$mount/stat | sed -r "s/ +/;/g" | sed -r "s/^;//"; done';
+
+ exec(cmd, { maxBuffer: 1024 * 1024 }, function (error, stdout) {
+ if (!error) {
+ let lines = stdout.split('\n');
+ lines.forEach(function (line) {
+ // ignore empty lines
+ if (!line) { return; }
+
+ // sum r/wIO of all disks to compute all disks IO
+ let stats = line.split(';');
+ rIO += parseInt(stats[0]);
+ wIO += parseInt(stats[4]);
+ rWaitTime += parseInt(stats[3]);
+ wWaitTime += parseInt(stats[7]);
+ tWaitTime += parseInt(stats[10]);
+ });
+ result = calcDiskIO(rIO, wIO, rWaitTime, wWaitTime, tWaitTime);
+
+ if (callback) {
+ callback(result);
+ }
+ resolve(result);
+ } else {
+ if (callback) {
+ callback(result);
+ }
+ resolve(result);
+ }
+ });
+ }
+ if (_darwin) {
+ exec('ioreg -c IOBlockStorageDriver -k Statistics -r -w0 | sed -n "/IOBlockStorageDriver/,/Statistics/p" | grep "Statistics" | tr -cd "01234567890,\n"', { maxBuffer: 1024 * 1024 }, function (error, stdout) {
+ if (!error) {
+ let lines = stdout.toString().split('\n');
+ lines.forEach(function (line) {
+ line = line.trim();
+ if (line !== '') {
+ line = line.split(',');
+
+ rIO += parseInt(line[10]);
+ wIO += parseInt(line[0]);
+ }
+ });
+ result = calcDiskIO(rIO, wIO, rWaitTime, wWaitTime, tWaitTime);
+ }
+ if (callback) {
+ callback(result);
+ }
+ resolve(result);
+ });
+ }
+ } else {
+ result.rIO = _disk_io.rIO;
+ result.wIO = _disk_io.wIO;
+ result.tIO = _disk_io.rIO + _disk_io.wIO;
+ result.ms = _disk_io.last_ms;
+ result.rIO_sec = _disk_io.rIO_sec;
+ result.wIO_sec = _disk_io.wIO_sec;
+ result.tIO_sec = _disk_io.tIO_sec;
+ result.rWaitTime = _disk_io.rWaitTime;
+ result.wWaitTime = _disk_io.wWaitTime;
+ result.tWaitTime = _disk_io.tWaitTime;
+ result.rWaitPercent = _disk_io.rWaitPercent;
+ result.wWaitPercent = _disk_io.wWaitPercent;
+ result.tWaitPercent = _disk_io.tWaitPercent;
+ if (callback) {
+ callback(result);
+ }
+ resolve(result);
+ }
+ });
+ });
+}
+
+exports.disksIO = disksIO;
+
+function diskLayout(callback) {
+
+ function getVendorFromModel(model) {
+ const diskManufacturers = [
+ { pattern: 'WESTERN.*', manufacturer: 'Western Digital' },
+ { pattern: '^WDC.*', manufacturer: 'Western Digital' },
+ { pattern: 'WD.*', manufacturer: 'Western Digital' },
+ { pattern: 'TOSHIBA.*', manufacturer: 'Toshiba' },
+ { pattern: 'HITACHI.*', manufacturer: 'Hitachi' },
+ { pattern: '^IC.*', manufacturer: 'Hitachi' },
+ { pattern: '^HTS.*', manufacturer: 'Hitachi' },
+ { pattern: 'SANDISK.*', manufacturer: 'SanDisk' },
+ { pattern: 'KINGSTON.*', manufacturer: 'Kingston Technology' },
+ { pattern: '^SONY.*', manufacturer: 'Sony' },
+ { pattern: 'TRANSCEND.*', manufacturer: 'Transcend' },
+ { pattern: 'SAMSUNG.*', manufacturer: 'Samsung' },
+ { pattern: '^ST(?!I\\ ).*', manufacturer: 'Seagate' },
+ { pattern: '^STI\\ .*', manufacturer: 'SimpleTech' },
+ { pattern: '^D...-.*', manufacturer: 'IBM' },
+ { pattern: '^IBM.*', manufacturer: 'IBM' },
+ { pattern: '^FUJITSU.*', manufacturer: 'Fujitsu' },
+ { pattern: '^MP.*', manufacturer: 'Fujitsu' },
+ { pattern: '^MK.*', manufacturer: 'Toshiba' },
+ { pattern: 'MAXTO.*', manufacturer: 'Maxtor' },
+ { pattern: 'PIONEER.*', manufacturer: 'Pioneer' },
+ { pattern: 'PHILIPS.*', manufacturer: 'Philips' },
+ { pattern: 'QUANTUM.*', manufacturer: 'Quantum Technology' },
+ { pattern: 'FIREBALL.*', manufacturer: 'Quantum Technology' },
+ { pattern: '^VBOX.*', manufacturer: 'VirtualBox' },
+ { pattern: 'CORSAIR.*', manufacturer: 'Corsair Components' },
+ { pattern: 'CRUCIAL.*', manufacturer: 'Crucial' },
+ { pattern: 'ECM.*', manufacturer: 'ECM' },
+ { pattern: 'INTEL.*', manufacturer: 'INTEL' },
+ { pattern: 'EVO.*', manufacturer: 'Samsung' },
+ { pattern: 'APPLE.*', manufacturer: 'Apple' },
+ ];
+
+ let result = '';
+ if (model) {
+ model = model.toUpperCase();
+ diskManufacturers.forEach((manufacturer) => {
+ const re = RegExp(manufacturer.pattern);
+ if (re.test(model)) { result = manufacturer.manufacturer; }
+ });
+ }
+ return result;
+ }
+
+ return new Promise((resolve) => {
+ process.nextTick(() => {
+
+ const commitResult = res => {
+ for (let i = 0; i < res.length; i++) {
+ delete res[i].BSDName;
+ }
+ if (callback) {
+ callback(res);
+ }
+ resolve(res);
+ };
+
+ let result = [];
+ let cmd = '';
+
+ if (_linux) {
+ let cmdFullSmart = '';
+
+ exec('export LC_ALL=C; lsblk -ablJO 2>/dev/null; unset LC_ALL', { maxBuffer: 1024 * 1024 }, function (error, stdout) {
+ if (!error) {
+ try {
+ const out = stdout.toString().trim();
+ let devices = [];
+ try {
+ const outJSON = JSON.parse(out);
+ if (outJSON && {}.hasOwnProperty.call(outJSON, 'blockdevices')) {
+ devices = outJSON.blockdevices.filter(item => { return (item.type === 'disk') && item.size > 0 && (item.model !== null || (item.mountpoint === null && item.label === null && item.fstype === null && item.parttype === null && item.path && item.path.indexOf('/ram') !== 0 && item.path.indexOf('/loop') !== 0 && item['disc-max'] && item['disc-max'] !== 0)); });
+ }
+ } catch (e) {
+ // fallback to older version of lsblk
+ const out2 = execSync('export LC_ALL=C; lsblk -bPo NAME,TYPE,SIZE,FSTYPE,MOUNTPOINT,UUID,ROTA,RO,RM,LABEL,MODEL,OWNER,GROUP 2>/dev/null; unset LC_ALL').toString();
+ let lines = blkStdoutToObject(out2).split('\n');
+ const data = parseBlk(lines);
+ devices = data.filter(item => { return (item.type === 'disk') && item.size > 0 && ((item.model !== null && item.model !== '') || (item.mount === '' && item.label === '' && item.fsType === '')); });
+ }
+ devices.forEach((device) => {
+ let mediumType = '';
+ const BSDName = '/dev/' + device.name;
+ const logical = device.name;
+ try {
+ mediumType = execSync('cat /sys/block/' + logical + '/queue/rotational 2>/dev/null').toString().split('\n')[0];
+ } catch (e) {
+ util.noop();
+ }
+ let interfaceType = device.tran ? device.tran.toUpperCase().trim() : '';
+ if (interfaceType === 'NVME') {
+ mediumType = '2';
+ interfaceType = 'PCIe';
+ }
+ result.push({
+ device: BSDName,
+ type: (mediumType === '0' ? 'SSD' : (mediumType === '1' ? 'HD' : (mediumType === '2' ? 'NVMe' : (device.model && device.model.indexOf('SSD') > -1 ? 'SSD' : (device.model && device.model.indexOf('NVM') > -1 ? 'NVMe' : 'HD'))))),
+ name: device.model || '',
+ vendor: getVendorFromModel(device.model) || (device.vendor ? device.vendor.trim() : ''),
+ size: device.size || 0,
+ bytesPerSector: null,
+ totalCylinders: null,
+ totalHeads: null,
+ totalSectors: null,
+ totalTracks: null,
+ tracksPerCylinder: null,
+ sectorsPerTrack: null,
+ firmwareRevision: device.rev ? device.rev.trim() : '',
+ serialNum: device.serial ? device.serial.trim() : '',
+ interfaceType: interfaceType,
+ smartStatus: 'unknown',
+ temperature: null,
+ BSDName: BSDName
+ });
+ cmd += `printf "\n${BSDName}|"; smartctl -H ${BSDName} | grep overall;`;
+ cmdFullSmart += `${cmdFullSmart ? 'printf ",";' : ''}smartctl -a -j ${BSDName};`;
+ });
+ } catch (e) {
+ util.noop();
+ }
+ }
+ // check S.M.A.R.T. status
+ if (cmdFullSmart) {
+ exec(cmdFullSmart, { maxBuffer: 1024 * 1024 }, function (error, stdout) {
+ try {
+ const data = JSON.parse(`[${stdout}]`);
+ data.forEach(disk => {
+ const diskBSDName = disk.smartctl.argv[disk.smartctl.argv.length - 1];
+
+ for (let i = 0; i < result.length; i++) {
+ if (result[i].BSDName === diskBSDName) {
+ result[i].smartStatus = (disk.smart_status.passed ? 'Ok' : (disk.smart_status.passed === false ? 'Predicted Failure' : 'unknown'));
+ if (disk.temperature && disk.temperature.current) {
+ result[i].temperature = disk.temperature.current;
+ }
+ result[i].smartData = disk;
+ }
+ }
+ });
+ commitResult(result);
+ } catch (e) {
+ if (cmd) {
+ cmd = cmd + 'printf "\n"';
+ exec(cmd, { maxBuffer: 1024 * 1024 }, function (error, stdout) {
+ let lines = stdout.toString().split('\n');
+ lines.forEach(line => {
+ if (line) {
+ let parts = line.split('|');
+ if (parts.length === 2) {
+ let BSDName = parts[0];
+ parts[1] = parts[1].trim();
+ let parts2 = parts[1].split(':');
+ if (parts2.length === 2) {
+ parts2[1] = parts2[1].trim();
+ let status = parts2[1].toLowerCase();
+ for (let i = 0; i < result.length; i++) {
+ if (result[i].BSDName === BSDName) {
+ result[i].smartStatus = (status === 'passed' ? 'Ok' : (status === 'failed!' ? 'Predicted Failure' : 'unknown'));
+ }
+ }
+ }
+ }
+ }
+ });
+ commitResult(result);
+ });
+ } else {
+ commitResult(result);
+ }
+ }
+ });
+ } else {
+ commitResult(result);
+ }
+ });
+ }
+ if (_freebsd || _openbsd || _netbsd) {
+ if (callback) { callback(result); }
+ resolve(result);
+ }
+ if (_sunos) {
+ if (callback) { callback(result); }
+ resolve(result);
+ }
+ if (_darwin) {
+ exec('system_profiler SPSerialATADataType SPNVMeDataType SPUSBDataType', { maxBuffer: 1024 * 1024 }, function (error, stdout) {
+ if (!error) {
+ // split by type:
+ let lines = stdout.toString().split('\n');
+ let linesSATA = [];
+ let linesNVMe = [];
+ let linesUSB = [];
+ let dataType = 'SATA';
+ lines.forEach(line => {
+ if (line === 'NVMExpress:') { dataType = 'NVMe'; }
+ else if (line === 'USB:') { dataType = 'USB'; }
+ else if (line === 'SATA/SATA Express:') { dataType = 'SATA'; }
+ else if (dataType === 'SATA') { linesSATA.push(line); }
+ else if (dataType === 'NVMe') { linesNVMe.push(line); }
+ else if (dataType === 'USB') { linesUSB.push(line); }
+ });
+ try {
+ // Serial ATA Drives
+ let devices = linesSATA.join('\n').split(' Physical Interconnect: ');
+ devices.shift();
+ devices.forEach(function (device) {
+ device = 'InterfaceType: ' + device;
+ let lines = device.split('\n');
+ const mediumType = util.getValue(lines, 'Medium Type', ':', true).trim();
+ const sizeStr = util.getValue(lines, 'capacity', ':', true).trim();
+ const BSDName = util.getValue(lines, 'BSD Name', ':', true).trim();
+ if (sizeStr) {
+ let sizeValue = 0;
+ if (sizeStr.indexOf('(') >= 0) {
+ sizeValue = parseInt(sizeStr.match(/\(([^)]+)\)/)[1].replace(/\./g, '').replace(/,/g, '').replace(/\s/g, ''));
+ }
+ if (!sizeValue) {
+ sizeValue = parseInt(sizeStr);
+ }
+ if (sizeValue) {
+ const smartStatusString = util.getValue(lines, 'S.M.A.R.T. status', ':', true).trim().toLowerCase();
+ result.push({
+ device: BSDName,
+ type: mediumType.startsWith('Solid') ? 'SSD' : 'HD',
+ name: util.getValue(lines, 'Model', ':', true).trim(),
+ vendor: getVendorFromModel(util.getValue(lines, 'Model', ':', true).trim()) || util.getValue(lines, 'Manufacturer', ':', true),
+ size: sizeValue,
+ bytesPerSector: null,
+ totalCylinders: null,
+ totalHeads: null,
+ totalSectors: null,
+ totalTracks: null,
+ tracksPerCylinder: null,
+ sectorsPerTrack: null,
+ firmwareRevision: util.getValue(lines, 'Revision', ':', true).trim(),
+ serialNum: util.getValue(lines, 'Serial Number', ':', true).trim(),
+ interfaceType: util.getValue(lines, 'InterfaceType', ':', true).trim(),
+ smartStatus: smartStatusString === 'verified' ? 'OK' : smartStatusString || 'unknown',
+ temperature: null,
+ BSDName: BSDName
+ });
+ cmd = cmd + 'printf "\n' + BSDName + '|"; diskutil info /dev/' + BSDName + ' | grep SMART;';
+ }
+ }
+ });
+ } catch (e) {
+ util.noop();
+ }
+
+ // NVME Drives
+ try {
+ let devices = linesNVMe.join('\n').split('\n\n Capacity:');
+ devices.shift();
+ devices.forEach(function (device) {
+ device = '!Capacity: ' + device;
+ let lines = device.split('\n');
+ const linkWidth = util.getValue(lines, 'link width', ':', true).trim();
+ const sizeStr = util.getValue(lines, '!capacity', ':', true).trim();
+ const BSDName = util.getValue(lines, 'BSD Name', ':', true).trim();
+ if (sizeStr) {
+ let sizeValue = 0;
+ if (sizeStr.indexOf('(') >= 0) {
+ sizeValue = parseInt(sizeStr.match(/\(([^)]+)\)/)[1].replace(/\./g, '').replace(/,/g, '').replace(/\s/g, ''));
+ }
+ if (!sizeValue) {
+ sizeValue = parseInt(sizeStr);
+ }
+ if (sizeValue) {
+ const smartStatusString = util.getValue(lines, 'S.M.A.R.T. status', ':', true).trim().toLowerCase();
+ result.push({
+ device: BSDName,
+ type: 'NVMe',
+ name: util.getValue(lines, 'Model', ':', true).trim(),
+ vendor: getVendorFromModel(util.getValue(lines, 'Model', ':', true).trim()),
+ size: sizeValue,
+ bytesPerSector: null,
+ totalCylinders: null,
+ totalHeads: null,
+ totalSectors: null,
+ totalTracks: null,
+ tracksPerCylinder: null,
+ sectorsPerTrack: null,
+ firmwareRevision: util.getValue(lines, 'Revision', ':', true).trim(),
+ serialNum: util.getValue(lines, 'Serial Number', ':', true).trim(),
+ interfaceType: ('PCIe ' + linkWidth).trim(),
+ smartStatus: smartStatusString === 'verified' ? 'OK' : smartStatusString || 'unknown',
+ temperature: null,
+ BSDName: BSDName
+ });
+ cmd = cmd + 'printf "\n' + BSDName + '|"; diskutil info /dev/' + BSDName + ' | grep SMART;';
+ }
+ }
+ });
+ } catch (e) {
+ util.noop();
+ }
+ // USB Drives
+ try {
+ let devices = linesUSB.join('\n').replaceAll('Media:\n ', 'Model:').split('\n\n Product ID:');
+ devices.shift();
+ devices.forEach(function (device) {
+ let lines = device.split('\n');
+ const sizeStr = util.getValue(lines, 'Capacity', ':', true).trim();
+ const BSDName = util.getValue(lines, 'BSD Name', ':', true).trim();
+ if (sizeStr) {
+ let sizeValue = 0;
+ if (sizeStr.indexOf('(') >= 0) {
+ sizeValue = parseInt(sizeStr.match(/\(([^)]+)\)/)[1].replace(/\./g, '').replace(/,/g, '').replace(/\s/g, ''));
+ }
+ if (!sizeValue) {
+ sizeValue = parseInt(sizeStr);
+ }
+ if (sizeValue) {
+ const smartStatusString = util.getValue(lines, 'S.M.A.R.T. status', ':', true).trim().toLowerCase();
+ result.push({
+ device: BSDName,
+ type: 'USB',
+ name: util.getValue(lines, 'Model', ':', true).trim().replaceAll(':', ''),
+ vendor: getVendorFromModel(util.getValue(lines, 'Model', ':', true).trim()),
+ size: sizeValue,
+ bytesPerSector: null,
+ totalCylinders: null,
+ totalHeads: null,
+ totalSectors: null,
+ totalTracks: null,
+ tracksPerCylinder: null,
+ sectorsPerTrack: null,
+ firmwareRevision: util.getValue(lines, 'Revision', ':', true).trim(),
+ serialNum: util.getValue(lines, 'Serial Number', ':', true).trim(),
+ interfaceType: 'USB',
+ smartStatus: smartStatusString === 'verified' ? 'OK' : smartStatusString || 'unknown',
+ temperature: null,
+ BSDName: BSDName
+ });
+ cmd = cmd + 'printf "\n' + BSDName + '|"; diskutil info /dev/' + BSDName + ' | grep SMART;';
+ }
+ }
+ });
+ } catch (e) {
+ util.noop();
+ }
+ if (cmd) {
+ cmd = cmd + 'printf "\n"';
+ exec(cmd, { maxBuffer: 1024 * 1024 }, function (error, stdout) {
+ let lines = stdout.toString().split('\n');
+ lines.forEach(line => {
+ if (line) {
+ let parts = line.split('|');
+ if (parts.length === 2) {
+ let BSDName = parts[0];
+ parts[1] = parts[1].trim();
+ let parts2 = parts[1].split(':');
+ if (parts2.length === 2) {
+ parts2[1] = parts2[1].trim();
+ let status = parts2[1].toLowerCase();
+ for (let i = 0; i < result.length; i++) {
+ if (result[i].BSDName === BSDName) {
+ result[i].smartStatus = (status === 'not supported' ? 'not supported' : (status === 'verified' ? 'Ok' : (status === 'failing' ? 'Predicted Failure' : 'unknown')));
+ }
+ }
+ }
+ }
+ }
+ });
+ for (let i = 0; i < result.length; i++) {
+ delete result[i].BSDName;
+ }
+ if (callback) {
+ callback(result);
+ }
+ resolve(result);
+ });
+ } else {
+ for (let i = 0; i < result.length; i++) {
+ delete result[i].BSDName;
+ }
+ if (callback) {
+ callback(result);
+ }
+ resolve(result);
+ }
+ }
+ });
+ }
+ if (_windows) {
+ try {
+ const workload = [];
+ workload.push(util.powerShell('Get-WmiObject Win32_DiskDrive | select Caption,Size,Status,PNPDeviceId,BytesPerSector,TotalCylinders,TotalHeads,TotalSectors,TotalTracks,TracksPerCylinder,SectorsPerTrack,FirmwareRevision,SerialNumber,InterfaceType | fl'));
+ workload.push(util.powerShell('Get-PhysicalDisk | select BusType,MediaType,FriendlyName,Model,SerialNumber,Size | fl'));
+ if (util.smartMonToolsInstalled()) {
+ try {
+ const smartDev = JSON.parse(execSync('smartctl --scan -j'));
+ if (smartDev && smartDev.devices && smartDev.devices.length > 0) {
+ smartDev.devices.forEach((dev) => {
+ workload.push(execPromiseSave(`smartctl -j -a ${dev.name}`, util.execOptsWin));
+ });
+ }
+ } catch (e) {
+ util.noop();
+ }
+ }
+ util.promiseAll(
+ workload
+ ).then((data) => {
+ let devices = data.results[0].toString().split(/\n\s*\n/);
+ devices.forEach(function (device) {
+ let lines = device.split('\r\n');
+ const size = util.getValue(lines, 'Size', ':').trim();
+ const status = util.getValue(lines, 'Status', ':').trim().toLowerCase();
+ if (size) {
+ result.push({
+ device: util.getValue(lines, 'PNPDeviceId', ':'),
+ type: device.indexOf('SSD') > -1 ? 'SSD' : 'HD', // just a starting point ... better: MSFT_PhysicalDisk - Media Type ... see below
+ name: util.getValue(lines, 'Caption', ':'),
+ vendor: getVendorFromModel(util.getValue(lines, 'Caption', ':', true).trim()),
+ size: parseInt(size),
+ bytesPerSector: parseInt(util.getValue(lines, 'BytesPerSector', ':')),
+ totalCylinders: parseInt(util.getValue(lines, 'TotalCylinders', ':')),
+ totalHeads: parseInt(util.getValue(lines, 'TotalHeads', ':')),
+ totalSectors: parseInt(util.getValue(lines, 'TotalSectors', ':')),
+ totalTracks: parseInt(util.getValue(lines, 'TotalTracks', ':')),
+ tracksPerCylinder: parseInt(util.getValue(lines, 'TracksPerCylinder', ':')),
+ sectorsPerTrack: parseInt(util.getValue(lines, 'SectorsPerTrack', ':')),
+ firmwareRevision: util.getValue(lines, 'FirmwareRevision', ':').trim(),
+ serialNum: util.getValue(lines, 'SerialNumber', ':').trim(),
+ interfaceType: util.getValue(lines, 'InterfaceType', ':').trim(),
+ smartStatus: (status === 'ok' ? 'Ok' : (status === 'degraded' ? 'Degraded' : (status === 'pred fail' ? 'Predicted Failure' : 'Unknown'))),
+ temperature: null,
+ });
+ }
+ });
+ devices = data.results[1].split(/\n\s*\n/);
+ devices.forEach(function (device) {
+ let lines = device.split('\r\n');
+ const serialNum = util.getValue(lines, 'SerialNumber', ':').trim();
+ const name = util.getValue(lines, 'FriendlyName', ':').trim().replace('Msft ', 'Microsoft');
+ const size = util.getValue(lines, 'Size', ':').trim();
+ const model = util.getValue(lines, 'Model', ':').trim();
+ const interfaceType = util.getValue(lines, 'BusType', ':').trim();
+ let mediaType = util.getValue(lines, 'MediaType', ':').trim();
+ if (mediaType === '3' || mediaType === 'HDD') { mediaType = 'HD'; }
+ if (mediaType === '4') { mediaType = 'SSD'; }
+ if (mediaType === '5') { mediaType = 'SCM'; }
+ if (mediaType === 'Unspecified' && (model.toLowerCase().indexOf('virtual') > -1 || model.toLowerCase().indexOf('vbox') > -1)) { mediaType = 'Virtual'; }
+ if (size) {
+ let i = util.findObjectByKey(result, 'serialNum', serialNum);
+ if (i === -1 || serialNum === '') {
+ i = util.findObjectByKey(result, 'name', name);
+ }
+ if (i != -1) {
+ result[i].type = mediaType;
+ result[i].interfaceType = interfaceType;
+ }
+ }
+ });
+ // S.M.A.R.T
+ data.results.shift();
+ data.results.shift();
+ if (data.results.length) {
+ data.results.forEach((smartStr) => {
+ try {
+ const smartData = JSON.parse(smartStr);
+ if (smartData.serial_number) {
+ const serialNum = smartData.serial_number;
+ let i = util.findObjectByKey(result, 'serialNum', serialNum);
+ if (i != -1) {
+ result[i].smartStatus = (smartData.smart_status && smartData.smart_status.passed ? 'Ok' : (smartData.smart_status && smartData.smart_status.passed === false ? 'Predicted Failure' : 'unknown'));
+ if (smartData.temperature && smartData.temperature.current) {
+ result[i].temperature = smartData.temperature.current;
+ }
+ result[i].smartData = smartData;
+ }
+ }
+ } catch (e) {
+ util.noop();
+ }
+ });
+ }
+ if (callback) {
+ callback(result);
+ }
+ resolve(result);
+ });
+ } catch (e) {
+ if (callback) { callback(result); }
+ resolve(result);
+ }
+ }
+ });
+ });
+}
+
+exports.diskLayout = diskLayout;
diff --git a/node_modules/systeminformation/lib/graphics.js b/node_modules/systeminformation/lib/graphics.js
new file mode 100644
index 0000000..e5d98b5
--- /dev/null
+++ b/node_modules/systeminformation/lib/graphics.js
@@ -0,0 +1,1066 @@
+'use strict';
+// @ts-check
+// ==================================================================================
+// graphics.js
+// ----------------------------------------------------------------------------------
+// Description: System Information - library
+// for Node.js
+// Copyright: (c) 2014 - 2022
+// Author: Sebastian Hildebrandt
+// ----------------------------------------------------------------------------------
+// License: MIT
+// ==================================================================================
+// 7. Graphics (controller, display)
+// ----------------------------------------------------------------------------------
+
+const fs = require('fs');
+const exec = require('child_process').exec;
+const execSync = require('child_process').execSync;
+const util = require('./util');
+
+let _platform = process.platform;
+let _nvidiaSmiPath = '';
+
+const _linux = (_platform === 'linux' || _platform === 'android');
+const _darwin = (_platform === 'darwin');
+const _windows = (_platform === 'win32');
+const _freebsd = (_platform === 'freebsd');
+const _openbsd = (_platform === 'openbsd');
+const _netbsd = (_platform === 'netbsd');
+const _sunos = (_platform === 'sunos');
+
+let _resolutionX = 0;
+let _resolutionY = 0;
+let _pixelDepth = 0;
+let _refreshRate = 0;
+
+const videoTypes = {
+ '-2': 'UNINITIALIZED',
+ '-1': 'OTHER',
+ '0': 'HD15',
+ '1': 'SVIDEO',
+ '2': 'Composite video',
+ '3': 'Component video',
+ '4': 'DVI',
+ '5': 'HDMI',
+ '6': 'LVDS',
+ '8': 'D_JPN',
+ '9': 'SDI',
+ '10': 'DP',
+ '11': 'DP embedded',
+ '12': 'UDI',
+ '13': 'UDI embedded',
+ '14': 'SDTVDONGLE',
+ '15': 'MIRACAST',
+ '2147483648': 'INTERNAL'
+};
+
+function getVendorFromModel(model) {
+ const manufacturers = [
+ { pattern: '^LG.+', manufacturer: 'LG' },
+ { pattern: '^BENQ.+', manufacturer: 'BenQ' },
+ { pattern: '^ASUS.+', manufacturer: 'Asus' },
+ { pattern: '^DELL.+', manufacturer: 'Dell' },
+ { pattern: '^SAMSUNG.+', manufacturer: 'Samsung' },
+ { pattern: '^VIEWSON.+', manufacturer: 'ViewSonic' },
+ { pattern: '^SONY.+', manufacturer: 'Sony' },
+ { pattern: '^ACER.+', manufacturer: 'Acer' },
+ { pattern: '^AOC.+', manufacturer: 'AOC Monitors' },
+ { pattern: '^HP.+', manufacturer: 'HP' },
+ { pattern: '^EIZO.?', manufacturer: 'Eizo' },
+ { pattern: '^PHILIPS.?', manufacturer: 'Philips' },
+ { pattern: '^IIYAMA.?', manufacturer: 'Iiyama' },
+ { pattern: '^SHARP.?', manufacturer: 'Sharp' },
+ { pattern: '^NEC.?', manufacturer: 'NEC' },
+ { pattern: '^LENOVO.?', manufacturer: 'Lenovo' },
+ { pattern: 'COMPAQ.?', manufacturer: 'Compaq' },
+ { pattern: 'APPLE.?', manufacturer: 'Apple' },
+ { pattern: 'INTEL.?', manufacturer: 'Intel' },
+ { pattern: 'AMD.?', manufacturer: 'AMD' },
+ { pattern: 'NVIDIA.?', manufacturer: 'NVDIA' },
+ ];
+
+ let result = '';
+ if (model) {
+ model = model.toUpperCase();
+ manufacturers.forEach((manufacturer) => {
+ const re = RegExp(manufacturer.pattern);
+ if (re.test(model)) { result = manufacturer.manufacturer; }
+ });
+ }
+ return result;
+}
+
+function getVendorFromId(id) {
+ const vendors = {
+ '610': 'Apple',
+ '1e6d': 'LG',
+ '10ac': 'DELL',
+ '4dd9': 'Sony',
+ '38a3': 'NEC',
+ };
+ return vendors[id] || '';
+}
+
+function vendorToId(str) {
+ let result = '';
+ str = (str || '').toLowerCase();
+ if (str.indexOf('apple') >= 0) { result = '0x05ac'; }
+ else if (str.indexOf('nvidia') >= 0) { result = '0x10de'; }
+ else if (str.indexOf('intel') >= 0) { result = '0x8086'; }
+ else if (str.indexOf('ati') >= 0 || str.indexOf('amd') >= 0) { result = '0x1002'; }
+
+ return result;
+}
+
+function getMetalVersion(id) {
+ const families = {
+ 'spdisplays_mtlgpufamilymac1': 'mac1',
+ 'spdisplays_mtlgpufamilymac2': 'mac2',
+ 'spdisplays_mtlgpufamilyapple1': 'apple1',
+ 'spdisplays_mtlgpufamilyapple2': 'apple2',
+ 'spdisplays_mtlgpufamilyapple3': 'apple3',
+ 'spdisplays_mtlgpufamilyapple4': 'apple4',
+ 'spdisplays_mtlgpufamilyapple5': 'apple5',
+ 'spdisplays_mtlgpufamilyapple6': 'apple6',
+ 'spdisplays_mtlgpufamilyapple7': 'apple7',
+ 'spdisplays_metalfeaturesetfamily11': 'family1_v1',
+ 'spdisplays_metalfeaturesetfamily12': 'family1_v2',
+ 'spdisplays_metalfeaturesetfamily13': 'family1_v3',
+ 'spdisplays_metalfeaturesetfamily14': 'family1_v4',
+ 'spdisplays_metalfeaturesetfamily21': 'family2_v1'
+ };
+ return families[id] || '';
+}
+
+function graphics(callback) {
+
+ function parseLinesDarwin(graphicsArr) {
+ const res = {
+ controllers: [],
+ displays: []
+ };
+ try {
+ graphicsArr.forEach(function (item) {
+ // controllers
+ const bus = ((item.sppci_bus || '').indexOf('builtin') > -1 ? 'Built-In' : ((item.sppci_bus || '').indexOf('pcie') > -1 ? 'PCIe' : ''));
+ const vram = (parseInt((item.spdisplays_vram || ''), 10) || 0) * (((item.spdisplays_vram || '').indexOf('GB') > -1) ? 1024 : 1);
+ const vramDyn = (parseInt((item.spdisplays_vram_shared || ''), 10) || 0) * (((item.spdisplays_vram_shared || '').indexOf('GB') > -1) ? 1024 : 1);
+ let metalVersion = getMetalVersion(item.spdisplays_metal || item.spdisplays_metalfamily || '');
+ res.controllers.push({
+ vendor: getVendorFromModel(item.spdisplays_vendor || '') || item.spdisplays_vendor || '',
+ model: item.sppci_model || '',
+ bus,
+ vramDynamic: bus === 'Built-In',
+ vram: vram || vramDyn || null,
+ deviceId: item['spdisplays_device-id'] || '',
+ vendorId: item['spdisplays_vendor-id'] || vendorToId((item['spdisplays_vendor'] || '') + (item.sppci_model || '')),
+ external: (item.sppci_device_type === 'spdisplays_egpu'),
+ cores: item['sppci_cores'] || null,
+ metalVersion
+ });
+
+ // displays
+ if (item.spdisplays_ndrvs && item.spdisplays_ndrvs.length) {
+ item.spdisplays_ndrvs.forEach(function (displayItem) {
+ const connectionType = displayItem['spdisplays_connection_type'] || '';
+ const currentResolutionParts = (displayItem['_spdisplays_resolution'] || '').split('@');
+ const currentResolution = currentResolutionParts[0].split('x');
+ const pixelParts = (displayItem['_spdisplays_pixels'] || '').split('x');
+ const pixelDepthString = displayItem['spdisplays_depth'] || '';
+ const serial = displayItem['_spdisplays_display-serial-number'] || displayItem['_spdisplays_display-serial-number2'] || null;
+ res.displays.push({
+ vendor: getVendorFromId(displayItem['_spdisplays_display-vendor-id'] || '') || getVendorFromModel(displayItem['_name'] || ''),
+ vendorId: displayItem['_spdisplays_display-vendor-id'] || '',
+ model: displayItem['_name'] || '',
+ productionYear: displayItem['_spdisplays_display-year'] || null,
+ serial: serial !== '0' ? serial : null,
+ displayId: displayItem['_spdisplays_displayID'] || null,
+ main: displayItem['spdisplays_main'] ? displayItem['spdisplays_main'] === 'spdisplays_yes' : false,
+ builtin: (displayItem['spdisplays_display_type'] || '').indexOf('built-in') > -1,
+ connection: ((connectionType.indexOf('_internal') > -1) ? 'Internal' : ((connectionType.indexOf('_displayport') > -1) ? 'Display Port' : ((connectionType.indexOf('_hdmi') > -1) ? 'HDMI' : null))),
+ sizeX: null,
+ sizeY: null,
+ pixelDepth: (pixelDepthString === 'CGSThirtyBitColor' ? 30 : (pixelDepthString === 'CGSThirtytwoBitColor' ? 32 : (pixelDepthString === 'CGSTwentyfourBitColor' ? 24 : null))),
+ resolutionX: pixelParts.length > 1 ? parseInt(pixelParts[0], 10) : null,
+ resolutionY: pixelParts.length > 1 ? parseInt(pixelParts[1], 10) : null,
+ currentResX: currentResolution.length > 1 ? parseInt(currentResolution[0], 10) : null,
+ currentResY: currentResolution.length > 1 ? parseInt(currentResolution[1], 10) : null,
+ positionX: 0,
+ positionY: 0,
+ currentRefreshRate: currentResolutionParts.length > 1 ? parseInt(currentResolutionParts[1], 10) : null,
+
+ });
+ });
+ }
+ });
+ return res;
+ } catch (e) {
+ return res;
+ }
+ }
+
+ function parseLinesLinuxControllers(lines) {
+ let controllers = [];
+ let currentController = {
+ vendor: '',
+ model: '',
+ bus: '',
+ busAddress: '',
+ vram: null,
+ vramDynamic: false,
+ pciID: ''
+ };
+ let isGraphicsController = false;
+ // PCI bus IDs
+ let pciIDs = [];
+ try {
+ pciIDs = execSync('export LC_ALL=C; dmidecode -t 9 2>/dev/null; unset LC_ALL | grep "Bus Address: "').toString().split('\n');
+ for (let i = 0; i < pciIDs.length; i++) {
+ pciIDs[i] = pciIDs[i].replace('Bus Address:', '').replace('0000:', '').trim();
+ }
+ pciIDs = pciIDs.filter(function (el) {
+ return el != null && el;
+ });
+ } catch (e) {
+ util.noop();
+ }
+ for (let i = 0; i < lines.length; i++) {
+ if ('' !== lines[i].trim()) {
+ if (' ' !== lines[i][0] && '\t' !== lines[i][0]) { // first line of new entry
+ let isExternal = (pciIDs.indexOf(lines[i].split(' ')[0]) >= 0);
+ let vgapos = lines[i].toLowerCase().indexOf(' vga ');
+ let _3dcontrollerpos = lines[i].toLowerCase().indexOf('3d controller');
+ if (vgapos !== -1 || _3dcontrollerpos !== -1) { // VGA
+ if (_3dcontrollerpos !== -1 && vgapos === -1) {
+ vgapos = _3dcontrollerpos;
+ }
+ if (currentController.vendor || currentController.model || currentController.bus || currentController.vram !== null || currentController.vramDynamic) { // already a controller found
+ controllers.push(currentController);
+ currentController = {
+ vendor: '',
+ model: '',
+ bus: '',
+ busAddress: '',
+ vram: null,
+ vramDynamic: false,
+ };
+ }
+
+ const pciIDCandidate = lines[i].split(' ')[0];
+ if (/[\da-fA-F]{2}:[\da-fA-F]{2}\.[\da-fA-F]/.test(pciIDCandidate)) {
+ currentController.busAddress = pciIDCandidate;
+ }
+ isGraphicsController = true;
+ let endpos = lines[i].search(/\[[0-9a-f]{4}:[0-9a-f]{4}]|$/);
+ let parts = lines[i].substr(vgapos, endpos - vgapos).split(':');
+ currentController.busAddress = lines[i].substr(0, vgapos).trim();
+ if (parts.length > 1) {
+ parts[1] = parts[1].trim();
+ if (parts[1].toLowerCase().indexOf('corporation') >= 0) {
+ currentController.vendor = parts[1].substr(0, parts[1].toLowerCase().indexOf('corporation') + 11).trim();
+ currentController.model = parts[1].substr(parts[1].toLowerCase().indexOf('corporation') + 11, 200).trim().split('(')[0];
+ currentController.bus = (pciIDs.length > 0 && isExternal) ? 'PCIe' : 'Onboard';
+ currentController.vram = null;
+ currentController.vramDynamic = false;
+ } else if (parts[1].toLowerCase().indexOf(' inc.') >= 0) {
+ if ((parts[1].match(new RegExp(']', 'g')) || []).length > 1) {
+ currentController.vendor = parts[1].substr(0, parts[1].toLowerCase().indexOf(']') + 1).trim();
+ currentController.model = parts[1].substr(parts[1].toLowerCase().indexOf(']') + 1, 200).trim().split('(')[0].trim();
+ } else {
+ currentController.vendor = parts[1].substr(0, parts[1].toLowerCase().indexOf(' inc.') + 5).trim();
+ currentController.model = parts[1].substr(parts[1].toLowerCase().indexOf(' inc.') + 5, 200).trim().split('(')[0].trim();
+ }
+ currentController.bus = (pciIDs.length > 0 && isExternal) ? 'PCIe' : 'Onboard';
+ currentController.vram = null;
+ currentController.vramDynamic = false;
+ } else if (parts[1].toLowerCase().indexOf(' ltd.') >= 0) {
+ if ((parts[1].match(new RegExp(']', 'g')) || []).length > 1) {
+ currentController.vendor = parts[1].substr(0, parts[1].toLowerCase().indexOf(']') + 1).trim();
+ currentController.model = parts[1].substr(parts[1].toLowerCase().indexOf(']') + 1, 200).trim().split('(')[0].trim();
+ } else {
+ currentController.vendor = parts[1].substr(0, parts[1].toLowerCase().indexOf(' ltd.') + 5).trim();
+ currentController.model = parts[1].substr(parts[1].toLowerCase().indexOf(' ltd.') + 5, 200).trim().split('(')[0].trim();
+ }
+ }
+ }
+
+ } else {
+ isGraphicsController = false;
+ }
+ }
+ if (isGraphicsController) { // within VGA details
+ let parts = lines[i].split(':');
+ if (parts.length > 1 && parts[0].replace(/ +/g, '').toLowerCase().indexOf('devicename') !== -1 && parts[1].toLowerCase().indexOf('onboard') !== -1) { currentController.bus = 'Onboard'; }
+ if (parts.length > 1 && parts[0].replace(/ +/g, '').toLowerCase().indexOf('region') !== -1 && parts[1].toLowerCase().indexOf('memory') !== -1) {
+ let memparts = parts[1].split('=');
+ if (memparts.length > 1) {
+ currentController.vram = parseInt(memparts[1]);
+ }
+ }
+ }
+ }
+ }
+ if (currentController.vendor || currentController.model || currentController.bus || currentController.busAddress || currentController.vram !== null || currentController.vramDynamic) { // already a controller found
+ controllers.push(currentController);
+ }
+ return (controllers);
+ }
+
+ function parseLinesLinuxClinfo(controllers, lines) {
+ const fieldPattern = /\[([^\]]+)\]\s+(\w+)\s+(.*)/;
+ const devices = lines.reduce((devices, line) => {
+ const field = fieldPattern.exec(line.trim());
+ if (field) {
+ if (!devices[field[1]]) {
+ devices[field[1]] = {};
+ }
+ devices[field[1]][field[2]] = field[3];
+ }
+ return devices;
+ }, {});
+ for (let deviceId in devices) {
+ const device = devices[deviceId];
+ if (device['CL_DEVICE_TYPE'] === 'CL_DEVICE_TYPE_GPU') {
+ let busAddress;
+ if (device['CL_DEVICE_TOPOLOGY_AMD']) {
+ const bdf = device['CL_DEVICE_TOPOLOGY_AMD'].match(/[a-zA-Z0-9]+:\d+\.\d+/);
+ if (bdf) {
+ busAddress = bdf[0];
+ }
+ } else if (device['CL_DEVICE_PCI_BUS_ID_NV'] && device['CL_DEVICE_PCI_SLOT_ID_NV']) {
+ const bus = parseInt(device['CL_DEVICE_PCI_BUS_ID_NV']);
+ const slot = parseInt(device['CL_DEVICE_PCI_SLOT_ID_NV']);
+ if (!isNaN(bus) && !isNaN(slot)) {
+ const b = bus & 0xff;
+ const d = (slot >> 3) & 0xff;
+ const f = slot & 0x07;
+ busAddress = `${b.toString().padStart(2, '0')}:${d.toString().padStart(2, '0')}.${f}`;
+ }
+ }
+ if (busAddress) {
+ let controller = controllers.find(controller => controller.busAddress === busAddress);
+ if (!controller) {
+ controller = {
+ vendor: '',
+ model: '',
+ bus: '',
+ busAddress,
+ vram: null,
+ vramDynamic: false
+ };
+ controllers.push(controller);
+ }
+ controller.vendor = device['CL_DEVICE_VENDOR'];
+ if (device['CL_DEVICE_BOARD_NAME_AMD']) {
+ controller.model = device['CL_DEVICE_BOARD_NAME_AMD'];
+ } else {
+ controller.model = device['CL_DEVICE_NAME'];
+ }
+ const memory = parseInt(device['CL_DEVICE_GLOBAL_MEM_SIZE']);
+ if (!isNaN(memory)) {
+ controller.vram = Math.round(memory / 1024 / 1024);
+ }
+ }
+ }
+ }
+ return controllers;
+ }
+
+ function getNvidiaSmi() {
+ if (_nvidiaSmiPath) {
+ return _nvidiaSmiPath;
+ }
+
+ if (_windows) {
+ try {
+ const basePath = util.WINDIR + '\\System32\\DriverStore\\FileRepository';
+ // find all directories that have an nvidia-smi.exe file
+ const candidateDirs = fs.readdirSync(basePath).filter(dir => {
+ return fs.readdirSync([basePath, dir].join('/')).includes('nvidia-smi.exe');
+ });
+ // use the directory with the most recently created nvidia-smi.exe file
+ const targetDir = candidateDirs.reduce((prevDir, currentDir) => {
+ const previousNvidiaSmi = fs.statSync([basePath, prevDir, 'nvidia-smi.exe'].join('/'));
+ const currentNvidiaSmi = fs.statSync([basePath, currentDir, 'nvidia-smi.exe'].join('/'));
+ return (previousNvidiaSmi.ctimeMs > currentNvidiaSmi.ctimeMs) ? prevDir : currentDir;
+ });
+
+ if (targetDir) {
+ _nvidiaSmiPath = [basePath, targetDir, 'nvidia-smi.exe'].join('/');
+ }
+ } catch (e) {
+ util.noop();
+ }
+ } else if (_linux) {
+ _nvidiaSmiPath = 'nvidia-smi';
+ }
+ return _nvidiaSmiPath;
+ }
+
+ function nvidiaSmi(options) {
+ const nvidiaSmiExe = getNvidiaSmi();
+ options = options || util.execOptsWin;
+ if (nvidiaSmiExe) {
+ const nvidiaSmiOpts = '--query-gpu=driver_version,pci.sub_device_id,name,pci.bus_id,fan.speed,memory.total,memory.used,memory.free,utilization.gpu,utilization.memory,temperature.gpu,temperature.memory,power.draw,power.limit,clocks.gr,clocks.mem --format=csv,noheader,nounits';
+ const cmd = nvidiaSmiExe + ' ' + nvidiaSmiOpts + (_linux ? ' 2>/dev/null' : '');
+ try {
+ const res = execSync(cmd, options).toString();
+ return res;
+ } catch (e) {
+ util.noop();
+ }
+ }
+ return '';
+ }
+
+ function nvidiaDevices() {
+
+ function safeParseNumber(value) {
+ if ([null, undefined].includes(value)) {
+ return value;
+ }
+ return parseFloat(value);
+ }
+
+ const stdout = nvidiaSmi();
+ if (!stdout) {
+ return [];
+ }
+
+ const gpus = stdout.split('\n').filter(Boolean);
+ let results = gpus.map(gpu => {
+ const splittedData = gpu.split(', ').map(value => value.includes('N/A') ? undefined : value);
+ if (splittedData.length === 16) {
+ return {
+ driverVersion: splittedData[0],
+ subDeviceId: splittedData[1],
+ name: splittedData[2],
+ pciBus: splittedData[3],
+ fanSpeed: safeParseNumber(splittedData[4]),
+ memoryTotal: safeParseNumber(splittedData[5]),
+ memoryUsed: safeParseNumber(splittedData[6]),
+ memoryFree: safeParseNumber(splittedData[7]),
+ utilizationGpu: safeParseNumber(splittedData[8]),
+ utilizationMemory: safeParseNumber(splittedData[9]),
+ temperatureGpu: safeParseNumber(splittedData[10]),
+ temperatureMemory: safeParseNumber(splittedData[11]),
+ powerDraw: safeParseNumber(splittedData[12]),
+ powerLimit: safeParseNumber(splittedData[13]),
+ clockCore: safeParseNumber(splittedData[14]),
+ clockMemory: safeParseNumber(splittedData[15]),
+ };
+ } else {
+ return {};
+ }
+ });
+ results = results.filter((item) => {
+ return ('pciBus' in item);
+ });
+ return results;
+ }
+
+ function mergeControllerNvidia(controller, nvidia) {
+ if (nvidia.driverVersion) { controller.driverVersion = nvidia.driverVersion; }
+ if (nvidia.subDeviceId) { controller.subDeviceId = nvidia.subDeviceId; }
+ if (nvidia.name) { controller.name = nvidia.name; }
+ if (nvidia.pciBus) { controller.pciBus = nvidia.pciBus; }
+ if (nvidia.fanSpeed) { controller.fanSpeed = nvidia.fanSpeed; }
+ if (nvidia.memoryTotal) {
+ controller.memoryTotal = nvidia.memoryTotal;
+ controller.vram = nvidia.memoryTotal;
+ controller.vramDynamic = false;
+ }
+ if (nvidia.memoryUsed) { controller.memoryUsed = nvidia.memoryUsed; }
+ if (nvidia.memoryFree) { controller.memoryFree = nvidia.memoryFree; }
+ if (nvidia.utilizationGpu) { controller.utilizationGpu = nvidia.utilizationGpu; }
+ if (nvidia.utilizationMemory) { controller.utilizationMemory = nvidia.utilizationMemory; }
+ if (nvidia.temperatureGpu) { controller.temperatureGpu = nvidia.temperatureGpu; }
+ if (nvidia.temperatureMemory) { controller.temperatureMemory = nvidia.temperatureMemory; }
+ if (nvidia.powerDraw) { controller.powerDraw = nvidia.powerDraw; }
+ if (nvidia.powerLimit) { controller.powerLimit = nvidia.powerLimit; }
+ if (nvidia.clockCore) { controller.clockCore = nvidia.clockCore; }
+ if (nvidia.clockMemory) { controller.clockMemory = nvidia.clockMemory; }
+ return controller;
+ }
+
+ function parseLinesLinuxEdid(edid) {
+ // parsen EDID
+ // --> model
+ // --> resolutionx
+ // --> resolutiony
+ // --> builtin = false
+ // --> pixeldepth (?)
+ // --> sizex
+ // --> sizey
+ let result = {
+ vendor: '',
+ model: '',
+ deviceName: '',
+ main: false,
+ builtin: false,
+ connection: '',
+ sizeX: null,
+ sizeY: null,
+ pixelDepth: null,
+ resolutionX: null,
+ resolutionY: null,
+ currentResX: null,
+ currentResY: null,
+ positionX: 0,
+ positionY: 0,
+ currentRefreshRate: null
+ };
+ // find first "Detailed Timing Description"
+ let start = 108;
+ if (edid.substr(start, 6) === '000000') {
+ start += 36;
+ }
+ if (edid.substr(start, 6) === '000000') {
+ start += 36;
+ }
+ if (edid.substr(start, 6) === '000000') {
+ start += 36;
+ }
+ if (edid.substr(start, 6) === '000000') {
+ start += 36;
+ }
+ result.resolutionX = parseInt('0x0' + edid.substr(start + 8, 1) + edid.substr(start + 4, 2));
+ result.resolutionY = parseInt('0x0' + edid.substr(start + 14, 1) + edid.substr(start + 10, 2));
+ result.sizeX = parseInt('0x0' + edid.substr(start + 28, 1) + edid.substr(start + 24, 2));
+ result.sizeY = parseInt('0x0' + edid.substr(start + 29, 1) + edid.substr(start + 26, 2));
+ // monitor name
+ start = edid.indexOf('000000fc00'); // find first "Monitor Description Data"
+ if (start >= 0) {
+ let model_raw = edid.substr(start + 10, 26);
+ if (model_raw.indexOf('0a') !== -1) {
+ model_raw = model_raw.substr(0, model_raw.indexOf('0a'));
+ }
+ try {
+ if (model_raw.length > 2) {
+ result.model = model_raw.match(/.{1,2}/g).map(function (v) {
+ return String.fromCharCode(parseInt(v, 16));
+ }).join('');
+ }
+ } catch (e) {
+ util.noop();
+ }
+ } else {
+ result.model = '';
+ }
+ return result;
+ }
+
+ function parseLinesLinuxDisplays(lines, depth) {
+ let displays = [];
+ let currentDisplay = {
+ vendor: '',
+ model: '',
+ deviceName: '',
+ main: false,
+ builtin: false,
+ connection: '',
+ sizeX: null,
+ sizeY: null,
+ pixelDepth: null,
+ resolutionX: null,
+ resolutionY: null,
+ currentResX: null,
+ currentResY: null,
+ positionX: 0,
+ positionY: 0,
+ currentRefreshRate: null
+ };
+ let is_edid = false;
+ let is_current = false;
+ let edid_raw = '';
+ let start = 0;
+ for (let i = 1; i < lines.length; i++) { // start with second line
+ if ('' !== lines[i].trim()) {
+ if (' ' !== lines[i][0] && '\t' !== lines[i][0] && lines[i].toLowerCase().indexOf(' connected ') !== -1) { // first line of new entry
+ if (currentDisplay.model || currentDisplay.main || currentDisplay.builtin || currentDisplay.connection || currentDisplay.sizeX !== null || currentDisplay.pixelDepth !== null || currentDisplay.resolutionX !== null) { // push last display to array
+ displays.push(currentDisplay);
+ currentDisplay = {
+ vendor: '',
+ model: '',
+ main: false,
+ builtin: false,
+ connection: '',
+ sizeX: null,
+ sizeY: null,
+ pixelDepth: null,
+ resolutionX: null,
+ resolutionY: null,
+ currentResX: null,
+ currentResY: null,
+ positionX: 0,
+ positionY: 0,
+ currentRefreshRate: null
+ };
+ }
+ let parts = lines[i].split(' ');
+ currentDisplay.connection = parts[0];
+ currentDisplay.main = lines[i].toLowerCase().indexOf(' primary ') >= 0;
+ currentDisplay.builtin = (parts[0].toLowerCase().indexOf('edp') >= 0);
+ }
+
+ // try to read EDID information
+ if (is_edid) {
+ if (lines[i].search(/\S|$/) > start) {
+ edid_raw += lines[i].toLowerCase().trim();
+ } else {
+ // parsen EDID
+ let edid_decoded = parseLinesLinuxEdid(edid_raw);
+ currentDisplay.vendor = edid_decoded.vendor;
+ currentDisplay.model = edid_decoded.model;
+ currentDisplay.resolutionX = edid_decoded.resolutionX;
+ currentDisplay.resolutionY = edid_decoded.resolutionY;
+ currentDisplay.sizeX = edid_decoded.sizeX;
+ currentDisplay.sizeY = edid_decoded.sizeY;
+ currentDisplay.pixelDepth = depth;
+ is_edid = false;
+ }
+ }
+ if (lines[i].toLowerCase().indexOf('edid:') >= 0) {
+ is_edid = true;
+ start = lines[i].search(/\S|$/);
+ }
+ if (lines[i].toLowerCase().indexOf('*current') >= 0) {
+ const parts1 = lines[i].split('(');
+ if (parts1 && parts1.length > 1 && parts1[0].indexOf('x') >= 0) {
+ const resParts = parts1[0].trim().split('x');
+ currentDisplay.currentResX = util.toInt(resParts[0]);
+ currentDisplay.currentResY = util.toInt(resParts[1]);
+ }
+ is_current = true;
+ }
+ if (is_current && lines[i].toLowerCase().indexOf('clock') >= 0 && lines[i].toLowerCase().indexOf('hz') >= 0 && lines[i].toLowerCase().indexOf('v: height') >= 0) {
+ const parts1 = lines[i].split('clock');
+ if (parts1 && parts1.length > 1 && parts1[1].toLowerCase().indexOf('hz') >= 0) {
+ currentDisplay.currentRefreshRate = util.toInt(parts1[1]);
+ }
+ is_current = false;
+ }
+ }
+ }
+
+ // pushen displays
+ if (currentDisplay.model || currentDisplay.main || currentDisplay.builtin || currentDisplay.connection || currentDisplay.sizeX !== null || currentDisplay.pixelDepth !== null || currentDisplay.resolutionX !== null) { // still information there
+ displays.push(currentDisplay);
+ }
+ return displays;
+ }
+
+ // function starts here
+ return new Promise((resolve) => {
+ process.nextTick(() => {
+ let result = {
+ controllers: [],
+ displays: []
+ };
+ if (_darwin) {
+ let cmd = 'system_profiler -xml -detailLevel full SPDisplaysDataType';
+ exec(cmd, function (error, stdout) {
+ if (!error) {
+ try {
+ let output = stdout.toString();
+ result = parseLinesDarwin(util.plistParser(output)[0]._items);
+ } catch (e) {
+ util.noop();
+ }
+ }
+ if (callback) {
+ callback(result);
+ }
+ resolve(result);
+ });
+ }
+ if (_linux) {
+ // Raspberry: https://elinux.org/RPI_vcgencmd_usage
+ if (util.isRaspberry() && util.isRaspbian()) {
+ let cmd = 'fbset -s | grep \'mode "\'; vcgencmd get_mem gpu; tvservice -s; tvservice -n;';
+ exec(cmd, function (error, stdout) {
+ let lines = stdout.toString().split('\n');
+ if (lines.length > 3 && lines[0].indexOf('mode "') >= -1 && lines[2].indexOf('0x12000a') > -1) {
+ const parts = lines[0].replace('mode', '').replace(/"/g, '').trim().split('x');
+ if (parts.length === 2) {
+ result.displays.push({
+ vendor: '',
+ model: util.getValue(lines, 'device_name', '='),
+ main: true,
+ builtin: false,
+ connection: 'HDMI',
+ sizeX: null,
+ sizeY: null,
+ pixelDepth: null,
+ resolutionX: parseInt(parts[0], 10),
+ resolutionY: parseInt(parts[1], 10),
+ currentResX: null,
+ currentResY: null,
+ positionX: 0,
+ positionY: 0,
+ currentRefreshRate: null
+ });
+ }
+ }
+ if (lines.length > 1 && stdout.toString().indexOf('gpu=') >= -1) {
+ result.controllers.push({
+ vendor: 'Broadcom',
+ model: 'VideoCore IV',
+ bus: '',
+ vram: util.getValue(lines, 'gpu', '=').replace('M', ''),
+ vramDynamic: true
+ });
+ }
+ if (callback) {
+ callback(result);
+ }
+ resolve(result);
+ });
+ } else {
+ let cmd = 'lspci -vvv 2>/dev/null';
+ exec(cmd, function (error, stdout) {
+ if (!error) {
+ let lines = stdout.toString().split('\n');
+ result.controllers = parseLinesLinuxControllers(lines);
+ const nvidiaData = nvidiaDevices();
+ // needs to be rewritten ... using no spread operators
+ result.controllers = result.controllers.map((controller) => { // match by busAddress
+ return mergeControllerNvidia(controller, nvidiaData.find((contr) => contr.pciBus.toLowerCase().endsWith(controller.busAddress.toLowerCase())) || {});
+ });
+ }
+ let cmd = 'clinfo --raw';
+ exec(cmd, function (error, stdout) {
+ if (!error) {
+ let lines = stdout.toString().split('\n');
+ result.controllers = parseLinesLinuxClinfo(result.controllers, lines);
+ }
+ let cmd = 'xdpyinfo 2>/dev/null | grep \'depth of root window\' | awk \'{ print $5 }\'';
+ exec(cmd, function (error, stdout) {
+ let depth = 0;
+ if (!error) {
+ let lines = stdout.toString().split('\n');
+ depth = parseInt(lines[0]) || 0;
+ }
+ let cmd = 'xrandr --verbose 2>/dev/null';
+ exec(cmd, function (error, stdout) {
+ if (!error) {
+ let lines = stdout.toString().split('\n');
+ result.displays = parseLinesLinuxDisplays(lines, depth);
+ }
+ if (callback) {
+ callback(result);
+ }
+ resolve(result);
+ });
+ });
+ });
+ });
+ }
+ }
+ if (_freebsd || _openbsd || _netbsd) {
+ if (callback) { callback(null); }
+ resolve(null);
+ }
+ if (_sunos) {
+ if (callback) { callback(null); }
+ resolve(null);
+ }
+ if (_windows) {
+
+ // https://blogs.technet.microsoft.com/heyscriptingguy/2013/10/03/use-powershell-to-discover-multi-monitor-information/
+ // https://devblogs.microsoft.com/scripting/use-powershell-to-discover-multi-monitor-information/
+ try {
+ const workload = [];
+ workload.push(util.powerShell('Get-WmiObject win32_VideoController | fl *'));
+ workload.push(util.powerShell('gp "HKLM:\\SYSTEM\\ControlSet001\\Control\\Class\\{4d36e968-e325-11ce-bfc1-08002be10318}\\*" -ErrorAction SilentlyContinue | where MatchingDeviceId $null -NE | select MatchingDeviceId,HardwareInformation.qwMemorySize | fl'));
+ workload.push(util.powerShell('Get-WmiObject win32_desktopmonitor | fl *'));
+ workload.push(util.powerShell('Get-CimInstance -Namespace root\\wmi -ClassName WmiMonitorBasicDisplayParams | fl'));
+ workload.push(util.powerShell('Add-Type -AssemblyName System.Windows.Forms; [System.Windows.Forms.Screen]::AllScreens'));
+ workload.push(util.powerShell('Get-CimInstance -Namespace root\\wmi -ClassName WmiMonitorConnectionParams | fl'));
+ workload.push(util.powerShell('gwmi WmiMonitorID -Namespace root\\wmi | ForEach-Object {(($_.ManufacturerName -notmatch 0 | foreach {[char]$_}) -join "") + "|" + (($_.ProductCodeID -notmatch 0 | foreach {[char]$_}) -join "") + "|" + (($_.UserFriendlyName -notmatch 0 | foreach {[char]$_}) -join "") + "|" + (($_.SerialNumberID -notmatch 0 | foreach {[char]$_}) -join "") + "|" + $_.InstanceName}'));
+
+ const nvidiaData = nvidiaDevices();
+
+ Promise.all(
+ workload
+ ).then((data) => {
+ // controller + vram
+ let csections = data[0].replace(/\r/g, '').split(/\n\s*\n/);
+ let vsections = data[1].replace(/\r/g, '').split(/\n\s*\n/);
+ result.controllers = parseLinesWindowsControllers(csections, vsections);
+ result.controllers = result.controllers.map((controller) => { // match by subDeviceId
+ if (controller.vendor.toLowerCase() === 'nvidia') {
+ return mergeControllerNvidia(controller, nvidiaData.find(device => {
+ let windowsSubDeviceId = (controller.subDeviceId || '').toLowerCase();
+ const nvidiaSubDeviceIdParts = device.subDeviceId.split('x');
+ let nvidiaSubDeviceId = nvidiaSubDeviceIdParts.length > 1 ? nvidiaSubDeviceIdParts[1].toLowerCase() : nvidiaSubDeviceIdParts[0].toLowerCase();
+ const lengthDifference = Math.abs(windowsSubDeviceId.length - nvidiaSubDeviceId.length);
+ if (windowsSubDeviceId.length > nvidiaSubDeviceId.length) {
+ for (let i = 0; i < lengthDifference; i++) {
+ nvidiaSubDeviceId = '0' + nvidiaSubDeviceId;
+ }
+ } else if (windowsSubDeviceId.length < nvidiaSubDeviceId.length) {
+ for (let i = 0; i < lengthDifference; i++) {
+ windowsSubDeviceId = '0' + windowsSubDeviceId;
+ }
+ }
+ return windowsSubDeviceId === nvidiaSubDeviceId;
+ }) || {});
+ } else {
+ return controller;
+ }
+ });
+
+ // displays
+ let dsections = data[2].replace(/\r/g, '').split(/\n\s*\n/);
+ // result.displays = parseLinesWindowsDisplays(dsections);
+ if (dsections[0].trim() === '') { dsections.shift(); }
+ if (dsections.length && dsections[dsections.length - 1].trim() === '') { dsections.pop(); }
+
+ // monitor (powershell)
+ let msections = data[3].replace(/\r/g, '').split('Active ');
+ msections.shift();
+
+ // forms.screens (powershell)
+ let ssections = data[4].replace(/\r/g, '').split('BitsPerPixel ');
+ ssections.shift();
+
+ // connection params (powershell) - video type
+ let tsections = data[5].replace(/\r/g, '').split(/\n\s*\n/);
+ tsections.shift();
+
+ // monitor ID (powershell) - model / vendor
+ const res = data[6].replace(/\r/g, '').split(/\n/);
+ let isections = [];
+ res.forEach(element => {
+ const parts = element.split('|');
+ if (parts.length === 5) {
+ isections.push({
+ vendor: parts[0],
+ code: parts[1],
+ model: parts[2],
+ serial: parts[3],
+ instanceId: parts[4]
+ });
+ }
+ });
+
+ result.displays = parseLinesWindowsDisplaysPowershell(ssections, msections, dsections, tsections, isections);
+
+ if (result.displays.length === 1) {
+ if (_resolutionX) {
+ result.displays[0].resolutionX = _resolutionX;
+ if (!result.displays[0].currentResX) {
+ result.displays[0].currentResX = _resolutionX;
+ }
+ }
+ if (_resolutionY) {
+ result.displays[0].resolutionY = _resolutionY;
+ if (result.displays[0].currentResY === 0) {
+ result.displays[0].currentResY = _resolutionY;
+ }
+ }
+ if (_pixelDepth) {
+ result.displays[0].pixelDepth = _pixelDepth;
+ }
+ if (_refreshRate && !result.displays[0].currentRefreshRate) {
+ result.displays[0].currentRefreshRate = _refreshRate;
+ }
+ }
+
+ if (callback) {
+ callback(result);
+ }
+ resolve(result);
+ })
+ .catch(() => {
+ if (callback) {
+ callback(result);
+ }
+ resolve(result);
+ });
+ } catch (e) {
+ if (callback) { callback(result); }
+ resolve(result);
+ }
+ }
+ });
+ });
+
+ function parseLinesWindowsControllers(sections, vections) {
+ const memorySizes = {};
+ for (const i in vections) {
+ if ({}.hasOwnProperty.call(vections, i)) {
+ if (vections[i].trim() !== '') {
+ const lines = vections[i].trim().split('\n');
+ const matchingDeviceId = util.getValue(lines, 'MatchingDeviceId').match(/PCI\\(VEN_[0-9A-F]{4})&(DEV_[0-9A-F]{4})(?:&(SUBSYS_[0-9A-F]{8}))?(?:&(REV_[0-9A-F]{2}))?/i);
+ if (matchingDeviceId) {
+ const quadWordmemorySize = parseInt(util.getValue(lines, 'HardwareInformation.qwMemorySize'));
+ if (!isNaN(quadWordmemorySize)) {
+ let deviceId = matchingDeviceId[1].toUpperCase() + '&' + matchingDeviceId[2].toUpperCase();
+ if (matchingDeviceId[3]) {
+ deviceId += '&' + matchingDeviceId[3].toUpperCase();
+ }
+ if (matchingDeviceId[4]) {
+ deviceId += '&' + matchingDeviceId[4].toUpperCase();
+ }
+ memorySizes[deviceId] = quadWordmemorySize;
+ }
+ }
+ }
+ }
+ }
+
+ let controllers = [];
+ for (let i in sections) {
+ if ({}.hasOwnProperty.call(sections, i)) {
+ if (sections[i].trim() !== '') {
+ let lines = sections[i].trim().split('\n');
+ let pnpDeviceId = util.getValue(lines, 'PNPDeviceID', ':').match(/PCI\\(VEN_[0-9A-F]{4})&(DEV_[0-9A-F]{4})(?:&(SUBSYS_[0-9A-F]{8}))?(?:&(REV_[0-9A-F]{2}))?/i);
+ let subDeviceId = null;
+ let memorySize = null;
+ if (pnpDeviceId) {
+ subDeviceId = pnpDeviceId[3] || '';
+ if (subDeviceId) {
+ subDeviceId = subDeviceId.split('_')[1];
+ }
+
+ // Match PCI device identifier (there's an order of increasing generality):
+ // https://docs.microsoft.com/en-us/windows-hardware/drivers/install/identifiers-for-pci-devices
+
+ // PCI\VEN_v(4)&DEV_d(4)&SUBSYS_s(4)n(4)&REV_r(2)
+ if (memorySize == null && pnpDeviceId[3] && pnpDeviceId[4]) {
+ const deviceId = pnpDeviceId[1].toUpperCase() + '&' + pnpDeviceId[2].toUpperCase() + '&' + pnpDeviceId[3].toUpperCase() + '&' + pnpDeviceId[4].toUpperCase();
+ if ({}.hasOwnProperty.call(memorySizes, deviceId)) {
+ memorySize = memorySizes[deviceId];
+ }
+ }
+
+ // PCI\VEN_v(4)&DEV_d(4)&SUBSYS_s(4)n(4)
+ if (memorySize == null && pnpDeviceId[3]) {
+ const deviceId = pnpDeviceId[1].toUpperCase() + '&' + pnpDeviceId[2].toUpperCase() + '&' + pnpDeviceId[3].toUpperCase();
+ if ({}.hasOwnProperty.call(memorySizes, deviceId)) {
+ memorySize = memorySizes[deviceId];
+ }
+ }
+
+ // PCI\VEN_v(4)&DEV_d(4)&REV_r(2)
+ if (memorySize == null && pnpDeviceId[4]) {
+ const deviceId = pnpDeviceId[1].toUpperCase() + '&' + pnpDeviceId[2].toUpperCase() + '&' + pnpDeviceId[4].toUpperCase();
+ if ({}.hasOwnProperty.call(memorySizes, deviceId)) {
+ memorySize = memorySizes[deviceId];
+ }
+ }
+
+ // PCI\VEN_v(4)&DEV_d(4)
+ if (memorySize == null) {
+ const deviceId = pnpDeviceId[1].toUpperCase() + '&' + pnpDeviceId[2].toUpperCase();
+ if ({}.hasOwnProperty.call(memorySizes, deviceId)) {
+ memorySize = memorySizes[deviceId];
+ }
+ }
+ }
+
+ controllers.push({
+ vendor: util.getValue(lines, 'AdapterCompatibility', ':'),
+ model: util.getValue(lines, 'name', ':'),
+ bus: util.getValue(lines, 'PNPDeviceID', ':').startsWith('PCI') ? 'PCI' : '',
+ vram: (memorySize == null ? util.toInt(util.getValue(lines, 'AdapterRAM', ':')) : memorySize) / 1024 / 1024,
+ vramDynamic: (util.getValue(lines, 'VideoMemoryType', ':') === '2'),
+ subDeviceId
+ });
+ _resolutionX = util.toInt(util.getValue(lines, 'CurrentHorizontalResolution', ':')) || _resolutionX;
+ _resolutionY = util.toInt(util.getValue(lines, 'CurrentVerticalResolution', ':')) || _resolutionY;
+ _refreshRate = util.toInt(util.getValue(lines, 'CurrentRefreshRate', ':')) || _refreshRate;
+ _pixelDepth = util.toInt(util.getValue(lines, 'CurrentBitsPerPixel', ':')) || _pixelDepth;
+ }
+ }
+ }
+ return controllers;
+ }
+
+ function parseLinesWindowsDisplaysPowershell(ssections, msections, dsections, tsections, isections) {
+ let displays = [];
+ let vendor = '';
+ let model = '';
+ let deviceID = '';
+ let resolutionX = 0;
+ let resolutionY = 0;
+ if (dsections && dsections.length) {
+ let linesDisplay = dsections[0].split('\n');
+ vendor = util.getValue(linesDisplay, 'MonitorManufacturer', ':');
+ model = util.getValue(linesDisplay, 'Name', ':');
+ deviceID = util.getValue(linesDisplay, 'PNPDeviceID', ':').replace(/&amp;/g, '&').toLowerCase();
+ resolutionX = util.toInt(util.getValue(linesDisplay, 'ScreenWidth', ':'));
+ resolutionY = util.toInt(util.getValue(linesDisplay, 'ScreenHeight', ':'));
+ }
+ for (let i = 0; i < ssections.length; i++) {
+ if (ssections[i].trim() !== '') {
+ ssections[i] = 'BitsPerPixel ' + ssections[i];
+ msections[i] = 'Active ' + msections[i];
+ // tsections can be empty OR undefined on earlier versions of powershell (<=2.0)
+ // Tag connection type as UNKNOWN by default if this information is missing
+ if (tsections.length === 0 || tsections[i] === undefined) {
+ tsections[i] = 'Unknown';
+ }
+ let linesScreen = ssections[i].split('\n');
+ let linesMonitor = msections[i].split('\n');
+
+ let linesConnection = tsections[i].split('\n');
+ const bitsPerPixel = util.getValue(linesScreen, 'BitsPerPixel');
+ const bounds = util.getValue(linesScreen, 'Bounds').replace('{', '').replace('}', '').replace(/=/g, ':').split(',');
+ const primary = util.getValue(linesScreen, 'Primary');
+ const sizeX = util.getValue(linesMonitor, 'MaxHorizontalImageSize');
+ const sizeY = util.getValue(linesMonitor, 'MaxVerticalImageSize');
+ const instanceName = util.getValue(linesMonitor, 'InstanceName').toLowerCase();
+ const videoOutputTechnology = util.getValue(linesConnection, 'VideoOutputTechnology');
+ const deviceName = util.getValue(linesScreen, 'DeviceName');
+ let displayVendor = '';
+ let displayModel = '';
+ isections.forEach(element => {
+ if (element.instanceId.toLowerCase().startsWith(instanceName) && vendor.startsWith('(') && model.startsWith('PnP')) {
+ displayVendor = element.vendor;
+ displayModel = element.model;
+ }
+ });
+ displays.push({
+ vendor: instanceName.startsWith(deviceID) && displayVendor === '' ? vendor : displayVendor,
+ model: instanceName.startsWith(deviceID) && displayModel === '' ? model : displayModel,
+ deviceName,
+ main: primary.toLowerCase() === 'true',
+ builtin: videoOutputTechnology === '2147483648',
+ connection: videoOutputTechnology && videoTypes[videoOutputTechnology] ? videoTypes[videoOutputTechnology] : '',
+ resolutionX: util.toInt(util.getValue(bounds, 'Width', ':')),
+ resolutionY: util.toInt(util.getValue(bounds, 'Height', ':')),
+ sizeX: sizeX ? parseInt(sizeX, 10) : null,
+ sizeY: sizeY ? parseInt(sizeY, 10) : null,
+ pixelDepth: bitsPerPixel,
+ currentResX: util.toInt(util.getValue(bounds, 'Width', ':')),
+ currentResY: util.toInt(util.getValue(bounds, 'Height', ':')),
+ positionX: util.toInt(util.getValue(bounds, 'X', ':')),
+ positionY: util.toInt(util.getValue(bounds, 'Y', ':')),
+ });
+ }
+ }
+ if (ssections.length === 0) {
+ displays.push({
+ vendor,
+ model,
+ main: true,
+ sizeX: null,
+ sizeY: null,
+ resolutionX,
+ resolutionY,
+ pixelDepth: null,
+ currentResX: resolutionX,
+ currentResY: resolutionY,
+ positionX: 0,
+ positionY: 0
+ });
+ }
+ return displays;
+ }
+}
+
+exports.graphics = graphics;
diff --git a/node_modules/systeminformation/lib/index.d.ts b/node_modules/systeminformation/lib/index.d.ts
new file mode 100644
index 0000000..b519397
--- /dev/null
+++ b/node_modules/systeminformation/lib/index.d.ts
@@ -0,0 +1,996 @@
+// Type definitions for systeminformation
+// Project: https://github.com/sebhildebrandt/systeminformation
+// Definitions by: sebhildebrandt <https://github.com/sebhildebrandt>
+
+export namespace Systeminformation {
+
+ // 1. General
+
+ interface TimeData {
+ current: number;
+ uptime: number;
+ timezone: string;
+ timezoneName: string;
+ }
+
+ // 2. System (HW)
+
+ interface RaspberryRevisionData {
+ manufacturer: string;
+ processor: string;
+ type: string;
+ revision: string;
+ }
+ interface SystemData {
+ manufacturer: string;
+ model: string;
+ version: string;
+ serial: string;
+ uuid: string;
+ sku: string;
+ virtual: boolean;
+ virtualHost?: string;
+ raspberry?: RaspberryRevisionData;
+ }
+
+ interface BiosData {
+ vendor: string;
+ version: string;
+ releaseDate: string;
+ revision: string;
+ serial?: string;
+ language?: string;
+ features?: string[];
+ }
+
+ interface BaseboardData {
+ manufacturer: string;
+ model: string;
+ version: string;
+ serial: string;
+ assetTag: string;
+ memMax: number | null;
+ memSlots: number | null;
+ }
+
+ interface ChassisData {
+ manufacturer: string;
+ model: string;
+ type: string;
+ version: string;
+ serial: string;
+ assetTag: string;
+ sku: string;
+ }
+
+ // 3. CPU, Memory, Disks, Battery, Graphics
+
+ interface CpuData {
+ manufacturer: string;
+ brand: string;
+ vendor: string;
+ family: string;
+ model: string;
+ stepping: string;
+ revision: string;
+ voltage: string;
+ speed: number;
+ speedMin: number;
+ speedMax: number;
+ governor: string;
+ cores: number;
+ physicalCores: number;
+ efficiencyCores?: number;
+ performanceCores?: number;
+ processors: number;
+ socket: string;
+ flags: string;
+ virtualization: boolean;
+ cache: CpuCacheData;
+ }
+
+ interface CpuCacheData {
+ l1d: number;
+ l1i: number;
+ l2: number;
+ l3: number;
+ }
+
+ interface CpuCurrentSpeedData {
+ min: number;
+ max: number;
+ avg: number;
+ cores: number[];
+ }
+
+ interface CpuTemperatureData {
+ main: number;
+ cores: number[];
+ max: number;
+ socket?: number[];
+ chipset?: number;
+ }
+
+ interface MemData {
+ total: number;
+ free: number;
+ used: number;
+ active: number;
+ available: number;
+ buffcache: number;
+ buffers: number;
+ cached: number;
+ slab: number;
+ swaptotal: number;
+ swapused: number;
+ swapfree: number;
+ }
+
+ interface MemLayoutData {
+ size: number;
+ bank: string;
+ type: string;
+ ecc?: boolean | null;
+ clockSpeed: number | null;
+ formFactor: string;
+ manufacturer?: string;
+ partNum: string;
+ serialNum: string;
+ voltageConfigured: number | null;
+ voltageMin: number | null;
+ voltageMax: number | null;
+ }
+
+ interface SmartData {
+ json_format_version: number[];
+ smartctl: {
+ version: number[];
+ platform_info: string;
+ build_info: string;
+ argv: string[];
+ exit_status: number;
+ };
+ device: {
+ name: string;
+ info_name: string;
+ type: string;
+ protocol: string;
+ };
+ model_family?: string;
+ model_name?: string;
+ serial_number?: string;
+ firmware_version?: string;
+ smart_status: {
+ passed: boolean;
+ };
+ trim?: {
+ supported: boolean;
+ };
+ ata_smart_attributes?: {
+ revision: number;
+ table: {
+ id: number;
+ name: string;
+ value: number;
+ worst: number;
+ thresh: number;
+ when_failed: string;
+ flags: {
+ value: number;
+ string: string;
+ prefailure: boolean;
+ updated_online: boolean;
+ performance: boolean;
+ error_rate: boolean;
+ event_count: boolean;
+ auto_keep: boolean;
+ };
+ raw: {
+ value: number;
+ string: string;
+ };
+ }[];
+ };
+ ata_smart_error_log?: {
+ summary: {
+ revision: number;
+ count: number;
+ };
+ };
+ ata_smart_self_test_log?: {
+ standard: {
+ revision: number;
+ table: {
+ type: {
+ value: number;
+ string: string;
+ };
+ status: {
+ value: number;
+ string: string;
+ passed: boolean;
+ };
+ lifetime_hours: number;
+ }[];
+ count: number;
+ error_count_total: number;
+ error_count_outdated: number;
+ };
+ };
+ nvme_pci_vendor?: {
+ id: number;
+ subsystem_id: number;
+ },
+ nvme_smart_health_information_log?: {
+ critical_warning?: number;
+ temperature?: number;
+ available_spare?: number;
+ available_spare_threshold?: number;
+ percentage_used?: number;
+ data_units_read?: number;
+ data_units_written?: number;
+ host_reads?: number;
+ host_writes?: number;
+ controller_busy_time?: number;
+ power_cycles?: number;
+ power_on_hours?: number;
+ unsafe_shutdowns?: number;
+ media_errors?: number;
+ num_err_log_entries?: number;
+ warning_temp_time?: number;
+ critical_comp_time?: number;
+ temperature_sensors?: number[];
+ },
+ user_capacity?: {
+ blocks: number;
+ bytes: number;
+ },
+ logical_block_size?: number;
+ temperature: {
+ current: number;
+ };
+ power_cycle_count: number;
+ power_on_time: {
+ hours: number;
+ };
+ }
+
+ interface DiskLayoutData {
+ device: string;
+ type: string;
+ name: string;
+ vendor: string;
+ size: number;
+ bytesPerSector: number;
+ totalCylinders: number;
+ totalHeads: number;
+ totalSectors: number;
+ totalTracks: number;
+ tracksPerCylinder: number;
+ sectorsPerTrack: number;
+ firmwareRevision: string;
+ serialNum: string;
+ interfaceType: string;
+ smartStatus: string;
+ temperature: null | number;
+ smartData?: SmartData;
+ }
+
+ interface BatteryData {
+ hasBattery: boolean;
+ cycleCount: number;
+ isCharging: boolean;
+ voltage: number;
+ designedCapacity: number;
+ maxCapacity: number;
+ currentCapacity: number;
+ capacityUnit: string;
+ percent: number;
+ timeRemaining: number;
+ acConnected: boolean;
+ type: string;
+ model: string;
+ manufacturer: string;
+ serial: string;
+ additionalBatteries?: BatteryData[];
+ }
+
+ interface GraphicsData {
+ controllers: GraphicsControllerData[];
+ displays: GraphicsDisplayData[];
+ }
+
+ interface GraphicsControllerData {
+ vendor: string;
+ vendorId?: string;
+ model: string;
+ deviceId?: string;
+ bus: string;
+ busAddress?: string;
+ vram: number | null;
+ vramDynamic: boolean;
+ external?: boolean;
+ cores?: number;
+ metalVersion?: string;
+ subDeviceId?: string;
+ driverVersion?: string;
+ name?: string;
+ pciBus?: string;
+ pciID?: string;
+ fanSpeed?: number;
+ memoryTotal?: number;
+ memoryUsed?: number;
+ memoryFree?: number;
+ utilizationGpu?: number;
+ utilizationMemory?: number;
+ temperatureGpu?: number;
+ temperatureMemory?: number;
+ powerDraw?: number;
+ powerLimit?: number;
+ clockCore?: number;
+ clockMemory?: number;
+ }
+
+ interface GraphicsDisplayData {
+ vendor: string;
+ vendorId: string | null;
+ model: string;
+ productionYear: number | null;
+ serial: string | null;
+ deviceName: string | null;
+ displayId: string | null;
+ main: boolean;
+ builtin: boolean;
+ connection: string | null;
+ sizeX: number | null;
+ sizeY: number | null;
+ pixelDepth: number | null;
+ resolutionX: number | null;
+ resolutionY: number | null;
+ currentResX: number | null;
+ currentResY: number | null;
+ positionX: number;
+ positionY: number;
+ currentRefreshRate: number | null;
+ }
+
+ // 4. Operating System
+
+ interface OsData {
+ platform: string;
+ distro: string;
+ release: string;
+ codename: string;
+ kernel: string;
+ arch: string;
+ hostname: string;
+ fqdn: string;
+ codepage: string;
+ logofile: string;
+ serial: string;
+ build: string;
+ servicepack: string;
+ uefi: boolean;
+ hypervizor?: boolean;
+ remoteSession?: boolean;
+ hypervisor?: boolean;
+ }
+
+ interface UuidData {
+ os: string;
+ hardware: string;
+ macs: string[];
+ }
+
+ interface VersionData {
+ kernel?: string;
+ openssl?: string;
+ systemOpenssl?: string;
+ systemOpensslLib?: string;
+ node?: string;
+ v8?: string;
+ npm?: string;
+ yarn?: string;
+ pm2?: string;
+ gulp?: string;
+ grunt?: string;
+ git?: string;
+ tsc?: string;
+ mysql?: string;
+ redis?: string;
+ mongodb?: string;
+ nginx?: string;
+ php?: string;
+ docker?: string;
+ postfix?: string;
+ postgresql?: string;
+ perl?: string;
+ python?: string;
+ python3?: string;
+ pip?: string;
+ pip3?: string;
+ java?: string;
+ gcc?: string;
+ virtualbox?: string;
+ dotnet?: string;
+ }
+
+ interface UserData {
+ user: string;
+ tty: string;
+ date: string;
+ time: string;
+ ip: string;
+ command: string;
+ }
+
+ // 5. File System
+
+ interface FsSizeData {
+ fs: string;
+ type: string;
+ size: number;
+ used: number;
+ available: number;
+ use: number;
+ mount: string;
+ }
+
+ interface FsOpenFilesData {
+ max: number;
+ allocated: number;
+ available: number;
+ }
+
+ interface BlockDevicesData {
+ name: string;
+ identifier: string;
+ type: string;
+ fsType: string;
+ mount: string;
+ size: number;
+ physical: string;
+ uuid: string;
+ label: string;
+ model: string;
+ serial: string;
+ removable: boolean;
+ protocol: string;
+ }
+
+ interface FsStatsData {
+ rx: number;
+ wx: number;
+ tx: number;
+ rx_sec: number | null;
+ wx_sec: number | null;
+ tx_sec: number | null;
+ ms: number;
+ }
+
+ interface DisksIoData {
+ rIO: number;
+ wIO: number;
+ tIO: number;
+ rIO_sec: number | null;
+ wIO_sec: number | null;
+ tIO_sec: number | null;
+ rWaitTime: number;
+ wWaitTime: number;
+ tWaitTime: number;
+ rWaitPercent: number | null;
+ wWaitPercent: number | null;
+ tWaitPercent: number | null;
+ ms: number;
+ }
+
+ // 6. Network related functions
+
+ interface NetworkInterfacesData {
+ iface: string;
+ ifaceName: string;
+ ip4: string;
+ ip4subnet: string;
+ ip6: string;
+ ip6subnet: string;
+ mac: string;
+ internal: boolean;
+ virtual: boolean;
+ operstate: string;
+ type: string;
+ duplex: string;
+ mtu: number;
+ speed: number;
+ dhcp: boolean;
+ dnsSuffix: string;
+ ieee8021xAuth: string;
+ ieee8021xState: string;
+ carrierChanges: number;
+ }
+
+ interface NetworkStatsData {
+ iface: string;
+ operstate: string;
+ rx_bytes: number;
+ rx_dropped: number;
+ rx_errors: number;
+ tx_bytes: number;
+ tx_dropped: number;
+ tx_errors: number;
+ rx_sec: number;
+ tx_sec: number;
+ ms: number;
+ }
+
+ interface NetworkConnectionsData {
+ protocol: string;
+ localAddress: string;
+ localPort: string;
+ peerAddress: string;
+ peerPort: string;
+ state: string;
+ pid: number;
+ process: string;
+ }
+
+ interface InetChecksiteData {
+ url: string;
+ ok: boolean;
+ status: number;
+ ms: number;
+ }
+
+ interface WifiNetworkData {
+ ssid: string;
+ bssid: string;
+ mode: string;
+ channel: number;
+ frequency: number;
+ signalLevel: number;
+ quality: number;
+ security: string[];
+ wpaFlags: string[];
+ rsnFlags: string[];
+ }
+
+ interface WifiInterfaceData {
+ id: string;
+ iface: string;
+ model: string;
+ vendor: string;
+ mac: string;
+ }
+
+ interface WifiConnectionData {
+ id: string;
+ iface: string;
+ model: string;
+ ssid: string;
+ bssid: string;
+ channel: number;
+ type: string;
+ security: string;
+ frequency: number;
+ signalLevel: number;
+ txRate: number;
+ }
+
+ // 7. Current Load, Processes & Services
+
+ interface CurrentLoadData {
+ avgLoad: number;
+ currentLoad: number;
+ currentLoadUser: number;
+ currentLoadSystem: number;
+ currentLoadNice: number;
+ currentLoadIdle: number;
+ currentLoadIrq: number;
+ rawCurrentLoad: number;
+ rawCurrentLoadUser: number;
+ rawCurrentLoadSystem: number;
+ rawCurrentLoadNice: number;
+ rawCurrentLoadIdle: number;
+ rawCurrentLoadIrq: number;
+ cpus: CurrentLoadCpuData[];
+ }
+
+ interface CurrentLoadCpuData {
+ load: number;
+ loadUser: number;
+ loadSystem: number;
+ loadNice: number;
+ loadIdle: number;
+ loadIrq: number;
+ rawLoad: number;
+ rawLoadUser: number;
+ rawLoadSystem: number;
+ rawLoadNice: number;
+ rawLoadIdle: number;
+ rawLoadIrq: number;
+ }
+
+ interface ProcessesData {
+ all: number;
+ running: number;
+ blocked: number;
+ sleeping: number;
+ unknown: number;
+ list: ProcessesProcessData[];
+ }
+
+ interface ProcessesProcessData {
+ pid: number;
+ parentPid: number;
+ name: string;
+ cpu: number;
+ cpuu: number;
+ cpus: number;
+ mem: number;
+ priority: number;
+ memVsz: number;
+ memRss: number;
+ nice: number;
+ started: string;
+ state: string;
+ tty: string;
+ user: string;
+ command: string;
+ params: string;
+ path: string;
+ }
+
+ interface ProcessesProcessLoadData {
+ proc: string;
+ pid: number;
+ pids: number[];
+ cpu: number;
+ mem: number;
+ }
+
+ interface ServicesData {
+ name: string;
+ running: boolean;
+ startmode: string;
+ pids: number[];
+ cpu: number;
+ mem: number;
+ }
+
+ // 8. Docker
+
+ interface DockerInfoData {
+ id: string;
+ containers: number;
+ containersRunning: number;
+ containersPaused: number;
+ containersStopped: number;
+ images: number;
+ driver: string;
+ memoryLimit: boolean;
+ swapLimit: boolean;
+ kernelMemory: boolean;
+ cpuCfsPeriod: boolean;
+ cpuCfsQuota: boolean;
+ cpuShares: boolean;
+ cpuSet: boolean;
+ ipv4Forwarding: boolean;
+ bridgeNfIptables: boolean;
+ bridgeNfIp6tables: boolean;
+ debug: boolean;
+ nfd: number;
+ oomKillDisable: boolean;
+ ngoroutines: number;
+ systemTime: string;
+ loggingDriver: string;
+ cgroupDriver: string;
+ nEventsListener: number;
+ kernelVersion: string;
+ operatingSystem: string;
+ osType: string;
+ architecture: string;
+ ncpu: number;
+ memTotal: number;
+ dockerRootDir: string;
+ httpProxy: string;
+ httpsProxy: string;
+ noProxy: string;
+ name: string;
+ labels: string[];
+ experimentalBuild: boolean;
+ serverVersion: string;
+ clusterStore: string;
+ clusterAdvertise: string;
+ defaultRuntime: string;
+ liveRestoreEnabled: boolean;
+ isolation: string;
+ initBinary: string;
+ productLicense: string;
+ }
+
+ interface DockerImageData {
+ id: string;
+ container: string;
+ comment: string;
+ os: string;
+ architecture: string;
+ parent: string;
+ dockerVersion: string;
+ size: number;
+ sharedSize: number;
+ virtualSize: number;
+ author: string;
+ created: number;
+ containerConfig: any;
+ graphDriver: any;
+ repoDigests: any;
+ repoTags: any;
+ config: any;
+ rootFS: any;
+ }
+
+ interface DockerContainerData {
+ id: string;
+ name: string;
+ image: string;
+ imageID: string;
+ command: string;
+ created: number;
+ started: number;
+ finished: number;
+ createdAt: string;
+ startedAt: string;
+ finishedAt: string;
+ state: string;
+ restartCount: number;
+ platform: string;
+ driver: string;
+ ports: number[];
+ mounts: DockerContainerMountData[];
+ }
+
+ interface DockerContainerMountData {
+ Type: string;
+ Source: string;
+ Destination: string;
+ Mode: string;
+ RW: boolean;
+ Propagation: string;
+ }
+
+ interface DockerContainerStatsData {
+ id: string;
+ memUsage: number;
+ memLimit: number;
+ memPercent: number;
+ cpuPercent: number;
+ pids: number;
+ netIO: {
+ rx: number;
+ wx: number;
+ };
+ blockIO: {
+ r: number;
+ w: number;
+ };
+ restartCount: number;
+ cpuStats: any;
+ precpuStats: any;
+ memoryStats: any;
+ networks: any;
+ }
+
+ interface DockerContainerProcessData {
+ pidHost: string;
+ ppid: string;
+ pgid: string;
+ user: string;
+ ruser: string;
+ group: string;
+ rgroup: string;
+ stat: string;
+ time: string;
+ elapsed: string;
+ nice: string;
+ rss: string;
+ vsz: string;
+ command: string;
+ }
+
+ interface DockerVolumeData {
+ name: string;
+ driver: string;
+ labels: any;
+ mountpoint: string;
+ options: any;
+ scope: string;
+ created: number;
+ }
+
+ // 9. Virtual Box
+
+ interface VboxInfoData {
+ id: string;
+ name: string;
+ running: boolean;
+ started: string;
+ runningSince: number;
+ stopped: string;
+ stoppedSince: number;
+ guestOS: string;
+ hardwareUUID: string;
+ memory: number;
+ vram: number;
+ cpus: number;
+ cpuExepCap: string;
+ cpuProfile: string;
+ chipset: string;
+ firmware: string;
+ pageFusion: boolean;
+ configFile: string;
+ snapshotFolder: string;
+ logFolder: string;
+ hpet: boolean;
+ pae: boolean;
+ longMode: boolean;
+ tripleFaultReset: boolean;
+ apic: boolean;
+ x2Apic: boolean;
+ acpi: boolean;
+ ioApic: boolean;
+ biosApicMode: string;
+ bootMenuMode: string;
+ bootDevice1: string;
+ bootDevice2: string;
+ bootDevice3: string;
+ bootDevice4: string;
+ timeOffset: string;
+ rtc: string;
+ }
+
+ interface PrinterData {
+ id: number;
+ name: string;
+ model: string;
+ uri: string;
+ uuid: string;
+ local: boolean;
+ status: string;
+ default: boolean;
+ shared: boolean;
+ }
+
+ interface UsbData {
+ id: number | string;
+ bus: number;
+ deviceId: number;
+ name: string;
+ type: string;
+ removable: boolean;
+ vendor: string;
+ manufacturer: string;
+ maxPower: string;
+ serialNumber: string;
+ }
+
+ interface AudioData {
+ id: number | string;
+ name: string;
+ manufacturer: string;
+ default: boolean;
+ revision: string;
+ driver: string;
+ channel: string;
+ in: boolean;
+ out: boolean;
+ type: string;
+ status: string;
+ }
+
+ interface BluetoothDeviceData {
+ device: string;
+ name: string;
+ macDevice: string;
+ macHost: string;
+ batteryPercent: number;
+ manufacturer: string;
+ type: string;
+ connected: boolean;
+ }
+
+ // 10. "Get All at once" - functions
+
+ interface StaticData {
+ version: string;
+ system: SystemData;
+ bios: BiosData;
+ baseboard: BaseboardData;
+ chassis: ChassisData;
+ os: OsData;
+ uuid: UuidData;
+ versions: VersionData;
+ cpu: CpuData;
+ graphics: GraphicsData;
+ net: NetworkInterfacesData[];
+ memLayout: MemLayoutData[];
+ diskLayout: DiskLayoutData[];
+ }
+}
+
+export function version(): string;
+export function system(cb?: (data: Systeminformation.SystemData) => any): Promise<Systeminformation.SystemData>;
+export function bios(cb?: (data: Systeminformation.BiosData) => any): Promise<Systeminformation.BiosData>;
+export function baseboard(cb?: (data: Systeminformation.BaseboardData) => any): Promise<Systeminformation.BaseboardData>;
+export function chassis(cb?: (data: Systeminformation.ChassisData) => any): Promise<Systeminformation.ChassisData>;
+
+export function time(): Systeminformation.TimeData;
+export function osInfo(cb?: (data: Systeminformation.OsData) => any): Promise<Systeminformation.OsData>;
+export function versions(apps?: string, cb?: (data: Systeminformation.VersionData) => any): Promise<Systeminformation.VersionData>;
+export function shell(cb?: (data: string) => any): Promise<string>;
+export function uuid(cb?: (data: Systeminformation.UuidData) => any): Promise<Systeminformation.UuidData>;
+
+export function cpu(cb?: (data: Systeminformation.CpuData) => any): Promise<Systeminformation.CpuData>;
+export function cpuFlags(cb?: (data: string) => any): Promise<string>;
+export function cpuCache(cb?: (data: Systeminformation.CpuCacheData) => any): Promise<Systeminformation.CpuCacheData>;
+export function cpuCurrentSpeed(cb?: (data: Systeminformation.CpuCurrentSpeedData) => any): Promise<Systeminformation.CpuCurrentSpeedData>;
+export function cpuTemperature(cb?: (data: Systeminformation.CpuTemperatureData) => any): Promise<Systeminformation.CpuTemperatureData>;
+export function currentLoad(cb?: (data: Systeminformation.CurrentLoadData) => any): Promise<Systeminformation.CurrentLoadData>;
+export function fullLoad(cb?: (data: number) => any): Promise<number>;
+
+export function mem(cb?: (data: Systeminformation.MemData) => any): Promise<Systeminformation.MemData>;
+export function memLayout(cb?: (data: Systeminformation.MemLayoutData[]) => any): Promise<Systeminformation.MemLayoutData[]>;
+
+export function battery(cb?: (data: Systeminformation.BatteryData) => any): Promise<Systeminformation.BatteryData>;
+export function graphics(cb?: (data: Systeminformation.GraphicsData) => any): Promise<Systeminformation.GraphicsData>;
+
+export function fsSize(cb?: (data: Systeminformation.FsSizeData[]) => any): Promise<Systeminformation.FsSizeData[]>;
+export function fsOpenFiles(cb?: (data: Systeminformation.FsOpenFilesData[]) => any): Promise<Systeminformation.FsOpenFilesData[]>;
+export function blockDevices(cb?: (data: Systeminformation.BlockDevicesData[]) => any): Promise<Systeminformation.BlockDevicesData[]>;
+export function fsStats(cb?: (data: Systeminformation.FsStatsData) => any): Promise<Systeminformation.FsStatsData>;
+export function disksIO(cb?: (data: Systeminformation.DisksIoData) => any): Promise<Systeminformation.DisksIoData>;
+export function diskLayout(cb?: (data: Systeminformation.DiskLayoutData[]) => any): Promise<Systeminformation.DiskLayoutData[]>;
+
+export function networkInterfaceDefault(cb?: (data: string) => any): Promise<string>;
+export function networkGatewayDefault(cb?: (data: string) => any): Promise<string>;
+export function networkInterfaces(cb?: (data: Systeminformation.NetworkInterfacesData[]) => any): Promise<Systeminformation.NetworkInterfacesData[]>;
+
+export function networkStats(ifaces?: string, cb?: (data: Systeminformation.NetworkStatsData[]) => any): Promise<Systeminformation.NetworkStatsData[]>;
+export function networkConnections(cb?: (data: Systeminformation.NetworkConnectionsData[]) => any): Promise<Systeminformation.NetworkConnectionsData[]>;
+export function inetChecksite(url: string, cb?: (data: Systeminformation.InetChecksiteData) => any): Promise<Systeminformation.InetChecksiteData>;
+export function inetLatency(host?: string, cb?: (data: number) => any): Promise<number>;
+
+export function wifiNetworks(cb?: (data: Systeminformation.WifiNetworkData[]) => any): Promise<Systeminformation.WifiNetworkData[]>;
+export function wifiInterfaces(cb?: (data: Systeminformation.WifiInterfaceData[]) => any): Promise<Systeminformation.WifiInterfaceData[]>;
+export function wifiConnections(cb?: (data: Systeminformation.WifiConnectionData[]) => any): Promise<Systeminformation.WifiConnectionData[]>;
+
+export function users(cb?: (data: Systeminformation.UserData[]) => any): Promise<Systeminformation.UserData[]>;
+
+export function processes(cb?: (data: Systeminformation.ProcessesData) => any): Promise<Systeminformation.ProcessesData>;
+export function processLoad(processNames: string, cb?: (data: Systeminformation.ProcessesProcessLoadData[]) => any): Promise<Systeminformation.ProcessesProcessLoadData[]>;
+export function services(serviceName: string, cb?: (data: Systeminformation.ServicesData[]) => any): Promise<Systeminformation.ServicesData[]>;
+
+export function dockerInfo(cb?: (data: Systeminformation.DockerInfoData) => any): Promise<Systeminformation.DockerInfoData>;
+export function dockerImages(all?: boolean, cb?: (data: Systeminformation.DockerImageData[]) => any): Promise<Systeminformation.DockerImageData[]>;
+export function dockerContainers(all?: boolean, cb?: (data: Systeminformation.DockerContainerData[]) => any): Promise<Systeminformation.DockerContainerData[]>;
+export function dockerContainerStats(id?: string, cb?: (data: Systeminformation.DockerContainerStatsData[]) => any): Promise<Systeminformation.DockerContainerStatsData[]>;
+export function dockerContainerProcesses(id?: string, cb?: (data: any) => any): Promise<Systeminformation.DockerContainerProcessData[]>;
+export function dockerVolumes(cb?: (data: Systeminformation.DockerVolumeData[]) => any): Promise<Systeminformation.DockerVolumeData[]>;
+export function dockerAll(cb?: (data: any) => any): Promise<any>;
+
+export function vboxInfo(cb?: (data: Systeminformation.VboxInfoData[]) => any): Promise<Systeminformation.VboxInfoData[]>;
+
+export function printer(cb?: (data: Systeminformation.PrinterData[]) => any): Promise<Systeminformation.PrinterData[]>;
+
+export function usb(cb?: (data: Systeminformation.UsbData[]) => any): Promise<Systeminformation.UsbData[]>;
+
+export function audio(cb?: (data: Systeminformation.AudioData[]) => any): Promise<Systeminformation.AudioData[]>;
+
+export function bluetoothDevices(cb?: (data: Systeminformation.BluetoothDeviceData[]) => any): Promise<Systeminformation.BluetoothDeviceData[]>;
+
+export function getStaticData(cb?: (data: Systeminformation.StaticData) => any): Promise<Systeminformation.StaticData>;
+export function getDynamicData(srv?: string, iface?: string, cb?: (data: any) => any): Promise<any>;
+export function getAllData(srv?: string, iface?: string, cb?: (data: any) => any): Promise<any>;
+export function get(valuesObject: any, cb?: (data: any) => any): Promise<any>;
+export function observe(valuesObject: any, interval: number, cb?: (data: any) => any): number;
+
+export function powerShellStart(): void;
+export function powerShellRelease(): void;
diff --git a/node_modules/systeminformation/lib/index.js b/node_modules/systeminformation/lib/index.js
new file mode 100644
index 0000000..1dd5bb2
--- /dev/null
+++ b/node_modules/systeminformation/lib/index.js
@@ -0,0 +1,504 @@
+'use strict';
+// @ts-check
+// ==================================================================================
+// index.js
+// ----------------------------------------------------------------------------------
+// Description: System Information - library
+// for Node.js
+// Copyright: (c) 2014 - 2022
+// Author: Sebastian Hildebrandt
+// ----------------------------------------------------------------------------------
+// Contributors: Guillaume Legrain (https://github.com/glegrain)
+// Riccardo Novaglia (https://github.com/richy24)
+// Quentin Busuttil (https://github.com/Buzut)
+// Lapsio (https://github.com/lapsio)
+// csy (https://github.com/csy1983)
+// ----------------------------------------------------------------------------------
+// License: MIT
+// ==================================================================================
+
+// ----------------------------------------------------------------------------------
+// Dependencies
+// ----------------------------------------------------------------------------------
+
+const lib_version = require('../package.json').version;
+const util = require('./util');
+const system = require('./system');
+const osInfo = require('./osinfo');
+const cpu = require('./cpu');
+const memory = require('./memory');
+const battery = require('./battery');
+const graphics = require('./graphics');
+const filesystem = require('./filesystem');
+const network = require('./network');
+const wifi = require('./wifi');
+const processes = require('./processes');
+const users = require('./users');
+const internet = require('./internet');
+const docker = require('./docker');
+const vbox = require('./virtualbox');
+const printer = require('./printer');
+const usb = require('./usb');
+const audio = require('./audio');
+const bluetooth = require('./bluetooth');
+
+let _platform = process.platform;
+const _windows = (_platform === 'win32');
+const _freebsd = (_platform === 'freebsd');
+const _openbsd = (_platform === 'openbsd');
+const _netbsd = (_platform === 'netbsd');
+const _sunos = (_platform === 'sunos');
+
+// ----------------------------------------------------------------------------------
+// init
+// ----------------------------------------------------------------------------------
+
+if (_windows) {
+ util.getCodepage();
+}
+
+// ----------------------------------------------------------------------------------
+// General
+// ----------------------------------------------------------------------------------
+
+function version() {
+ return lib_version;
+}
+
+// ----------------------------------------------------------------------------------
+// Get static and dynamic data (all)
+// ----------------------------------------------------------------------------------
+
+// --------------------------
+// get static data - they should not change until restarted
+
+function getStaticData(callback) {
+
+ return new Promise((resolve) => {
+ process.nextTick(() => {
+
+ let data = {};
+
+ data.version = version();
+
+ Promise.all([
+ system.system(),
+ system.bios(),
+ system.baseboard(),
+ system.chassis(),
+ osInfo.osInfo(),
+ osInfo.uuid(),
+ osInfo.versions(),
+ cpu.cpu(),
+ cpu.cpuFlags(),
+ graphics.graphics(),
+ network.networkInterfaces(),
+ memory.memLayout(),
+ filesystem.diskLayout()
+ ]).then((res) => {
+ data.system = res[0];
+ data.bios = res[1];
+ data.baseboard = res[2];
+ data.chassis = res[3];
+ data.os = res[4];
+ data.uuid = res[5];
+ data.versions = res[6];
+ data.cpu = res[7];
+ data.cpu.flags = res[8];
+ data.graphics = res[9];
+ data.net = res[10];
+ data.memLayout = res[11];
+ data.diskLayout = res[12];
+ if (callback) { callback(data); }
+ resolve(data);
+ });
+ });
+ });
+}
+
+
+// --------------------------
+// get all dynamic data - e.g. for monitoring agents
+// may take some seconds to get all data
+// --------------------------
+// 2 additional parameters needed
+// - srv: comma separated list of services to monitor e.g. "mysql, apache, postgresql"
+// - iface: define network interface for which you like to monitor network speed e.g. "eth0"
+
+function getDynamicData(srv, iface, callback) {
+
+ if (util.isFunction(iface)) {
+ callback = iface;
+ iface = '';
+ }
+ if (util.isFunction(srv)) {
+ callback = srv;
+ srv = '';
+ }
+
+ return new Promise((resolve) => {
+ process.nextTick(() => {
+
+ iface = iface || network.getDefaultNetworkInterface();
+ srv = srv || '';
+
+ // use closure to track ƒ completion
+ let functionProcessed = (function () {
+ let totalFunctions = 15;
+ if (_windows) { totalFunctions = 13; }
+ if (_freebsd || _openbsd || _netbsd) { totalFunctions = 11; }
+ if (_sunos) { totalFunctions = 6; }
+
+ return function () {
+ if (--totalFunctions === 0) {
+ if (callback) {
+ callback(data);
+ }
+ resolve(data);
+ }
+ };
+ })();
+
+ let data = {};
+
+ // get time
+ data.time = osInfo.time();
+
+ /**
+ * @namespace
+ * @property {Object} versions
+ * @property {string} versions.node
+ * @property {string} versions.v8
+ */
+ data.node = process.versions.node;
+ data.v8 = process.versions.v8;
+
+ cpu.cpuCurrentSpeed().then((res) => {
+ data.cpuCurrentSpeed = res;
+ functionProcessed();
+ });
+
+ users.users().then((res) => {
+ data.users = res;
+ functionProcessed();
+ });
+
+ processes.processes().then((res) => {
+ data.processes = res;
+ functionProcessed();
+ });
+
+ cpu.currentLoad().then((res) => {
+ data.currentLoad = res;
+ functionProcessed();
+ });
+
+ if (!_sunos) {
+ cpu.cpuTemperature().then((res) => {
+ data.temp = res;
+ functionProcessed();
+ });
+ }
+
+ if (!_openbsd && !_freebsd && !_netbsd && !_sunos) {
+ network.networkStats(iface).then((res) => {
+ data.networkStats = res;
+ functionProcessed();
+ });
+ }
+
+ if (!_sunos) {
+ network.networkConnections().then((res) => {
+ data.networkConnections = res;
+ functionProcessed();
+ });
+ }
+
+ memory.mem().then((res) => {
+ data.mem = res;
+ functionProcessed();
+ });
+
+ if (!_sunos) {
+ battery().then((res) => {
+ data.battery = res;
+ functionProcessed();
+ });
+ }
+
+ if (!_sunos) {
+ processes.services(srv).then((res) => {
+ data.services = res;
+ functionProcessed();
+ });
+ }
+
+ if (!_sunos) {
+ filesystem.fsSize().then((res) => {
+ data.fsSize = res;
+ functionProcessed();
+ });
+ }
+
+ if (!_windows && !_openbsd && !_freebsd && !_netbsd && !_sunos) {
+ filesystem.fsStats().then((res) => {
+ data.fsStats = res;
+ functionProcessed();
+ });
+ }
+
+ if (!_windows && !_openbsd && !_freebsd && !_netbsd && !_sunos) {
+ filesystem.disksIO().then((res) => {
+ data.disksIO = res;
+ functionProcessed();
+ });
+ }
+
+ if (!_openbsd && !_freebsd && !_netbsd && !_sunos) {
+ wifi.wifiNetworks().then((res) => {
+ data.wifiNetworks = res;
+ functionProcessed();
+ });
+ }
+
+ internet.inetLatency().then((res) => {
+ data.inetLatency = res;
+ functionProcessed();
+ });
+ });
+ });
+}
+
+// --------------------------
+// get all data at once
+// --------------------------
+// 2 additional parameters needed
+// - srv: comma separated list of services to monitor e.g. "mysql, apache, postgresql"
+// - iface: define network interface for which you like to monitor network speed e.g. "eth0"
+
+function getAllData(srv, iface, callback) {
+
+ return new Promise((resolve) => {
+ process.nextTick(() => {
+ let data = {};
+
+ if (iface && util.isFunction(iface) && !callback) {
+ callback = iface;
+ iface = '';
+ }
+
+ if (srv && util.isFunction(srv) && !iface && !callback) {
+ callback = srv;
+ srv = '';
+ iface = '';
+ }
+
+ getStaticData().then((res) => {
+ data = res;
+ getDynamicData(srv, iface).then((res) => {
+ for (let key in res) {
+ if ({}.hasOwnProperty.call(res, key)) {
+ data[key] = res[key];
+ }
+ }
+ if (callback) { callback(data); }
+ resolve(data);
+ });
+ });
+ });
+ });
+}
+
+function get(valueObject, callback) {
+ return new Promise((resolve) => {
+ process.nextTick(() => {
+ const allPromises = Object.keys(valueObject)
+ .filter(func => ({}.hasOwnProperty.call(exports, func)))
+ .map(func => {
+ const params = valueObject[func].substring(valueObject[func].lastIndexOf('(') + 1, valueObject[func].lastIndexOf(')'));
+ let funcWithoutParams = func.indexOf(')') >= 0 ? func.split(')')[1].trim() : func;
+ funcWithoutParams = func.indexOf('|') >= 0 ? func.split('|')[0].trim() : funcWithoutParams;
+ if (params) {
+ return exports[funcWithoutParams](params);
+ } else {
+ return exports[funcWithoutParams]('');
+ }
+ });
+
+ Promise.all(allPromises).then((data) => {
+ const result = {};
+ let i = 0;
+ for (let key in valueObject) {
+ if ({}.hasOwnProperty.call(valueObject, key) && {}.hasOwnProperty.call(exports, key) && data.length > i) {
+ if (valueObject[key] === '*' || valueObject[key] === 'all') {
+ result[key] = data[i];
+ } else {
+ let keys = valueObject[key];
+ let filter = '';
+ let filterParts = [];
+ // remove params
+ if (keys.indexOf(')') >= 0) {
+ keys = keys.split(')')[1].trim();
+ }
+ // extract filter and remove it from keys
+ if (keys.indexOf('|') >= 0) {
+ filter = keys.split('|')[1].trim();
+ filterParts = filter.split(':');
+
+ keys = keys.split('|')[0].trim();
+ }
+ keys = keys.replace(/,/g, ' ').replace(/ +/g, ' ').split(' ');
+ if (data[i]) {
+ if (Array.isArray(data[i])) {
+ // result is in an array, go through all elements of array and pick only the right ones
+ const partialArray = [];
+ data[i].forEach(element => {
+ let partialRes = {};
+ if (keys.length === 1 && (keys[0] === '*' || keys[0] === 'all')) {
+ partialRes = element;
+ } else {
+ keys.forEach(k => {
+ if ({}.hasOwnProperty.call(element, k)) {
+ partialRes[k] = element[k];
+ }
+ });
+ }
+ // if there is a filter, then just take those elements
+ if (filter && filterParts.length === 2) {
+ if ({}.hasOwnProperty.call(partialRes, filterParts[0].trim())) {
+ const val = partialRes[filterParts[0].trim()];
+ if (typeof val == 'number') {
+ if (val === parseFloat(filterParts[1].trim())) {
+ partialArray.push(partialRes);
+ }
+ } else if (typeof val == 'string') {
+ if (val.toLowerCase() === filterParts[1].trim().toLowerCase()) {
+ partialArray.push(partialRes);
+ }
+ }
+ }
+ } else {
+ partialArray.push(partialRes);
+ }
+
+ });
+ result[key] = partialArray;
+ } else {
+ const partialRes = {};
+ keys.forEach(k => {
+ if ({}.hasOwnProperty.call(data[i], k)) {
+ partialRes[k] = data[i][k];
+ }
+ });
+ result[key] = partialRes;
+ }
+ } else {
+ result[key] = {};
+ }
+ }
+ i++;
+ }
+ }
+ if (callback) { callback(result); }
+ resolve(result);
+ });
+ });
+ });
+}
+
+function observe(valueObject, interval, callback) {
+ let _data = null;
+
+ const result = setInterval(() => {
+ get(valueObject).then((data) => {
+ if (JSON.stringify(_data) !== JSON.stringify(data)) {
+ _data = Object.assign({}, data);
+ callback(data);
+ }
+ });
+ }, interval);
+ return result;
+}
+
+// ----------------------------------------------------------------------------------
+// export all libs
+// ----------------------------------------------------------------------------------
+
+exports.version = version;
+exports.system = system.system;
+exports.bios = system.bios;
+exports.baseboard = system.baseboard;
+exports.chassis = system.chassis;
+
+exports.time = osInfo.time;
+exports.osInfo = osInfo.osInfo;
+exports.versions = osInfo.versions;
+exports.shell = osInfo.shell;
+exports.uuid = osInfo.uuid;
+
+exports.cpu = cpu.cpu;
+exports.cpuFlags = cpu.cpuFlags;
+exports.cpuCache = cpu.cpuCache;
+exports.cpuCurrentSpeed = cpu.cpuCurrentSpeed;
+exports.cpuTemperature = cpu.cpuTemperature;
+exports.currentLoad = cpu.currentLoad;
+exports.fullLoad = cpu.fullLoad;
+
+exports.mem = memory.mem;
+exports.memLayout = memory.memLayout;
+
+exports.battery = battery;
+
+exports.graphics = graphics.graphics;
+
+exports.fsSize = filesystem.fsSize;
+exports.fsOpenFiles = filesystem.fsOpenFiles;
+exports.blockDevices = filesystem.blockDevices;
+exports.fsStats = filesystem.fsStats;
+exports.disksIO = filesystem.disksIO;
+exports.diskLayout = filesystem.diskLayout;
+
+exports.networkInterfaceDefault = network.networkInterfaceDefault;
+exports.networkGatewayDefault = network.networkGatewayDefault;
+exports.networkInterfaces = network.networkInterfaces;
+exports.networkStats = network.networkStats;
+exports.networkConnections = network.networkConnections;
+
+exports.wifiNetworks = wifi.wifiNetworks;
+exports.wifiInterfaces = wifi.wifiInterfaces;
+exports.wifiConnections = wifi.wifiConnections;
+
+exports.services = processes.services;
+exports.processes = processes.processes;
+exports.processLoad = processes.processLoad;
+
+exports.users = users.users;
+
+exports.inetChecksite = internet.inetChecksite;
+exports.inetLatency = internet.inetLatency;
+
+exports.dockerInfo = docker.dockerInfo;
+exports.dockerImages = docker.dockerImages;
+exports.dockerContainers = docker.dockerContainers;
+exports.dockerContainerStats = docker.dockerContainerStats;
+exports.dockerContainerProcesses = docker.dockerContainerProcesses;
+exports.dockerVolumes = docker.dockerVolumes;
+exports.dockerAll = docker.dockerAll;
+
+exports.vboxInfo = vbox.vboxInfo;
+
+exports.printer = printer.printer;
+
+exports.usb = usb.usb;
+
+exports.audio = audio.audio;
+exports.bluetoothDevices = bluetooth.bluetoothDevices;
+
+exports.getStaticData = getStaticData;
+exports.getDynamicData = getDynamicData;
+exports.getAllData = getAllData;
+exports.get = get;
+exports.observe = observe;
+
+exports.powerShellStart = util.powerShellStart;
+exports.powerShellRelease = util.powerShellRelease;
diff --git a/node_modules/systeminformation/lib/internet.js b/node_modules/systeminformation/lib/internet.js
new file mode 100644
index 0000000..71f0878
--- /dev/null
+++ b/node_modules/systeminformation/lib/internet.js
@@ -0,0 +1,240 @@
+'use strict';
+// @ts-check
+// ==================================================================================
+// internet.js
+// ----------------------------------------------------------------------------------
+// Description: System Information - library
+// for Node.js
+// Copyright: (c) 2014 - 2022
+// Author: Sebastian Hildebrandt
+// ----------------------------------------------------------------------------------
+// License: MIT
+// ==================================================================================
+// 12. Internet
+// ----------------------------------------------------------------------------------
+
+// const exec = require('child_process').exec;
+const util = require('./util');
+
+let _platform = process.platform;
+
+const _linux = (_platform === 'linux' || _platform === 'android');
+const _darwin = (_platform === 'darwin');
+const _windows = (_platform === 'win32');
+const _freebsd = (_platform === 'freebsd');
+const _openbsd = (_platform === 'openbsd');
+const _netbsd = (_platform === 'netbsd');
+const _sunos = (_platform === 'sunos');
+
+// --------------------------
+// check if external site is available
+
+function inetChecksite(url, callback) {
+
+ return new Promise((resolve) => {
+ process.nextTick(() => {
+ let result = {
+ url: url,
+ ok: false,
+ status: 404,
+ ms: null
+ };
+ if (typeof url !== 'string') {
+ if (callback) { callback(result); }
+ return resolve(result);
+ }
+ let urlSanitized = '';
+ const s = util.sanitizeShellString(url, true);
+ for (let i = 0; i <= util.mathMin(s.length, 2000); i++) {
+ if (!(s[i] === undefined)) {
+ s[i].__proto__.toLowerCase = util.stringToLower;
+ const sl = s[i].toLowerCase();
+ if (sl && sl[0] && !sl[1] && sl[0].length === 1) {
+ urlSanitized = urlSanitized + sl[0];
+ }
+ }
+ }
+ result.url = urlSanitized;
+ try {
+ if (urlSanitized && !util.isPrototypePolluted()) {
+ urlSanitized.__proto__.startsWith = util.stringStartWith;
+ if (urlSanitized.startsWith('file:') || urlSanitized.startsWith('gopher:') || urlSanitized.startsWith('telnet:') || urlSanitized.startsWith('mailto:') || urlSanitized.startsWith('news:') || urlSanitized.startsWith('nntp:')) {
+ if (callback) { callback(result); }
+ return resolve(result);
+ }
+ let t = Date.now();
+ if (_linux || _freebsd || _openbsd || _netbsd || _darwin || _sunos) {
+ let args = ['-I', '--connect-timeout', '5', '-m', '5'];
+ args.push(urlSanitized);
+ let cmd = 'curl';
+ util.execSafe(cmd, args).then((stdout) => {
+ const lines = stdout.split('\n');
+ let statusCode = lines[0] && lines[0].indexOf(' ') >= 0 ? parseInt(lines[0].split(' ')[1], 10) : 404;
+ result.status = statusCode || 404;
+ result.ok = (statusCode === 200 || statusCode === 301 || statusCode === 302 || statusCode === 304);
+ result.ms = (result.ok ? Date.now() - t : null);
+ if (callback) { callback(result); }
+ resolve(result);
+ });
+ }
+ if (_windows) { // if this is stable, this can be used for all OS types
+ const http = (urlSanitized.startsWith('https:') ? require('https') : require('http'));
+ try {
+ http.get(urlSanitized, (res) => {
+ const statusCode = res.statusCode;
+
+ result.status = statusCode || 404;
+ result.ok = (statusCode === 200 || statusCode === 301 || statusCode === 302 || statusCode === 304);
+
+ if (statusCode !== 200) {
+ res.resume();
+ result.ms = (result.ok ? Date.now() - t : null);
+ if (callback) { callback(result); }
+ resolve(result);
+ } else {
+ res.on('data', () => { });
+ res.on('end', () => {
+ result.ms = (result.ok ? Date.now() - t : null);
+ if (callback) { callback(result); }
+ resolve(result);
+ });
+ }
+ }).on('error', () => {
+ if (callback) { callback(result); }
+ resolve(result);
+ });
+ } catch (err) {
+ if (callback) { callback(result); }
+ resolve(result);
+ }
+ }
+ } else {
+ if (callback) { callback(result); }
+ resolve(result);
+ }
+ } catch (err) {
+ if (callback) { callback(result); }
+ resolve(result);
+ }
+ });
+ });
+}
+
+exports.inetChecksite = inetChecksite;
+
+// --------------------------
+// check inet latency
+
+function inetLatency(host, callback) {
+
+ // fallback - if only callback is given
+ if (util.isFunction(host) && !callback) {
+ callback = host;
+ host = '';
+ }
+
+ host = host || '8.8.8.8';
+
+ return new Promise((resolve) => {
+ process.nextTick(() => {
+ if (typeof host !== 'string') {
+ if (callback) { callback(null); }
+ return resolve(null);
+ }
+ let hostSanitized = '';
+ const s = (util.isPrototypePolluted() ? '8.8.8.8' : util.sanitizeShellString(host, true)).trim();
+ for (let i = 0; i <= util.mathMin(s.length, 2000); i++) {
+ if (!(s[i] === undefined)) {
+ s[i].__proto__.toLowerCase = util.stringToLower;
+ const sl = s[i].toLowerCase();
+ if (sl && sl[0] && !sl[1]) {
+ hostSanitized = hostSanitized + sl[0];
+ }
+ }
+ }
+ hostSanitized.__proto__.startsWith = util.stringStartWith;
+ if (hostSanitized.startsWith('file:') || hostSanitized.startsWith('gopher:') || hostSanitized.startsWith('telnet:') || hostSanitized.startsWith('mailto:') || hostSanitized.startsWith('news:') || hostSanitized.startsWith('nntp:')) {
+ if (callback) { callback(null); }
+ return resolve(null);
+ }
+ let params;
+ let filt;
+ if (_linux || _freebsd || _openbsd || _netbsd || _darwin) {
+ if (_linux) {
+ params = ['-c', '2', '-w', '3', hostSanitized];
+ filt = 'rtt';
+ }
+ if (_freebsd || _openbsd || _netbsd) {
+ params = ['-c', '2', '-t', '3', hostSanitized];
+ filt = 'round-trip';
+ }
+ if (_darwin) {
+ params = ['-c2', '-t3', hostSanitized];
+ filt = 'avg';
+ }
+ util.execSafe('ping', params).then((stdout) => {
+ let result = null;
+ if (stdout) {
+ const lines = stdout.split('\n').filter(line => line.indexOf(filt) >= 0).join('\n');
+
+ const line = lines.split('=');
+ if (line.length > 1) {
+ const parts = line[1].split('/');
+ if (parts.length > 1) {
+ result = parseFloat(parts[1]);
+ }
+ }
+ }
+ if (callback) { callback(result); }
+ resolve(result);
+ });
+ }
+ if (_sunos) {
+ const params = ['-s', '-a', hostSanitized, '56', '2'];
+ const filt = 'avg';
+ util.execSafe('ping', params, { timeout: 3000 }).then((stdout) => {
+ let result = null;
+ if (stdout) {
+ const lines = stdout.split('\n').filter(line => line.indexOf(filt) >= 0).join('\n');
+ const line = lines.split('=');
+ if (line.length > 1) {
+ const parts = line[1].split('/');
+ if (parts.length > 1) {
+ result = parseFloat(parts[1].replace(',', '.'));
+ }
+ }
+ }
+ if (callback) { callback(result); }
+ resolve(result);
+ });
+ }
+ if (_windows) {
+ let result = null;
+ try {
+ const params = [hostSanitized, '-n', '1'];
+ util.execSafe('ping', params, util.execOptsWin).then((stdout) => {
+ if (stdout) {
+ let lines = stdout.split('\r\n');
+ lines.shift();
+ lines.forEach(function (line) {
+ if ((line.toLowerCase().match(/ms/g) || []).length === 3) {
+ let l = line.replace(/ +/g, ' ').split(' ');
+ if (l.length > 6) {
+ result = parseFloat(l[l.length - 1]);
+ }
+ }
+ });
+ }
+ if (callback) { callback(result); }
+ resolve(result);
+ });
+ } catch (e) {
+ if (callback) { callback(result); }
+ resolve(result);
+ }
+ }
+ });
+ });
+}
+
+exports.inetLatency = inetLatency;
diff --git a/node_modules/systeminformation/lib/memory.js b/node_modules/systeminformation/lib/memory.js
new file mode 100644
index 0000000..bbf7e5c
--- /dev/null
+++ b/node_modules/systeminformation/lib/memory.js
@@ -0,0 +1,547 @@
+'use strict';
+// @ts-check
+// ==================================================================================
+// memory.js
+// ----------------------------------------------------------------------------------
+// Description: System Information - library
+// for Node.js
+// Copyright: (c) 2014 - 2022
+// Author: Sebastian Hildebrandt
+// ----------------------------------------------------------------------------------
+// License: MIT
+// ==================================================================================
+// 5. Memory
+// ----------------------------------------------------------------------------------
+
+const os = require('os');
+const exec = require('child_process').exec;
+const execSync = require('child_process').execSync;
+const util = require('./util');
+const fs = require('fs');
+
+let _platform = process.platform;
+
+const _linux = (_platform === 'linux' || _platform === 'android');
+const _darwin = (_platform === 'darwin');
+const _windows = (_platform === 'win32');
+const _freebsd = (_platform === 'freebsd');
+const _openbsd = (_platform === 'openbsd');
+const _netbsd = (_platform === 'netbsd');
+const _sunos = (_platform === 'sunos');
+
+const OSX_RAM_manufacturers = {
+ '0x014F': 'Transcend Information',
+ '0x2C00': 'Micron Technology Inc.',
+ '0x802C': 'Micron Technology Inc.',
+ '0x80AD': 'Hynix Semiconductor Inc.',
+ '0x80CE': 'Samsung Electronics Inc.',
+ '0xAD00': 'Hynix Semiconductor Inc.',
+ '0xCE00': 'Samsung Electronics Inc.',
+ '0x02FE': 'Elpida',
+ '0x5105': 'Qimonda AG i. In.',
+ '0x8551': 'Qimonda AG i. In.',
+ '0x859B': 'Crucial',
+ '0x04CD': 'G-Skill'
+};
+
+const LINUX_RAM_manufacturers = {
+ '017A': 'Apacer',
+ '0198': 'HyperX',
+ '029E': 'Corsair',
+ '04CB': 'A-DATA',
+ '04CD': 'G-Skill',
+ '059B': 'Crucial',
+ '00CE': 'Samsung',
+ '1315': 'Crutial',
+ '014F': 'Transcend Information',
+ '2C00': 'Micron Technology Inc.',
+ '802C': 'Micron Technology Inc.',
+ '80AD': 'Hynix Semiconductor Inc.',
+ '80CE': 'Samsung Electronics Inc.',
+ 'AD00': 'Hynix Semiconductor Inc.',
+ 'CE00': 'Samsung Electronics Inc.',
+ '02FE': 'Elpida',
+ '5105': 'Qimonda AG i. In.',
+ '8551': 'Qimonda AG i. In.',
+ '859B': 'Crucial'
+};
+
+// _______________________________________________________________________________________
+// | R A M | H D |
+// |______________________|_________________________| | |
+// | active buffers/cache | | |
+// |________________________________________________|___________|_________|______________|
+// | used free | used free |
+// |____________________________________________________________|________________________|
+// | total | swap |
+// |____________________________________________________________|________________________|
+
+// free (older versions)
+// ----------------------------------
+// # free
+// total used free shared buffers cached
+// Mem: 16038 (1) 15653 (2) 384 (3) 0 (4) 236 (5) 14788 (6)
+// -/+ buffers/cache: 628 (7) 15409 (8)
+// Swap: 16371 83 16288
+//
+// |------------------------------------------------------------|
+// | R A M |
+// |______________________|_____________________________________|
+// | active (2-(5+6) = 7) | available (3+5+6 = 8) |
+// |______________________|_________________________|___________|
+// | active | buffers/cache (5+6) | |
+// |________________________________________________|___________|
+// | used (2) | free (3) |
+// |____________________________________________________________|
+// | total (1) |
+// |____________________________________________________________|
+
+//
+// free (since free von procps-ng 3.3.10)
+// ----------------------------------
+// # free
+// total used free shared buffers/cache available
+// Mem: 16038 (1) 628 (2) 386 (3) 0 (4) 15024 (5) 14788 (6)
+// Swap: 16371 83 16288
+//
+// |------------------------------------------------------------|
+// | R A M |
+// |______________________|_____________________________________|
+// | | available (6) estimated |
+// |______________________|_________________________|___________|
+// | active (2) | buffers/cache (5) | free (3) |
+// |________________________________________________|___________|
+// | total (1) |
+// |____________________________________________________________|
+//
+// Reference: http://www.software-architect.net/blog/article/date/2015/06/12/-826c6e5052.html
+
+// /procs/meminfo - sample (all in kB)
+//
+// MemTotal: 32806380 kB
+// MemFree: 17977744 kB
+// MemAvailable: 19768972 kB
+// Buffers: 517028 kB
+// Cached: 2161876 kB
+// SwapCached: 456 kB
+// Active: 12081176 kB
+// Inactive: 2164616 kB
+// Active(anon): 10832884 kB
+// Inactive(anon): 1477272 kB
+// Active(file): 1248292 kB
+// Inactive(file): 687344 kB
+// Unevictable: 0 kB
+// Mlocked: 0 kB
+// SwapTotal: 16768892 kB
+// SwapFree: 16768304 kB
+// Dirty: 268 kB
+// Writeback: 0 kB
+// AnonPages: 11568832 kB
+// Mapped: 719992 kB
+// Shmem: 743272 kB
+// Slab: 335716 kB
+// SReclaimable: 256364 kB
+// SUnreclaim: 79352 kB
+
+function mem(callback) {
+
+ return new Promise((resolve) => {
+ process.nextTick(() => {
+
+ let result = {
+ total: os.totalmem(),
+ free: os.freemem(),
+ used: os.totalmem() - os.freemem(),
+
+ active: os.totalmem() - os.freemem(), // temporarily (fallback)
+ available: os.freemem(), // temporarily (fallback)
+ buffers: 0,
+ cached: 0,
+ slab: 0,
+ buffcache: 0,
+
+ swaptotal: 0,
+ swapused: 0,
+ swapfree: 0
+ };
+
+ if (_linux) {
+ fs.readFile('/proc/meminfo', function (error, stdout) {
+ if (!error) {
+ const lines = stdout.toString().split('\n');
+ result.total = parseInt(util.getValue(lines, 'memtotal'), 10);
+ result.total = result.total ? result.total * 1024 : os.totalmem();
+ result.free = parseInt(util.getValue(lines, 'memfree'), 10);
+ result.free = result.free ? result.free * 1024 : os.freemem();
+ result.used = result.total - result.free;
+
+ result.buffers = parseInt(util.getValue(lines, 'buffers'), 10);
+ result.buffers = result.buffers ? result.buffers * 1024 : 0;
+ result.cached = parseInt(util.getValue(lines, 'cached'), 10);
+ result.cached = result.cached ? result.cached * 1024 : 0;
+ result.slab = parseInt(util.getValue(lines, 'slab'), 10);
+ result.slab = result.slab ? result.slab * 1024 : 0;
+ result.buffcache = result.buffers + result.cached + result.slab;
+
+ let available = parseInt(util.getValue(lines, 'memavailable'), 10);
+ result.available = available ? available * 1024 : result.free + result.buffcache;
+ result.active = result.total - result.available;
+
+ result.swaptotal = parseInt(util.getValue(lines, 'swaptotal'), 10);
+ result.swaptotal = result.swaptotal ? result.swaptotal * 1024 : 0;
+ result.swapfree = parseInt(util.getValue(lines, 'swapfree'), 10);
+ result.swapfree = result.swapfree ? result.swapfree * 1024 : 0;
+ result.swapused = result.swaptotal - result.swapfree;
+ }
+ if (callback) { callback(result); }
+ resolve(result);
+ });
+ }
+ if (_freebsd || _openbsd || _netbsd) {
+ exec('/sbin/sysctl hw.realmem hw.physmem vm.stats.vm.v_page_count vm.stats.vm.v_wire_count vm.stats.vm.v_active_count vm.stats.vm.v_inactive_count vm.stats.vm.v_cache_count vm.stats.vm.v_free_count vm.stats.vm.v_page_size', function (error, stdout) {
+ if (!error) {
+ let lines = stdout.toString().split('\n');
+ const pagesize = parseInt(util.getValue(lines, 'vm.stats.vm.v_page_size'), 10);
+ const inactive = parseInt(util.getValue(lines, 'vm.stats.vm.v_inactive_count'), 10) * pagesize;
+ const cache = parseInt(util.getValue(lines, 'vm.stats.vm.v_cache_count'), 10) * pagesize;
+
+ result.total = parseInt(util.getValue(lines, 'hw.realmem'), 10);
+ if (isNaN(result.total)) { result.total = parseInt(util.getValue(lines, 'hw.physmem'), 10); }
+ result.free = parseInt(util.getValue(lines, 'vm.stats.vm.v_free_count'), 10) * pagesize;
+ result.buffcache = inactive + cache;
+ result.available = result.buffcache + result.free;
+ result.active = result.total - result.free - result.buffcache;
+
+ result.swaptotal = 0;
+ result.swapfree = 0;
+ result.swapused = 0;
+
+ }
+ if (callback) { callback(result); }
+ resolve(result);
+ });
+ }
+ if (_sunos) {
+ if (callback) { callback(result); }
+ resolve(result);
+ }
+ if (_darwin) {
+ let pageSize = 4096;
+ try {
+ let sysPpageSize = util.toInt(execSync('sysctl -n vm.pagesize').toString());
+ pageSize = sysPpageSize || pageSize;
+ } catch (e) {
+ util.noop();
+ }
+ exec('vm_stat 2>/dev/null | grep "Pages active"', function (error, stdout) {
+ if (!error) {
+ let lines = stdout.toString().split('\n');
+
+ result.active = parseInt(lines[0].split(':')[1], 10) * pageSize;
+ result.buffcache = result.used - result.active;
+ result.available = result.free + result.buffcache;
+ }
+ exec('sysctl -n vm.swapusage 2>/dev/null', function (error, stdout) {
+ if (!error) {
+ let lines = stdout.toString().split('\n');
+ if (lines.length > 0) {
+ let line = lines[0].replace(/,/g, '.').replace(/M/g, '');
+ line = line.trim().split(' ');
+ for (let i = 0; i < line.length; i++) {
+ if (line[i].toLowerCase().indexOf('total') !== -1) { result.swaptotal = parseFloat(line[i].split('=')[1].trim()) * 1024 * 1024; }
+ if (line[i].toLowerCase().indexOf('used') !== -1) { result.swapused = parseFloat(line[i].split('=')[1].trim()) * 1024 * 1024; }
+ if (line[i].toLowerCase().indexOf('free') !== -1) { result.swapfree = parseFloat(line[i].split('=')[1].trim()) * 1024 * 1024; }
+ }
+ }
+ }
+ if (callback) { callback(result); }
+ resolve(result);
+ });
+ });
+ }
+ if (_windows) {
+ let swaptotal = 0;
+ let swapused = 0;
+ try {
+ util.powerShell('Get-CimInstance Win32_PageFileUsage | Select AllocatedBaseSize, CurrentUsage').then((stdout, error) => {
+ if (!error) {
+ let lines = stdout.split('\r\n').filter(line => line.trim() !== '').filter((line, idx) => idx > 0);
+ lines.forEach(function (line) {
+ if (line !== '') {
+ line = line.trim().split(/\s\s+/);
+ swaptotal = swaptotal + (parseInt(line[0], 10) || 0);
+ swapused = swapused + (parseInt(line[1], 10) || 0);
+ }
+ });
+ }
+ result.swaptotal = swaptotal * 1024 * 1024;
+ result.swapused = swapused * 1024 * 1024;
+ result.swapfree = result.swaptotal - result.swapused;
+
+ if (callback) { callback(result); }
+ resolve(result);
+ });
+ } catch (e) {
+ if (callback) { callback(result); }
+ resolve(result);
+ }
+ }
+ });
+ });
+}
+
+exports.mem = mem;
+
+function memLayout(callback) {
+
+ function getManufacturerDarwin(manId) {
+ if ({}.hasOwnProperty.call(OSX_RAM_manufacturers, manId)) {
+ return (OSX_RAM_manufacturers[manId]);
+ }
+ return manId;
+ }
+
+ function getManufacturerLinux(manId) {
+ const manIdSearch = manId.replace('0x', '').toUpperCase();
+ if (manIdSearch.length === 4 && {}.hasOwnProperty.call(LINUX_RAM_manufacturers, manIdSearch)) {
+ return (LINUX_RAM_manufacturers[manIdSearch]);
+ }
+ return manId;
+ }
+
+ return new Promise((resolve) => {
+ process.nextTick(() => {
+
+ let result = [];
+
+ if (_linux || _freebsd || _openbsd || _netbsd) {
+ exec('export LC_ALL=C; dmidecode -t memory 2>/dev/null | grep -iE "Size:|Type|Speed|Manufacturer|Form Factor|Locator|Memory Device|Serial Number|Voltage|Part Number"; unset LC_ALL', function (error, stdout) {
+ if (!error) {
+ let devices = stdout.toString().split('Memory Device');
+ devices.shift();
+ devices.forEach(function (device) {
+ let lines = device.split('\n');
+ const sizeString = util.getValue(lines, 'Size');
+ const size = sizeString.indexOf('GB') >= 0 ? parseInt(sizeString, 10) * 1024 * 1024 * 1024 : parseInt(sizeString, 10) * 1024 * 1024;
+ if (parseInt(util.getValue(lines, 'Size'), 10) > 0) {
+ const totalWidth = util.toInt(util.getValue(lines, 'Total Width'));
+ const dataWidth = util.toInt(util.getValue(lines, 'Data Width'));
+ result.push({
+ size,
+ bank: util.getValue(lines, 'Bank Locator'),
+ type: util.getValue(lines, 'Type:'),
+ ecc: dataWidth && totalWidth ? totalWidth > dataWidth : false,
+ clockSpeed: (util.getValue(lines, 'Configured Clock Speed:') ? parseInt(util.getValue(lines, 'Configured Clock Speed:'), 10) : (util.getValue(lines, 'Speed:') ? parseInt(util.getValue(lines, 'Speed:'), 10) : null)),
+ formFactor: util.getValue(lines, 'Form Factor:'),
+ manufacturer: getManufacturerLinux(util.getValue(lines, 'Manufacturer:')),
+ partNum: util.getValue(lines, 'Part Number:'),
+ serialNum: util.getValue(lines, 'Serial Number:'),
+ voltageConfigured: parseFloat(util.getValue(lines, 'Configured Voltage:')) || null,
+ voltageMin: parseFloat(util.getValue(lines, 'Minimum Voltage:')) || null,
+ voltageMax: parseFloat(util.getValue(lines, 'Maximum Voltage:')) || null,
+ });
+ } else {
+ result.push({
+ size: 0,
+ bank: util.getValue(lines, 'Bank Locator'),
+ type: 'Empty',
+ ecc: null,
+ clockSpeed: 0,
+ formFactor: util.getValue(lines, 'Form Factor:'),
+ partNum: '',
+ serialNum: '',
+ voltageConfigured: null,
+ voltageMin: null,
+ voltageMax: null,
+ });
+ }
+ });
+ }
+ if (!result.length) {
+ result.push({
+ size: os.totalmem(),
+ bank: '',
+ type: '',
+ ecc: null,
+ clockSpeed: 0,
+ formFactor: '',
+ partNum: '',
+ serialNum: '',
+ voltageConfigured: null,
+ voltageMin: null,
+ voltageMax: null,
+ });
+
+ // Try Raspberry PI
+ try {
+ let stdout = execSync('cat /proc/cpuinfo 2>/dev/null');
+ let lines = stdout.toString().split('\n');
+ let model = util.getValue(lines, 'hardware', ':', true).toUpperCase();
+ let version = util.getValue(lines, 'revision', ':', true).toLowerCase();
+
+ if (model === 'BCM2835' || model === 'BCM2708' || model === 'BCM2709' || model === 'BCM2835' || model === 'BCM2837') {
+
+ const clockSpeed = {
+ '0': 400,
+ '1': 450,
+ '2': 450,
+ '3': 3200
+ };
+ result[0].type = 'LPDDR2';
+ result[0].type = version && version[2] && version[2] === '3' ? 'LPDDR4' : result[0].type;
+ result[0].ecc = false;
+ result[0].clockSpeed = version && version[2] && clockSpeed[version[2]] || 400;
+ result[0].clockSpeed = version && version[4] && version[4] === 'd' ? 500 : result[0].clockSpeed;
+ result[0].formFactor = 'SoC';
+
+ stdout = execSync('vcgencmd get_config sdram_freq 2>/dev/null');
+ lines = stdout.toString().split('\n');
+ let freq = parseInt(util.getValue(lines, 'sdram_freq', '=', true), 10) || 0;
+ if (freq) {
+ result[0].clockSpeed = freq;
+ }
+
+ stdout = execSync('vcgencmd measure_volts sdram_p 2>/dev/null');
+ lines = stdout.toString().split('\n');
+ let voltage = parseFloat(util.getValue(lines, 'volt', '=', true)) || 0;
+ if (voltage) {
+ result[0].voltageConfigured = voltage;
+ result[0].voltageMin = voltage;
+ result[0].voltageMax = voltage;
+ }
+ }
+ } catch (e) {
+ util.noop();
+ }
+
+ }
+ if (callback) { callback(result); }
+ resolve(result);
+ });
+ }
+
+ if (_darwin) {
+ exec('system_profiler SPMemoryDataType', function (error, stdout) {
+ if (!error) {
+ const allLines = stdout.toString().split('\n');
+ const eccStatus = util.getValue(allLines, 'ecc', ':', true).toLowerCase();
+ let devices = stdout.toString().split(' BANK ');
+ let hasBank = true;
+ if (devices.length === 1) {
+ devices = stdout.toString().split(' DIMM');
+ hasBank = false;
+ }
+ devices.shift();
+ devices.forEach(function (device) {
+ let lines = device.split('\n');
+ const bank = (hasBank ? 'BANK ' : 'DIMM') + lines[0].trim().split('/')[0];
+ const size = parseInt(util.getValue(lines, ' Size'));
+ if (size) {
+ result.push({
+ size: size * 1024 * 1024 * 1024,
+ bank: bank,
+ type: util.getValue(lines, ' Type:'),
+ ecc: eccStatus ? eccStatus === 'enabled' : null,
+ clockSpeed: parseInt(util.getValue(lines, ' Speed:'), 10),
+ formFactor: '',
+ manufacturer: getManufacturerDarwin(util.getValue(lines, ' Manufacturer:')),
+ partNum: util.getValue(lines, ' Part Number:'),
+ serialNum: util.getValue(lines, ' Serial Number:'),
+ voltageConfigured: null,
+ voltageMin: null,
+ voltageMax: null,
+ });
+ } else {
+ result.push({
+ size: 0,
+ bank: bank,
+ type: 'Empty',
+ ecc: null,
+ clockSpeed: 0,
+ formFactor: '',
+ manufacturer: '',
+ partNum: '',
+ serialNum: '',
+ voltageConfigured: null,
+ voltageMin: null,
+ voltageMax: null,
+ });
+ }
+ });
+ }
+ if (!result.length) {
+ const lines = stdout.toString().split('\n');
+ const size = parseInt(util.getValue(lines, ' Memory:'));
+ const type = util.getValue(lines, ' Type:');
+ if (size && type) {
+ result.push({
+ size: size * 1024 * 1024 * 1024,
+ bank: '0',
+ type,
+ ecc: false,
+ clockSpeed: 0,
+ formFactor: '',
+ manufacturer: 'Apple',
+ partNum: '',
+ serialNum: '',
+ voltageConfigured: null,
+ voltageMin: null,
+ voltageMax: null,
+ });
+
+ }
+ }
+ if (callback) { callback(result); }
+ resolve(result);
+ });
+ }
+ if (_sunos) {
+ if (callback) { callback(result); }
+ resolve(result);
+ }
+ if (_windows) {
+ const memoryTypes = 'Unknown|Other|DRAM|Synchronous DRAM|Cache DRAM|EDO|EDRAM|VRAM|SRAM|RAM|ROM|FLASH|EEPROM|FEPROM|EPROM|CDRAM|3DRAM|SDRAM|SGRAM|RDRAM|DDR|DDR2|DDR2 FB-DIMM|Reserved|DDR3|FBD2|DDR4|LPDDR|LPDDR2|LPDDR3|LPDDR4'.split('|');
+ const FormFactors = 'Unknown|Other|SIP|DIP|ZIP|SOJ|Proprietary|SIMM|DIMM|TSOP|PGA|RIMM|SODIMM|SRIMM|SMD|SSMP|QFP|TQFP|SOIC|LCC|PLCC|BGA|FPBGA|LGA'.split('|');
+
+ try {
+ util.powerShell('Get-WmiObject Win32_PhysicalMemory | select DataWidth,TotalWidth,Capacity,BankLabel,MemoryType,SMBIOSMemoryType,ConfiguredClockSpeed,FormFactor,Manufacturer,PartNumber,SerialNumber,ConfiguredVoltage,MinVoltage,MaxVoltage | fl').then((stdout, error) => {
+ if (!error) {
+ let devices = stdout.toString().split(/\n\s*\n/);
+ devices.shift();
+ devices.forEach(function (device) {
+ let lines = device.split('\r\n');
+ const dataWidth = util.toInt(util.getValue(lines, 'DataWidth', ':'));
+ const totalWidth = util.toInt(util.getValue(lines, 'TotalWidth', ':'));
+ const size = parseInt(util.getValue(lines, 'Capacity', ':'), 10) || 0;
+ if (size) {
+ result.push({
+ size,
+ bank: util.getValue(lines, 'BankLabel', ':'), // BankLabel
+ type: memoryTypes[parseInt(util.getValue(lines, 'MemoryType', ':'), 10) || parseInt(util.getValue(lines, 'SMBIOSMemoryType', ':'), 10)],
+ ecc: dataWidth && totalWidth ? totalWidth > dataWidth : false,
+ clockSpeed: parseInt(util.getValue(lines, 'ConfiguredClockSpeed', ':'), 10) || parseInt(util.getValue(lines, 'Speed', ':'), 10) || 0,
+ formFactor: FormFactors[parseInt(util.getValue(lines, 'FormFactor', ':'), 10) || 0],
+ manufacturer: util.getValue(lines, 'Manufacturer', ':'),
+ partNum: util.getValue(lines, 'PartNumber', ':'),
+ serialNum: util.getValue(lines, 'SerialNumber', ':'),
+ voltageConfigured: (parseInt(util.getValue(lines, 'ConfiguredVoltage', ':'), 10) || 0) / 1000.0,
+ voltageMin: (parseInt(util.getValue(lines, 'MinVoltage', ':'), 10) || 0) / 1000.0,
+ voltageMax: (parseInt(util.getValue(lines, 'MaxVoltage', ':'), 10) || 0) / 1000.0,
+ });
+ }
+ });
+ }
+ if (callback) { callback(result); }
+ resolve(result);
+ });
+ } catch (e) {
+ if (callback) { callback(result); }
+ resolve(result);
+ }
+ }
+ });
+ });
+}
+
+exports.memLayout = memLayout;
+
diff --git a/node_modules/systeminformation/lib/network.js b/node_modules/systeminformation/lib/network.js
new file mode 100644
index 0000000..e3a29e3
--- /dev/null
+++ b/node_modules/systeminformation/lib/network.js
@@ -0,0 +1,1736 @@
+'use strict';
+// @ts-check
+// ==================================================================================
+// network.js
+// ----------------------------------------------------------------------------------
+// Description: System Information - library
+// for Node.js
+// Copyright: (c) 2014 - 2022
+// Author: Sebastian Hildebrandt
+// ----------------------------------------------------------------------------------
+// License: MIT
+// ==================================================================================
+// 9. Network
+// ----------------------------------------------------------------------------------
+
+const os = require('os');
+const exec = require('child_process').exec;
+const execSync = require('child_process').execSync;
+const fs = require('fs');
+const util = require('./util');
+
+let _platform = process.platform;
+
+const _linux = (_platform === 'linux' || _platform === 'android');
+const _darwin = (_platform === 'darwin');
+const _windows = (_platform === 'win32');
+const _freebsd = (_platform === 'freebsd');
+const _openbsd = (_platform === 'openbsd');
+const _netbsd = (_platform === 'netbsd');
+const _sunos = (_platform === 'sunos');
+
+let _network = {};
+let _default_iface = '';
+let _ifaces = {};
+let _dhcpNics = [];
+let _networkInterfaces = [];
+let _mac = {};
+let pathToIp;
+
+function getDefaultNetworkInterface() {
+
+ let ifacename = '';
+ let ifacenameFirst = '';
+ try {
+ let ifaces = os.networkInterfaces();
+
+ let scopeid = 9999;
+
+ // fallback - "first" external interface (sorted by scopeid)
+ for (let dev in ifaces) {
+ if ({}.hasOwnProperty.call(ifaces, dev)) {
+ ifaces[dev].forEach(function (details) {
+ if (details && details.internal === false) {
+ ifacenameFirst = ifacenameFirst || dev; // fallback if no scopeid
+ if (details.scopeid && details.scopeid < scopeid) {
+ ifacename = dev;
+ scopeid = details.scopeid;
+ }
+ }
+ });
+ }
+ }
+ ifacename = ifacename || ifacenameFirst || '';
+
+ if (_windows) {
+ // https://www.inetdaemon.com/tutorials/internet/ip/routing/default_route.shtml
+ let defaultIp = '';
+ const cmd = 'netstat -r';
+ const result = execSync(cmd, util.execOptsWin);
+ const lines = result.toString().split(os.EOL);
+ lines.forEach(line => {
+ line = line.replace(/\s+/g, ' ').trim();
+ if (line.indexOf('0.0.0.0 0.0.0.0') > -1 && !(/[a-zA-Z]/.test(line))) {
+ const parts = line.split(' ');
+ if (parts.length >= 5) {
+ defaultIp = parts[parts.length - 2];
+ }
+ }
+ });
+ if (defaultIp) {
+ for (let dev in ifaces) {
+ if ({}.hasOwnProperty.call(ifaces, dev)) {
+ ifaces[dev].forEach(function (details) {
+ if (details && details.address && details.address === defaultIp) {
+ ifacename = dev;
+ }
+ });
+ }
+ }
+ }
+ }
+ if (_linux) {
+ let cmd = 'ip route 2> /dev/null | grep default';
+ let result = execSync(cmd);
+ let parts = result.toString().split('\n')[0].split(/\s+/);
+ if (parts[0] === 'none' && parts[5]) {
+ ifacename = parts[5];
+ } else if (parts[4]) {
+ ifacename = parts[4];
+ }
+
+ if (ifacename.indexOf(':') > -1) {
+ ifacename = ifacename.split(':')[1].trim();
+ }
+ }
+ if (_darwin || _freebsd || _openbsd || _netbsd || _sunos) {
+ let cmd = '';
+ if (_linux) { cmd = 'ip route 2> /dev/null | grep default | awk \'{print $5}\''; }
+ if (_darwin) { cmd = 'route -n get default 2>/dev/null | grep interface: | awk \'{print $2}\''; }
+ if (_freebsd || _openbsd || _netbsd || _sunos) { cmd = 'route get 0.0.0.0 | grep interface:'; }
+ let result = execSync(cmd);
+ ifacename = result.toString().split('\n')[0];
+ if (ifacename.indexOf(':') > -1) {
+ ifacename = ifacename.split(':')[1].trim();
+ }
+ }
+ } catch (e) {
+ util.noop();
+ }
+ if (ifacename) { _default_iface = ifacename; }
+ return _default_iface;
+}
+
+exports.getDefaultNetworkInterface = getDefaultNetworkInterface;
+
+function getMacAddresses() {
+ let iface = '';
+ let mac = '';
+ let result = {};
+ if (_linux || _freebsd || _openbsd || _netbsd) {
+ if (typeof pathToIp === 'undefined') {
+ try {
+ const lines = execSync('which ip').toString().split('\n');
+ if (lines.length && lines[0].indexOf(':') === -1 && lines[0].indexOf('/') === 0) {
+ pathToIp = lines[0];
+ } else {
+ pathToIp = '';
+ }
+ } catch (e) {
+ pathToIp = '';
+ }
+ }
+ try {
+ const cmd = 'export LC_ALL=C; ' + ((pathToIp) ? pathToIp + ' link show up' : '/sbin/ifconfig') + '; unset LC_ALL';
+ let res = execSync(cmd);
+ const lines = res.toString().split('\n');
+ for (let i = 0; i < lines.length; i++) {
+ if (lines[i] && lines[i][0] !== ' ') {
+ if (pathToIp) {
+ let nextline = lines[i + 1].trim().split(' ');
+ if (nextline[0] === 'link/ether') {
+ iface = lines[i].split(' ')[1];
+ iface = iface.slice(0, iface.length - 1);
+ mac = nextline[1];
+ }
+ } else {
+ iface = lines[i].split(' ')[0];
+ mac = lines[i].split('HWaddr ')[1];
+ }
+
+ if (iface && mac) {
+ result[iface] = mac.trim();
+ iface = '';
+ mac = '';
+ }
+ }
+ }
+ } catch (e) {
+ util.noop();
+ }
+ }
+ if (_darwin) {
+ try {
+ const cmd = '/sbin/ifconfig';
+ let res = execSync(cmd);
+ const lines = res.toString().split('\n');
+ for (let i = 0; i < lines.length; i++) {
+ if (lines[i] && lines[i][0] !== '\t' && lines[i].indexOf(':') > 0) {
+ iface = lines[i].split(':')[0];
+ } else if (lines[i].indexOf('\tether ') === 0) {
+ mac = lines[i].split('\tether ')[1];
+ if (iface && mac) {
+ result[iface] = mac.trim();
+ iface = '';
+ mac = '';
+ }
+ }
+ }
+ } catch (e) {
+ util.noop();
+ }
+ }
+ return result;
+}
+
+function networkInterfaceDefault(callback) {
+
+ return new Promise((resolve) => {
+ process.nextTick(() => {
+ let result = getDefaultNetworkInterface();
+ if (callback) { callback(result); }
+ resolve(result);
+ });
+ });
+}
+
+exports.networkInterfaceDefault = networkInterfaceDefault;
+
+// --------------------------
+// NET - interfaces
+
+function parseLinesWindowsNics(sections, nconfigsections) {
+ let nics = [];
+ for (let i in sections) {
+ if ({}.hasOwnProperty.call(sections, i)) {
+
+ if (sections[i].trim() !== '') {
+
+ let lines = sections[i].trim().split('\r\n');
+ let linesNicConfig = nconfigsections && nconfigsections[i] ? nconfigsections[i].trim().split('\r\n') : [];
+ let netEnabled = util.getValue(lines, 'NetEnabled', ':');
+ let adapterType = util.getValue(lines, 'AdapterTypeID', ':') === '9' ? 'wireless' : 'wired';
+ let ifacename = util.getValue(lines, 'Name', ':').replace(/\]/g, ')').replace(/\[/g, '(');
+ let iface = util.getValue(lines, 'NetConnectionID', ':').replace(/\]/g, ')').replace(/\[/g, '(');
+ if (ifacename.toLowerCase().indexOf('wi-fi') >= 0 || ifacename.toLowerCase().indexOf('wireless') >= 0) {
+ adapterType = 'wireless';
+ }
+ if (netEnabled !== '') {
+ const speed = parseInt(util.getValue(lines, 'speed', ':').trim(), 10) / 1000000;
+ nics.push({
+ mac: util.getValue(lines, 'MACAddress', ':').toLowerCase(),
+ dhcp: util.getValue(linesNicConfig, 'dhcpEnabled', ':').toLowerCase() === 'true',
+ name: ifacename,
+ iface,
+ netEnabled: netEnabled === 'TRUE',
+ speed: isNaN(speed) ? null : speed,
+ operstate: util.getValue(lines, 'NetConnectionStatus', ':') === '2' ? 'up' : 'down',
+ type: adapterType
+ });
+ }
+ }
+ }
+ }
+ return nics;
+}
+
+function getWindowsNics() {
+ return new Promise((resolve) => {
+ process.nextTick(() => {
+ let cmd = 'Get-WmiObject Win32_NetworkAdapter | fl *' + '; echo \'#-#-#-#\';';
+ cmd += 'Get-WmiObject Win32_NetworkAdapterConfiguration | fl DHCPEnabled' + '';
+ try {
+ util.powerShell(cmd).then((data) => {
+ data = data.split('#-#-#-#');
+ const nsections = (data[0] || '').split(/\n\s*\n/);
+ const nconfigsections = (data[1] || '').split(/\n\s*\n/);
+ resolve(parseLinesWindowsNics(nsections, nconfigsections));
+ });
+ } catch (e) {
+ resolve([]);
+ }
+ });
+ });
+}
+
+function getWindowsDNSsuffixes() {
+
+ let iface = {};
+
+ let dnsSuffixes = {
+ primaryDNS: '',
+ exitCode: 0,
+ ifaces: [],
+ };
+
+ try {
+ const ipconfig = execSync('ipconfig /all', util.execOptsWin);
+ const ipconfigArray = ipconfig.split('\r\n\r\n');
+
+ ipconfigArray.forEach((element, index) => {
+
+ if (index == 1) {
+ const longPrimaryDNS = element.split('\r\n').filter((element) => {
+ return element.toUpperCase().includes('DNS');
+ });
+ const primaryDNS = longPrimaryDNS[0].substring(longPrimaryDNS[0].lastIndexOf(':') + 1);
+ dnsSuffixes.primaryDNS = primaryDNS.trim();
+ if (!dnsSuffixes.primaryDNS) { dnsSuffixes.primaryDNS = 'Not defined'; }
+ }
+ if (index > 1) {
+ if (index % 2 == 0) {
+ const name = element.substring(element.lastIndexOf(' ') + 1).replace(':', '');
+ iface.name = name;
+ } else {
+ const connectionSpecificDNS = element.split('\r\n').filter((element) => {
+ return element.toUpperCase().includes('DNS');
+ });
+ const dnsSuffix = connectionSpecificDNS[0].substring(connectionSpecificDNS[0].lastIndexOf(':') + 1);
+ iface.dnsSuffix = dnsSuffix.trim();
+ dnsSuffixes.ifaces.push(iface);
+ iface = {};
+ }
+ }
+ });
+
+ return dnsSuffixes;
+ } catch (error) {
+ // console.log('An error occurred trying to bring the Connection-specific DNS suffix', error.message);
+ return {
+ primaryDNS: '',
+ exitCode: 0,
+ ifaces: [],
+ };
+ }
+}
+
+function getWindowsIfaceDNSsuffix(ifaces, ifacename) {
+ let dnsSuffix = '';
+ // Adding (.) to ensure ifacename compatibility when duplicated iface-names
+ const interfaceName = ifacename + '.';
+ try {
+ const connectionDnsSuffix = ifaces.filter((iface) => {
+ return interfaceName.includes(iface.name + '.');
+ }).map((iface) => iface.dnsSuffix);
+ if (connectionDnsSuffix[0]) {
+ dnsSuffix = connectionDnsSuffix[0];
+ }
+ if (!dnsSuffix) { dnsSuffix = ''; }
+ return dnsSuffix;
+ } catch (error) {
+ // console.log('Error getting Connection-specific DNS suffix: ', error.message);
+ return 'Unknown';
+ }
+}
+
+function getWindowsWiredProfilesInformation() {
+ try {
+ const result = execSync('netsh lan show profiles', util.execOptsWin);
+ const profileList = result.split('\r\nProfile on interface');
+ return profileList;
+ } catch (error) {
+ if (error.status === 1 && error.stdout.includes('AutoConfig')) {
+ return 'Disabled';
+ }
+ return [];
+ }
+}
+
+function getWindowsWirelessIfaceSSID(interfaceName) {
+ try {
+ const result = execSync(`netsh wlan show interface name="${interfaceName}" | findstr "SSID"`, util.execOptsWin);
+ const SSID = result.split('\r\n').shift();
+ const parseSSID = SSID.split(':').pop();
+ return parseSSID;
+ } catch (error) {
+ return 'Unknown';
+ }
+}
+function getWindowsIEEE8021x(connectionType, iface, ifaces) {
+ let i8021x = {
+ state: 'Unknown',
+ protocol: 'Unknown',
+ };
+
+ if (ifaces === 'Disabled') {
+ i8021x.state = 'Disabled';
+ i8021x.protocol = 'Not defined';
+ return i8021x;
+ }
+
+ if (connectionType == 'wired' && ifaces.length > 0) {
+ try {
+ // Get 802.1x information by interface name
+ const iface8021xInfo = ifaces.find((element) => {
+ return element.includes(iface + '\r\n');
+ });
+ const arrayIface8021xInfo = iface8021xInfo.split('\r\n');
+ const state8021x = arrayIface8021xInfo.find((element) => {
+ return element.includes('802.1x');
+ });
+
+ if (state8021x.includes('Disabled')) {
+ i8021x.state = 'Disabled';
+ i8021x.protocol = 'Not defined';
+ } else if (state8021x.includes('Enabled')) {
+ const protocol8021x = arrayIface8021xInfo.find((element) => {
+ return element.includes('EAP');
+ });
+ i8021x.protocol = protocol8021x.split(':').pop();
+ i8021x.state = 'Enabled';
+ }
+ } catch (error) {
+ return i8021x;
+ }
+ } else if (connectionType == 'wireless') {
+
+ let i8021xState = '';
+ let i8021xProtocol = '';
+
+
+
+ try {
+ const SSID = getWindowsWirelessIfaceSSID(iface);
+ if (SSID !== 'Unknown') {
+ i8021xState = execSync(`netsh wlan show profiles "${SSID}" | findstr "802.1X"`, util.execOptsWin);
+ i8021xProtocol = execSync(`netsh wlan show profiles "${SSID}" | findstr "EAP"`, util.execOptsWin);
+ }
+
+ if (i8021xState.includes(':') && i8021xProtocol.includes(':')) {
+ i8021x.state = i8021xState.split(':').pop();
+ i8021x.protocol = i8021xProtocol.split(':').pop();
+ }
+ } catch (error) {
+ if (error.status === 1 && error.stdout.includes('AutoConfig')) {
+ i8021x.state = 'Disabled';
+ i8021x.protocol = 'Not defined';
+ }
+ return i8021x;
+ }
+ }
+
+ return i8021x;
+}
+
+function splitSectionsNics(lines) {
+ const result = [];
+ let section = [];
+ lines.forEach(function (line) {
+ if (!line.startsWith('\t') && !line.startsWith(' ')) {
+ if (section.length) {
+ result.push(section);
+ section = [];
+ }
+ }
+ section.push(line);
+ });
+ if (section.length) {
+ result.push(section);
+ }
+ return result;
+}
+
+function parseLinesDarwinNics(sections) {
+ let nics = [];
+ sections.forEach(section => {
+ let nic = {
+ iface: '',
+ mtu: null,
+ mac: '',
+ ip6: '',
+ ip4: '',
+ speed: null,
+ type: '',
+ operstate: '',
+ duplex: '',
+ internal: false
+ };
+ const first = section[0];
+ nic.iface = first.split(':')[0].trim();
+ let parts = first.split('> mtu');
+ nic.mtu = parts.length > 1 ? parseInt(parts[1], 10) : null;
+ if (isNaN(nic.mtu)) {
+ nic.mtu = null;
+ }
+ nic.internal = parts[0].toLowerCase().indexOf('loopback') > -1;
+ section.forEach(line => {
+ if (line.trim().startsWith('ether ')) {
+ nic.mac = line.split('ether ')[1].toLowerCase().trim();
+ }
+ if (line.trim().startsWith('inet6 ') && !nic.ip6) {
+ nic.ip6 = line.split('inet6 ')[1].toLowerCase().split('%')[0].split(' ')[0];
+ }
+ if (line.trim().startsWith('inet ') && !nic.ip4) {
+ nic.ip4 = line.split('inet ')[1].toLowerCase().split(' ')[0];
+ }
+ });
+ let speed = util.getValue(section, 'link rate');
+ nic.speed = speed ? parseFloat(speed) : null;
+ if (nic.speed === null) {
+ speed = util.getValue(section, 'uplink rate');
+ nic.speed = speed ? parseFloat(speed) : null;
+ if (nic.speed !== null && speed.toLowerCase().indexOf('gbps') >= 0) {
+ nic.speed = nic.speed * 1000;
+ }
+ } else {
+ if (speed.toLowerCase().indexOf('gbps') >= 0) {
+ nic.speed = nic.speed * 1000;
+ }
+ }
+ nic.type = util.getValue(section, 'type').toLowerCase().indexOf('wi-fi') > -1 ? 'wireless' : 'wired';
+ const operstate = util.getValue(section, 'status').toLowerCase();
+ nic.operstate = (operstate === 'active' ? 'up' : (operstate === 'inactive' ? 'down' : 'unknown'));
+ nic.duplex = util.getValue(section, 'media').toLowerCase().indexOf('half-duplex') > -1 ? 'half' : 'full';
+ if (nic.ip6 || nic.ip4 || nic.mac) {
+ nics.push(nic);
+ }
+ });
+ return nics;
+}
+
+function getDarwinNics() {
+ const cmd = '/sbin/ifconfig -v';
+ try {
+ // console.log('SYNC - Nics darwin 12');
+ const lines = execSync(cmd, { maxBuffer: 1024 * 20000 }).toString().split('\n');
+ const nsections = splitSectionsNics(lines);
+ return (parseLinesDarwinNics(nsections));
+ } catch (e) {
+ return [];
+ }
+}
+
+function getLinuxIfaceConnectionName(interfaceName) {
+ const cmd = `nmcli device status 2>/dev/null | grep ${interfaceName}`;
+
+ try {
+ const result = execSync(cmd).toString();
+ const resultFormat = result.replace(/\s+/g, ' ').trim();
+ const connectionNameLines = resultFormat.split(' ').slice(3);
+ const connectionName = connectionNameLines.join(' ');
+ return connectionName != '--' ? connectionName : '';
+ } catch (e) {
+ return '';
+ }
+}
+
+function checkLinuxDCHPInterfaces(file) {
+ let result = [];
+ try {
+ let cmd = `cat ${file} 2> /dev/null | grep 'iface\\|source'`;
+ const lines = execSync(cmd, { maxBuffer: 1024 * 20000 }).toString().split('\n');
+
+ lines.forEach(line => {
+ const parts = line.replace(/\s+/g, ' ').trim().split(' ');
+ if (parts.length >= 4) {
+ if (line.toLowerCase().indexOf(' inet ') >= 0 && line.toLowerCase().indexOf('dhcp') >= 0) {
+ result.push(parts[1]);
+ }
+ }
+ if (line.toLowerCase().includes('source')) {
+ let file = line.split(' ')[1];
+ result = result.concat(checkLinuxDCHPInterfaces(file));
+ }
+ });
+ } catch (e) {
+ util.noop();
+ }
+ return result;
+}
+
+function getLinuxDHCPNics() {
+ // alternate methods getting interfaces using DHCP
+ let cmd = 'ip a 2> /dev/null';
+ let result = [];
+ try {
+ const lines = execSync(cmd, { maxBuffer: 1024 * 20000 }).toString().split('\n');
+ const nsections = splitSectionsNics(lines);
+ result = (parseLinuxDHCPNics(nsections));
+ } catch (e) {
+ util.noop();
+ }
+ try {
+ result = checkLinuxDCHPInterfaces('/etc/network/interfaces');
+ } catch (e) {
+ util.noop();
+ }
+ return result;
+}
+
+function parseLinuxDHCPNics(sections) {
+ const result = [];
+ if (sections && sections.length) {
+ sections.forEach(lines => {
+ if (lines && lines.length) {
+ const parts = lines[0].split(':');
+ if (parts.length > 2) {
+ for (let line of lines) {
+ if (line.indexOf(' inet ') >= 0 && line.indexOf(' dynamic ') >= 0) {
+ const parts2 = line.split(' ');
+ const nic = parts2[parts2.length - 1].trim();
+ result.push(nic);
+ break;
+ }
+ }
+ }
+ }
+ });
+ }
+ return result;
+}
+
+function getLinuxIfaceDHCPstatus(iface, connectionName, DHCPNics) {
+ let result = false;
+ if (connectionName) {
+ const cmd = `nmcli connection show "${connectionName}" 2>/dev/null | grep ipv4.method;`;
+ try {
+ const lines = execSync(cmd).toString();
+ const resultFormat = lines.replace(/\s+/g, ' ').trim();
+
+ let dhcStatus = resultFormat.split(' ').slice(1).toString();
+ switch (dhcStatus) {
+ case 'auto':
+ result = true;
+ break;
+
+ default:
+ result = false;
+ break;
+ }
+ return result;
+ } catch (e) {
+ return (DHCPNics.indexOf(iface) >= 0);
+ }
+ } else {
+ return (DHCPNics.indexOf(iface) >= 0);
+ }
+}
+
+function getDarwinIfaceDHCPstatus(iface) {
+ let result = false;
+ const cmd = `ipconfig getpacket "${iface}" 2>/dev/null | grep lease_time;`;
+ try {
+ // console.log('SYNC - DHCP status darwin 17');
+ const lines = execSync(cmd).toString().split('\n');
+ if (lines.length && lines[0].startsWith('lease_time')) {
+ result = true;
+ }
+ } catch (e) {
+ util.noop();
+ }
+ return result;
+}
+
+function getLinuxIfaceDNSsuffix(connectionName) {
+ if (connectionName) {
+ const cmd = `nmcli connection show "${connectionName}" 2>/dev/null | grep ipv4.dns-search;`;
+ try {
+ const result = execSync(cmd).toString();
+ const resultFormat = result.replace(/\s+/g, ' ').trim();
+ const dnsSuffix = resultFormat.split(' ').slice(1).toString();
+ return dnsSuffix == '--' ? 'Not defined' : dnsSuffix;
+ } catch (e) {
+ return 'Unknown';
+ }
+ } else {
+ return 'Unknown';
+ }
+}
+
+function getLinuxIfaceIEEE8021xAuth(connectionName) {
+ if (connectionName) {
+ const cmd = `nmcli connection show "${connectionName}" 2>/dev/null | grep 802-1x.eap;`;
+ try {
+ const result = execSync(cmd).toString();
+ const resultFormat = result.replace(/\s+/g, ' ').trim();
+ const authenticationProtocol = resultFormat.split(' ').slice(1).toString();
+
+
+ return authenticationProtocol == '--' ? '' : authenticationProtocol;
+ } catch (e) {
+ return 'Not defined';
+ }
+ } else {
+ return 'Not defined';
+ }
+}
+
+function getLinuxIfaceIEEE8021xState(authenticationProtocol) {
+ if (authenticationProtocol) {
+ if (authenticationProtocol == 'Not defined') {
+ return 'Disabled';
+ }
+ return 'Enabled';
+ } else {
+ return 'Unknown';
+ }
+}
+
+function testVirtualNic(iface, ifaceName, mac) {
+ const virtualMacs = ['00:00:00:00:00:00', '00:03:FF', '00:05:69', '00:0C:29', '00:0F:4B', '00:0F:4B', '00:13:07', '00:13:BE', '00:15:5d', '00:16:3E', '00:1C:42', '00:21:F6', '00:21:F6', '00:24:0B', '00:24:0B', '00:50:56', '00:A0:B1', '00:E0:C8', '08:00:27', '0A:00:27', '18:92:2C', '16:DF:49', '3C:F3:92', '54:52:00', 'FC:15:97'];
+ if (mac) {
+ return virtualMacs.filter(item => { return mac.toUpperCase().toUpperCase().startsWith(item.substr(0, mac.length)); }).length > 0 ||
+ iface.toLowerCase().indexOf(' virtual ') > -1 ||
+ ifaceName.toLowerCase().indexOf(' virtual ') > -1 ||
+ iface.toLowerCase().indexOf('vethernet ') > -1 ||
+ ifaceName.toLowerCase().indexOf('vethernet ') > -1 ||
+ iface.toLowerCase().startsWith('veth') ||
+ ifaceName.toLowerCase().startsWith('veth') ||
+ iface.toLowerCase().startsWith('vboxnet') ||
+ ifaceName.toLowerCase().startsWith('vboxnet');
+ } else { return false; }
+}
+
+function networkInterfaces(callback, rescan, defaultString) {
+
+ if (typeof callback === 'string') {
+ defaultString = callback;
+ rescan = true;
+ callback = null;
+ }
+
+ if (typeof callback === 'boolean') {
+ rescan = callback;
+ callback = null;
+ defaultString = '';
+ }
+ if (typeof rescan === 'undefined') {
+ rescan = true;
+ }
+ defaultString = defaultString || '';
+ defaultString = '' + defaultString;
+
+ return new Promise((resolve) => {
+ process.nextTick(() => {
+
+ let ifaces = os.networkInterfaces();
+
+ let result = [];
+ let nics = [];
+ let dnsSuffixes = [];
+ let nics8021xInfo = [];
+ // seperate handling in OSX
+ if (_darwin || _freebsd || _openbsd || _netbsd) {
+ if ((JSON.stringify(ifaces) === JSON.stringify(_ifaces)) && !rescan) {
+ // no changes - just return object
+ result = _networkInterfaces;
+
+ if (callback) { callback(result); }
+ resolve(result);
+ } else {
+ const defaultInterface = getDefaultNetworkInterface();
+ _ifaces = JSON.parse(JSON.stringify(ifaces));
+
+ nics = getDarwinNics();
+
+
+ nics.forEach(nic => {
+
+ if ({}.hasOwnProperty.call(ifaces, nic.iface)) {
+ ifaces[nic.iface].forEach(function (details) {
+ if (details.family === 'IPv4' || details.family === 4) {
+ nic.ip4subnet = details.netmask;
+ }
+ if (details.family === 'IPv6' || details.family === 6) {
+ nic.ip6subnet = details.netmask;
+ }
+ });
+ }
+
+ result.push({
+ iface: nic.iface,
+ ifaceName: nic.iface,
+ default: nic.iface === defaultInterface,
+ ip4: nic.ip4,
+ ip4subnet: nic.ip4subnet || '',
+ ip6: nic.ip6,
+ ip6subnet: nic.ip6subnet || '',
+ mac: nic.mac,
+ internal: nic.internal,
+ virtual: nic.internal ? false : testVirtualNic(nic.iface, nic.iface, nic.mac),
+ operstate: nic.operstate,
+ type: nic.type,
+ duplex: nic.duplex,
+ mtu: nic.mtu,
+ speed: nic.speed,
+ dhcp: getDarwinIfaceDHCPstatus(nic.iface),
+ dnsSuffix: '',
+ ieee8021xAuth: '',
+ ieee8021xState: '',
+ carrierChanges: 0
+ });
+ });
+ _networkInterfaces = result;
+ if (defaultString.toLowerCase().indexOf('default') >= 0) {
+ result = result.filter(item => item.default);
+ if (result.length > 0) {
+ result = result[0];
+ } else {
+ result = [];
+ }
+ }
+ if (callback) { callback(result); }
+ resolve(result);
+ }
+ }
+ if (_linux) {
+ if ((JSON.stringify(ifaces) === JSON.stringify(_ifaces)) && !rescan) {
+ // no changes - just return object
+ result = _networkInterfaces;
+
+ if (callback) { callback(result); }
+ resolve(result);
+ } else {
+ _ifaces = JSON.parse(JSON.stringify(ifaces));
+ _dhcpNics = getLinuxDHCPNics();
+ const defaultInterface = getDefaultNetworkInterface();
+ for (let dev in ifaces) {
+ let ip4 = '';
+ let ip4subnet = '';
+ let ip6 = '';
+ let ip6subnet = '';
+ let mac = '';
+ let duplex = '';
+ let mtu = '';
+ let speed = null;
+ let carrierChanges = 0;
+ let dhcp = false;
+ let dnsSuffix = '';
+ let ieee8021xAuth = '';
+ let ieee8021xState = '';
+ let type = '';
+
+ if ({}.hasOwnProperty.call(ifaces, dev)) {
+ let ifaceName = dev;
+ ifaces[dev].forEach(function (details) {
+ if (details.family === 'IPv4' || details.family === 4) {
+ ip4 = details.address;
+ ip4subnet = details.netmask;
+ }
+ if (details.family === 'IPv6' || details.family === 6) {
+ if (!ip6 || ip6.match(/^fe80::/i)) {
+ ip6 = details.address;
+ ip6subnet = details.netmask;
+ }
+ }
+ mac = details.mac;
+ // fallback due to https://github.com/nodejs/node/issues/13581 (node 8.1 - node 8.2)
+ const nodeMainVersion = parseInt(process.versions.node.split('.'), 10);
+ if (mac.indexOf('00:00:0') > -1 && (_linux || _darwin) && (!details.internal) && nodeMainVersion >= 8 && nodeMainVersion <= 11) {
+ if (Object.keys(_mac).length === 0) {
+ _mac = getMacAddresses();
+ }
+ mac = _mac[dev] || '';
+ }
+ });
+ let iface = dev.split(':')[0].trim().toLowerCase();
+ const cmd = `echo -n "addr_assign_type: "; cat /sys/class/net/${iface}/addr_assign_type 2>/dev/null; echo;
+ echo -n "address: "; cat /sys/class/net/${iface}/address 2>/dev/null; echo;
+ echo -n "addr_len: "; cat /sys/class/net/${iface}/addr_len 2>/dev/null; echo;
+ echo -n "broadcast: "; cat /sys/class/net/${iface}/broadcast 2>/dev/null; echo;
+ echo -n "carrier: "; cat /sys/class/net/${iface}/carrier 2>/dev/null; echo;
+ echo -n "carrier_changes: "; cat /sys/class/net/${iface}/carrier_changes 2>/dev/null; echo;
+ echo -n "dev_id: "; cat /sys/class/net/${iface}/dev_id 2>/dev/null; echo;
+ echo -n "dev_port: "; cat /sys/class/net/${iface}/dev_port 2>/dev/null; echo;
+ echo -n "dormant: "; cat /sys/class/net/${iface}/dormant 2>/dev/null; echo;
+ echo -n "duplex: "; cat /sys/class/net/${iface}/duplex 2>/dev/null; echo;
+ echo -n "flags: "; cat /sys/class/net/${iface}/flags 2>/dev/null; echo;
+ echo -n "gro_flush_timeout: "; cat /sys/class/net/${iface}/gro_flush_timeout 2>/dev/null; echo;
+ echo -n "ifalias: "; cat /sys/class/net/${iface}/ifalias 2>/dev/null; echo;
+ echo -n "ifindex: "; cat /sys/class/net/${iface}/ifindex 2>/dev/null; echo;
+ echo -n "iflink: "; cat /sys/class/net/${iface}/iflink 2>/dev/null; echo;
+ echo -n "link_mode: "; cat /sys/class/net/${iface}/link_mode 2>/dev/null; echo;
+ echo -n "mtu: "; cat /sys/class/net/${iface}/mtu 2>/dev/null; echo;
+ echo -n "netdev_group: "; cat /sys/class/net/${iface}/netdev_group 2>/dev/null; echo;
+ echo -n "operstate: "; cat /sys/class/net/${iface}/operstate 2>/dev/null; echo;
+ echo -n "proto_down: "; cat /sys/class/net/${iface}/proto_down 2>/dev/null; echo;
+ echo -n "speed: "; cat /sys/class/net/${iface}/speed 2>/dev/null; echo;
+ echo -n "tx_queue_len: "; cat /sys/class/net/${iface}/tx_queue_len 2>/dev/null; echo;
+ echo -n "type: "; cat /sys/class/net/${iface}/type 2>/dev/null; echo;
+ echo -n "wireless: "; cat /proc/net/wireless 2>/dev/null | grep ${iface}; echo;
+ echo -n "wirelessspeed: "; iw dev ${iface} link 2>&1 | grep bitrate; echo;`;
+
+ let lines = [];
+ try {
+ lines = execSync(cmd).toString().split('\n');
+ const connectionName = getLinuxIfaceConnectionName(iface);
+ dhcp = getLinuxIfaceDHCPstatus(iface, connectionName, _dhcpNics);
+ dnsSuffix = getLinuxIfaceDNSsuffix(connectionName);
+ ieee8021xAuth = getLinuxIfaceIEEE8021xAuth(connectionName);
+ ieee8021xState = getLinuxIfaceIEEE8021xState(ieee8021xAuth);
+ } catch (e) {
+ util.noop();
+ }
+ duplex = util.getValue(lines, 'duplex');
+ duplex = duplex.startsWith('cat') ? '' : duplex;
+ mtu = parseInt(util.getValue(lines, 'mtu'), 10);
+ let myspeed = parseInt(util.getValue(lines, 'speed'), 10);
+ speed = isNaN(myspeed) ? null : myspeed;
+ let wirelessspeed = util.getValue(lines, 'wirelessspeed').split('tx bitrate: ');
+ if (speed === null && wirelessspeed.length === 2) {
+ myspeed = parseFloat(wirelessspeed[1]);
+ speed = isNaN(myspeed) ? null : myspeed;
+ }
+ carrierChanges = parseInt(util.getValue(lines, 'carrier_changes'), 10);
+ const operstate = util.getValue(lines, 'operstate');
+ type = operstate === 'up' ? (util.getValue(lines, 'wireless').trim() ? 'wireless' : 'wired') : 'unknown';
+ if (iface === 'lo' || iface.startsWith('bond')) { type = 'virtual'; }
+
+ let internal = (ifaces[dev] && ifaces[dev][0]) ? ifaces[dev][0].internal : false;
+ if (dev.toLowerCase().indexOf('loopback') > -1 || ifaceName.toLowerCase().indexOf('loopback') > -1) {
+ internal = true;
+ }
+ const virtual = internal ? false : testVirtualNic(dev, ifaceName, mac);
+ result.push({
+ iface,
+ ifaceName,
+ default: iface === defaultInterface,
+ ip4,
+ ip4subnet,
+ ip6,
+ ip6subnet,
+ mac,
+ internal,
+ virtual,
+ operstate,
+ type,
+ duplex,
+ mtu,
+ speed,
+ dhcp,
+ dnsSuffix,
+ ieee8021xAuth,
+ ieee8021xState,
+ carrierChanges,
+ });
+ }
+ }
+ _networkInterfaces = result;
+ if (defaultString.toLowerCase().indexOf('default') >= 0) {
+ result = result.filter(item => item.default);
+ if (result.length > 0) {
+ result = result[0];
+ } else {
+ result = [];
+ }
+ }
+ if (callback) { callback(result); }
+ resolve(result);
+ }
+ }
+ if (_windows) {
+ if ((JSON.stringify(ifaces) === JSON.stringify(_ifaces)) && !rescan) {
+ // no changes - just return object
+ result = _networkInterfaces;
+
+ if (callback) { callback(result); }
+ resolve(result);
+ } else {
+ _ifaces = JSON.parse(JSON.stringify(ifaces));
+ const defaultInterface = getDefaultNetworkInterface();
+
+ getWindowsNics().then(function (nics) {
+ nics.forEach(nic => {
+ let found = false;
+ Object.keys(ifaces).forEach(key => {
+ if (!found) {
+ ifaces[key].forEach(value => {
+ if (Object.keys(value).indexOf('mac') >= 0) {
+ found = value['mac'] === nic.mac;
+ }
+ });
+ }
+ });
+
+ if (!found) {
+ ifaces[nic.name] = [{ mac: nic.mac }];
+ }
+ });
+ nics8021xInfo = getWindowsWiredProfilesInformation();
+ dnsSuffixes = getWindowsDNSsuffixes();
+ for (let dev in ifaces) {
+ let iface = dev;
+ let ip4 = '';
+ let ip4subnet = '';
+ let ip6 = '';
+ let ip6subnet = '';
+ let mac = '';
+ let duplex = '';
+ let mtu = '';
+ let speed = null;
+ let carrierChanges = 0;
+ let operstate = 'down';
+ let dhcp = false;
+ let dnsSuffix = '';
+ let ieee8021xAuth = '';
+ let ieee8021xState = '';
+ let type = '';
+
+ if ({}.hasOwnProperty.call(ifaces, dev)) {
+ let ifaceName = dev;
+ ifaces[dev].forEach(function (details) {
+ if (details.family === 'IPv4' || details.family === 4) {
+ ip4 = details.address;
+ ip4subnet = details.netmask;
+ }
+ if (details.family === 'IPv6' || details.family === 6) {
+ if (!ip6 || ip6.match(/^fe80::/i)) {
+ ip6 = details.address;
+ ip6subnet = details.netmask;
+ }
+ }
+ mac = details.mac;
+ // fallback due to https://github.com/nodejs/node/issues/13581 (node 8.1 - node 8.2)
+ const nodeMainVersion = parseInt(process.versions.node.split('.'), 10);
+ if (mac.indexOf('00:00:0') > -1 && (_linux || _darwin) && (!details.internal) && nodeMainVersion >= 8 && nodeMainVersion <= 11) {
+ if (Object.keys(_mac).length === 0) {
+ _mac = getMacAddresses();
+ }
+ mac = _mac[dev] || '';
+ }
+ });
+
+
+
+ dnsSuffix = getWindowsIfaceDNSsuffix(dnsSuffixes.ifaces, dev);
+ let foundFirst = false;
+ nics.forEach(detail => {
+ if (detail.mac === mac && !foundFirst) {
+ iface = detail.iface || iface;
+ ifaceName = detail.name;
+ dhcp = detail.dhcp;
+ operstate = detail.operstate;
+ speed = detail.speed;
+ type = detail.type;
+ foundFirst = true;
+ }
+ });
+
+ if (dev.toLowerCase().indexOf('wlan') >= 0 || ifaceName.toLowerCase().indexOf('wlan') >= 0 || ifaceName.toLowerCase().indexOf('802.11n') >= 0 || ifaceName.toLowerCase().indexOf('wireless') >= 0 || ifaceName.toLowerCase().indexOf('wi-fi') >= 0 || ifaceName.toLowerCase().indexOf('wifi') >= 0) {
+ type = 'wireless';
+ }
+
+ const IEEE8021x = getWindowsIEEE8021x(type, dev, nics8021xInfo);
+ ieee8021xAuth = IEEE8021x.protocol;
+ ieee8021xState = IEEE8021x.state;
+ let internal = (ifaces[dev] && ifaces[dev][0]) ? ifaces[dev][0].internal : false;
+ if (dev.toLowerCase().indexOf('loopback') > -1 || ifaceName.toLowerCase().indexOf('loopback') > -1) {
+ internal = true;
+ }
+ const virtual = internal ? false : testVirtualNic(dev, ifaceName, mac);
+ result.push({
+ iface,
+ ifaceName,
+ default: iface === defaultInterface,
+ ip4,
+ ip4subnet,
+ ip6,
+ ip6subnet,
+ mac,
+ internal,
+ virtual,
+ operstate,
+ type,
+ duplex,
+ mtu,
+ speed,
+ dhcp,
+ dnsSuffix,
+ ieee8021xAuth,
+ ieee8021xState,
+ carrierChanges,
+ });
+ }
+ }
+ _networkInterfaces = result;
+ if (defaultString.toLowerCase().indexOf('default') >= 0) {
+ result = result.filter(item => item.default);
+ if (result.length > 0) {
+ result = result[0];
+ } else {
+ result = [];
+ }
+ }
+ if (callback) { callback(result); }
+ resolve(result);
+ });
+ }
+ }
+ });
+ });
+}
+
+exports.networkInterfaces = networkInterfaces;
+
+// --------------------------
+// NET - Speed
+
+function calcNetworkSpeed(iface, rx_bytes, tx_bytes, operstate, rx_dropped, rx_errors, tx_dropped, tx_errors) {
+ let result = {
+ iface,
+ operstate,
+ rx_bytes,
+ rx_dropped,
+ rx_errors,
+ tx_bytes,
+ tx_dropped,
+ tx_errors,
+ rx_sec: null,
+ tx_sec: null,
+ ms: 0
+ };
+
+ if (_network[iface] && _network[iface].ms) {
+ result.ms = Date.now() - _network[iface].ms;
+ result.rx_sec = (rx_bytes - _network[iface].rx_bytes) >= 0 ? (rx_bytes - _network[iface].rx_bytes) / (result.ms / 1000) : 0;
+ result.tx_sec = (tx_bytes - _network[iface].tx_bytes) >= 0 ? (tx_bytes - _network[iface].tx_bytes) / (result.ms / 1000) : 0;
+ _network[iface].rx_bytes = rx_bytes;
+ _network[iface].tx_bytes = tx_bytes;
+ _network[iface].rx_sec = result.rx_sec;
+ _network[iface].tx_sec = result.tx_sec;
+ _network[iface].ms = Date.now();
+ _network[iface].last_ms = result.ms;
+ _network[iface].operstate = operstate;
+ } else {
+ if (!_network[iface]) { _network[iface] = {}; }
+ _network[iface].rx_bytes = rx_bytes;
+ _network[iface].tx_bytes = tx_bytes;
+ _network[iface].rx_sec = null;
+ _network[iface].tx_sec = null;
+ _network[iface].ms = Date.now();
+ _network[iface].last_ms = 0;
+ _network[iface].operstate = operstate;
+ }
+ return result;
+}
+
+function networkStats(ifaces, callback) {
+
+ let ifacesArray = [];
+
+ return new Promise((resolve) => {
+ process.nextTick(() => {
+
+ // fallback - if only callback is given
+ if (util.isFunction(ifaces) && !callback) {
+ callback = ifaces;
+ ifacesArray = [getDefaultNetworkInterface()];
+ } else {
+ if (typeof ifaces !== 'string' && ifaces !== undefined) {
+ if (callback) { callback([]); }
+ return resolve([]);
+ }
+ ifaces = ifaces || getDefaultNetworkInterface();
+
+ ifaces.__proto__.toLowerCase = util.stringToLower;
+ ifaces.__proto__.replace = util.stringReplace;
+ ifaces.__proto__.trim = util.stringTrim;
+
+ ifaces = ifaces.trim().toLowerCase().replace(/,+/g, '|');
+ ifacesArray = ifaces.split('|');
+ }
+
+ const result = [];
+
+ const workload = [];
+ if (ifacesArray.length && ifacesArray[0].trim() === '*') {
+ ifacesArray = [];
+ networkInterfaces(false).then(allIFaces => {
+ for (let iface of allIFaces) {
+ ifacesArray.push(iface.iface);
+ }
+ networkStats(ifacesArray.join(',')).then(result => {
+ if (callback) { callback(result); }
+ resolve(result);
+ });
+ });
+ } else {
+ for (let iface of ifacesArray) {
+ workload.push(networkStatsSingle(iface.trim()));
+ }
+ if (workload.length) {
+ Promise.all(
+ workload
+ ).then((data) => {
+ if (callback) { callback(data); }
+ resolve(data);
+ });
+ } else {
+ if (callback) { callback(result); }
+ resolve(result);
+ }
+ }
+ });
+ });
+}
+
+function networkStatsSingle(iface) {
+
+ function parseLinesWindowsPerfData(sections) {
+ let perfData = [];
+ for (let i in sections) {
+ if ({}.hasOwnProperty.call(sections, i)) {
+ if (sections[i].trim() !== '') {
+ let lines = sections[i].trim().split('\r\n');
+ perfData.push({
+ name: util.getValue(lines, 'Name', ':').replace(/[()[\] ]+/g, '').replace(/#|\//g, '_').toLowerCase(),
+ rx_bytes: parseInt(util.getValue(lines, 'BytesReceivedPersec', ':'), 10),
+ rx_errors: parseInt(util.getValue(lines, 'PacketsReceivedErrors', ':'), 10),
+ rx_dropped: parseInt(util.getValue(lines, 'PacketsReceivedDiscarded', ':'), 10),
+ tx_bytes: parseInt(util.getValue(lines, 'BytesSentPersec', ':'), 10),
+ tx_errors: parseInt(util.getValue(lines, 'PacketsOutboundErrors', ':'), 10),
+ tx_dropped: parseInt(util.getValue(lines, 'PacketsOutboundDiscarded', ':'), 10)
+ });
+ }
+ }
+ }
+ return perfData;
+ }
+
+ return new Promise((resolve) => {
+ process.nextTick(() => {
+ let ifaceSanitized = '';
+ const s = util.isPrototypePolluted() ? '---' : util.sanitizeShellString(iface);
+ for (let i = 0; i <= util.mathMin(s.length, 2000); i++) {
+ if (s[i] !== undefined) {
+ ifaceSanitized = ifaceSanitized + s[i];
+ }
+ }
+
+ let result = {
+ iface: ifaceSanitized,
+ operstate: 'unknown',
+ rx_bytes: 0,
+ rx_dropped: 0,
+ rx_errors: 0,
+ tx_bytes: 0,
+ tx_dropped: 0,
+ tx_errors: 0,
+ rx_sec: null,
+ tx_sec: null,
+ ms: 0
+ };
+
+ let operstate = 'unknown';
+ let rx_bytes = 0;
+ let tx_bytes = 0;
+ let rx_dropped = 0;
+ let rx_errors = 0;
+ let tx_dropped = 0;
+ let tx_errors = 0;
+
+ let cmd, lines, stats;
+ if (!_network[ifaceSanitized] || (_network[ifaceSanitized] && !_network[ifaceSanitized].ms) || (_network[ifaceSanitized] && _network[ifaceSanitized].ms && Date.now() - _network[ifaceSanitized].ms >= 500)) {
+ if (_linux) {
+ if (fs.existsSync('/sys/class/net/' + ifaceSanitized)) {
+ cmd =
+ 'cat /sys/class/net/' + ifaceSanitized + '/operstate; ' +
+ 'cat /sys/class/net/' + ifaceSanitized + '/statistics/rx_bytes; ' +
+ 'cat /sys/class/net/' + ifaceSanitized + '/statistics/tx_bytes; ' +
+ 'cat /sys/class/net/' + ifaceSanitized + '/statistics/rx_dropped; ' +
+ 'cat /sys/class/net/' + ifaceSanitized + '/statistics/rx_errors; ' +
+ 'cat /sys/class/net/' + ifaceSanitized + '/statistics/tx_dropped; ' +
+ 'cat /sys/class/net/' + ifaceSanitized + '/statistics/tx_errors; ';
+ exec(cmd, function (error, stdout) {
+ if (!error) {
+ lines = stdout.toString().split('\n');
+ operstate = lines[0].trim();
+ rx_bytes = parseInt(lines[1], 10);
+ tx_bytes = parseInt(lines[2], 10);
+ rx_dropped = parseInt(lines[3], 10);
+ rx_errors = parseInt(lines[4], 10);
+ tx_dropped = parseInt(lines[5], 10);
+ tx_errors = parseInt(lines[6], 10);
+
+ result = calcNetworkSpeed(ifaceSanitized, rx_bytes, tx_bytes, operstate, rx_dropped, rx_errors, tx_dropped, tx_errors);
+
+ }
+ resolve(result);
+ });
+ } else {
+ resolve(result);
+ }
+ }
+ if (_freebsd || _openbsd || _netbsd) {
+ cmd = 'netstat -ibndI ' + ifaceSanitized; // lgtm [js/shell-command-constructed-from-input]
+ exec(cmd, function (error, stdout) {
+ if (!error) {
+ lines = stdout.toString().split('\n');
+ for (let i = 1; i < lines.length; i++) {
+ const line = lines[i].replace(/ +/g, ' ').split(' ');
+ if (line && line[0] && line[7] && line[10]) {
+ rx_bytes = rx_bytes + parseInt(line[7]);
+ if (line[6].trim() !== '-') { rx_dropped = rx_dropped + parseInt(line[6]); }
+ if (line[5].trim() !== '-') { rx_errors = rx_errors + parseInt(line[5]); }
+ tx_bytes = tx_bytes + parseInt(line[10]);
+ if (line[12].trim() !== '-') { tx_dropped = tx_dropped + parseInt(line[12]); }
+ if (line[9].trim() !== '-') { tx_errors = tx_errors + parseInt(line[9]); }
+ operstate = 'up';
+ }
+ }
+ result = calcNetworkSpeed(ifaceSanitized, rx_bytes, tx_bytes, operstate, rx_dropped, rx_errors, tx_dropped, tx_errors);
+ }
+ resolve(result);
+ });
+ }
+ if (_darwin) {
+ cmd = 'ifconfig ' + ifaceSanitized + ' | grep "status"'; // lgtm [js/shell-command-constructed-from-input]
+ exec(cmd, function (error, stdout) {
+ result.operstate = (stdout.toString().split(':')[1] || '').trim();
+ result.operstate = (result.operstate || '').toLowerCase();
+ result.operstate = (result.operstate === 'active' ? 'up' : (result.operstate === 'inactive' ? 'down' : 'unknown'));
+ cmd = 'netstat -bdI ' + ifaceSanitized; // lgtm [js/shell-command-constructed-from-input]
+ exec(cmd, function (error, stdout) {
+ if (!error) {
+ lines = stdout.toString().split('\n');
+ // if there is less than 2 lines, no information for this interface was found
+ if (lines.length > 1 && lines[1].trim() !== '') {
+ // skip header line
+ // use the second line because it is tied to the NIC instead of the ipv4 or ipv6 address
+ stats = lines[1].replace(/ +/g, ' ').split(' ');
+ const offset = stats.length > 11 ? 1 : 0;
+ rx_bytes = parseInt(stats[offset + 5]);
+ rx_dropped = parseInt(stats[offset + 10]);
+ rx_errors = parseInt(stats[offset + 4]);
+ tx_bytes = parseInt(stats[offset + 8]);
+ tx_dropped = parseInt(stats[offset + 10]);
+ tx_errors = parseInt(stats[offset + 7]);
+ result = calcNetworkSpeed(ifaceSanitized, rx_bytes, tx_bytes, result.operstate, rx_dropped, rx_errors, tx_dropped, tx_errors);
+ }
+ }
+ resolve(result);
+ });
+ });
+ }
+ if (_windows) {
+ let perfData = [];
+ let ifaceName = ifaceSanitized;
+
+ // Performance Data
+ util.powerShell('Get-WmiObject Win32_PerfRawData_Tcpip_NetworkInterface | select Name,BytesReceivedPersec,PacketsReceivedErrors,PacketsReceivedDiscarded,BytesSentPersec,PacketsOutboundErrors,PacketsOutboundDiscarded | fl').then((stdout, error) => {
+ if (!error) {
+ const psections = stdout.toString().split(/\n\s*\n/);
+ perfData = parseLinesWindowsPerfData(psections);
+ }
+
+ // Network Interfaces
+ networkInterfaces(false).then(interfaces => {
+ // get bytes sent, received from perfData by name
+ rx_bytes = 0;
+ tx_bytes = 0;
+ perfData.forEach(detail => {
+ interfaces.forEach(det => {
+ if ((det.iface.toLowerCase() === ifaceSanitized.toLowerCase() ||
+ det.mac.toLowerCase() === ifaceSanitized.toLowerCase() ||
+ det.ip4.toLowerCase() === ifaceSanitized.toLowerCase() ||
+ det.ip6.toLowerCase() === ifaceSanitized.toLowerCase() ||
+ det.ifaceName.replace(/[()[\] ]+/g, '').replace(/#|\//g, '_').toLowerCase() === ifaceSanitized.replace(/[()[\] ]+/g, '').replace('#', '_').toLowerCase()) &&
+ (det.ifaceName.replace(/[()[\] ]+/g, '').replace(/#|\//g, '_').toLowerCase() === detail.name)) {
+ ifaceName = det.iface;
+ rx_bytes = detail.rx_bytes;
+ rx_dropped = detail.rx_dropped;
+ rx_errors = detail.rx_errors;
+ tx_bytes = detail.tx_bytes;
+ tx_dropped = detail.tx_dropped;
+ tx_errors = detail.tx_errors;
+ operstate = det.operstate;
+ }
+ });
+ });
+ if (rx_bytes && tx_bytes) {
+ result = calcNetworkSpeed(ifaceName, parseInt(rx_bytes), parseInt(tx_bytes), operstate, rx_dropped, rx_errors, tx_dropped, tx_errors);
+ }
+ resolve(result);
+ });
+ });
+ }
+ } else {
+ result.rx_bytes = _network[ifaceSanitized].rx_bytes;
+ result.tx_bytes = _network[ifaceSanitized].tx_bytes;
+ result.rx_sec = _network[ifaceSanitized].rx_sec;
+ result.tx_sec = _network[ifaceSanitized].tx_sec;
+ result.ms = _network[ifaceSanitized].last_ms;
+ result.operstate = _network[ifaceSanitized].operstate;
+ resolve(result);
+ }
+ });
+ });
+}
+
+exports.networkStats = networkStats;
+
+// --------------------------
+// NET - connections (sockets)
+
+function networkConnections(callback) {
+
+ return new Promise((resolve) => {
+ process.nextTick(() => {
+ let result = [];
+ if (_linux || _freebsd || _openbsd || _netbsd) {
+ let cmd = 'export LC_ALL=C; netstat -tunap | grep "ESTABLISHED\\|SYN_SENT\\|SYN_RECV\\|FIN_WAIT1\\|FIN_WAIT2\\|TIME_WAIT\\|CLOSE\\|CLOSE_WAIT\\|LAST_ACK\\|LISTEN\\|CLOSING\\|UNKNOWN"; unset LC_ALL';
+ if (_freebsd || _openbsd || _netbsd) { cmd = 'export LC_ALL=C; netstat -na | grep "ESTABLISHED\\|SYN_SENT\\|SYN_RECV\\|FIN_WAIT1\\|FIN_WAIT2\\|TIME_WAIT\\|CLOSE\\|CLOSE_WAIT\\|LAST_ACK\\|LISTEN\\|CLOSING\\|UNKNOWN"; unset LC_ALL'; }
+ exec(cmd, { maxBuffer: 1024 * 20000 }, function (error, stdout) {
+ let lines = stdout.toString().split('\n');
+ if (!error && (lines.length > 1 || lines[0] != '')) {
+ lines.forEach(function (line) {
+ line = line.replace(/ +/g, ' ').split(' ');
+ if (line.length >= 7) {
+ let localip = line[3];
+ let localport = '';
+ let localaddress = line[3].split(':');
+ if (localaddress.length > 1) {
+ localport = localaddress[localaddress.length - 1];
+ localaddress.pop();
+ localip = localaddress.join(':');
+ }
+ let peerip = line[4];
+ let peerport = '';
+ let peeraddress = line[4].split(':');
+ if (peeraddress.length > 1) {
+ peerport = peeraddress[peeraddress.length - 1];
+ peeraddress.pop();
+ peerip = peeraddress.join(':');
+ }
+ let connstate = line[5];
+ let proc = line[6].split('/');
+
+ if (connstate) {
+ result.push({
+ protocol: line[0],
+ localAddress: localip,
+ localPort: localport,
+ peerAddress: peerip,
+ peerPort: peerport,
+ state: connstate,
+ pid: proc[0] && proc[0] !== '-' ? parseInt(proc[0], 10) : null,
+ process: proc[1] ? proc[1].split(' ')[0] : ''
+ });
+ }
+ }
+ });
+ if (callback) {
+ callback(result);
+ }
+ resolve(result);
+ } else {
+ cmd = 'ss -tunap | grep "ESTAB\\|SYN-SENT\\|SYN-RECV\\|FIN-WAIT1\\|FIN-WAIT2\\|TIME-WAIT\\|CLOSE\\|CLOSE-WAIT\\|LAST-ACK\\|LISTEN\\|CLOSING"';
+ exec(cmd, { maxBuffer: 1024 * 20000 }, function (error, stdout) {
+
+ if (!error) {
+ let lines = stdout.toString().split('\n');
+ lines.forEach(function (line) {
+ line = line.replace(/ +/g, ' ').split(' ');
+ if (line.length >= 6) {
+ let localip = line[4];
+ let localport = '';
+ let localaddress = line[4].split(':');
+ if (localaddress.length > 1) {
+ localport = localaddress[localaddress.length - 1];
+ localaddress.pop();
+ localip = localaddress.join(':');
+ }
+ let peerip = line[5];
+ let peerport = '';
+ let peeraddress = line[5].split(':');
+ if (peeraddress.length > 1) {
+ peerport = peeraddress[peeraddress.length - 1];
+ peeraddress.pop();
+ peerip = peeraddress.join(':');
+ }
+ let connstate = line[1];
+ if (connstate === 'ESTAB') { connstate = 'ESTABLISHED'; }
+ if (connstate === 'TIME-WAIT') { connstate = 'TIME_WAIT'; }
+ let pid = null;
+ let process = '';
+ if (line.length >= 7 && line[6].indexOf('users:') > -1) {
+ let proc = line[6].replace('users:(("', '').replace(/"/g, '').split(',');
+ if (proc.length > 2) {
+ process = proc[0].split(' ')[0];
+ pid = parseInt(proc[1], 10);
+ }
+ }
+ if (connstate) {
+ result.push({
+ protocol: line[0],
+ localAddress: localip,
+ localPort: localport,
+ peerAddress: peerip,
+ peerPort: peerport,
+ state: connstate,
+ pid,
+ process
+ });
+ }
+ }
+ });
+ }
+ if (callback) {
+ callback(result);
+ }
+ resolve(result);
+ });
+ }
+ });
+ }
+ if (_darwin) {
+ let cmd = 'netstat -natv | grep "ESTABLISHED\\|SYN_SENT\\|SYN_RECV\\|FIN_WAIT1\\|FIN_WAIT2\\|TIME_WAIT\\|CLOSE\\|CLOSE_WAIT\\|LAST_ACK\\|LISTEN\\|CLOSING\\|UNKNOWN"';
+ exec(cmd, { maxBuffer: 1024 * 20000 }, function (error, stdout) {
+ if (!error) {
+
+ let lines = stdout.toString().split('\n');
+
+ lines.forEach(function (line) {
+ line = line.replace(/ +/g, ' ').split(' ');
+ if (line.length >= 8) {
+ let localip = line[3];
+ let localport = '';
+ let localaddress = line[3].split('.');
+ if (localaddress.length > 1) {
+ localport = localaddress[localaddress.length - 1];
+ localaddress.pop();
+ localip = localaddress.join('.');
+ }
+ let peerip = line[4];
+ let peerport = '';
+ let peeraddress = line[4].split('.');
+ if (peeraddress.length > 1) {
+ peerport = peeraddress[peeraddress.length - 1];
+ peeraddress.pop();
+ peerip = peeraddress.join('.');
+ }
+ let connstate = line[5];
+ let pid = parseInt(line[8], 10);
+ if (connstate) {
+ result.push({
+ protocol: line[0],
+ localAddress: localip,
+ localPort: localport,
+ peerAddress: peerip,
+ peerPort: peerport,
+ state: connstate,
+ pid: pid,
+ process: ''
+ });
+ }
+ }
+ });
+ if (callback) {
+ callback(result);
+ }
+ resolve(result);
+ }
+ });
+ }
+ if (_windows) {
+ let cmd = 'netstat -nao';
+ try {
+ exec(cmd, util.execOptsWin, function (error, stdout) {
+ if (!error) {
+
+ let lines = stdout.toString().split('\r\n');
+
+ lines.forEach(function (line) {
+ line = line.trim().replace(/ +/g, ' ').split(' ');
+ if (line.length >= 4) {
+ let localip = line[1];
+ let localport = '';
+ let localaddress = line[1].split(':');
+ if (localaddress.length > 1) {
+ localport = localaddress[localaddress.length - 1];
+ localaddress.pop();
+ localip = localaddress.join(':');
+ }
+ localip = localip.replace(/\[/g, '').replace(/\]/g, '');
+ let peerip = line[2];
+ let peerport = '';
+ let peeraddress = line[2].split(':');
+ if (peeraddress.length > 1) {
+ peerport = peeraddress[peeraddress.length - 1];
+ peeraddress.pop();
+ peerip = peeraddress.join(':');
+ }
+ peerip = peerip.replace(/\[/g, '').replace(/\]/g, '');
+ let pid = util.toInt(line[4]);
+ let connstate = line[3];
+ if (connstate === 'HERGESTELLT') { connstate = 'ESTABLISHED'; }
+ if (connstate.startsWith('ABH')) { connstate = 'LISTEN'; }
+ if (connstate === 'SCHLIESSEN_WARTEN') { connstate = 'CLOSE_WAIT'; }
+ if (connstate === 'WARTEND') { connstate = 'TIME_WAIT'; }
+ if (connstate === 'SYN_GESENDET') { connstate = 'SYN_SENT'; }
+
+ if (connstate === 'LISTENING') { connstate = 'LISTEN'; }
+ if (connstate === 'SYN_RECEIVED') { connstate = 'SYN_RECV'; }
+ if (connstate === 'FIN_WAIT_1') { connstate = 'FIN_WAIT1'; }
+ if (connstate === 'FIN_WAIT_2') { connstate = 'FIN_WAIT2'; }
+ if (line[0].toLowerCase() !== 'udp' && connstate) {
+ result.push({
+ protocol: line[0].toLowerCase(),
+ localAddress: localip,
+ localPort: localport,
+ peerAddress: peerip,
+ peerPort: peerport,
+ state: connstate,
+ pid,
+ process: ''
+ });
+ } else if (line[0].toLowerCase() === 'udp') {
+ result.push({
+ protocol: line[0].toLowerCase(),
+ localAddress: localip,
+ localPort: localport,
+ peerAddress: peerip,
+ peerPort: peerport,
+ state: '',
+ pid: parseInt(line[3], 10),
+ process: ''
+ });
+ }
+ }
+ });
+ if (callback) {
+ callback(result);
+ }
+ resolve(result);
+ }
+ });
+ } catch (e) {
+ if (callback) { callback(result); }
+ resolve(result);
+ }
+ }
+ });
+ });
+}
+
+exports.networkConnections = networkConnections;
+
+function networkGatewayDefault(callback) {
+
+ return new Promise((resolve) => {
+ process.nextTick(() => {
+ let result = '';
+ if (_linux || _freebsd || _openbsd || _netbsd) {
+ let cmd = 'ip route get 1';
+ try {
+ exec(cmd, { maxBuffer: 1024 * 20000 }, function (error, stdout) {
+ if (!error) {
+ let lines = stdout.toString().split('\n');
+ const line = lines && lines[0] ? lines[0] : '';
+ let parts = line.split(' via ');
+ if (parts && parts[1]) {
+ parts = parts[1].split(' ');
+ result = parts[0];
+ }
+ if (callback) {
+ callback(result);
+ }
+ resolve(result);
+ } else {
+ if (callback) {
+ callback(result);
+ }
+ resolve(result);
+ }
+ });
+ } catch (e) {
+ if (callback) { callback(result); }
+ resolve(result);
+ }
+ }
+ if (_darwin) {
+ let cmd = 'route -n get default';
+ try {
+ exec(cmd, { maxBuffer: 1024 * 20000 }, function (error, stdout) {
+ if (!error) {
+ const lines = stdout.toString().split('\n').map(line => line.trim());
+ result = util.getValue(lines, 'gateway');
+ }
+ if (!result) {
+ cmd = 'netstat -rn | awk \'/default/ {print $2}\'';
+ exec(cmd, { maxBuffer: 1024 * 20000 }, function (error, stdout) {
+ const lines = stdout.toString().split('\n').map(line => line.trim());
+ result = lines.find(line => (/^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/.test(line)));
+ if (callback) {
+ callback(result);
+ }
+ resolve(result);
+ });
+ } else {
+ if (callback) {
+ callback(result);
+ }
+ resolve(result);
+ }
+ });
+ } catch (e) {
+ if (callback) { callback(result); }
+ resolve(result);
+ }
+ }
+ if (_windows) {
+ try {
+ exec('netstat -r', util.execOptsWin, function (error, stdout) {
+ const lines = stdout.toString().split(os.EOL);
+ lines.forEach(line => {
+ line = line.replace(/\s+/g, ' ').trim();
+ if (line.indexOf('0.0.0.0 0.0.0.0') > -1 && !(/[a-zA-Z]/.test(line))) {
+ const parts = line.split(' ');
+ if (parts.length >= 5 && (parts[parts.length - 3]).indexOf('.') > -1) {
+ result = parts[parts.length - 3];
+ }
+ }
+ });
+ if (!result) {
+ util.powerShell('Get-CimInstance -ClassName Win32_IP4RouteTable | Where-Object { $_.Destination -eq \'0.0.0.0\' -and $_.Mask -eq \'0.0.0.0\' }')
+ .then((data) => {
+ let lines = data.toString().split('\r\n');
+ if (lines.length > 1 && !result) {
+ result = util.getValue(lines, 'NextHop');
+ if (callback) {
+ callback(result);
+ }
+ resolve(result);
+ // } else {
+ // exec('ipconfig', util.execOptsWin, function (error, stdout) {
+ // let lines = stdout.toString().split('\r\n');
+ // lines.forEach(function (line) {
+ // line = line.trim().replace(/\. /g, '');
+ // line = line.trim().replace(/ +/g, '');
+ // const parts = line.split(':');
+ // if ((parts[0].toLowerCase().startsWith('standardgate') || parts[0].toLowerCase().indexOf('gateway') > -1 || parts[0].toLowerCase().indexOf('enlace') > -1) && parts[1]) {
+ // result = parts[1];
+ // }
+ // });
+ // if (callback) { callback(result); }
+ // resolve(result);
+ // });
+ }
+ });
+ } else {
+ if (callback) {
+ callback(result);
+ }
+ resolve(result);
+ }
+ });
+ } catch (e) {
+ if (callback) { callback(result); }
+ resolve(result);
+ }
+ }
+ });
+ });
+}
+
+exports.networkGatewayDefault = networkGatewayDefault;
diff --git a/node_modules/systeminformation/lib/osinfo.js b/node_modules/systeminformation/lib/osinfo.js
new file mode 100644
index 0000000..e79cbcf
--- /dev/null
+++ b/node_modules/systeminformation/lib/osinfo.js
@@ -0,0 +1,1154 @@
+'use strict';
+// @ts-check
+// ==================================================================================
+// osinfo.js
+// ----------------------------------------------------------------------------------
+// Description: System Information - library
+// for Node.js
+// Copyright: (c) 2014 - 2022
+// Author: Sebastian Hildebrandt
+// ----------------------------------------------------------------------------------
+// License: MIT
+// ==================================================================================
+// 3. Operating System
+// ----------------------------------------------------------------------------------
+
+const os = require('os');
+const fs = require('fs');
+const util = require('./util');
+const exec = require('child_process').exec;
+const execSync = require('child_process').execSync;
+
+let _platform = process.platform;
+
+const _linux = (_platform === 'linux' || _platform === 'android');
+const _darwin = (_platform === 'darwin');
+const _windows = (_platform === 'win32');
+const _freebsd = (_platform === 'freebsd');
+const _openbsd = (_platform === 'openbsd');
+const _netbsd = (_platform === 'netbsd');
+const _sunos = (_platform === 'sunos');
+
+// --------------------------
+// Get current time and OS uptime
+
+function time() {
+ let t = new Date().toString().split(' ');
+ return {
+ current: Date.now(),
+ uptime: os.uptime(),
+ timezone: (t.length >= 7) ? t[5] : '',
+ timezoneName: Intl ? Intl.DateTimeFormat().resolvedOptions().timeZone : (t.length >= 7) ? t.slice(6).join(' ').replace(/\(/g, '').replace(/\)/g, '') : ''
+ };
+}
+
+exports.time = time;
+
+// --------------------------
+// Get logo filename of OS distribution
+
+function getLogoFile(distro) {
+ distro = distro || '';
+ distro = distro.toLowerCase();
+ let result = _platform;
+ if (_windows) {
+ result = 'windows';
+ }
+ else if (distro.indexOf('mac os') !== -1) {
+ result = 'apple';
+ }
+ else if (distro.indexOf('arch') !== -1) {
+ result = 'arch';
+ }
+ else if (distro.indexOf('centos') !== -1) {
+ result = 'centos';
+ }
+ else if (distro.indexOf('coreos') !== -1) {
+ result = 'coreos';
+ }
+ else if (distro.indexOf('debian') !== -1) {
+ result = 'debian';
+ }
+ else if (distro.indexOf('deepin') !== -1) {
+ result = 'deepin';
+ }
+ else if (distro.indexOf('elementary') !== -1) {
+ result = 'elementary';
+ }
+ else if (distro.indexOf('fedora') !== -1) {
+ result = 'fedora';
+ }
+ else if (distro.indexOf('gentoo') !== -1) {
+ result = 'gentoo';
+ }
+ else if (distro.indexOf('mageia') !== -1) {
+ result = 'mageia';
+ }
+ else if (distro.indexOf('mandriva') !== -1) {
+ result = 'mandriva';
+ }
+ else if (distro.indexOf('manjaro') !== -1) {
+ result = 'manjaro';
+ }
+ else if (distro.indexOf('mint') !== -1) {
+ result = 'mint';
+ }
+ else if (distro.indexOf('mx') !== -1) {
+ result = 'mx';
+ }
+ else if (distro.indexOf('openbsd') !== -1) {
+ result = 'openbsd';
+ }
+ else if (distro.indexOf('freebsd') !== -1) {
+ result = 'freebsd';
+ }
+ else if (distro.indexOf('opensuse') !== -1) {
+ result = 'opensuse';
+ }
+ else if (distro.indexOf('pclinuxos') !== -1) {
+ result = 'pclinuxos';
+ }
+ else if (distro.indexOf('puppy') !== -1) {
+ result = 'puppy';
+ }
+ else if (distro.indexOf('raspbian') !== -1) {
+ result = 'raspbian';
+ }
+ else if (distro.indexOf('reactos') !== -1) {
+ result = 'reactos';
+ }
+ else if (distro.indexOf('redhat') !== -1) {
+ result = 'redhat';
+ }
+ else if (distro.indexOf('slackware') !== -1) {
+ result = 'slackware';
+ }
+ else if (distro.indexOf('sugar') !== -1) {
+ result = 'sugar';
+ }
+ else if (distro.indexOf('steam') !== -1) {
+ result = 'steam';
+ }
+ else if (distro.indexOf('suse') !== -1) {
+ result = 'suse';
+ }
+ else if (distro.indexOf('mate') !== -1) {
+ result = 'ubuntu-mate';
+ }
+ else if (distro.indexOf('lubuntu') !== -1) {
+ result = 'lubuntu';
+ }
+ else if (distro.indexOf('xubuntu') !== -1) {
+ result = 'xubuntu';
+ }
+ else if (distro.indexOf('ubuntu') !== -1) {
+ result = 'ubuntu';
+ }
+ else if (distro.indexOf('solaris') !== -1) {
+ result = 'solaris';
+ }
+ else if (distro.indexOf('tails') !== -1) {
+ result = 'tails';
+ }
+ else if (distro.indexOf('feren') !== -1) {
+ result = 'ferenos';
+ }
+ else if (distro.indexOf('robolinux') !== -1) {
+ result = 'robolinux';
+ } else if (_linux && distro) {
+ result = distro.toLowerCase().trim().replace(/\s+/g, '-');
+ }
+ return result;
+}
+
+// --------------------------
+// FQDN
+
+function getFQDN() {
+ let fqdn = os.hostname;
+ if (_linux || _darwin) {
+ try {
+ const stdout = execSync('hostname -f');
+ fqdn = stdout.toString().split(os.EOL)[0];
+ } catch (e) {
+ util.noop();
+ }
+ }
+ if (_freebsd || _openbsd || _netbsd) {
+ try {
+ const stdout = execSync('hostname');
+ fqdn = stdout.toString().split(os.EOL)[0];
+ } catch (e) {
+ util.noop();
+ }
+ }
+ if (_windows) {
+ try {
+ const stdout = execSync('echo %COMPUTERNAME%.%USERDNSDOMAIN%', util.execOptsWin);
+ fqdn = stdout.toString().replace('.%USERDNSDOMAIN%', '').split(os.EOL)[0];
+ } catch (e) {
+ util.noop();
+ }
+ }
+ return fqdn;
+}
+
+// --------------------------
+// OS Information
+
+function osInfo(callback) {
+
+ return new Promise((resolve) => {
+ process.nextTick(() => {
+ let result = {
+
+ platform: (_platform === 'win32' ? 'Windows' : _platform),
+ distro: 'unknown',
+ release: 'unknown',
+ codename: '',
+ kernel: os.release(),
+ arch: os.arch(),
+ hostname: os.hostname(),
+ fqdn: getFQDN(),
+ codepage: '',
+ logofile: '',
+ serial: '',
+ build: '',
+ servicepack: '',
+ uefi: false
+ };
+
+ if (_linux) {
+
+ exec('cat /etc/*-release; cat /usr/lib/os-release; cat /etc/openwrt_release', function (error, stdout) {
+ /**
+ * @namespace
+ * @property {string} DISTRIB_ID
+ * @property {string} NAME
+ * @property {string} DISTRIB_RELEASE
+ * @property {string} VERSION_ID
+ * @property {string} DISTRIB_CODENAME
+ */
+ let release = {};
+ let lines = stdout.toString().split('\n');
+ lines.forEach(function (line) {
+ if (line.indexOf('=') !== -1) {
+ release[line.split('=')[0].trim().toUpperCase()] = line.split('=')[1].trim();
+ }
+ });
+ let releaseVersion = (release.VERSION || '').replace(/"/g, '');
+ let codename = (release.DISTRIB_CODENAME || release.VERSION_CODENAME || '').replace(/"/g, '');
+ if (releaseVersion.indexOf('(') >= 0) {
+ codename = releaseVersion.split('(')[1].replace(/[()]/g, '').trim();
+ releaseVersion = releaseVersion.split('(')[0].trim();
+ }
+ result.distro = (release.DISTRIB_ID || release.NAME || 'unknown').replace(/"/g, '');
+ result.logofile = getLogoFile(result.distro);
+ result.release = (releaseVersion || release.DISTRIB_RELEASE || release.VERSION_ID || 'unknown').replace(/"/g, '');
+ result.codename = codename;
+ result.codepage = util.getCodepage();
+ result.build = (release.BUILD_ID || '').replace(/"/g, '').trim();
+ isUefiLinux().then(uefi => {
+ result.uefi = uefi;
+ uuid().then((data) => {
+ result.serial = data.os;
+ if (callback) {
+ callback(result);
+ }
+ resolve(result);
+ });
+ });
+ });
+ }
+ if (_freebsd || _openbsd || _netbsd) {
+
+ exec('sysctl kern.ostype kern.osrelease kern.osrevision kern.hostuuid machdep.bootmethod', function (error, stdout) {
+ if (!error) {
+ let lines = stdout.toString().split('\n');
+ result.distro = util.getValue(lines, 'kern.ostype');
+ result.logofile = getLogoFile(result.distro);
+ result.release = util.getValue(lines, 'kern.osrelease').split('-')[0];
+ result.serial = util.getValue(lines, 'kern.uuid');
+ result.codename = '';
+ result.codepage = util.getCodepage();
+ result.uefi = util.getValue(lines, 'machdep.bootmethod').toLowerCase().indexOf('uefi') >= 0;
+ }
+ if (callback) {
+ callback(result);
+ }
+ resolve(result);
+ });
+ }
+ if (_darwin) {
+ exec('sw_vers; sysctl kern.ostype kern.osrelease kern.osrevision kern.uuid', function (error, stdout) {
+ let lines = stdout.toString().split('\n');
+ result.serial = util.getValue(lines, 'kern.uuid');
+ result.distro = util.getValue(lines, 'ProductName');
+ result.release = util.getValue(lines, 'ProductVersion');
+ result.build = util.getValue(lines, 'BuildVersion');
+ result.logofile = getLogoFile(result.distro);
+ result.codename = 'macOS';
+ result.codename = (result.release.indexOf('10.4') > -1 ? 'Mac OS X Tiger' : result.codename);
+ result.codename = (result.release.indexOf('10.4') > -1 ? 'Mac OS X Tiger' : result.codename);
+ result.codename = (result.release.indexOf('10.4') > -1 ? 'Mac OS X Tiger' : result.codename);
+ result.codename = (result.release.indexOf('10.5') > -1 ? 'Mac OS X Leopard' : result.codename);
+ result.codename = (result.release.indexOf('10.6') > -1 ? 'Mac OS X Snow Leopard' : result.codename);
+ result.codename = (result.release.indexOf('10.7') > -1 ? 'Mac OS X Lion' : result.codename);
+ result.codename = (result.release.indexOf('10.8') > -1 ? 'OS X Mountain Lion' : result.codename);
+ result.codename = (result.release.indexOf('10.9') > -1 ? 'OS X Mavericks' : result.codename);
+ result.codename = (result.release.indexOf('10.10') > -1 ? 'OS X Yosemite' : result.codename);
+ result.codename = (result.release.indexOf('10.11') > -1 ? 'OS X El Capitan' : result.codename);
+ result.codename = (result.release.indexOf('10.12') > -1 ? 'macOS Sierra' : result.codename);
+ result.codename = (result.release.indexOf('10.13') > -1 ? 'macOS High Sierra' : result.codename);
+ result.codename = (result.release.indexOf('10.14') > -1 ? 'macOS Mojave' : result.codename);
+ result.codename = (result.release.indexOf('10.15') > -1 ? 'macOS Catalina' : result.codename);
+ result.codename = (result.release.startsWith('11.') ? 'macOS Big Sur' : result.codename);
+ result.codename = (result.release.startsWith('12.') ? 'macOS Monterey' : result.codename);
+ result.codename = (result.release.startsWith('13.') ? 'macOS Ventura' : result.codename);
+ result.uefi = true;
+ result.codepage = util.getCodepage();
+ if (callback) {
+ callback(result);
+ }
+ resolve(result);
+ });
+ }
+ if (_sunos) {
+ result.release = result.kernel;
+ exec('uname -o', function (error, stdout) {
+ let lines = stdout.toString().split('\n');
+ result.distro = lines[0];
+ result.logofile = getLogoFile(result.distro);
+ if (callback) { callback(result); }
+ resolve(result);
+ });
+ }
+ if (_windows) {
+ result.logofile = getLogoFile();
+ result.release = result.kernel;
+ try {
+ const workload = [];
+ workload.push(util.powerShell('Get-WmiObject Win32_OperatingSystem | select Caption,SerialNumber,BuildNumber,ServicePackMajorVersion,ServicePackMinorVersion | fl'));
+ workload.push(util.powerShell('(Get-CimInstance Win32_ComputerSystem).HypervisorPresent'));
+ workload.push(util.powerShell('Add-Type -AssemblyName System.Windows.Forms; [System.Windows.Forms.SystemInformation]::TerminalServerSession'));
+ util.promiseAll(
+ workload
+ ).then((data) => {
+ let lines = data.results[0] ? data.results[0].toString().split('\r\n') : [''];
+ result.distro = util.getValue(lines, 'Caption', ':').trim();
+ result.serial = util.getValue(lines, 'SerialNumber', ':').trim();
+ result.build = util.getValue(lines, 'BuildNumber', ':').trim();
+ result.servicepack = util.getValue(lines, 'ServicePackMajorVersion', ':').trim() + '.' + util.getValue(lines, 'ServicePackMinorVersion', ':').trim();
+ result.codepage = util.getCodepage();
+ const hyperv = data.results[1] ? data.results[1].toString().toLowerCase() : '';
+ result.hypervisor = hyperv.indexOf('true') !== -1;
+ const term = data.results[2] ? data.results[2].toString() : '';
+ result.remoteSession = (term.toString().toLowerCase().indexOf('true') >= 0);
+ isUefiWindows().then(uefi => {
+ result.uefi = uefi;
+ if (callback) {
+ callback(result);
+ }
+ resolve(result);
+ });
+ });
+ } catch (e) {
+ if (callback) { callback(result); }
+ resolve(result);
+ }
+ }
+ });
+ });
+}
+
+exports.osInfo = osInfo;
+
+function isUefiLinux() {
+ return new Promise((resolve) => {
+ process.nextTick(() => {
+ fs.stat('/sys/firmware/efi', function (err) {
+ if (!err) {
+ return resolve(true);
+ } else {
+ exec('dmesg | grep -E "EFI v"', function (error, stdout) {
+ if (!error) {
+ const lines = stdout.toString().split('\n');
+ return resolve(lines.length > 0);
+ }
+ return resolve(false);
+ });
+ }
+ });
+ });
+ });
+}
+
+function isUefiWindows() {
+ return new Promise((resolve) => {
+ process.nextTick(() => {
+ try {
+ exec('findstr /C:"Detected boot environment" "%windir%\\Panther\\setupact.log"', util.execOptsWin, function (error, stdout) {
+ if (!error) {
+ const line = stdout.toString().split('\n\r')[0];
+ return resolve(line.toLowerCase().indexOf('efi') >= 0);
+ } else {
+ exec('echo %firmware_type%', util.execOptsWin, function (error, stdout) {
+ if (!error) {
+ const line = stdout.toString() || '';
+ return resolve(line.toLowerCase().indexOf('efi') >= 0);
+ } else {
+ return resolve(false);
+ }
+ });
+ }
+ });
+ } catch (e) {
+ return resolve(false);
+ }
+ });
+ });
+}
+
+function versions(apps, callback) {
+ let versionObject = {
+ kernel: os.release(),
+ openssl: '',
+ systemOpenssl: '',
+ systemOpensslLib: '',
+ node: process.versions.node,
+ v8: process.versions.v8,
+ npm: '',
+ yarn: '',
+ pm2: '',
+ gulp: '',
+ grunt: '',
+ git: '',
+ tsc: '',
+ mysql: '',
+ redis: '',
+ mongodb: '',
+ apache: '',
+ nginx: '',
+ php: '',
+ docker: '',
+ postfix: '',
+ postgresql: '',
+ perl: '',
+ python: '',
+ python3: '',
+ pip: '',
+ pip3: '',
+ java: '',
+ gcc: '',
+ virtualbox: '',
+ bash: '',
+ zsh: '',
+ fish: '',
+ powershell: '',
+ dotnet: ''
+ };
+
+ function checkVersionParam(apps) {
+ if (apps === '*') {
+ return {
+ versions: versionObject,
+ counter: 30
+ };
+ }
+ if (!Array.isArray(apps)) {
+ apps = apps.trim().toLowerCase().replace(/,+/g, '|').replace(/ /g, '|');
+ apps = apps.split('|');
+ const result = {
+ versions: {},
+ counter: 0
+ };
+ apps.forEach(el => {
+ if (el) {
+ for (let key in versionObject) {
+ if ({}.hasOwnProperty.call(versionObject, key)) {
+ if (key.toLowerCase() === el.toLowerCase() && !{}.hasOwnProperty.call(result.versions, key)) {
+ result.versions[key] = versionObject[key];
+ if (key === 'openssl') {
+ result.versions.systemOpenssl = '';
+ result.versions.systemOpensslLib = '';
+ }
+
+ if (!result.versions[key]) { result.counter++; }
+ }
+ }
+ }
+ }
+ });
+ return result;
+ }
+ }
+
+ return new Promise((resolve) => {
+ process.nextTick(() => {
+ if (util.isFunction(apps) && !callback) {
+ callback = apps;
+ apps = '*';
+ } else {
+ apps = apps || '*';
+ if (typeof apps !== 'string') {
+ if (callback) { callback({}); }
+ return resolve({});
+ }
+ }
+ const appsObj = checkVersionParam(apps);
+ let totalFunctions = appsObj.counter;
+
+ let functionProcessed = (function () {
+ return function () {
+ if (--totalFunctions === 0) {
+ if (callback) {
+ callback(appsObj.versions);
+ }
+ resolve(appsObj.versions);
+ }
+ };
+ })();
+
+ let cmd = '';
+ try {
+ if ({}.hasOwnProperty.call(appsObj.versions, 'openssl')) {
+ appsObj.versions.openssl = process.versions.openssl;
+ exec('openssl version', function (error, stdout) {
+ if (!error) {
+ let openssl_string = stdout.toString().split('\n')[0].trim();
+ let openssl = openssl_string.split(' ');
+ appsObj.versions.systemOpenssl = openssl.length > 0 ? openssl[1] : openssl[0];
+ appsObj.versions.systemOpensslLib = openssl.length > 0 ? openssl[0] : 'openssl';
+ }
+ functionProcessed();
+ });
+ }
+ if ({}.hasOwnProperty.call(appsObj.versions, 'npm')) {
+ exec('npm -v', function (error, stdout) {
+ if (!error) {
+ appsObj.versions.npm = stdout.toString().split('\n')[0];
+ }
+ functionProcessed();
+ });
+ }
+ if ({}.hasOwnProperty.call(appsObj.versions, 'pm2')) {
+ cmd = 'pm2';
+ if (_windows) {
+ cmd += '.cmd';
+ }
+ exec(`${cmd} -v`, function (error, stdout) {
+ if (!error) {
+ let pm2 = stdout.toString().split('\n')[0].trim();
+ if (!pm2.startsWith('[PM2]')) {
+ appsObj.versions.pm2 = pm2;
+ }
+ }
+ functionProcessed();
+ });
+ }
+ if ({}.hasOwnProperty.call(appsObj.versions, 'yarn')) {
+ exec('yarn --version', function (error, stdout) {
+ if (!error) {
+ appsObj.versions.yarn = stdout.toString().split('\n')[0];
+ }
+ functionProcessed();
+ });
+ }
+ if ({}.hasOwnProperty.call(appsObj.versions, 'gulp')) {
+ cmd = 'gulp';
+ if (_windows) {
+ cmd += '.cmd';
+ }
+ exec(`${cmd} --version`, function (error, stdout) {
+ if (!error) {
+ const gulp = stdout.toString().split('\n')[0] || '';
+ appsObj.versions.gulp = (gulp.toLowerCase().split('version')[1] || '').trim();
+ }
+ functionProcessed();
+ });
+ }
+ if ({}.hasOwnProperty.call(appsObj.versions, 'tsc')) {
+ cmd = 'tsc';
+ if (_windows) {
+ cmd += '.cmd';
+ }
+ exec(`${cmd} --version`, function (error, stdout) {
+ if (!error) {
+ const tsc = stdout.toString().split('\n')[0] || '';
+ appsObj.versions.tsc = (tsc.toLowerCase().split('version')[1] || '').trim();
+ }
+ functionProcessed();
+ });
+ }
+ if ({}.hasOwnProperty.call(appsObj.versions, 'grunt')) {
+ cmd = 'grunt';
+ if (_windows) {
+ cmd += '.cmd';
+ }
+ exec(`${cmd} --version`, function (error, stdout) {
+ if (!error) {
+ const grunt = stdout.toString().split('\n')[0] || '';
+ appsObj.versions.grunt = (grunt.toLowerCase().split('cli v')[1] || '').trim();
+ }
+ functionProcessed();
+ });
+ }
+ if ({}.hasOwnProperty.call(appsObj.versions, 'git')) {
+ if (_darwin) {
+ const gitHomebrewExists = fs.existsSync('/usr/local/Cellar/git') || fs.existsSync('/opt/homebrew/bin/git');
+ if (util.darwinXcodeExists() || gitHomebrewExists) {
+ exec('git --version', function (error, stdout) {
+ if (!error) {
+ let git = stdout.toString().split('\n')[0] || '';
+ git = (git.toLowerCase().split('version')[1] || '').trim();
+ appsObj.versions.git = (git.split(' ')[0] || '').trim();
+ }
+ functionProcessed();
+ });
+ } else {
+ functionProcessed();
+ }
+ } else {
+ exec('git --version', function (error, stdout) {
+ if (!error) {
+ let git = stdout.toString().split('\n')[0] || '';
+ git = (git.toLowerCase().split('version')[1] || '').trim();
+ appsObj.versions.git = (git.split(' ')[0] || '').trim();
+ }
+ functionProcessed();
+ });
+ }
+ }
+ if ({}.hasOwnProperty.call(appsObj.versions, 'apache')) {
+ exec('apachectl -v 2>&1', function (error, stdout) {
+ if (!error) {
+ const apache = (stdout.toString().split('\n')[0] || '').split(':');
+ appsObj.versions.apache = (apache.length > 1 ? apache[1].replace('Apache', '').replace('/', '').split('(')[0].trim() : '');
+ }
+ functionProcessed();
+ });
+ }
+ if ({}.hasOwnProperty.call(appsObj.versions, 'nginx')) {
+ exec('nginx -v 2>&1', function (error, stdout) {
+ if (!error) {
+ const nginx = stdout.toString().split('\n')[0] || '';
+ appsObj.versions.nginx = (nginx.toLowerCase().split('/')[1] || '').trim();
+ }
+ functionProcessed();
+ });
+ }
+ if ({}.hasOwnProperty.call(appsObj.versions, 'mysql')) {
+ exec('mysql -V', function (error, stdout) {
+ if (!error) {
+ let mysql = stdout.toString().split('\n')[0] || '';
+ mysql = mysql.toLowerCase();
+ if (mysql.indexOf(',') > -1) {
+ mysql = (mysql.split(',')[0] || '').trim();
+ const parts = mysql.split(' ');
+ appsObj.versions.mysql = (parts[parts.length - 1] || '').trim();
+ } else {
+ if (mysql.indexOf(' ver ') > -1) {
+ mysql = mysql.split(' ver ')[1];
+ appsObj.versions.mysql = mysql.split(' ')[0];
+ }
+ }
+ }
+ functionProcessed();
+ });
+ }
+ if ({}.hasOwnProperty.call(appsObj.versions, 'php')) {
+ exec('php -v', function (error, stdout) {
+ if (!error) {
+ const php = stdout.toString().split('\n')[0] || '';
+ let parts = php.split('(');
+ if (parts[0].indexOf('-')) {
+ parts = parts[0].split('-');
+ }
+ appsObj.versions.php = parts[0].replace(/[^0-9.]/g, '');
+ }
+ functionProcessed();
+ });
+ }
+ if ({}.hasOwnProperty.call(appsObj.versions, 'redis')) {
+ exec('redis-server --version', function (error, stdout) {
+ if (!error) {
+ const redis = stdout.toString().split('\n')[0] || '';
+ const parts = redis.split(' ');
+ appsObj.versions.redis = util.getValue(parts, 'v', '=', true);
+ }
+ functionProcessed();
+ });
+ }
+ if ({}.hasOwnProperty.call(appsObj.versions, 'docker')) {
+ exec('docker --version', function (error, stdout) {
+ if (!error) {
+ const docker = stdout.toString().split('\n')[0] || '';
+ const parts = docker.split(' ');
+ appsObj.versions.docker = parts.length > 2 && parts[2].endsWith(',') ? parts[2].slice(0, -1) : '';
+ }
+ functionProcessed();
+ });
+ }
+ if ({}.hasOwnProperty.call(appsObj.versions, 'postfix')) {
+ exec('postconf -d | grep mail_version', function (error, stdout) {
+ if (!error) {
+ const postfix = stdout.toString().split('\n') || [];
+ appsObj.versions.postfix = util.getValue(postfix, 'mail_version', '=', true);
+ }
+ functionProcessed();
+ });
+ }
+ if ({}.hasOwnProperty.call(appsObj.versions, 'mongodb')) {
+ exec('mongod --version', function (error, stdout) {
+ if (!error) {
+ const mongodb = stdout.toString().split('\n')[0] || '';
+ appsObj.versions.mongodb = (mongodb.toLowerCase().split(',')[0] || '').replace(/[^0-9.]/g, '');
+ }
+ functionProcessed();
+ });
+ }
+ if ({}.hasOwnProperty.call(appsObj.versions, 'postgresql')) {
+ if (_linux) {
+ exec('locate bin/postgres', function (error, stdout) {
+ if (!error) {
+ const postgresqlBin = stdout.toString().split('\n').sort();
+ if (postgresqlBin.length) {
+ exec(postgresqlBin[postgresqlBin.length - 1] + ' -V', function (error, stdout) {
+ if (!error) {
+ const postgresql = stdout.toString().split('\n')[0].split(' ') || [];
+ appsObj.versions.postgresql = postgresql.length ? postgresql[postgresql.length - 1] : '';
+ }
+ functionProcessed();
+ });
+ } else {
+ functionProcessed();
+ }
+ } else {
+ exec('psql -V', function (error, stdout) {
+ if (!error) {
+ const postgresql = stdout.toString().split('\n')[0].split(' ') || [];
+ appsObj.versions.postgresql = postgresql.length ? postgresql[postgresql.length - 1] : '';
+ appsObj.versions.postgresql = appsObj.versions.postgresql.split('-')[0];
+ }
+ functionProcessed();
+ });
+ }
+ });
+ } else {
+ if (_windows) {
+ util.powerShell('Get-WmiObject Win32_Service | select caption | fl').then((stdout) => {
+ let serviceSections = stdout.split(/\n\s*\n/);
+ for (let i = 0; i < serviceSections.length; i++) {
+ if (serviceSections[i].trim() !== '') {
+ let lines = serviceSections[i].trim().split('\r\n');
+ let srvCaption = util.getValue(lines, 'caption', ':', true).toLowerCase();
+ if (srvCaption.indexOf('postgresql') > -1) {
+ const parts = srvCaption.split(' server ');
+ if (parts.length > 1) {
+ appsObj.versions.postgresql = parts[1];
+ }
+ }
+ }
+ }
+ functionProcessed();
+ });
+ } else {
+ exec('postgres -V', function (error, stdout) {
+ if (!error) {
+ const postgresql = stdout.toString().split('\n')[0].split(' ') || [];
+ appsObj.versions.postgresql = postgresql.length ? postgresql[postgresql.length - 1] : '';
+ }
+ functionProcessed();
+ });
+ }
+ }
+ }
+ if ({}.hasOwnProperty.call(appsObj.versions, 'perl')) {
+ exec('perl -v', function (error, stdout) {
+ if (!error) {
+ const perl = stdout.toString().split('\n') || '';
+ while (perl.length > 0 && perl[0].trim() === '') {
+ perl.shift();
+ }
+ if (perl.length > 0) {
+ appsObj.versions.perl = perl[0].split('(').pop().split(')')[0].replace('v', '');
+ }
+ }
+ functionProcessed();
+ });
+ }
+ if ({}.hasOwnProperty.call(appsObj.versions, 'python')) {
+ if (_darwin) {
+ const stdout = execSync('sw_vers');
+ const lines = stdout.toString().split('\n');
+ const osVersion = util.getValue(lines, 'ProductVersion', ':');
+ const gitHomebrewExists1 = fs.existsSync('/usr/local/Cellar/python');
+ const gitHomebrewExists2 = fs.existsSync('/opt/homebrew/bin/python');
+ if ((util.darwinXcodeExists() && util.semverCompare('12.0.1', osVersion) < 0) || gitHomebrewExists1 || gitHomebrewExists2) {
+ const cmd = gitHomebrewExists1 ? '/usr/local/Cellar/python -V 2>&1' : (gitHomebrewExists2 ? '/opt/homebrew/bin/python -V 2>&1' : 'python -V 2>&1');
+ exec(cmd, function (error, stdout) {
+ if (!error) {
+ const python = stdout.toString().split('\n')[0] || '';
+ appsObj.versions.python = python.toLowerCase().replace('python', '').trim();
+ }
+ functionProcessed();
+ });
+ } else {
+ functionProcessed();
+ }
+ } else {
+ exec('python -V 2>&1', function (error, stdout) {
+ if (!error) {
+ const python = stdout.toString().split('\n')[0] || '';
+ appsObj.versions.python = python.toLowerCase().replace('python', '').trim();
+ }
+ functionProcessed();
+ });
+ }
+ }
+ if ({}.hasOwnProperty.call(appsObj.versions, 'python3')) {
+ if (_darwin) {
+ const gitHomebrewExists = fs.existsSync('/usr/local/Cellar/python3') || fs.existsSync('/opt/homebrew/bin/python3');
+ if (util.darwinXcodeExists() || gitHomebrewExists) {
+ exec('python3 -V 2>&1', function (error, stdout) {
+ if (!error) {
+ const python = stdout.toString().split('\n')[0] || '';
+ appsObj.versions.python3 = python.toLowerCase().replace('python', '').trim();
+ }
+ functionProcessed();
+ });
+ } else {
+ functionProcessed();
+ }
+ } else {
+ exec('python3 -V 2>&1', function (error, stdout) {
+ if (!error) {
+ const python = stdout.toString().split('\n')[0] || '';
+ appsObj.versions.python3 = python.toLowerCase().replace('python', '').trim();
+ }
+ functionProcessed();
+ });
+ }
+ }
+ if ({}.hasOwnProperty.call(appsObj.versions, 'pip')) {
+ if (_darwin) {
+ const gitHomebrewExists = fs.existsSync('/usr/local/Cellar/pip') || fs.existsSync('/opt/homebrew/bin/pip');
+ if (util.darwinXcodeExists() || gitHomebrewExists) {
+ exec('pip -V 2>&1', function (error, stdout) {
+ if (!error) {
+ const pip = stdout.toString().split('\n')[0] || '';
+ const parts = pip.split(' ');
+ appsObj.versions.pip = parts.length >= 2 ? parts[1] : '';
+ }
+ functionProcessed();
+ });
+ } else {
+ functionProcessed();
+ }
+ } else {
+ exec('pip -V 2>&1', function (error, stdout) {
+ if (!error) {
+ const pip = stdout.toString().split('\n')[0] || '';
+ const parts = pip.split(' ');
+ appsObj.versions.pip = parts.length >= 2 ? parts[1] : '';
+ }
+ functionProcessed();
+ });
+ }
+ }
+ if ({}.hasOwnProperty.call(appsObj.versions, 'pip3')) {
+ if (_darwin) {
+ const gitHomebrewExists = fs.existsSync('/usr/local/Cellar/pip3') || fs.existsSync('/opt/homebrew/bin/pip3');
+ if (util.darwinXcodeExists() || gitHomebrewExists) {
+ exec('pip3 -V 2>&1', function (error, stdout) {
+ if (!error) {
+ const pip = stdout.toString().split('\n')[0] || '';
+ const parts = pip.split(' ');
+ appsObj.versions.pip3 = parts.length >= 2 ? parts[1] : '';
+ }
+ functionProcessed();
+ });
+ } else {
+ functionProcessed();
+ }
+ } else {
+ exec('pip3 -V 2>&1', function (error, stdout) {
+ if (!error) {
+ const pip = stdout.toString().split('\n')[0] || '';
+ const parts = pip.split(' ');
+ appsObj.versions.pip3 = parts.length >= 2 ? parts[1] : '';
+ }
+ functionProcessed();
+ });
+ }
+ }
+ if ({}.hasOwnProperty.call(appsObj.versions, 'java')) {
+ if (_darwin) {
+ // check if any JVM is installed but avoid dialog box that Java needs to be installed
+ exec('/usr/libexec/java_home -V 2>&1', function (error, stdout) {
+ if (!error && stdout.toString().toLowerCase().indexOf('no java runtime') === -1) {
+ // now this can be done savely
+ exec('java -version 2>&1', function (error, stdout) {
+ if (!error) {
+ const java = stdout.toString().split('\n')[0] || '';
+ const parts = java.split('"');
+ appsObj.versions.java = parts.length === 3 ? parts[1].trim() : '';
+ }
+ functionProcessed();
+ });
+ } else {
+ functionProcessed();
+ }
+ });
+ } else {
+ exec('java -version 2>&1', function (error, stdout) {
+ if (!error) {
+ const java = stdout.toString().split('\n')[0] || '';
+ const parts = java.split('"');
+ appsObj.versions.java = parts.length === 3 ? parts[1].trim() : '';
+ }
+ functionProcessed();
+ });
+ }
+ }
+ if ({}.hasOwnProperty.call(appsObj.versions, 'gcc')) {
+ if ((_darwin && util.darwinXcodeExists()) || !_darwin) {
+ exec('gcc -dumpversion', function (error, stdout) {
+ if (!error) {
+ appsObj.versions.gcc = stdout.toString().split('\n')[0].trim() || '';
+ }
+ if (appsObj.versions.gcc.indexOf('.') > -1) {
+ functionProcessed();
+ } else {
+ exec('gcc --version', function (error, stdout) {
+ if (!error) {
+ const gcc = stdout.toString().split('\n')[0].trim();
+ if (gcc.indexOf('gcc') > -1 && gcc.indexOf(')') > -1) {
+ const parts = gcc.split(')');
+ appsObj.versions.gcc = parts[1].trim() || appsObj.versions.gcc;
+ }
+ }
+ functionProcessed();
+ });
+ }
+ });
+ } else {
+ functionProcessed();
+ }
+ }
+ if ({}.hasOwnProperty.call(appsObj.versions, 'virtualbox')) {
+ exec(util.getVboxmanage() + ' -v 2>&1', function (error, stdout) {
+ if (!error) {
+ const vbox = stdout.toString().split('\n')[0] || '';
+ const parts = vbox.split('r');
+ appsObj.versions.virtualbox = parts[0];
+ }
+ functionProcessed();
+ });
+ }
+ if ({}.hasOwnProperty.call(appsObj.versions, 'bash')) {
+ exec('bash --version', function (error, stdout) {
+ if (!error) {
+ const line = stdout.toString().split('\n')[0];
+ const parts = line.split(' version ');
+ if (parts.length > 1) {
+ appsObj.versions.bash = parts[1].split(' ')[0].split('(')[0];
+ }
+ }
+ functionProcessed();
+ });
+ }
+ if ({}.hasOwnProperty.call(appsObj.versions, 'zsh')) {
+ exec('zsh --version', function (error, stdout) {
+ if (!error) {
+ const line = stdout.toString().split('\n')[0];
+ const parts = line.split('zsh ');
+ if (parts.length > 1) {
+ appsObj.versions.zsh = parts[1].split(' ')[0];
+ }
+ }
+ functionProcessed();
+ });
+ }
+ if ({}.hasOwnProperty.call(appsObj.versions, 'fish')) {
+ exec('fish --version', function (error, stdout) {
+ if (!error) {
+ const line = stdout.toString().split('\n')[0];
+ const parts = line.split(' version ');
+ if (parts.length > 1) {
+ appsObj.versions.fish = parts[1].split(' ')[0];
+ }
+ }
+ functionProcessed();
+ });
+ }
+ if ({}.hasOwnProperty.call(appsObj.versions, 'powershell')) {
+ if (_windows) {
+ util.powerShell('$PSVersionTable').then(stdout => {
+ const lines = stdout.toString().split('\n').map(line => line.replace(/ +/g, ' ').replace(/ +/g, ':'));
+ appsObj.versions.powershell = util.getValue(lines, 'psversion');
+ functionProcessed();
+ });
+ } else {
+ functionProcessed();
+ }
+ }
+ if ({}.hasOwnProperty.call(appsObj.versions, 'dotnet')) {
+ if (_windows) {
+ util.powerShell('gci "HKLM:\\SOFTWARE\\Microsoft\\NET Framework Setup\\NDP" -recurse | gp -name Version,Release -EA 0 | where { $_.PSChildName -match "^(?!S)\\p{L}"} | select PSChildName, Version, Release').then(stdout => {
+ const lines = stdout.toString().split('\r\n');
+ let dotnet = '';
+ lines.forEach(line => {
+ line = line.replace(/ +/g, ' ');
+ const parts = line.split(' ');
+ dotnet = dotnet || (parts[0].toLowerCase().startsWith('client') && parts.length > 2 ? parts[1].trim() : (parts[0].toLowerCase().startsWith('full') && parts.length > 2 ? parts[1].trim() : ''));
+ });
+ appsObj.versions.dotnet = dotnet.trim();
+ functionProcessed();
+ });
+ } else {
+ functionProcessed();
+ }
+ }
+ } catch (e) {
+ if (callback) { callback(appsObj.versions); }
+ resolve(appsObj.versions);
+ }
+ });
+ });
+}
+
+exports.versions = versions;
+
+function shell(callback) {
+ return new Promise((resolve) => {
+ process.nextTick(() => {
+ if (_windows) {
+ resolve('cmd');
+ } else {
+ let result = '';
+ exec('echo $SHELL', function (error, stdout) {
+ if (!error) {
+ result = stdout.toString().split('\n')[0];
+ }
+ if (callback) {
+ callback(result);
+ }
+ resolve(result);
+ });
+ }
+ });
+ });
+}
+
+exports.shell = shell;
+
+function getUniqueMacAdresses() {
+ const ifaces = os.networkInterfaces();
+ let macs = [];
+ for (let dev in ifaces) {
+ if ({}.hasOwnProperty.call(ifaces, dev)) {
+ ifaces[dev].forEach(function (details) {
+ if (details && details.mac && details.mac !== '00:00:00:00:00:00') {
+ const mac = details.mac.toLowerCase();
+ if (macs.indexOf(mac) === -1) {
+ macs.push(mac);
+ }
+ }
+ });
+ }
+ }
+ macs = macs.sort(function (a, b) {
+ if (a < b) { return -1; }
+ if (a > b) { return 1; }
+ return 0;
+ });
+ return macs;
+}
+
+function uuid(callback) {
+ return new Promise((resolve) => {
+ process.nextTick(() => {
+
+ let result = {
+ os: '',
+ hardware: '',
+ macs: getUniqueMacAdresses()
+ };
+ let parts;
+
+ if (_darwin) {
+ exec('system_profiler SPHardwareDataType -json', function (error, stdout) {
+ if (!error) {
+ try {
+ const jsonObj = JSON.parse(stdout.toString());
+ if (jsonObj.SPHardwareDataType && jsonObj.SPHardwareDataType.length > 0) {
+ const spHardware = jsonObj.SPHardwareDataType[0];
+ result.os = spHardware.platform_UUID.toLowerCase();
+ result.hardware = spHardware.serial_number;
+ }
+ } catch (e) {
+ util.noop();
+ }
+ }
+ if (callback) {
+ callback(result);
+ }
+ resolve(result);
+ });
+ }
+ if (_linux) {
+ const cmd = `echo -n "os: "; cat /var/lib/dbus/machine-id 2> /dev/null; echo;
+echo -n "os: "; cat /etc/machine-id 2> /dev/null; echo;
+echo -n "hardware: "; cat /sys/class/dmi/id/product_uuid 2> /dev/null; echo;`;
+ exec(cmd, function (error, stdout) {
+ const lines = stdout.toString().split('\n');
+ result.os = util.getValue(lines, 'os').toLowerCase();
+ result.hardware = util.getValue(lines, 'hardware').toLowerCase();
+ if (!result.hardware) {
+ const lines = fs.readFileSync('/proc/cpuinfo', { encoding: 'utf8' }).toString().split('\n');
+ const serial = util.getValue(lines, 'serial');
+ result.hardware = serial || '';
+ }
+ if (callback) {
+ callback(result);
+ }
+ resolve(result);
+ });
+ }
+ if (_freebsd || _openbsd || _netbsd) {
+ exec('sysctl -i kern.hostid kern.hostuuid', function (error, stdout) {
+ const lines = stdout.toString().split('\n');
+ result.os = util.getValue(lines, 'kern.hostid', ':').toLowerCase();
+ result.hardware = util.getValue(lines, 'kern.hostuuid', ':').toLowerCase();
+ if (result.os.indexOf('unknown') >= 0) { result.os = ''; }
+ if (result.hardware.indexOf('unknown') >= 0) { result.hardware = ''; }
+ if (callback) {
+ callback(result);
+ }
+ resolve(result);
+ });
+ }
+ if (_windows) {
+ let sysdir = '%windir%\\System32';
+ if (process.arch === 'ia32' && Object.prototype.hasOwnProperty.call(process.env, 'PROCESSOR_ARCHITEW6432')) {
+ sysdir = '%windir%\\sysnative\\cmd.exe /c %windir%\\System32';
+ }
+ util.powerShell('Get-WmiObject Win32_ComputerSystemProduct | select UUID | fl').then((stdout) => {
+ let lines = stdout.split('\r\n');
+ result.hardware = util.getValue(lines, 'uuid', ':').toLowerCase();
+ exec(`${sysdir}\\reg query "HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Cryptography" /v MachineGuid`, util.execOptsWin, function (error, stdout) {
+ parts = stdout.toString().split('\n\r')[0].split('REG_SZ');
+ result.os = parts.length > 1 ? parts[1].replace(/\r+|\n+|\s+/ig, '').toLowerCase() : '';
+ if (callback) {
+ callback(result);
+ }
+ resolve(result);
+ });
+ });
+ }
+ });
+ });
+}
+
+exports.uuid = uuid;
diff --git a/node_modules/systeminformation/lib/printer.js b/node_modules/systeminformation/lib/printer.js
new file mode 100644
index 0000000..b437489
--- /dev/null
+++ b/node_modules/systeminformation/lib/printer.js
@@ -0,0 +1,210 @@
+'use strict';
+// @ts-check
+// ==================================================================================
+// printers.js
+// ----------------------------------------------------------------------------------
+// Description: System Information - library
+// for Node.js
+// Copyright: (c) 2014 - 2022
+// Author: Sebastian Hildebrandt
+// ----------------------------------------------------------------------------------
+// License: MIT
+// ==================================================================================
+// 15. printers
+// ----------------------------------------------------------------------------------
+
+const exec = require('child_process').exec;
+const util = require('./util');
+
+let _platform = process.platform;
+
+const _linux = (_platform === 'linux' || _platform === 'android');
+const _darwin = (_platform === 'darwin');
+const _windows = (_platform === 'win32');
+const _freebsd = (_platform === 'freebsd');
+const _openbsd = (_platform === 'openbsd');
+const _netbsd = (_platform === 'netbsd');
+const _sunos = (_platform === 'sunos');
+
+const winPrinterStatus = {
+ 1: 'Other',
+ 2: 'Unknown',
+ 3: 'Idle',
+ 4: 'Printing',
+ 5: 'Warmup',
+ 6: 'Stopped Printing',
+ 7: 'Offline',
+};
+
+function parseLinuxCupsHeader(lines) {
+ const result = {};
+ if (lines && lines.length) {
+ if (lines[0].indexOf(' CUPS v') > 0) {
+ const parts = lines[0].split(' CUPS v');
+ result.cupsVersion = parts[1];
+ }
+ }
+ return result;
+}
+
+function parseLinuxCupsPrinter(lines) {
+ const result = {};
+ const printerId = util.getValue(lines, 'PrinterId', ' ');
+ result.id = printerId ? parseInt(printerId, 10) : null;
+ result.name = util.getValue(lines, 'Info', ' ');
+ result.model = lines.length > 0 && lines[0] ? lines[0].split(' ')[0] : '';
+ result.uri = util.getValue(lines, 'DeviceURI', ' ');
+ result.uuid = util.getValue(lines, 'UUID', ' ');
+ result.status = util.getValue(lines, 'State', ' ');
+ result.local = util.getValue(lines, 'Location', ' ').toLowerCase().startsWith('local');
+ result.default = null;
+ result.shared = util.getValue(lines, 'Shared', ' ').toLowerCase().startsWith('yes');
+
+ return result;
+}
+
+function parseLinuxLpstatPrinter(lines, id) {
+ const result = {};
+ result.id = id;
+ result.name = util.getValue(lines, 'Description', ':', true);
+ result.model = lines.length > 0 && lines[0] ? lines[0].split(' ')[0] : '';
+ result.uri = null;
+ result.uuid = null;
+ result.status = lines.length > 0 && lines[0] ? (lines[0].indexOf(' idle') > 0 ? 'idle' : (lines[0].indexOf(' printing') > 0 ? 'printing' : 'unknown')) : null;
+ result.local = util.getValue(lines, 'Location', ':', true).toLowerCase().startsWith('local');
+ result.default = null;
+ result.shared = util.getValue(lines, 'Shared', ' ').toLowerCase().startsWith('yes');
+
+ return result;
+}
+
+function parseDarwinPrinters(printerObject, id) {
+ const result = {};
+ const uriParts = printerObject.uri.split('/');
+ result.id = id;
+ result.name = printerObject._name;
+ result.model = uriParts.length ? uriParts[uriParts.length - 1] : '';
+ result.uri = printerObject.uri;
+ result.uuid = null;
+ result.status = printerObject.status;
+ result.local = printerObject.printserver === 'local';
+ result.default = printerObject.default === 'yes';
+ result.shared = printerObject.shared === 'yes';
+
+ return result;
+}
+
+function parseWindowsPrinters(lines, id) {
+ const result = {};
+ const status = parseInt(util.getValue(lines, 'PrinterStatus', ':'), 10);
+
+ result.id = id;
+ result.name = util.getValue(lines, 'name', ':');
+ result.model = util.getValue(lines, 'DriverName', ':');
+ result.uri = null;
+ result.uuid = null;
+ result.status = winPrinterStatus[status] ? winPrinterStatus[status] : null;
+ result.local = util.getValue(lines, 'Local', ':').toUpperCase() === 'TRUE';
+ result.default = util.getValue(lines, 'Default', ':').toUpperCase() === 'TRUE';
+ result.shared = util.getValue(lines, 'Shared', ':').toUpperCase() === 'TRUE';
+
+ return result;
+}
+
+function printer(callback) {
+
+ return new Promise((resolve) => {
+ process.nextTick(() => {
+ let result = [];
+ if (_linux || _freebsd || _openbsd || _netbsd) {
+ let cmd = 'cat /etc/cups/printers.conf 2>/dev/null';
+ exec(cmd, function (error, stdout) {
+ // printers.conf
+ if (!error) {
+ const parts = stdout.toString().split('<Printer ');
+ const printerHeader = parseLinuxCupsHeader(parts[0]);
+ for (let i = 1; i < parts.length; i++) {
+ const printers = parseLinuxCupsPrinter(parts[i].split('\n'));
+ if (printers.name) {
+ printers.engine = 'CUPS';
+ printers.engineVersion = printerHeader.cupsVersion;
+ result.push(printers);
+ }
+ }
+ }
+ if (result.length === 0) {
+ if (_linux) {
+ cmd = 'export LC_ALL=C; lpstat -lp 2>/dev/null; unset LC_ALL';
+ // lpstat
+ exec(cmd, function (error, stdout) {
+ const parts = ('\n' + stdout.toString()).split('\nprinter ');
+ for (let i = 1; i < parts.length; i++) {
+ const printers = parseLinuxLpstatPrinter(parts[i].split('\n'), i);
+ result.push(printers);
+ }
+ });
+ if (callback) {
+ callback(result);
+ }
+ resolve(result);
+ } else {
+ if (callback) {
+ callback(result);
+ }
+ resolve(result);
+ }
+ } else {
+ if (callback) {
+ callback(result);
+ }
+ resolve(result);
+ }
+ });
+ }
+ if (_darwin) {
+ let cmd = 'system_profiler SPPrintersDataType -json';
+ exec(cmd, function (error, stdout) {
+ if (!error) {
+ try {
+ const outObj = JSON.parse(stdout.toString());
+ if (outObj.SPPrintersDataType && outObj.SPPrintersDataType.length) {
+ for (let i = 0; i < outObj.SPPrintersDataType.length; i++) {
+ const printer = parseDarwinPrinters(outObj.SPPrintersDataType[i], i);
+ result.push(printer);
+ }
+ }
+ } catch (e) {
+ util.noop();
+ }
+ }
+ if (callback) {
+ callback(result);
+ }
+ resolve(result);
+ });
+ }
+ if (_windows) {
+ util.powerShell('Get-WmiObject Win32_Printer | select PrinterStatus,Name,DriverName,Local,Default,Shared | fl').then((stdout, error) => {
+ if (!error) {
+ const parts = stdout.toString().split(/\n\s*\n/);
+ for (let i = 0; i < parts.length; i++) {
+ const printer = parseWindowsPrinters(parts[i].split('\n'), i);
+ if (printer.name || printer.model) {
+ result.push(parseWindowsPrinters(parts[i].split('\n'), i));
+ }
+ }
+ }
+ if (callback) {
+ callback(result);
+ }
+ resolve(result);
+ });
+ }
+ if (_sunos) {
+ resolve(null);
+ }
+ });
+ });
+}
+
+exports.printer = printer;
diff --git a/node_modules/systeminformation/lib/processes.js b/node_modules/systeminformation/lib/processes.js
new file mode 100644
index 0000000..f52a3d1
--- /dev/null
+++ b/node_modules/systeminformation/lib/processes.js
@@ -0,0 +1,1274 @@
+'use strict';
+// @ts-check
+// ==================================================================================
+// processes.js
+// ----------------------------------------------------------------------------------
+// Description: System Information - library
+// for Node.js
+// Copyright: (c) 2014 - 2022
+// Author: Sebastian Hildebrandt
+// ----------------------------------------------------------------------------------
+// License: MIT
+// ==================================================================================
+// 10. Processes
+// ----------------------------------------------------------------------------------
+
+const os = require('os');
+const fs = require('fs');
+const path = require('path');
+const exec = require('child_process').exec;
+const execSync = require('child_process').execSync;
+
+const util = require('./util');
+
+let _platform = process.platform;
+
+const _linux = (_platform === 'linux' || _platform === 'android');
+const _darwin = (_platform === 'darwin');
+const _windows = (_platform === 'win32');
+const _freebsd = (_platform === 'freebsd');
+const _openbsd = (_platform === 'openbsd');
+const _netbsd = (_platform === 'netbsd');
+const _sunos = (_platform === 'sunos');
+
+const _processes_cpu = {
+ all: 0,
+ all_utime: 0,
+ all_stime: 0,
+ list: {},
+ ms: 0,
+ result: {}
+};
+const _services_cpu = {
+ all: 0,
+ all_utime: 0,
+ all_stime: 0,
+ list: {},
+ ms: 0,
+ result: {}
+};
+const _process_cpu = {
+ all: 0,
+ all_utime: 0,
+ all_stime: 0,
+ list: {},
+ ms: 0,
+ result: {}
+};
+
+const _winStatusValues = {
+ '0': 'unknown',
+ '1': 'other',
+ '2': 'ready',
+ '3': 'running',
+ '4': 'blocked',
+ '5': 'suspended blocked',
+ '6': 'suspended ready',
+ '7': 'terminated',
+ '8': 'stopped',
+ '9': 'growing',
+};
+
+
+function parseTimeWin(time) {
+ time = time || '';
+ if (time) {
+ return (time.substr(0, 4) + '-' + time.substr(4, 2) + '-' + time.substr(6, 2) + ' ' + time.substr(8, 2) + ':' + time.substr(10, 2) + ':' + time.substr(12, 2));
+ } else {
+ return '';
+ }
+}
+
+function parseTimeUnix(time) {
+ let result = time;
+ let parts = time.replace(/ +/g, ' ').split(' ');
+ if (parts.length === 5) {
+ result = parts[4] + '-' + ('0' + ('JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC'.indexOf(parts[1].toUpperCase()) / 3 + 1)).slice(-2) + '-' + ('0' + parts[2]).slice(-2) + ' ' + parts[3];
+ }
+ return result;
+}
+
+function parseElapsedTime(etime) {
+ let current = new Date();
+ current = new Date(current.getTime() - current.getTimezoneOffset() * 60000);
+
+ const elapsed = etime.split('-');
+
+ const timeIndex = elapsed.length - 1;
+ const days = timeIndex > 0 ? parseInt(elapsed[timeIndex - 1]) : 0;
+
+ const timeStr = elapsed[timeIndex].split(':');
+ const hours = timeStr.length === 3 ? parseInt(timeStr[0] || 0) : 0;
+ const mins = parseInt(timeStr[timeStr.length === 3 ? 1 : 0] || 0);
+ const secs = parseInt(timeStr[timeStr.length === 3 ? 2 : 1] || 0);
+ const ms = (((((days * 24 + hours) * 60) + mins) * 60 + secs) * 1000);
+
+ const res = new Date(current.getTime() - ms);
+ return res.toISOString().substring(0, 10) + ' ' + res.toISOString().substring(11, 19);
+}
+
+// --------------------------
+// PS - services
+// pass a comma separated string with services to check (mysql, apache, postgresql, ...)
+// this function gives an array back, if the services are running.
+
+function services(srv, callback) {
+
+ // fallback - if only callback is given
+ if (util.isFunction(srv) && !callback) {
+ callback = srv;
+ srv = '';
+ }
+
+ return new Promise((resolve) => {
+ process.nextTick(() => {
+ if (typeof srv !== 'string') {
+ if (callback) { callback([]); }
+ return resolve([]);
+ }
+
+ if (srv) {
+ let srvString = '';
+ srvString.__proto__.toLowerCase = util.stringToLower;
+ srvString.__proto__.replace = util.stringReplace;
+ srvString.__proto__.trim = util.stringTrim;
+
+ const s = util.sanitizeShellString(srv);
+ for (let i = 0; i <= util.mathMin(s.length, 2000); i++) {
+ if (s[i] !== undefined) {
+ srvString = srvString + s[i];
+ }
+ }
+
+ srvString = srvString.trim().toLowerCase().replace(/, /g, '|').replace(/,+/g, '|');
+ if (srvString === '') {
+ srvString = '*';
+ }
+ if (util.isPrototypePolluted() && srvString !== '*') {
+ srvString = '------';
+ }
+ let srvs = srvString.split('|');
+ let result = [];
+ let dataSrv = [];
+
+ if (_linux || _freebsd || _openbsd || _netbsd || _darwin) {
+ if ((_linux || _freebsd || _openbsd || _netbsd) && srvString === '*') {
+ try {
+ const tmpsrv = execSync('systemctl --type=service --no-legend 2> /dev/null').toString().split('\n');
+ srvs = [];
+ for (const s of tmpsrv) {
+ const name = s.split('.service')[0];
+ if (name) {
+ srvs.push(name.trim());
+ }
+ }
+ srvString = srvs.join('|');
+ } catch (d) {
+ try {
+ srvString = '';
+ const tmpsrv = execSync('service --status-all 2> /dev/null').toString().split('\n');
+ for (const s of tmpsrv) {
+ const parts = s.split(']');
+ if (parts.length === 2) {
+ srvString += (srvString !== '' ? '|' : '') + parts[1].trim();
+ }
+ }
+ srvs = srvString.split('|');
+ } catch (e) {
+ try {
+ const srvStr = execSync('ls /etc/init.d/ -m 2> /dev/null').toString().split('\n').join('');
+ srvString = '';
+ if (srvStr) {
+ const tmpsrv = srvStr.split(',');
+ for (const s of tmpsrv) {
+ const name = s.trim();
+ if (name) {
+ srvString += (srvString !== '' ? '|' : '') + name;
+ }
+ }
+ srvs = srvString.split('|');
+ }
+ } catch (f) {
+ srvString = '';
+ srvs = [];
+ }
+ }
+ }
+ }
+ if ((_darwin) && srvString === '*') { // service enumeration not yet suported on mac OS
+ if (callback) { callback(result); }
+ resolve(result);
+ }
+ let args = (_darwin) ? ['-caxo', 'pcpu,pmem,pid,command'] : ['-axo', 'pcpu,pmem,pid,command'];
+ if (srvString !== '' && srvs.length > 0) {
+ util.execSafe('ps', args).then((stdout) => {
+ if (stdout) {
+ let lines = stdout.replace(/ +/g, ' ').replace(/,+/g, '.').split('\n');
+ srvs.forEach(function (srv) {
+ let ps;
+ if (_darwin) {
+ ps = lines.filter(function (e) {
+ return (e.toLowerCase().indexOf(srv) !== -1);
+ });
+
+ } else {
+ ps = lines.filter(function (e) {
+ return (e.toLowerCase().indexOf(' ' + srv + ':') !== -1) || (e.toLowerCase().indexOf('/' + srv) !== -1);
+ });
+ }
+ const pids = [];
+ for (const p of ps) {
+ const pid = p.trim().split(' ')[2];
+ if (pid) {
+ pids.push(parseInt(pid, 10));
+ }
+ }
+ result.push({
+ name: srv,
+ running: ps.length > 0,
+ startmode: '',
+ pids: pids,
+ cpu: parseFloat((ps.reduce(function (pv, cv) {
+ return pv + parseFloat(cv.trim().split(' ')[0]);
+ }, 0)).toFixed(2)),
+ mem: parseFloat((ps.reduce(function (pv, cv) {
+ return pv + parseFloat(cv.trim().split(' ')[1]);
+ }, 0)).toFixed(2))
+ });
+ });
+ if (_linux) {
+ // calc process_cpu - ps is not accurate in linux!
+ let cmd = 'cat /proc/stat | grep "cpu "';
+ for (let i in result) {
+ for (let j in result[i].pids) {
+ cmd += (';cat /proc/' + result[i].pids[j] + '/stat');
+ }
+ }
+ exec(cmd, { maxBuffer: 1024 * 20000 }, function (error, stdout) {
+ let curr_processes = stdout.toString().split('\n');
+
+ // first line (all - /proc/stat)
+ let all = parseProcStat(curr_processes.shift());
+
+ // process
+ let list_new = {};
+ let resultProcess = {};
+ curr_processes.forEach((element) => {
+ resultProcess = calcProcStatLinux(element, all, _services_cpu);
+
+ if (resultProcess.pid) {
+ let listPos = -1;
+ for (let i in result) {
+ for (let j in result[i].pids) {
+ if (parseInt(result[i].pids[j]) === parseInt(resultProcess.pid)) {
+ listPos = i;
+ }
+ }
+ }
+ if (listPos >= 0) {
+ result[listPos].cpu += resultProcess.cpuu + resultProcess.cpus;
+ }
+
+ // save new values
+ list_new[resultProcess.pid] = {
+ cpuu: resultProcess.cpuu,
+ cpus: resultProcess.cpus,
+ utime: resultProcess.utime,
+ stime: resultProcess.stime,
+ cutime: resultProcess.cutime,
+ cstime: resultProcess.cstime
+ };
+ }
+ });
+
+ // store old values
+ _services_cpu.all = all;
+ _services_cpu.list = Object.assign({}, list_new);
+ _services_cpu.ms = Date.now() - _services_cpu.ms;
+ _services_cpu.result = Object.assign({}, result);
+ if (callback) { callback(result); }
+ resolve(result);
+ });
+ } else {
+ if (callback) { callback(result); }
+ resolve(result);
+ }
+ } else {
+ args = ['-o', 'comm'];
+ util.execSafe('ps', args).then((stdout) => {
+ if (stdout) {
+ let lines = stdout.replace(/ +/g, ' ').replace(/,+/g, '.').split('\n');
+ srvs.forEach(function (srv) {
+ let ps = lines.filter(function (e) {
+ return e.indexOf(srv) !== -1;
+ });
+ result.push({
+ name: srv,
+ running: ps.length > 0,
+ startmode: '',
+ cpu: 0,
+ mem: 0
+ });
+ });
+ if (callback) { callback(result); }
+ resolve(result);
+ } else {
+ srvs.forEach(function (srv) {
+ result.push({
+ name: srv,
+ running: false,
+ startmode: '',
+ cpu: 0,
+ mem: 0
+ });
+ });
+ if (callback) { callback(result); }
+ resolve(result);
+ }
+ });
+ }
+ });
+ } else {
+ if (callback) { callback(result); }
+ resolve(result);
+ }
+ }
+ if (_windows) {
+ try {
+ let wincommand = 'Get-WmiObject Win32_Service';
+ if (srvs[0] !== '*') {
+ wincommand += ' -Filter "';
+ srvs.forEach((srv) => {
+ wincommand += `Name='${srv}' or `;
+ });
+ wincommand = `${wincommand.slice(0, -4)}"`;
+ }
+ wincommand += ' | select Name,Caption,Started,StartMode,ProcessId | fl';
+ util.powerShell(wincommand).then((stdout, error) => {
+ if (!error) {
+ let serviceSections = stdout.split(/\n\s*\n/);
+ serviceSections.forEach((element) => {
+ if (element.trim() !== '') {
+ let lines = element.trim().split('\r\n');
+ let srvName = util.getValue(lines, 'Name', ':', true).toLowerCase();
+ let srvCaption = util.getValue(lines, 'Caption', ':', true).toLowerCase();
+ let started = util.getValue(lines, 'Started', ':', true);
+ let startMode = util.getValue(lines, 'StartMode', ':', true);
+ let pid = util.getValue(lines, 'ProcessId', ':', true);
+ if (srvString === '*' || srvs.indexOf(srvName) >= 0 || srvs.indexOf(srvCaption) >= 0) {
+ result.push({
+ name: srvName,
+ running: (started.toLowerCase() === 'true'),
+ startmode: startMode,
+ pids: [pid],
+ cpu: 0,
+ mem: 0
+ });
+ dataSrv.push(srvName);
+ dataSrv.push(srvCaption);
+ }
+ }
+
+ });
+
+ if (srvString !== '*') {
+ let srvsMissing = srvs.filter(function (e) {
+ return dataSrv.indexOf(e) === -1;
+ });
+ srvsMissing.forEach(function (srvName) {
+ result.push({
+ name: srvName,
+ running: false,
+ startmode: '',
+ pids: [],
+ cpu: 0,
+ mem: 0
+ });
+ });
+ }
+ if (callback) { callback(result); }
+ resolve(result);
+ } else {
+ srvs.forEach(function (srvName) {
+ result.push({
+ name: srvName,
+ running: false,
+ startmode: '',
+ cpu: 0,
+ mem: 0
+ });
+ });
+ if (callback) { callback(result); }
+ resolve(result);
+ }
+ });
+ } catch (e) {
+ if (callback) { callback(result); }
+ resolve(result);
+ }
+ }
+ } else {
+ if (callback) { callback([]); }
+ resolve([]);
+ }
+ });
+ });
+}
+
+exports.services = services;
+
+function parseProcStat(line) {
+ let parts = line.replace(/ +/g, ' ').split(' ');
+ let user = (parts.length >= 2 ? parseInt(parts[1]) : 0);
+ let nice = (parts.length >= 3 ? parseInt(parts[2]) : 0);
+ let system = (parts.length >= 4 ? parseInt(parts[3]) : 0);
+ let idle = (parts.length >= 5 ? parseInt(parts[4]) : 0);
+ let iowait = (parts.length >= 6 ? parseInt(parts[5]) : 0);
+ let irq = (parts.length >= 7 ? parseInt(parts[6]) : 0);
+ let softirq = (parts.length >= 8 ? parseInt(parts[7]) : 0);
+ let steal = (parts.length >= 9 ? parseInt(parts[8]) : 0);
+ let guest = (parts.length >= 10 ? parseInt(parts[9]) : 0);
+ let guest_nice = (parts.length >= 11 ? parseInt(parts[10]) : 0);
+ return user + nice + system + idle + iowait + irq + softirq + steal + guest + guest_nice;
+}
+
+function calcProcStatLinux(line, all, _cpu_old) {
+ let statparts = line.replace(/ +/g, ' ').split(')');
+ if (statparts.length >= 2) {
+ let parts = statparts[1].split(' ');
+ if (parts.length >= 16) {
+ let pid = parseInt(statparts[0].split(' ')[0]);
+ let utime = parseInt(parts[12]);
+ let stime = parseInt(parts[13]);
+ let cutime = parseInt(parts[14]);
+ let cstime = parseInt(parts[15]);
+
+ // calc
+ let cpuu = 0;
+ let cpus = 0;
+ if (_cpu_old.all > 0 && _cpu_old.list[pid]) {
+ cpuu = (utime + cutime - _cpu_old.list[pid].utime - _cpu_old.list[pid].cutime) / (all - _cpu_old.all) * 100; // user
+ cpus = (stime + cstime - _cpu_old.list[pid].stime - _cpu_old.list[pid].cstime) / (all - _cpu_old.all) * 100; // system
+ } else {
+ cpuu = (utime + cutime) / (all) * 100; // user
+ cpus = (stime + cstime) / (all) * 100; // system
+ }
+ return {
+ pid: pid,
+ utime: utime,
+ stime: stime,
+ cutime: cutime,
+ cstime: cstime,
+ cpuu: cpuu,
+ cpus: cpus
+ };
+ } else {
+ return {
+ pid: 0,
+ utime: 0,
+ stime: 0,
+ cutime: 0,
+ cstime: 0,
+ cpuu: 0,
+ cpus: 0
+ };
+ }
+ } else {
+ return {
+ pid: 0,
+ utime: 0,
+ stime: 0,
+ cutime: 0,
+ cstime: 0,
+ cpuu: 0,
+ cpus: 0
+ };
+ }
+}
+
+function calcProcStatWin(procStat, all, _cpu_old) {
+ // calc
+ let cpuu = 0;
+ let cpus = 0;
+ if (_cpu_old.all > 0 && _cpu_old.list[procStat.pid]) {
+ cpuu = (procStat.utime - _cpu_old.list[procStat.pid].utime) / (all - _cpu_old.all) * 100; // user
+ cpus = (procStat.stime - _cpu_old.list[procStat.pid].stime) / (all - _cpu_old.all) * 100; // system
+ } else {
+ cpuu = (procStat.utime) / (all) * 100; // user
+ cpus = (procStat.stime) / (all) * 100; // system
+ }
+ return {
+ pid: procStat.pid,
+ utime: cpuu > 0 ? procStat.utime : 0,
+ stime: cpus > 0 ? procStat.stime : 0,
+ cpuu: cpuu > 0 ? cpuu : 0,
+ cpus: cpus > 0 ? cpus : 0
+ };
+}
+
+
+
+// --------------------------
+// running processes
+
+function processes(callback) {
+
+ let parsedhead = [];
+
+ function getName(command) {
+ command = command || '';
+ let result = command.split(' ')[0];
+ if (result.substr(-1) === ':') {
+ result = result.substr(0, result.length - 1);
+ }
+ if (result.substr(0, 1) !== '[') {
+ let parts = result.split('/');
+ if (isNaN(parseInt(parts[parts.length - 1]))) {
+ result = parts[parts.length - 1];
+ } else {
+ result = parts[0];
+ }
+ }
+ return result;
+ }
+
+ function parseLine(line) {
+
+ let offset = 0;
+ let offset2 = 0;
+
+ function checkColumn(i) {
+ offset = offset2;
+ if (parsedhead[i]) {
+ offset2 = line.substring(parsedhead[i].to + offset, 10000).indexOf(' ');
+ } else {
+ offset2 = 10000;
+ }
+ }
+
+ checkColumn(0);
+ const pid = parseInt(line.substring(parsedhead[0].from + offset, parsedhead[0].to + offset2));
+ checkColumn(1);
+ const ppid = parseInt(line.substring(parsedhead[1].from + offset, parsedhead[1].to + offset2));
+ checkColumn(2);
+ const cpu = parseFloat(line.substring(parsedhead[2].from + offset, parsedhead[2].to + offset2).replace(/,/g, '.'));
+ checkColumn(3);
+ const mem = parseFloat(line.substring(parsedhead[3].from + offset, parsedhead[3].to + offset2).replace(/,/g, '.'));
+ checkColumn(4);
+ const priority = parseInt(line.substring(parsedhead[4].from + offset, parsedhead[4].to + offset2));
+ checkColumn(5);
+ const vsz = parseInt(line.substring(parsedhead[5].from + offset, parsedhead[5].to + offset2));
+ checkColumn(6);
+ const rss = parseInt(line.substring(parsedhead[6].from + offset, parsedhead[6].to + offset2));
+ checkColumn(7);
+ const nice = parseInt(line.substring(parsedhead[7].from + offset, parsedhead[7].to + offset2)) || 0;
+ checkColumn(8);
+ const started = !_sunos ? parseElapsedTime(line.substring(parsedhead[8].from + offset, parsedhead[8].to + offset2).trim()) : parseTimeUnix(line.substring(parsedhead[8].from + offset, parsedhead[8].to + offset2).trim());
+ checkColumn(9);
+ let state = line.substring(parsedhead[9].from + offset, parsedhead[9].to + offset2).trim();
+ state = (state[0] === 'R' ? 'running' : (state[0] === 'S' ? 'sleeping' : (state[0] === 'T' ? 'stopped' : (state[0] === 'W' ? 'paging' : (state[0] === 'X' ? 'dead' : (state[0] === 'Z' ? 'zombie' : ((state[0] === 'D' || state[0] === 'U') ? 'blocked' : 'unknown')))))));
+ checkColumn(10);
+ let tty = line.substring(parsedhead[10].from + offset, parsedhead[10].to + offset2).trim();
+ if (tty === '?' || tty === '??') { tty = ''; }
+ checkColumn(11);
+ const user = line.substring(parsedhead[11].from + offset, parsedhead[11].to + offset2).trim();
+ checkColumn(12);
+ let cmdPath = '';
+ let command = '';
+ let params = '';
+ let fullcommand = line.substring(parsedhead[12].from + offset, parsedhead[12].to + offset2).trim();
+ if (fullcommand.substr(fullcommand.length - 1) === ']') { fullcommand = fullcommand.slice(0, -1); }
+ if (fullcommand.substr(0, 1) === '[') { command = fullcommand.substring(1); }
+ else {
+ const p1 = fullcommand.indexOf('(');
+ const p2 = fullcommand.indexOf(')');
+ const p3 = fullcommand.indexOf('/');
+ const p4 = fullcommand.indexOf(':');
+ if (p1 < p2 && p1 < p3 && p3 < p2) {
+ command = fullcommand.split(' ')[0];
+ command = command.replace(/:/g, '');
+ } else {
+ if (p4 > 0 && (p3 === -1 || p3 > 3)) {
+ command = fullcommand.split(' ')[0];
+ command = command.replace(/:/g, '');
+ } else {
+ // try to figure out where parameter starts
+ let firstParamPos = fullcommand.indexOf(' -');
+ let firstParamPathPos = fullcommand.indexOf(' /');
+ firstParamPos = (firstParamPos >= 0 ? firstParamPos : 10000);
+ firstParamPathPos = (firstParamPathPos >= 0 ? firstParamPathPos : 10000);
+ const firstPos = Math.min(firstParamPos, firstParamPathPos);
+ let tmpCommand = fullcommand.substr(0, firstPos);
+ const tmpParams = fullcommand.substr(firstPos);
+ const lastSlashPos = tmpCommand.lastIndexOf('/');
+ if (lastSlashPos >= 0) {
+ cmdPath = tmpCommand.substr(0, lastSlashPos);
+ tmpCommand = tmpCommand.substr(lastSlashPos + 1);
+ }
+
+ if (firstPos === 10000 && tmpCommand.indexOf(' ') > -1) {
+ const parts = tmpCommand.split(' ');
+ if (fs.existsSync(path.join(cmdPath, parts[0]))) {
+ command = parts.shift();
+ params = (parts.join(' ') + ' ' + tmpParams).trim();
+ } else {
+ command = tmpCommand.trim();
+ params = tmpParams.trim();
+ }
+ } else {
+ command = tmpCommand.trim();
+ params = tmpParams.trim();
+ }
+ }
+ }
+
+ }
+
+ return ({
+ pid: pid,
+ parentPid: ppid,
+ name: _linux ? getName(command) : command,
+ cpu: cpu,
+ cpuu: 0,
+ cpus: 0,
+ mem: mem,
+ priority: priority,
+ memVsz: vsz,
+ memRss: rss,
+ nice: nice,
+ started: started,
+ state: state,
+ tty: tty,
+ user: user,
+ command: command,
+ params: params,
+ path: cmdPath
+ });
+ }
+
+ function parseProcesses(lines) {
+ let result = [];
+ if (lines.length > 1) {
+ let head = lines[0];
+ parsedhead = util.parseHead(head, 8);
+ lines.shift();
+ lines.forEach(function (line) {
+ if (line.trim() !== '') {
+ result.push(parseLine(line));
+ }
+ });
+ }
+ return result;
+ }
+ function parseProcesses2(lines) {
+
+ function formatDateTime(time) {
+ const month = ('0' + (time.getMonth() + 1).toString()).substr(-2);
+ const year = time.getFullYear().toString();
+ const day = ('0' + time.getDay().toString()).substr(-2);
+ const hours = time.getHours().toString();
+ const mins = time.getMinutes().toString();
+ const secs = ('0' + time.getSeconds().toString()).substr(-2);
+
+ return (year + '-' + month + '-' + day + ' ' + hours + ':' + mins + ':' + secs);
+ }
+
+ let result = [];
+ lines.forEach(function (line) {
+ if (line.trim() !== '') {
+ line = line.trim().replace(/ +/g, ' ').replace(/,+/g, '.');
+ const parts = line.split(' ');
+ const command = parts.slice(9).join(' ');
+ const pmem = parseFloat((1.0 * parseInt(parts[3]) * 1024 / os.totalmem()).toFixed(1));
+ const elapsed_parts = parts[5].split(':');
+ const started = formatDateTime(new Date(Date.now() - (elapsed_parts.length > 1 ? (elapsed_parts[0] * 60 + elapsed_parts[1]) * 1000 : elapsed_parts[0] * 1000)));
+
+ result.push({
+ pid: parseInt(parts[0]),
+ parentPid: parseInt(parts[1]),
+ name: getName(command),
+ cpu: 0,
+ cpuu: 0,
+ cpus: 0,
+ mem: pmem,
+ priority: 0,
+ memVsz: parseInt(parts[2]),
+ memRss: parseInt(parts[3]),
+ nice: parseInt(parts[4]),
+ started: started,
+ state: (parts[6] === 'R' ? 'running' : (parts[6] === 'S' ? 'sleeping' : (parts[6] === 'T' ? 'stopped' : (parts[6] === 'W' ? 'paging' : (parts[6] === 'X' ? 'dead' : (parts[6] === 'Z' ? 'zombie' : ((parts[6] === 'D' || parts[6] === 'U') ? 'blocked' : 'unknown'))))))),
+ tty: parts[7],
+ user: parts[8],
+ command: command
+ });
+ }
+ });
+ return result;
+ }
+
+ return new Promise((resolve) => {
+ process.nextTick(() => {
+ let result = {
+ all: 0,
+ running: 0,
+ blocked: 0,
+ sleeping: 0,
+ unknown: 0,
+ list: []
+ };
+
+ let cmd = '';
+
+ if ((_processes_cpu.ms && Date.now() - _processes_cpu.ms >= 500) || _processes_cpu.ms === 0) {
+ if (_linux || _freebsd || _openbsd || _netbsd || _darwin || _sunos) {
+ if (_linux) { cmd = 'export LC_ALL=C; ps -axo pid:11,ppid:11,pcpu:6,pmem:6,pri:5,vsz:11,rss:11,ni:5,etime:30,state:5,tty:15,user:20,command; unset LC_ALL'; }
+ if (_freebsd || _openbsd || _netbsd) { cmd = 'export LC_ALL=C; ps -axo pid,ppid,pcpu,pmem,pri,vsz,rss,ni,etime,state,tty,user,command; unset LC_ALL'; }
+ if (_darwin) { cmd = 'ps -axo pid,ppid,pcpu,pmem,pri,vsz=temp_title_1,rss=temp_title_2,nice,etime=temp_title_3,state,tty,user,command -r'; }
+ if (_sunos) { cmd = 'ps -Ao pid,ppid,pcpu,pmem,pri,vsz,rss,nice,stime,s,tty,user,comm'; }
+ exec(cmd, { maxBuffer: 1024 * 20000 }, function (error, stdout) {
+ if (!error && stdout.toString().trim()) {
+ result.list = (parseProcesses(stdout.toString().split('\n'))).slice();
+ result.all = result.list.length;
+ result.running = result.list.filter(function (e) {
+ return e.state === 'running';
+ }).length;
+ result.blocked = result.list.filter(function (e) {
+ return e.state === 'blocked';
+ }).length;
+ result.sleeping = result.list.filter(function (e) {
+ return e.state === 'sleeping';
+ }).length;
+
+ if (_linux) {
+ // calc process_cpu - ps is not accurate in linux!
+ cmd = 'cat /proc/stat | grep "cpu "';
+ result.list.forEach((element) => {
+ cmd += (';cat /proc/' + element.pid + '/stat');
+ });
+ exec(cmd, { maxBuffer: 1024 * 20000 }, function (error, stdout) {
+ let curr_processes = stdout.toString().split('\n');
+
+ // first line (all - /proc/stat)
+ let all = parseProcStat(curr_processes.shift());
+
+ // process
+ let list_new = {};
+ let resultProcess = {};
+ curr_processes.forEach((element) => {
+ resultProcess = calcProcStatLinux(element, all, _processes_cpu);
+
+ if (resultProcess.pid) {
+
+ // store pcpu in outer array
+ let listPos = result.list.map(function (e) { return e.pid; }).indexOf(resultProcess.pid);
+ if (listPos >= 0) {
+ result.list[listPos].cpu = resultProcess.cpuu + resultProcess.cpus;
+ result.list[listPos].cpuu = resultProcess.cpuu;
+ result.list[listPos].cpus = resultProcess.cpus;
+ }
+
+ // save new values
+ list_new[resultProcess.pid] = {
+ cpuu: resultProcess.cpuu,
+ cpus: resultProcess.cpus,
+ utime: resultProcess.utime,
+ stime: resultProcess.stime,
+ cutime: resultProcess.cutime,
+ cstime: resultProcess.cstime
+ };
+ }
+ });
+
+ // store old values
+ _processes_cpu.all = all;
+ _processes_cpu.list = Object.assign({}, list_new);
+ _processes_cpu.ms = Date.now() - _processes_cpu.ms;
+ _processes_cpu.result = Object.assign({}, result);
+ if (callback) { callback(result); }
+ resolve(result);
+ });
+ } else {
+ if (callback) { callback(result); }
+ resolve(result);
+ }
+ } else {
+ cmd = 'ps -o pid,ppid,vsz,rss,nice,etime,stat,tty,user,comm';
+ if (_sunos) {
+ cmd = 'ps -o pid,ppid,vsz,rss,nice,etime,s,tty,user,comm';
+ }
+ exec(cmd, { maxBuffer: 1024 * 20000 }, function (error, stdout) {
+ if (!error) {
+ let lines = stdout.toString().split('\n');
+ lines.shift();
+
+ result.list = parseProcesses2(lines).slice();
+ result.all = result.list.length;
+ result.running = result.list.filter(function (e) {
+ return e.state === 'running';
+ }).length;
+ result.blocked = result.list.filter(function (e) {
+ return e.state === 'blocked';
+ }).length;
+ result.sleeping = result.list.filter(function (e) {
+ return e.state === 'sleeping';
+ }).length;
+ if (callback) { callback(result); }
+ resolve(result);
+ } else {
+ if (callback) { callback(result); }
+ resolve(result);
+ }
+ });
+ }
+ });
+ } else if (_windows) {
+ try {
+ util.powerShell('Get-WmiObject Win32_Process | select ProcessId,ParentProcessId,ExecutionState,Caption,CommandLine,ExecutablePath,UserModeTime,KernelModeTime,WorkingSetSize,Priority,PageFileUsage,CreationDate | fl').then((stdout, error) => {
+ if (!error) {
+ let processSections = stdout.split(/\n\s*\n/);
+ let procs = [];
+ let procStats = [];
+ let list_new = {};
+ let allcpuu = 0;
+ let allcpus = 0;
+ processSections.forEach((element) => {
+ if (element.trim() !== '') {
+ let lines = element.trim().split('\r\n');
+ let pid = parseInt(util.getValue(lines, 'ProcessId', ':', true), 10);
+ let parentPid = parseInt(util.getValue(lines, 'ParentProcessId', ':', true), 10);
+ let statusValue = util.getValue(lines, 'ExecutionState', ':');
+ let name = util.getValue(lines, 'Caption', ':', true);
+ let commandLine = util.getValue(lines, 'CommandLine', ':', true);
+ // get additional command line data
+ let additionalCommand = false;
+ lines.forEach((line) => {
+ if (additionalCommand && line.toLowerCase().startsWith(' ')) {
+ commandLine = commandLine + line.trim();
+ } else {
+ additionalCommand = false;
+ }
+ if (line.toLowerCase().startsWith('commandline')) {
+ additionalCommand = true;
+ }
+ });
+ let commandPath = util.getValue(lines, 'ExecutablePath', ':', true);
+ let utime = parseInt(util.getValue(lines, 'UserModeTime', ':', true), 10);
+ let stime = parseInt(util.getValue(lines, 'KernelModeTime', ':', true), 10);
+ let memw = parseInt(util.getValue(lines, 'WorkingSetSize', ':', true), 10);
+ allcpuu = allcpuu + utime;
+ allcpus = allcpus + stime;
+ result.all++;
+ if (!statusValue) { result.unknown++; }
+ if (statusValue === '3') { result.running++; }
+ if (statusValue === '4' || statusValue === '5') { result.blocked++; }
+
+ procStats.push({
+ pid: pid,
+ utime: utime,
+ stime: stime,
+ cpu: 0,
+ cpuu: 0,
+ cpus: 0,
+ });
+ procs.push({
+ pid: pid,
+ parentPid: parentPid,
+ name: name,
+ cpu: 0,
+ cpuu: 0,
+ cpus: 0,
+ mem: memw / os.totalmem() * 100,
+ priority: parseInt(util.getValue(lines, 'Priority', ':', true), 10),
+ memVsz: parseInt(util.getValue(lines, 'PageFileUsage', ':', true), 10),
+ memRss: Math.floor(parseInt(util.getValue(lines, 'WorkingSetSize', ':', true), 10) / 1024),
+ nice: 0,
+ started: parseTimeWin(util.getValue(lines, 'CreationDate', ':', true)),
+ state: (!statusValue ? _winStatusValues[0] : _winStatusValues[statusValue]),
+ tty: '',
+ user: '',
+ command: commandLine || name,
+ path: commandPath,
+ params: ''
+ });
+ }
+ });
+
+ result.sleeping = result.all - result.running - result.blocked - result.unknown;
+ result.list = procs;
+ procStats.forEach((element) => {
+ let resultProcess = calcProcStatWin(element, allcpuu + allcpus, _processes_cpu);
+
+ // store pcpu in outer array
+ let listPos = result.list.map(function (e) { return e.pid; }).indexOf(resultProcess.pid);
+ if (listPos >= 0) {
+ result.list[listPos].cpu = resultProcess.cpuu + resultProcess.cpus;
+ result.list[listPos].cpuu = resultProcess.cpuu;
+ result.list[listPos].cpus = resultProcess.cpus;
+ }
+
+ // save new values
+ list_new[resultProcess.pid] = {
+ cpuu: resultProcess.cpuu,
+ cpus: resultProcess.cpus,
+ utime: resultProcess.utime,
+ stime: resultProcess.stime
+ };
+ });
+
+ // store old values
+ _processes_cpu.all = allcpuu + allcpus;
+ _processes_cpu.all_utime = allcpuu;
+ _processes_cpu.all_stime = allcpus;
+ _processes_cpu.list = Object.assign({}, list_new);
+ _processes_cpu.ms = Date.now() - _processes_cpu.ms;
+ _processes_cpu.result = Object.assign({}, result);
+ }
+ if (callback) {
+ callback(result);
+ }
+ resolve(result);
+ });
+ } catch (e) {
+ if (callback) { callback(result); }
+ resolve(result);
+ }
+ } else {
+ if (callback) { callback(result); }
+ resolve(result);
+ }
+ } else {
+ if (callback) { callback(_processes_cpu.result); }
+ resolve(_processes_cpu.result);
+ }
+ });
+ });
+}
+
+exports.processes = processes;
+
+// --------------------------
+// PS - process load
+// get detailed information about a certain process
+// (PID, CPU-Usage %, Mem-Usage %)
+
+function processLoad(proc, callback) {
+
+ // fallback - if only callback is given
+ if (util.isFunction(proc) && !callback) {
+ callback = proc;
+ proc = '';
+ }
+
+ return new Promise((resolve) => {
+ process.nextTick(() => {
+
+ proc = proc || '';
+
+ if (typeof proc !== 'string') {
+ if (callback) { callback([]); }
+ return resolve([]);
+ }
+
+ let processesString = '';
+ processesString.__proto__.toLowerCase = util.stringToLower;
+ processesString.__proto__.replace = util.stringReplace;
+ processesString.__proto__.trim = util.stringTrim;
+
+ const s = util.sanitizeShellString(proc);
+ for (let i = 0; i <= util.mathMin(s.length, 2000); i++) {
+ if (s[i] !== undefined) {
+ processesString = processesString + s[i];
+ }
+ }
+
+ processesString = processesString.trim().toLowerCase().replace(/, /g, '|').replace(/,+/g, '|');
+ if (processesString === '') {
+ processesString = '*';
+ }
+ if (util.isPrototypePolluted() && processesString !== '*') {
+ processesString = '------';
+ }
+ let processes = processesString.split('|');
+ let result = [];
+
+ const procSanitized = util.isPrototypePolluted() ? '' : util.sanitizeShellString(proc);
+
+ // from here new
+ // let result = {
+ // 'proc': procSanitized,
+ // 'pid': null,
+ // 'cpu': 0,
+ // 'mem': 0
+ // };
+ if (procSanitized && processes.length && processes[0] !== '------') {
+ if (_windows) {
+ try {
+ util.powerShell('Get-WmiObject Win32_Process | select ProcessId,Caption,UserModeTime,KernelModeTime,WorkingSetSize | fl').then((stdout, error) => {
+ if (!error) {
+ let processSections = stdout.split(/\n\s*\n/);
+ let procStats = [];
+ let list_new = {};
+ let allcpuu = 0;
+ let allcpus = 0;
+
+ // go through all processes
+ processSections.forEach((element) => {
+ if (element.trim() !== '') {
+ let lines = element.trim().split('\r\n');
+ let pid = parseInt(util.getValue(lines, 'ProcessId', ':', true), 10);
+ let name = util.getValue(lines, 'Caption', ':', true);
+ let utime = parseInt(util.getValue(lines, 'UserModeTime', ':', true), 10);
+ let stime = parseInt(util.getValue(lines, 'KernelModeTime', ':', true), 10);
+ let mem = parseInt(util.getValue(lines, 'WorkingSetSize', ':', true), 10);
+ allcpuu = allcpuu + utime;
+ allcpus = allcpus + stime;
+
+ procStats.push({
+ pid: pid,
+ name,
+ utime: utime,
+ stime: stime,
+ cpu: 0,
+ cpuu: 0,
+ cpus: 0,
+ mem
+ });
+ let pname = '';
+ let inList = false;
+ processes.forEach(function (proc) {
+ if (name.toLowerCase().indexOf(proc.toLowerCase()) >= 0 && !inList) {
+ inList = true;
+ pname = proc;
+ }
+ });
+
+ if (processesString === '*' || inList) {
+ let processFound = false;
+ result.forEach(function (item) {
+ if (item.proc.toLowerCase() === pname.toLowerCase()) {
+ item.pids.push(pid);
+ item.mem += mem / os.totalmem() * 100;
+ processFound = true;
+ }
+ });
+ if (!processFound) {
+ result.push({
+ proc: pname,
+ pid: pid,
+ pids: [pid],
+ cpu: 0,
+ mem: mem / os.totalmem() * 100
+ });
+ }
+ }
+ }
+ });
+
+ // add missing processes
+ if (processesString !== '*') {
+ let processesMissing = processes.filter(function (name) {
+ return procStats.filter(function (item) { return item.name.toLowerCase().indexOf(name) >= 0; }).length === 0;
+
+ });
+ processesMissing.forEach(function (procName) {
+ result.push({
+ proc: procName,
+ pid: null,
+ pids: [],
+ cpu: 0,
+ mem: 0
+ });
+ });
+ }
+
+ // calculate proc stats for each proc
+ procStats.forEach((element) => {
+ let resultProcess = calcProcStatWin(element, allcpuu + allcpus, _process_cpu);
+
+ let listPos = -1;
+ for (let j = 0; j < result.length; j++) {
+ if (result[j].pid === resultProcess.pid || result[j].pids.indexOf(resultProcess.pid) >= 0) { listPos = j; }
+ }
+ if (listPos >= 0) {
+ result[listPos].cpu += resultProcess.cpuu + resultProcess.cpus;
+ }
+
+ // save new values
+ list_new[resultProcess.pid] = {
+ cpuu: resultProcess.cpuu,
+ cpus: resultProcess.cpus,
+ utime: resultProcess.utime,
+ stime: resultProcess.stime
+ };
+ });
+
+ // store old values
+ _process_cpu.all = allcpuu + allcpus;
+ _process_cpu.all_utime = allcpuu;
+ _process_cpu.all_stime = allcpus;
+ _process_cpu.list = Object.assign({}, list_new);
+ _process_cpu.ms = Date.now() - _process_cpu.ms;
+ _process_cpu.result = JSON.parse(JSON.stringify(result));
+ if (callback) {
+ callback(result);
+ }
+ resolve(result);
+ }
+ });
+ } catch (e) {
+ if (callback) { callback(result); }
+ resolve(result);
+ }
+ }
+
+ if (_darwin || _linux || _freebsd || _openbsd || _netbsd) {
+ const params = ['-axo', 'pid,pcpu,pmem,comm'];
+ util.execSafe('ps', params).then((stdout) => {
+ if (stdout) {
+ let procStats = [];
+ let lines = stdout.toString().split('\n').filter(function (line) {
+ if (processesString === '*') { return true; }
+ if (line.toLowerCase().indexOf('grep') !== -1) { return false; } // remove this??
+ let found = false;
+ processes.forEach(function (item) {
+ found = found || (line.toLowerCase().indexOf(item.toLowerCase()) >= 0);
+ });
+ return found;
+ });
+
+ lines.forEach(function (line) {
+ let data = line.trim().replace(/ +/g, ' ').split(' ');
+ if (data.length > 3) {
+ procStats.push({
+ name: data[3].substring(data[3].lastIndexOf('/') + 1),
+ pid: parseInt(data[0]) || 0,
+ cpu: parseFloat(data[1].replace(',', '.')),
+ mem: parseFloat(data[2].replace(',', '.'))
+ });
+ }
+ });
+
+ procStats.forEach(function (item) {
+ let listPos = -1;
+ let inList = false;
+ let name = '';
+ for (let j = 0; j < result.length; j++) {
+ if (item.name.toLowerCase().indexOf(result[j].proc.toLowerCase()) >= 0) {
+ listPos = j;
+ }
+ }
+ processes.forEach(function (proc) {
+
+ if (item.name.toLowerCase().indexOf(proc.toLowerCase()) >= 0 && !inList) {
+ inList = true;
+ name = proc;
+ }
+ });
+ if ((processesString === '*') || inList) {
+ if (listPos < 0) {
+ result.push({
+ proc: name,
+ pid: item.pid,
+ pids: [item.pid],
+ cpu: item.cpu,
+ mem: item.mem
+ });
+ } else {
+ result[listPos].pids.push(item.pid);
+ result[listPos].cpu += item.cpu;
+ result[listPos].mem += item.mem;
+ }
+ }
+ });
+
+ if (processesString !== '*') {
+ // add missing processes
+ let processesMissing = processes.filter(function (name) {
+ return procStats.filter(function (item) { return item.name.toLowerCase().indexOf(name) >= 0; }).length === 0;
+ });
+ processesMissing.forEach(function (procName) {
+ result.push({
+ proc: procName,
+ pid: null,
+ pids: [],
+ cpu: 0,
+ mem: 0
+ });
+ });
+ }
+ if (_linux) {
+ // calc process_cpu - ps is not accurate in linux!
+ result.forEach(function (item) {
+ item.cpu = 0;
+ });
+ let cmd = 'cat /proc/stat | grep "cpu "';
+ for (let i in result) {
+ for (let j in result[i].pids) {
+ cmd += (';cat /proc/' + result[i].pids[j] + '/stat');
+ }
+ }
+ exec(cmd, { maxBuffer: 1024 * 20000 }, function (error, stdout) {
+ let curr_processes = stdout.toString().split('\n');
+
+ // first line (all - /proc/stat)
+ let all = parseProcStat(curr_processes.shift());
+
+ // process
+ let list_new = {};
+ let resultProcess = {};
+ curr_processes.forEach((element) => {
+ resultProcess = calcProcStatLinux(element, all, _process_cpu);
+
+ if (resultProcess.pid) {
+
+ // find result item
+ let resultItemId = -1;
+ for (let i in result) {
+ if (result[i].pids.indexOf(resultProcess.pid) >= 0) {
+ resultItemId = i;
+ }
+ }
+ // store pcpu in outer result
+ if (resultItemId >= 0) {
+ result[resultItemId].cpu += resultProcess.cpuu + resultProcess.cpus;
+ }
+
+ // save new values
+ list_new[resultProcess.pid] = {
+ cpuu: resultProcess.cpuu,
+ cpus: resultProcess.cpus,
+ utime: resultProcess.utime,
+ stime: resultProcess.stime,
+ cutime: resultProcess.cutime,
+ cstime: resultProcess.cstime
+ };
+ }
+ });
+
+ result.forEach(function (item) {
+ item.cpu = Math.round(item.cpu * 100) / 100;
+ });
+
+ _process_cpu.all = all;
+ _process_cpu.list = Object.assign({}, list_new);
+ _process_cpu.ms = Date.now() - _process_cpu.ms;
+ _process_cpu.result = Object.assign({}, result);
+ if (callback) { callback(result); }
+ resolve(result);
+ });
+ } else {
+ if (callback) { callback(result); }
+ resolve(result);
+ }
+ } else {
+ if (callback) { callback(result); }
+ resolve(result);
+ }
+ });
+ }
+ }
+ });
+ });
+}
+
+exports.processLoad = processLoad;
diff --git a/node_modules/systeminformation/lib/system.js b/node_modules/systeminformation/lib/system.js
new file mode 100644
index 0000000..f5d21c6
--- /dev/null
+++ b/node_modules/systeminformation/lib/system.js
@@ -0,0 +1,831 @@
+'use strict';
+// @ts-check
+// ==================================================================================
+// system.js
+// ----------------------------------------------------------------------------------
+// Description: System Information - library
+// for Node.js
+// Copyright: (c) 2014 - 2022
+// Author: Sebastian Hildebrandt
+// ----------------------------------------------------------------------------------
+// License: MIT
+// ==================================================================================
+// 2. System (Hardware, BIOS, Base Board)
+// ----------------------------------------------------------------------------------
+
+const fs = require('fs');
+const os = require('os');
+const util = require('./util');
+const exec = require('child_process').exec;
+const execSync = require('child_process').execSync;
+const execPromise = util.promisify(require('child_process').exec);
+
+let _platform = process.platform;
+
+const _linux = (_platform === 'linux' || _platform === 'android');
+const _darwin = (_platform === 'darwin');
+const _windows = (_platform === 'win32');
+const _freebsd = (_platform === 'freebsd');
+const _openbsd = (_platform === 'openbsd');
+const _netbsd = (_platform === 'netbsd');
+const _sunos = (_platform === 'sunos');
+
+function system(callback) {
+
+ return new Promise((resolve) => {
+ process.nextTick(() => {
+
+ let result = {
+ manufacturer: '',
+ model: 'Computer',
+ version: '',
+ serial: '-',
+ uuid: '-',
+ sku: '-',
+ virtual: false
+ };
+
+ if (_linux || _freebsd || _openbsd || _netbsd) {
+ exec('export LC_ALL=C; dmidecode -t system 2>/dev/null; unset LC_ALL', function (error, stdout) {
+ // if (!error) {
+ let lines = stdout.toString().split('\n');
+ result.manufacturer = util.getValue(lines, 'manufacturer');
+ result.model = util.getValue(lines, 'product name');
+ result.version = util.getValue(lines, 'version');
+ result.serial = util.getValue(lines, 'serial number');
+ result.uuid = util.getValue(lines, 'uuid').toLowerCase();
+ result.sku = util.getValue(lines, 'sku number');
+ // }
+ // Non-Root values
+ const cmd = `echo -n "product_name: "; cat /sys/devices/virtual/dmi/id/product_name 2>/dev/null; echo;
+ echo -n "product_serial: "; cat /sys/devices/virtual/dmi/id/product_serial 2>/dev/null; echo;
+ echo -n "product_uuid: "; cat /sys/devices/virtual/dmi/id/product_uuid 2>/dev/null; echo;
+ echo -n "product_version: "; cat /sys/devices/virtual/dmi/id/product_version 2>/dev/null; echo;
+ echo -n "sys_vendor: "; cat /sys/devices/virtual/dmi/id/sys_vendor 2>/dev/null; echo;`;
+ try {
+ lines = execSync(cmd).toString().split('\n');
+ result.manufacturer = result.manufacturer === '' ? util.getValue(lines, 'sys_vendor') : result.manufacturer;
+ result.model = result.model === '' ? util.getValue(lines, 'product_name') : result.model;
+ result.version = result.version === '' ? util.getValue(lines, 'product_version') : result.version;
+ result.serial = result.serial === '' ? util.getValue(lines, 'product_serial') : result.serial;
+ result.uuid = result.uuid === '' ? util.getValue(lines, 'product_uuid').toLowerCase() : result.uuid;
+ } catch (e) {
+ util.noop();
+ }
+ if (!result.serial || result.serial.toLowerCase().indexOf('o.e.m.') !== -1) { result.serial = '-'; }
+ if (!result.manufacturer || result.manufacturer.toLowerCase().indexOf('o.e.m.') !== -1) { result.manufacturer = ''; }
+ if (!result.model || result.model.toLowerCase().indexOf('o.e.m.') !== -1) { result.model = 'Computer'; }
+ if (!result.version || result.version.toLowerCase().indexOf('o.e.m.') !== -1) { result.version = ''; }
+ if (!result.sku || result.sku.toLowerCase().indexOf('o.e.m.') !== -1) { result.sku = '-'; }
+
+ // detect virtual (1)
+ if (result.model.toLowerCase() === 'virtualbox' || result.model.toLowerCase() === 'kvm' || result.model.toLowerCase() === 'virtual machine' || result.model.toLowerCase() === 'bochs' || result.model.toLowerCase().startsWith('vmware') || result.model.toLowerCase().startsWith('droplet')) {
+ result.virtual = true;
+ switch (result.model.toLowerCase()) {
+ case 'virtualbox':
+ result.virtualHost = 'VirtualBox';
+ break;
+ case 'vmware':
+ result.virtualHost = 'VMware';
+ break;
+ case 'kvm':
+ result.virtualHost = 'KVM';
+ break;
+ case 'bochs':
+ result.virtualHost = 'bochs';
+ break;
+ }
+ }
+ if (result.manufacturer.toLowerCase().startsWith('vmware') || result.manufacturer.toLowerCase() === 'xen') {
+ result.virtual = true;
+ switch (result.manufacturer.toLowerCase()) {
+ case 'vmware':
+ result.virtualHost = 'VMware';
+ break;
+ case 'xen':
+ result.virtualHost = 'Xen';
+ break;
+ }
+ }
+ if (!result.virtual) {
+ try {
+ const disksById = execSync('ls -1 /dev/disk/by-id/ 2>/dev/null').toString();
+ if (disksById.indexOf('_QEMU_') >= 0) {
+ result.virtual = true;
+ result.virtualHost = 'QEMU';
+ }
+ if (disksById.indexOf('_VBOX_') >= 0) {
+ result.virtual = true;
+ result.virtualHost = 'VirtualBox';
+ }
+ } catch (e) {
+ util.noop();
+ }
+ }
+ if (!result.virtual && (os.release().toLowerCase().indexOf('microsoft') >= 0 || os.release().toLowerCase().endsWith('wsl2'))) {
+ const kernelVersion = parseFloat(os.release().toLowerCase());
+ result.virtual = true;
+ result.manufacturer = 'Microsoft';
+ result.model = 'WSL';
+ result.version = kernelVersion < 4.19 ? '1' : '2';
+ }
+ if ((_freebsd || _openbsd || _netbsd) && !result.virtualHost) {
+ try {
+ const procInfo = execSync('dmidecode -t 4');
+ const procLines = procInfo.toString().split('\n');
+ const procManufacturer = util.getValue(procLines, 'manufacturer', ':', true);
+ switch (procManufacturer.toLowerCase()) {
+ case 'virtualbox':
+ result.virtualHost = 'VirtualBox';
+ break;
+ case 'vmware':
+ result.virtualHost = 'VMware';
+ break;
+ case 'kvm':
+ result.virtualHost = 'KVM';
+ break;
+ case 'bochs':
+ result.virtualHost = 'bochs';
+ break;
+ }
+ } catch (e) {
+ util.noop();
+ }
+ }
+ // detect docker
+ if (fs.existsSync('/.dockerenv') || fs.existsSync('/.dockerinit')) {
+ result.model = 'Docker Container';
+ }
+ try {
+ const stdout = execSync('dmesg 2>/dev/null | grep -iE "virtual|hypervisor" | grep -iE "vmware|qemu|kvm|xen" | grep -viE "Nested Virtualization|/virtual/"');
+ // detect virtual machines
+ let lines = stdout.toString().split('\n');
+ if (lines.length > 0) {
+ if (result.model === 'Computer') { result.model = 'Virtual machine'; }
+ result.virtual = true;
+ if (stdout.toString().toLowerCase().indexOf('vmware') >= 0 && !result.virtualHost) {
+ result.virtualHost = 'VMware';
+ }
+ if (stdout.toString().toLowerCase().indexOf('qemu') >= 0 && !result.virtualHost) {
+ result.virtualHost = 'QEMU';
+ }
+ if (stdout.toString().toLowerCase().indexOf('xen') >= 0 && !result.virtualHost) {
+ result.virtualHost = 'Xen';
+ }
+ if (stdout.toString().toLowerCase().indexOf('kvm') >= 0 && !result.virtualHost) {
+ result.virtualHost = 'KVM';
+ }
+ }
+ } catch (e) {
+ util.noop();
+ }
+
+ if (result.manufacturer === '' && result.model === 'Computer' && result.version === '') {
+ // Check Raspberry Pi
+ fs.readFile('/proc/cpuinfo', function (error, stdout) {
+ if (!error) {
+ let lines = stdout.toString().split('\n');
+ result.model = util.getValue(lines, 'hardware', ':', true).toUpperCase();
+ result.version = util.getValue(lines, 'revision', ':', true).toLowerCase();
+ result.serial = util.getValue(lines, 'serial', ':', true);
+ const model = util.getValue(lines, 'model:', ':', true);
+ // reference values: https://elinux.org/RPi_HardwareHistory
+ // https://www.raspberrypi.org/documentation/hardware/raspberrypi/revision-codes/README.md
+ if ((result.model === 'BCM2835' || result.model === 'BCM2708' || result.model === 'BCM2709' || result.model === 'BCM2710' || result.model === 'BCM2711' || result.model === 'BCM2836' || result.model === 'BCM2837') && model.toLowerCase().indexOf('raspberry') >= 0) {
+ const rPIRevision = util.decodePiCpuinfo(lines);
+ result.model = rPIRevision.model;
+ result.version = rPIRevision.revisionCode;
+ result.manufacturer = 'Raspberry Pi Foundation';
+ result.raspberry = {
+ manufacturer: rPIRevision.manufacturer,
+ processor: rPIRevision.processor,
+ type: rPIRevision.type,
+ revision: rPIRevision.revision
+ };
+ }
+
+ // if (result.model === 'BCM2835' || result.model === 'BCM2708' || result.model === 'BCM2709' || result.model === 'BCM2835' || result.model === 'BCM2837') {
+
+
+ // // Pi 4
+ // if (['d03114'].indexOf(result.version) >= 0) {
+ // result.model = result.model + ' - Pi 4 Model B';
+ // result.version = result.version + ' - Rev. 1.4';
+ // }
+ // if (['b03112', 'c03112'].indexOf(result.version) >= 0) {
+ // result.model = result.model + ' - Pi 4 Model B';
+ // result.version = result.version + ' - Rev. 1.2';
+ // }
+ // if (['a03111', 'b03111', 'c03111'].indexOf(result.version) >= 0) {
+ // result.model = result.model + ' - Pi 4 Model B';
+ // result.version = result.version + ' - Rev. 1.1';
+ // }
+ // // Pi 3
+ // if (['a02082', 'a22082', 'a32082', 'a52082'].indexOf(result.version) >= 0) {
+ // result.model = result.model + ' - Pi 3 Model B';
+ // result.version = result.version + ' - Rev. 1.2';
+ // }
+ // if (['a22083'].indexOf(result.version) >= 0) {
+ // result.model = result.model + ' - Pi 3 Model B';
+ // result.version = result.version + ' - Rev. 1.3';
+ // }
+ // if (['a020d3'].indexOf(result.version) >= 0) {
+ // result.model = result.model + ' - Pi 3 Model B+';
+ // result.version = result.version + ' - Rev. 1.3';
+ // }
+ // if (['9020e0'].indexOf(result.version) >= 0) {
+ // result.model = result.model + ' - Pi 3 Model A+';
+ // result.version = result.version + ' - Rev. 1.3';
+ // }
+ // // Pi 2 Model B
+ // if (['a01040'].indexOf(result.version) >= 0) {
+ // result.model = result.model + ' - Pi 2 Model B';
+ // result.version = result.version + ' - Rev. 1.0';
+ // }
+ // if (['a01041', 'a21041'].indexOf(result.version) >= 0) {
+ // result.model = result.model + ' - Pi 2 Model B';
+ // result.version = result.version + ' - Rev. 1.1';
+ // }
+ // if (['a22042', 'a02042'].indexOf(result.version) >= 0) {
+ // result.model = result.model + ' - Pi 2 Model B';
+ // result.version = result.version + ' - Rev. 1.2';
+ // }
+
+ // // Compute Model
+ // if (['a02100'].indexOf(result.version) >= 0) {
+ // result.model = result.model + ' - Pi CM3+';
+ // result.version = result.version + ' - Rev 1.0';
+ // }
+ // if (['a020a0', 'a220a0'].indexOf(result.version) >= 0) {
+ // result.model = result.model + ' - Pi CM3';
+ // result.version = result.version + ' - Rev 1.0';
+ // }
+ // if (['900061'].indexOf(result.version) >= 0) {
+ // result.model = result.model + ' - Pi CM';
+ // result.version = result.version + ' - Rev 1.1';
+ // }
+
+ // // Pi Zero
+ // if (['900092', '920092'].indexOf(result.version) >= 0) {
+ // result.model = result.model + ' - Pi Zero';
+ // result.version = result.version + ' - Rev 1.2';
+ // }
+ // if (['900093', '920093'].indexOf(result.version) >= 0) {
+ // result.model = result.model + ' - Pi Zero';
+ // result.version = result.version + ' - Rev 1.3';
+ // }
+ // if (['9000c1'].indexOf(result.version) >= 0) {
+ // result.model = result.model + ' - Pi Zero W';
+ // result.version = result.version + ' - Rev 1.1';
+ // }
+
+ // // A, B, A+ B+
+ // if (['0002', '0003'].indexOf(result.version) >= 0) {
+ // result.model = result.model + ' - Pi Model B';
+ // result.version = result.version + ' - Rev 1.0';
+ // }
+ // if (['0004', '0005', '0006', '000d', '000e', '000f'].indexOf(result.version) >= 0) {
+ // result.model = result.model + ' - Pi Model B';
+ // result.version = result.version + ' - Rev 2.0';
+ // }
+ // if (['0007', '0008', '0009'].indexOf(result.version) >= 0) {
+ // result.model = result.model + ' - Pi Model A';
+ // result.version = result.version + ' - Rev 2.0';
+ // }
+ // if (['0010'].indexOf(result.version) >= 0) {
+ // result.model = result.model + ' - Pi Model B+';
+ // result.version = result.version + ' - Rev 1.0';
+ // }
+ // if (['0012'].indexOf(result.version) >= 0) {
+ // result.model = result.model + ' - Pi Model A+';
+ // result.version = result.version + ' - Rev 1.0';
+ // }
+ // if (['0013', '900032'].indexOf(result.version) >= 0) {
+ // result.model = result.model + ' - Pi Model B+';
+ // result.version = result.version + ' - Rev 1.2';
+ // }
+ // if (['0015', '900021'].indexOf(result.version) >= 0) {
+ // result.model = result.model + ' - Pi Model A+';
+ // result.version = result.version + ' - Rev 1.1';
+ // }
+ // if (result.model.indexOf('Pi') !== -1 && result.version) { // Pi, Pi Zero
+ // result.manufacturer = 'Raspberry Pi Foundation';
+ // }
+ // }
+ }
+ if (callback) { callback(result); }
+ resolve(result);
+ });
+ } else {
+ if (callback) { callback(result); }
+ resolve(result);
+ }
+ });
+ }
+ if (_darwin) {
+ exec('ioreg -c IOPlatformExpertDevice -d 2', function (error, stdout) {
+ if (!error) {
+ let lines = stdout.toString().replace(/[<>"]/g, '').split('\n');
+ result.manufacturer = util.getValue(lines, 'manufacturer', '=', true);
+ result.model = util.getValue(lines, 'model', '=', true);
+ result.version = util.getValue(lines, 'version', '=', true);
+ result.serial = util.getValue(lines, 'ioplatformserialnumber', '=', true);
+ result.uuid = util.getValue(lines, 'ioplatformuuid', '=', true).toLowerCase();
+ result.sku = util.getValue(lines, 'board-id', '=', true);
+ }
+ if (callback) { callback(result); }
+ resolve(result);
+ });
+ }
+ if (_sunos) {
+ if (callback) { callback(result); }
+ resolve(result);
+ }
+ if (_windows) {
+ try {
+ util.powerShell('Get-WmiObject Win32_ComputerSystemProduct | select Name,Vendor,Version,IdentifyingNumber,UUID | fl').then((stdout, error) => {
+ if (!error) {
+ // let lines = stdout.split('\r\n').filter(line => line.trim() !== '').filter((line, idx) => idx > 0)[0].trim().split(/\s\s+/);
+ let lines = stdout.split('\r\n');
+ result.manufacturer = util.getValue(lines, 'vendor', ':');
+ result.model = util.getValue(lines, 'name', ':');
+ result.version = util.getValue(lines, 'version', ':');
+ result.serial = util.getValue(lines, 'identifyingnumber', ':');
+ result.uuid = util.getValue(lines, 'uuid', ':').toLowerCase();
+ // detect virtual (1)
+ const model = result.model.toLowerCase();
+ if (model === 'virtualbox' || model === 'kvm' || model === 'virtual machine' || model === 'bochs' || model.startsWith('vmware') || model.startsWith('qemu')) {
+ result.virtual = true;
+ if (model.startsWith('virtualbox')) { result.virtualHost = 'VirtualBox'; }
+ if (model.startsWith('vmware')) { result.virtualHost = 'VMware'; }
+ if (model.startsWith('kvm')) { result.virtualHost = 'KVM'; }
+ if (model.startsWith('bochs')) { result.virtualHost = 'bochs'; }
+ if (model.startsWith('qemu')) { result.virtualHost = 'KVM'; }
+ }
+ const manufacturer = result.manufacturer.toLowerCase();
+ if (manufacturer.startsWith('vmware') || manufacturer.startsWith('qemu') || manufacturer === 'xen') {
+ result.virtual = true;
+ if (manufacturer.startsWith('vmware')) { result.virtualHost = 'VMware'; }
+ if (manufacturer.startsWith('xen')) { result.virtualHost = 'Xen'; }
+ if (manufacturer.startsWith('qemu')) { result.virtualHost = 'KVM'; }
+ }
+ util.powerShell('Get-WmiObject MS_Systeminformation -Namespace "root/wmi" | select systemsku | fl ').then((stdout, error) => {
+ if (!error) {
+ let lines = stdout.split('\r\n');
+ result.sku = util.getValue(lines, 'systemsku', ':');
+ }
+ if (!result.virtual) {
+ util.powerShell('Get-WmiObject Win32_bios | select Version, SerialNumber, SMBIOSBIOSVersion').then((stdout, error) => {
+ if (!error) {
+ let lines = stdout.toString();
+ if (lines.indexOf('VRTUAL') >= 0 || lines.indexOf('A M I ') >= 0 || lines.indexOf('VirtualBox') >= 0 || lines.indexOf('VMWare') >= 0 || lines.indexOf('Xen') >= 0) {
+ result.virtual = true;
+ if (lines.indexOf('VirtualBox') >= 0 && !result.virtualHost) {
+ result.virtualHost = 'VirtualBox';
+ }
+ if (lines.indexOf('VMware') >= 0 && !result.virtualHost) {
+ result.virtualHost = 'VMware';
+ }
+ if (lines.indexOf('Xen') >= 0 && !result.virtualHost) {
+ result.virtualHost = 'Xen';
+ }
+ if (lines.indexOf('VRTUAL') >= 0 && !result.virtualHost) {
+ result.virtualHost = 'Hyper-V';
+ }
+ if (lines.indexOf('A M I') >= 0 && !result.virtualHost) {
+ result.virtualHost = 'Virtual PC';
+ }
+ }
+ if (callback) { callback(result); }
+ resolve(result);
+ } else {
+ if (callback) { callback(result); }
+ resolve(result);
+ }
+ });
+ } else {
+ if (callback) { callback(result); }
+ resolve(result);
+ }
+ });
+ } else {
+ if (callback) { callback(result); }
+ resolve(result);
+ }
+ });
+ } catch (e) {
+ if (callback) { callback(result); }
+ resolve(result);
+ }
+ }
+ });
+ });
+}
+
+exports.system = system;
+
+function bios(callback) {
+
+ return new Promise((resolve) => {
+ process.nextTick(() => {
+
+ let result = {
+ vendor: '',
+ version: '',
+ releaseDate: '',
+ revision: '',
+ };
+ let cmd = '';
+ if (_linux || _freebsd || _openbsd || _netbsd) {
+ if (process.arch === 'arm') {
+ cmd = 'cat /proc/cpuinfo | grep Serial';
+ } else {
+ cmd = 'export LC_ALL=C; dmidecode -t bios 2>/dev/null; unset LC_ALL';
+ }
+ exec(cmd, function (error, stdout) {
+ let lines = stdout.toString().split('\n');
+ result.vendor = util.getValue(lines, 'Vendor');
+ result.version = util.getValue(lines, 'Version');
+ let datetime = util.getValue(lines, 'Release Date');
+ result.releaseDate = util.parseDateTime(datetime).date;
+ result.revision = util.getValue(lines, 'BIOS Revision');
+ result.serial = util.getValue(lines, 'SerialNumber');
+ let language = util.getValue(lines, 'Currently Installed Language').split('|')[0];
+ if (language) {
+ result.language = language;
+ }
+ if (lines.length && stdout.toString().indexOf('Characteristics:') >= 0) {
+ const features = [];
+ lines.forEach(line => {
+ if (line.indexOf(' is supported') >= 0) {
+ const feature = line.split(' is supported')[0].trim();
+ features.push(feature);
+ }
+ });
+ result.features = features;
+ }
+ // Non-Root values
+ const cmd = `echo -n "bios_date: "; cat /sys/devices/virtual/dmi/id/bios_date 2>/dev/null; echo;
+ echo -n "bios_vendor: "; cat /sys/devices/virtual/dmi/id/bios_vendor 2>/dev/null; echo;
+ echo -n "bios_version: "; cat /sys/devices/virtual/dmi/id/bios_version 2>/dev/null; echo;`;
+ try {
+ lines = execSync(cmd).toString().split('\n');
+ result.vendor = !result.vendor ? util.getValue(lines, 'bios_vendor') : result.vendor;
+ result.version = !result.version ? util.getValue(lines, 'bios_version') : result.version;
+ datetime = util.getValue(lines, 'bios_date');
+ result.releaseDate = !result.releaseDate ? util.parseDateTime(datetime).date : result.releaseDate;
+ } catch (e) {
+ util.noop();
+ }
+ if (callback) { callback(result); }
+ resolve(result);
+ });
+ }
+ if (_darwin) {
+ result.vendor = 'Apple Inc.';
+ exec(
+ 'system_profiler SPHardwareDataType -json', function (error, stdout) {
+ try {
+ const hardwareData = JSON.parse(stdout.toString());
+ if (hardwareData && hardwareData.SPHardwareDataType && hardwareData.SPHardwareDataType.length) {
+ let bootRomVersion = hardwareData.SPHardwareDataType[0].boot_rom_version;
+ bootRomVersion = bootRomVersion ? bootRomVersion.split('(')[0].trim() : null;
+ result.version = bootRomVersion;
+ }
+ } catch (e) {
+ util.noop();
+ }
+ if (callback) { callback(result); }
+ resolve(result);
+ });
+ }
+ if (_sunos) {
+ result.vendor = 'Sun Microsystems';
+ if (callback) { callback(result); }
+ resolve(result);
+ }
+ if (_windows) {
+ try {
+ util.powerShell('Get-WmiObject Win32_bios | select Description,Version,Manufacturer,ReleaseDate,BuildNumber,SerialNumber | fl').then((stdout, error) => {
+ if (!error) {
+ let lines = stdout.toString().split('\r\n');
+ const description = util.getValue(lines, 'description', ':');
+ if (description.indexOf(' Version ') !== -1) {
+ // ... Phoenix ROM BIOS PLUS Version 1.10 A04
+ result.vendor = description.split(' Version ')[0].trim();
+ result.version = description.split(' Version ')[1].trim();
+ } else if (description.indexOf(' Ver: ') !== -1) {
+ // ... BIOS Date: 06/27/16 17:50:16 Ver: 1.4.5
+ result.vendor = util.getValue(lines, 'manufacturer', ':');
+ result.version = description.split(' Ver: ')[1].trim();
+ } else {
+ result.vendor = util.getValue(lines, 'manufacturer', ':');
+ result.version = util.getValue(lines, 'version', ':');
+ }
+ result.releaseDate = util.getValue(lines, 'releasedate', ':');
+ if (result.releaseDate.length >= 10) {
+ result.releaseDate = result.releaseDate.substr(0, 4) + '-' + result.releaseDate.substr(4, 2) + '-' + result.releaseDate.substr(6, 2);
+ }
+ result.revision = util.getValue(lines, 'buildnumber', ':');
+ result.serial = util.getValue(lines, 'serialnumber', ':');
+ }
+
+ if (callback) { callback(result); }
+ resolve(result);
+ });
+ } catch (e) {
+ if (callback) { callback(result); }
+ resolve(result);
+ }
+ }
+ });
+ });
+}
+
+exports.bios = bios;
+
+function baseboard(callback) {
+
+ return new Promise((resolve) => {
+ process.nextTick(() => {
+
+ let result = {
+ manufacturer: '',
+ model: '',
+ version: '',
+ serial: '-',
+ assetTag: '-',
+ memMax: null,
+ memSlots: null
+ };
+ let cmd = '';
+ if (_linux || _freebsd || _openbsd || _netbsd) {
+ if (process.arch === 'arm') {
+ cmd = 'cat /proc/cpuinfo | grep Serial';
+ // 'BCM2709', 'BCM2835', 'BCM2708' -->
+ } else {
+ cmd = 'export LC_ALL=C; dmidecode -t 2 2>/dev/null; unset LC_ALL';
+ }
+ const workload = [];
+ workload.push(execPromise(cmd));
+ workload.push(execPromise('export LC_ALL=C; dmidecode -t memory 2>/dev/null'));
+ util.promiseAll(
+ workload
+ ).then((data) => {
+ let lines = data.results[0] ? data.results[0].toString().split('\n') : [''];
+ result.manufacturer = util.getValue(lines, 'Manufacturer');
+ result.model = util.getValue(lines, 'Product Name');
+ result.version = util.getValue(lines, 'Version');
+ result.serial = util.getValue(lines, 'Serial Number');
+ result.assetTag = util.getValue(lines, 'Asset Tag');
+ // Non-Root values
+ const cmd = `echo -n "board_asset_tag: "; cat /sys/devices/virtual/dmi/id/board_asset_tag 2>/dev/null; echo;
+ echo -n "board_name: "; cat /sys/devices/virtual/dmi/id/board_name 2>/dev/null; echo;
+ echo -n "board_serial: "; cat /sys/devices/virtual/dmi/id/board_serial 2>/dev/null; echo;
+ echo -n "board_vendor: "; cat /sys/devices/virtual/dmi/id/board_vendor 2>/dev/null; echo;
+ echo -n "board_version: "; cat /sys/devices/virtual/dmi/id/board_version 2>/dev/null; echo;`;
+ try {
+ lines = execSync(cmd).toString().split('\n');
+ result.manufacturer = !result.manufacturer ? util.getValue(lines, 'board_vendor') : result.manufacturer;
+ result.model = !result.model ? util.getValue(lines, 'board_name') : result.model;
+ result.version = !result.version ? util.getValue(lines, 'board_version') : result.version;
+ result.serial = !result.serial ? util.getValue(lines, 'board_serial') : result.serial;
+ result.assetTag = !result.assetTag ? util.getValue(lines, 'board_asset_tag') : result.assetTag;
+ } catch (e) {
+ util.noop();
+ }
+ if (result.serial.toLowerCase().indexOf('o.e.m.') !== -1) { result.serial = '-'; }
+ if (result.assetTag.toLowerCase().indexOf('o.e.m.') !== -1) { result.assetTag = '-'; }
+
+ // mem
+ lines = data.results[1] ? data.results[1].toString().split('\n') : [''];
+ result.memMax = util.toInt(util.getValue(lines, 'Maximum Capacity')) * 1024 * 1024 * 1024 || null;
+ result.memSlots = util.toInt(util.getValue(lines, 'Number Of Devices')) || null;
+
+ // raspberry
+ let linesRpi = '';
+ try {
+ linesRpi = fs.readFileSync('/proc/cpuinfo').toString().split('\n');
+ } catch (e) {
+ util.noop();
+ }
+ const hardware = util.getValue(linesRpi, 'hardware');
+ if (hardware.startsWith('BCM')) {
+ const rpi = util.decodePiCpuinfo(linesRpi);
+ result.manufacturer = rpi.manufacturer;
+ result.model = 'Raspberry Pi';
+ result.serial = rpi.serial;
+ result.version = rpi.type + ' - ' + rpi.revision;
+ result.memMax = os.totalmem();
+ result.memSlots = 0;
+ }
+
+ if (callback) { callback(result); }
+ resolve(result);
+ });
+ }
+ if (_darwin) {
+ const workload = [];
+ workload.push(execPromise('ioreg -c IOPlatformExpertDevice -d 2'));
+ workload.push(execPromise('system_profiler SPMemoryDataType'));
+ util.promiseAll(
+ workload
+ ).then((data) => {
+ let lines = data.results[0] ? data.results[0].toString().replace(/[<>"]/g, '').split('\n') : [''];
+ result.manufacturer = util.getValue(lines, 'manufacturer', '=', true);
+ result.model = util.getValue(lines, 'model', '=', true);
+ result.version = util.getValue(lines, 'version', '=', true);
+ result.serial = util.getValue(lines, 'ioplatformserialnumber', '=', true);
+ result.assetTag = util.getValue(lines, 'board-id', '=', true);
+
+ // mem
+ let devices = data.results[1] ? data.results[1].toString().split(' BANK ') : [''];
+ if (devices.length === 1) {
+ devices = data.results[1] ? data.results[1].toString().split(' DIMM') : [''];
+ }
+ devices.shift();
+ result.memSlots = devices.length;
+
+ if (os.arch() === 'arm64') {
+ result.memSlots = 0;
+ result.memMax = os.totalmem();
+ }
+
+ if (callback) { callback(result); }
+ resolve(result);
+ });
+ }
+ if (_sunos) {
+ if (callback) { callback(result); }
+ resolve(result);
+ }
+ if (_windows) {
+ try {
+ const workload = [];
+ const win10plus = parseInt(os.release()) >= 10;
+ const maxCapacityAttribute = win10plus ? 'MaxCapacityEx' : 'MaxCapacity';
+ workload.push(util.powerShell('Get-WmiObject Win32_baseboard | select Model,Manufacturer,Product,Version,SerialNumber,PartNumber,SKU | fl'));
+ workload.push(util.powerShell(`Get-WmiObject Win32_physicalmemoryarray | select ${maxCapacityAttribute}, MemoryDevices | fl`));
+ util.promiseAll(
+ workload
+ ).then((data) => {
+ let lines = data.results[0] ? data.results[0].toString().split('\r\n') : [''];
+
+ result.manufacturer = util.getValue(lines, 'manufacturer', ':');
+ result.model = util.getValue(lines, 'model', ':');
+ if (!result.model) {
+ result.model = util.getValue(lines, 'product', ':');
+ }
+ result.version = util.getValue(lines, 'version', ':');
+ result.serial = util.getValue(lines, 'serialnumber', ':');
+ result.assetTag = util.getValue(lines, 'partnumber', ':');
+ if (!result.assetTag) {
+ result.assetTag = util.getValue(lines, 'sku', ':');
+ }
+
+ // memphysical
+ lines = data.results[1] ? data.results[1].toString().split('\r\n') : [''];
+ result.memMax = util.toInt(util.getValue(lines, maxCapacityAttribute, ':')) * (win10plus ? 1024 : 1) || null;
+ result.memSlots = util.toInt(util.getValue(lines, 'MemoryDevices', ':')) || null;
+
+ if (callback) { callback(result); }
+ resolve(result);
+ });
+ } catch (e) {
+ if (callback) { callback(result); }
+ resolve(result);
+ }
+ }
+ });
+ });
+}
+
+exports.baseboard = baseboard;
+
+function chassis(callback) {
+ const chassisTypes = ['Other',
+ 'Unknown',
+ 'Desktop',
+ 'Low Profile Desktop',
+ 'Pizza Box',
+ 'Mini Tower',
+ 'Tower',
+ 'Portable',
+ 'Laptop',
+ 'Notebook',
+ 'Hand Held',
+ 'Docking Station',
+ 'All in One',
+ 'Sub Notebook',
+ 'Space-Saving',
+ 'Lunch Box',
+ 'Main System Chassis',
+ 'Expansion Chassis',
+ 'SubChassis',
+ 'Bus Expansion Chassis',
+ 'Peripheral Chassis',
+ 'Storage Chassis',
+ 'Rack Mount Chassis',
+ 'Sealed-Case PC',
+ 'Multi-System Chassis',
+ 'Compact PCI',
+ 'Advanced TCA',
+ 'Blade',
+ 'Blade Enclosure',
+ 'Tablet',
+ 'Convertible',
+ 'Detachable',
+ 'IoT Gateway ',
+ 'Embedded PC',
+ 'Mini PC',
+ 'Stick PC',
+ ];
+
+ return new Promise((resolve) => {
+ process.nextTick(() => {
+
+ let result = {
+ manufacturer: '',
+ model: '',
+ type: '',
+ version: '',
+ serial: '-',
+ assetTag: '-',
+ sku: '',
+ };
+ if (_linux || _freebsd || _openbsd || _netbsd) {
+ const cmd = `echo -n "chassis_asset_tag: "; cat /sys/devices/virtual/dmi/id/chassis_asset_tag 2>/dev/null; echo;
+ echo -n "chassis_serial: "; cat /sys/devices/virtual/dmi/id/chassis_serial 2>/dev/null; echo;
+ echo -n "chassis_type: "; cat /sys/devices/virtual/dmi/id/chassis_type 2>/dev/null; echo;
+ echo -n "chassis_vendor: "; cat /sys/devices/virtual/dmi/id/chassis_vendor 2>/dev/null; echo;
+ echo -n "chassis_version: "; cat /sys/devices/virtual/dmi/id/chassis_version 2>/dev/null; echo;`;
+ exec(cmd, function (error, stdout) {
+ let lines = stdout.toString().split('\n');
+ result.manufacturer = util.getValue(lines, 'chassis_vendor');
+ const ctype = parseInt(util.getValue(lines, 'chassis_type').replace(/\D/g, ''));
+ result.type = (ctype && !isNaN(ctype) && ctype < chassisTypes.length) ? chassisTypes[ctype - 1] : '';
+ result.version = util.getValue(lines, 'chassis_version');
+ result.serial = util.getValue(lines, 'chassis_serial');
+ result.assetTag = util.getValue(lines, 'chassis_asset_tag');
+ if (result.manufacturer.toLowerCase().indexOf('o.e.m.') !== -1) { result.manufacturer = '-'; }
+ if (result.version.toLowerCase().indexOf('o.e.m.') !== -1) { result.version = '-'; }
+ if (result.serial.toLowerCase().indexOf('o.e.m.') !== -1) { result.serial = '-'; }
+ if (result.assetTag.toLowerCase().indexOf('o.e.m.') !== -1) { result.assetTag = '-'; }
+
+ if (callback) { callback(result); }
+ resolve(result);
+ });
+ }
+ if (_darwin) {
+ exec('ioreg -c IOPlatformExpertDevice -d 2', function (error, stdout) {
+ if (!error) {
+ let lines = stdout.toString().replace(/[<>"]/g, '').split('\n');
+ result.manufacturer = util.getValue(lines, 'manufacturer', '=', true);
+ result.model = util.getValue(lines, 'model', '=', true);
+ result.version = util.getValue(lines, 'version', '=', true);
+ result.serial = util.getValue(lines, 'ioplatformserialnumber', '=', true);
+ result.assetTag = util.getValue(lines, 'board-id', '=', true);
+ }
+
+ if (callback) { callback(result); }
+ resolve(result);
+ });
+ }
+ if (_sunos) {
+ if (callback) { callback(result); }
+ resolve(result);
+ }
+ if (_windows) {
+ try {
+ util.powerShell('Get-WmiObject Win32_SystemEnclosure | select Model,Manufacturer,ChassisTypes,Version,SerialNumber,PartNumber,SKU | fl').then((stdout, error) => {
+ if (!error) {
+ let lines = stdout.toString().split('\r\n');
+
+ result.manufacturer = util.getValue(lines, 'manufacturer', ':');
+ result.model = util.getValue(lines, 'model', ':');
+ const ctype = parseInt(util.getValue(lines, 'ChassisTypes', ':').replace(/\D/g, ''));
+ result.type = (ctype && !isNaN(ctype) && ctype < chassisTypes.length) ? chassisTypes[ctype - 1] : '';
+ result.version = util.getValue(lines, 'version', ':');
+ result.serial = util.getValue(lines, 'serialnumber', ':');
+ result.assetTag = util.getValue(lines, 'partnumber', ':');
+ result.sku = util.getValue(lines, 'sku', ':');
+ if (result.manufacturer.toLowerCase().indexOf('o.e.m.') !== -1) { result.manufacturer = '-'; }
+ if (result.version.toLowerCase().indexOf('o.e.m.') !== -1) { result.version = '-'; }
+ if (result.serial.toLowerCase().indexOf('o.e.m.') !== -1) { result.serial = '-'; }
+ if (result.assetTag.toLowerCase().indexOf('o.e.m.') !== -1) { result.assetTag = '-'; }
+ }
+
+ if (callback) { callback(result); }
+ resolve(result);
+ });
+ } catch (e) {
+ if (callback) { callback(result); }
+ resolve(result);
+ }
+ }
+ });
+ });
+}
+
+exports.chassis = chassis;
+
diff --git a/node_modules/systeminformation/lib/usb.js b/node_modules/systeminformation/lib/usb.js
new file mode 100644
index 0000000..d7c1fa3
--- /dev/null
+++ b/node_modules/systeminformation/lib/usb.js
@@ -0,0 +1,258 @@
+'use strict';
+// @ts-check
+// ==================================================================================
+// usb.js
+// ----------------------------------------------------------------------------------
+// Description: System Information - library
+// for Node.js
+// Copyright: (c) 2014 - 2022
+// Author: Sebastian Hildebrandt
+// ----------------------------------------------------------------------------------
+// License: MIT
+// ==================================================================================
+// 16. usb
+// ----------------------------------------------------------------------------------
+
+const exec = require('child_process').exec;
+const util = require('./util');
+
+let _platform = process.platform;
+
+const _linux = (_platform === 'linux' || _platform === 'android');
+const _darwin = (_platform === 'darwin');
+const _windows = (_platform === 'win32');
+const _freebsd = (_platform === 'freebsd');
+const _openbsd = (_platform === 'openbsd');
+const _netbsd = (_platform === 'netbsd');
+const _sunos = (_platform === 'sunos');
+
+function getLinuxUsbType(type, name) {
+ let result = type;
+ const str = (name + ' ' + type).toLowerCase();
+ if (str.indexOf('camera') >= 0) { result = 'Camera'; }
+ else if (str.indexOf('hub') >= 0) { result = 'Hub'; }
+ else if (str.indexOf('keybrd') >= 0) { result = 'Keyboard'; }
+ else if (str.indexOf('keyboard') >= 0) { result = 'Keyboard'; }
+ else if (str.indexOf('mouse') >= 0) { result = 'Mouse'; }
+ else if (str.indexOf('stora') >= 0) { result = 'Storage'; }
+ else if (str.indexOf('mic') >= 0) { result = 'Microphone'; }
+ else if (str.indexOf('headset') >= 0) { result = 'Audio'; }
+ else if (str.indexOf('audio') >= 0) { result = 'Audio'; }
+
+ return result;
+}
+
+function parseLinuxUsb(usb) {
+ const result = {};
+ const lines = usb.split('\n');
+ if (lines && lines.length && lines[0].indexOf('Device') >= 0) {
+ const parts = lines[0].split(' ');
+ result.bus = parseInt(parts[0], 10);
+ if (parts[2]) {
+ result.deviceId = parseInt(parts[2], 10);
+ } else {
+ result.deviceId = null;
+ }
+ } else {
+ result.bus = null;
+ result.deviceId = null;
+ }
+ const idVendor = util.getValue(lines, 'idVendor', ' ', true).trim();
+ let vendorParts = idVendor.split(' ');
+ vendorParts.shift();
+ const vendor = vendorParts.join(' ');
+
+ const idProduct = util.getValue(lines, 'idProduct', ' ', true).trim();
+ let productParts = idProduct.split(' ');
+ productParts.shift();
+ const product = productParts.join(' ');
+
+ const interfaceClass = util.getValue(lines, 'bInterfaceClass', ' ', true).trim();
+ let interfaceClassParts = interfaceClass.split(' ');
+ interfaceClassParts.shift();
+ const usbType = interfaceClassParts.join(' ');
+
+ const iManufacturer = util.getValue(lines, 'iManufacturer', ' ', true).trim();
+ let iManufacturerParts = iManufacturer.split(' ');
+ iManufacturerParts.shift();
+ const manufacturer = iManufacturerParts.join(' ');
+
+ result.id = (idVendor.startsWith('0x') ? idVendor.split(' ')[0].substr(2, 10) : '') + ':' + (idProduct.startsWith('0x') ? idProduct.split(' ')[0].substr(2, 10) : '');
+ result.name = product;
+ result.type = getLinuxUsbType(usbType, product);
+ result.removable = null;
+ result.vendor = vendor;
+ result.manufacturer = manufacturer;
+ result.maxPower = util.getValue(lines, 'MaxPower', ' ', true);
+ result.serialNumber = null;
+
+ return result;
+}
+
+function getDarwinUsbType(name) {
+ let result = '';
+ if (name.indexOf('camera') >= 0) { result = 'Camera'; }
+ else if (name.indexOf('touch bar') >= 0) { result = 'Touch Bar'; }
+ else if (name.indexOf('controller') >= 0) { result = 'Controller'; }
+ else if (name.indexOf('headset') >= 0) { result = 'Audio'; }
+ else if (name.indexOf('keyboard') >= 0) { result = 'Keyboard'; }
+ else if (name.indexOf('trackpad') >= 0) { result = 'Trackpad'; }
+ else if (name.indexOf('sensor') >= 0) { result = 'Sensor'; }
+ else if (name.indexOf('bthusb') >= 0) { result = 'Bluetooth'; }
+ else if (name.indexOf('bth') >= 0) { result = 'Bluetooth'; }
+ else if (name.indexOf('rfcomm') >= 0) { result = 'Bluetooth'; }
+ else if (name.indexOf('usbhub') >= 0) { result = 'Hub'; }
+ else if (name.indexOf(' hub') >= 0) { result = 'Hub'; }
+ else if (name.indexOf('mouse') >= 0) { result = 'Mouse'; }
+ else if (name.indexOf('mic') >= 0) { result = 'Microphone'; }
+ else if (name.indexOf('removable') >= 0) { result = 'Storage'; }
+ return result;
+}
+
+
+function parseDarwinUsb(usb, id) {
+ const result = {};
+ result.id = id;
+
+ usb = usb.replace(/ \|/g, '');
+ usb = usb.trim();
+ let lines = usb.split('\n');
+ lines.shift();
+ try {
+ for (let i = 0; i < lines.length; i++) {
+ lines[i] = lines[i].trim();
+ lines[i] = lines[i].replace(/=/g, ':');
+ if (lines[i] !== '{' && lines[i] !== '}' && lines[i + 1] && lines[i + 1].trim() !== '}') {
+ lines[i] = lines[i] + ',';
+ }
+ lines[i] = lines[i].replace(': Yes,', ': "Yes",');
+ lines[i] = lines[i].replace(': No,', ': "No",');
+ }
+ const usbObj = JSON.parse(lines.join('\n'));
+ const removableDrive = usbObj['Built-In'].toLowerCase() !== 'yes' && usbObj['non-removable'].toLowerCase() === 'no';
+
+ result.bus = null;
+ result.deviceId = null;
+ result.id = usbObj['USB Address'] || null;
+ result.name = usbObj['kUSBProductString'] || usbObj['USB Product Name'] || null;
+ result.type = getDarwinUsbType((usbObj['kUSBProductString'] || usbObj['USB Product Name'] || '').toLowerCase() + (removableDrive ? ' removable' : ''));
+ result.removable = usbObj['non-removable'].toLowerCase() === 'no';
+ result.vendor = usbObj['kUSBVendorString'] || usbObj['USB Vendor Name'] || null;
+ result.manufacturer = usbObj['kUSBVendorString'] || usbObj['USB Vendor Name'] || null;
+ result.maxPower = null;
+ result.serialNumber = usbObj['kUSBSerialNumberString'] || null;
+
+ if (result.name) {
+ return result;
+ } else {
+ return null;
+ }
+ } catch (e) {
+ return null;
+ }
+}
+
+function getWindowsUsbTypeCreation(creationclass, name) {
+ let result = '';
+ if (name.indexOf('storage') >= 0) { result = 'Storage'; }
+ else if (name.indexOf('speicher') >= 0) { result = 'Storage'; }
+ else if (creationclass.indexOf('usbhub') >= 0) { result = 'Hub'; }
+ else if (creationclass.indexOf('storage') >= 0) { result = 'Storage'; }
+ else if (creationclass.indexOf('usbcontroller') >= 0) { result = 'Controller'; }
+ else if (creationclass.indexOf('keyboard') >= 0) { result = 'Keyboard'; }
+ else if (creationclass.indexOf('pointing') >= 0) { result = 'Mouse'; }
+ else if (creationclass.indexOf('disk') >= 0) { result = 'Storage'; }
+ return result;
+}
+
+function parseWindowsUsb(lines, id) {
+ const usbType = getWindowsUsbTypeCreation(util.getValue(lines, 'CreationClassName', ':').toLowerCase(), util.getValue(lines, 'name', ':').toLowerCase());
+
+ if (usbType) {
+ const result = {};
+ result.bus = null;
+ result.deviceId = util.getValue(lines, 'deviceid', ':');
+ result.id = id;
+ result.name = util.getValue(lines, 'name', ':');
+ result.type = usbType;
+ result.removable = null;
+ result.vendor = null;
+ result.manufacturer = util.getValue(lines, 'Manufacturer', ':');
+ result.maxPower = null;
+ result.serialNumber = null;
+
+ return result;
+ } else {
+ return null;
+ }
+}
+
+function usb(callback) {
+
+ return new Promise((resolve) => {
+ process.nextTick(() => {
+ let result = [];
+ if (_linux) {
+ const cmd = 'export LC_ALL=C; lsusb -v 2>/dev/null; unset LC_ALL';
+ exec(cmd, { maxBuffer: 1024 * 1024 * 128 }, function (error, stdout) {
+ if (!error) {
+ const parts = ('\n\n' + stdout.toString()).split('\n\nBus ');
+ for (let i = 1; i < parts.length; i++) {
+ const usb = parseLinuxUsb(parts[i]);
+ result.push(usb);
+ }
+ }
+ if (callback) {
+ callback(result);
+ }
+ resolve(result);
+ });
+ }
+ if (_darwin) {
+ let cmd = 'ioreg -p IOUSB -c AppleUSBRootHubDevice -w0 -l';
+ exec(cmd, { maxBuffer: 1024 * 1024 * 128 }, function (error, stdout) {
+ if (!error) {
+ const parts = (stdout.toString()).split(' +-o ');
+ for (let i = 1; i < parts.length; i++) {
+ const usb = parseDarwinUsb(parts[i]);
+ if (usb) {
+ result.push(usb);
+ }
+ }
+ if (callback) {
+ callback(result);
+ }
+ resolve(result);
+ }
+ if (callback) {
+ callback(result);
+ }
+ resolve(result);
+ });
+ }
+ if (_windows) {
+ util.powerShell('Get-WmiObject CIM_LogicalDevice | where { $_.Description -match "USB"} | select Name,CreationClassName,DeviceId,Manufacturer | fl').then((stdout, error) => {
+ if (!error) {
+ const parts = stdout.toString().split(/\n\s*\n/);
+ for (let i = 0; i < parts.length; i++) {
+ const usb = parseWindowsUsb(parts[i].split('\n'), i);
+ if (usb) {
+ result.push(usb);
+ }
+ }
+ }
+ if (callback) {
+ callback(result);
+ }
+ resolve(result);
+ });
+ }
+ if (_sunos || _freebsd || _openbsd || _netbsd) {
+ resolve(null);
+ }
+ });
+ });
+}
+
+exports.usb = usb;
+
diff --git a/node_modules/systeminformation/lib/users.js b/node_modules/systeminformation/lib/users.js
new file mode 100644
index 0000000..38ecfe1
--- /dev/null
+++ b/node_modules/systeminformation/lib/users.js
@@ -0,0 +1,393 @@
+'use strict';
+// @ts-check
+// ==================================================================================
+// users.js
+// ----------------------------------------------------------------------------------
+// Description: System Information - library
+// for Node.js
+// Copyright: (c) 2014 - 2022
+// Author: Sebastian Hildebrandt
+// ----------------------------------------------------------------------------------
+// License: MIT
+// ==================================================================================
+// 11. Users/Sessions
+// ----------------------------------------------------------------------------------
+
+const exec = require('child_process').exec;
+const util = require('./util');
+
+let _platform = process.platform;
+
+const _linux = (_platform === 'linux' || _platform === 'android');
+const _darwin = (_platform === 'darwin');
+const _windows = (_platform === 'win32');
+const _freebsd = (_platform === 'freebsd');
+const _openbsd = (_platform === 'openbsd');
+const _netbsd = (_platform === 'netbsd');
+const _sunos = (_platform === 'sunos');
+
+function parseUsersLinux(lines, phase) {
+ let result = [];
+ let result_who = [];
+ let result_w = {};
+ let w_first = true;
+ let w_header = [];
+ let w_pos = [];
+ let who_line = {};
+
+ let is_whopart = true;
+ lines.forEach(function (line) {
+ if (line === '---') {
+ is_whopart = false;
+ } else {
+ let l = line.replace(/ +/g, ' ').split(' ');
+
+ // who part
+ if (is_whopart) {
+ result_who.push({
+ user: l[0],
+ tty: l[1],
+ date: l[2],
+ time: l[3],
+ ip: (l && l.length > 4) ? l[4].replace(/\(/g, '').replace(/\)/g, '') : ''
+ });
+ } else {
+ // w part
+ if (w_first) { // header
+ w_header = l;
+ w_header.forEach(function (item) {
+ w_pos.push(line.indexOf(item));
+ });
+ w_first = false;
+ } else {
+ // split by w_pos
+ result_w.user = line.substring(w_pos[0], w_pos[1] - 1).trim();
+ result_w.tty = line.substring(w_pos[1], w_pos[2] - 1).trim();
+ result_w.ip = line.substring(w_pos[2], w_pos[3] - 1).replace(/\(/g, '').replace(/\)/g, '').trim();
+ result_w.command = line.substring(w_pos[7], 1000).trim();
+ // find corresponding 'who' line
+ who_line = result_who.filter(function (obj) {
+ return (obj.user.substring(0, 8).trim() === result_w.user && obj.tty === result_w.tty);
+ });
+ if (who_line.length === 1) {
+ result.push({
+ user: who_line[0].user,
+ tty: who_line[0].tty,
+ date: who_line[0].date,
+ time: who_line[0].time,
+ ip: who_line[0].ip,
+ command: result_w.command
+ });
+ }
+ }
+ }
+ }
+ });
+ if (result.length === 0 && phase === 2) {
+ return result_who;
+ } else {
+ return result;
+ }
+}
+
+function parseUsersDarwin(lines) {
+ let result = [];
+ let result_who = [];
+ let result_w = {};
+ let who_line = {};
+
+ let is_whopart = true;
+ lines.forEach(function (line) {
+ if (line === '---') {
+ is_whopart = false;
+ } else {
+ let l = line.replace(/ +/g, ' ').split(' ');
+
+ // who part
+ if (is_whopart) {
+ result_who.push({
+ user: l[0],
+ tty: l[1],
+ date: ('' + new Date().getFullYear()) + '-' + ('0' + ('JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC'.indexOf(l[2].toUpperCase()) / 3 + 1)).slice(-2) + '-' + ('0' + l[3]).slice(-2),
+ time: l[4],
+ });
+ } else {
+ // w part
+ // split by w_pos
+ result_w.user = l[0];
+ result_w.tty = l[1];
+ result_w.ip = (l[2] !== '-') ? l[2] : '';
+ result_w.command = l.slice(5, 1000).join(' ');
+ // find corresponding 'who' line
+ who_line = result_who.filter(function (obj) {
+ return (obj.user === result_w.user && (obj.tty.substring(3, 1000) === result_w.tty || obj.tty === result_w.tty));
+ });
+ if (who_line.length === 1) {
+ result.push({
+ user: who_line[0].user,
+ tty: who_line[0].tty,
+ date: who_line[0].date,
+ time: who_line[0].time,
+ ip: result_w.ip,
+ command: result_w.command
+ });
+ }
+ }
+ }
+ });
+ return result;
+}
+
+function users(callback) {
+
+ return new Promise((resolve) => {
+ process.nextTick(() => {
+ let result = [];
+
+ // linux
+ if (_linux) {
+ exec('who --ips; echo "---"; w | tail -n +2', function (error, stdout) {
+ if (!error) {
+ // lines / split
+ let lines = stdout.toString().split('\n');
+ result = parseUsersLinux(lines, 1);
+ if (result.length === 0) {
+ exec('who; echo "---"; w | tail -n +2', function (error, stdout) {
+ if (!error) {
+ // lines / split
+ lines = stdout.toString().split('\n');
+ result = parseUsersLinux(lines, 2);
+ }
+ if (callback) { callback(result); }
+ resolve(result);
+ });
+ } else {
+ if (callback) { callback(result); }
+ resolve(result);
+ }
+ } else {
+ if (callback) { callback(result); }
+ resolve(result);
+ }
+ });
+ }
+ if (_freebsd || _openbsd || _netbsd) {
+ exec('who; echo "---"; w -ih', function (error, stdout) {
+ if (!error) {
+ // lines / split
+ let lines = stdout.toString().split('\n');
+ result = parseUsersDarwin(lines);
+ }
+ if (callback) { callback(result); }
+ resolve(result);
+ });
+ }
+ if (_sunos) {
+ exec('who; echo "---"; w -h', function (error, stdout) {
+ if (!error) {
+ // lines / split
+ let lines = stdout.toString().split('\n');
+ result = parseUsersDarwin(lines);
+ }
+ if (callback) { callback(result); }
+ resolve(result);
+ });
+ }
+
+ if (_darwin) {
+ exec('who; echo "---"; w -ih', function (error, stdout) {
+ if (!error) {
+ // lines / split
+ let lines = stdout.toString().split('\n');
+ result = parseUsersDarwin(lines);
+ }
+ if (callback) { callback(result); }
+ resolve(result);
+ });
+ }
+ if (_windows) {
+ try {
+ let cmd = 'Get-WmiObject Win32_LogonSession | select LogonId,StartTime | fl' + '; echo \'#-#-#-#\';';
+ cmd += 'Get-WmiObject Win32_LoggedOnUser | select antecedent,dependent | fl ' + '; echo \'#-#-#-#\';';
+ cmd += 'Get-WmiObject Win32_Process -Filter "name=\'explorer.exe\'" | Select @{Name="sessionid";Expression={$_.SessionId}}, @{Name="domain";Expression={$_.GetOwner().Domain}}, @{Name="username";Expression={$_.GetOwner().User}} | fl' + '; echo \'#-#-#-#\';';
+ cmd += 'query user';
+ util.powerShell(cmd).then((data) => {
+ if (data) {
+ data = data.split('#-#-#-#');
+ let sessions = parseWinSessions((data[0] || '').split(/\n\s*\n/));
+ let loggedons = parseWinLoggedOn((data[1] || '').split(/\n\s*\n/));
+ let queryUser = parseWinUsersQuery((data[3] || '').split('\r\n'));
+ let users = parseWinUsers((data[2] || '').split(/\n\s*\n/), queryUser);
+ for (let id in loggedons) {
+ if ({}.hasOwnProperty.call(loggedons, id)) {
+ loggedons[id].dateTime = {}.hasOwnProperty.call(sessions, id) ? sessions[id] : '';
+ }
+ }
+ users.forEach(user => {
+ let dateTime = '';
+ for (let id in loggedons) {
+ if ({}.hasOwnProperty.call(loggedons, id)) {
+ if (loggedons[id].user === user.user && (!dateTime || dateTime < loggedons[id].dateTime)) {
+ dateTime = loggedons[id].dateTime;
+ }
+ }
+ }
+
+ result.push({
+ user: user.user,
+ tty: user.tty,
+ date: `${dateTime.substr(0, 4)}-${dateTime.substr(4, 2)}-${dateTime.substr(6, 2)}`,
+ time: `${dateTime.substr(8, 2)}:${dateTime.substr(10, 2)}`,
+ ip: '',
+ command: ''
+ });
+ });
+ }
+ if (callback) { callback(result); }
+ resolve(result);
+
+ });
+ // util.powerShell('query user').then(stdout => {
+ // if (stdout) {
+ // // lines / split
+ // let lines = stdout.toString().split('\r\n');
+ // getWinCulture()
+ // .then(culture => {
+ // result = parseUsersWin(lines, culture);
+ // if (callback) { callback(result); }
+ // resolve(result);
+ // });
+ // } else {
+ // if (callback) { callback(result); }
+ // resolve(result);
+ // }
+ // });
+ } catch (e) {
+ if (callback) { callback(result); }
+ resolve(result);
+ }
+ }
+
+ });
+ });
+}
+
+// function parseWinAccounts(accountParts) {
+// const accounts = [];
+// accountParts.forEach(account => {
+// const lines = account.split('\r\n');
+// const name = util.getValue(lines, 'name', ':', true);
+// const domain = util.getValue(lines, 'domain', ':', true);
+// accounts.push(`${domain}\${name}`);
+// });
+// return accounts;
+// }
+
+function parseWinSessions(sessionParts) {
+ const sessions = {};
+ sessionParts.forEach(session => {
+ const lines = session.split('\r\n');
+ const id = util.getValue(lines, 'LogonId');
+ const starttime = util.getValue(lines, 'starttime');
+ if (id) {
+ sessions[id] = starttime;
+ }
+ });
+ return sessions;
+}
+
+function fuzzyMatch(name1, name2) {
+ name1 = name1.toLowerCase();
+ name2 = name2.toLowerCase();
+ let eq = 0;
+ let len = name1.length;
+ if (name2.length > len) { len = name2.length; }
+
+ for (let i = 0; i < len; i++) {
+ const c1 = name1[i] || '';
+ const c2 = name2[i] || '';
+ if (c1 === c2) { eq++; }
+ }
+ return (len > 10 ? eq / len > 0.9 : (len > 0 ? eq / len > 0.8 : false));
+}
+
+function parseWinUsers(userParts, userQuery) {
+ const users = [];
+ userParts.forEach(user => {
+ const lines = user.split('\r\n');
+
+ const domain = util.getValue(lines, 'domain', ':', true);
+ const username = util.getValue(lines, 'username', ':', true);
+ const sessionid = util.getValue(lines, 'sessionid', ':', true);
+
+ if (username) {
+ const quser = userQuery.filter(item => fuzzyMatch(item.user, username));
+ users.push({
+ domain,
+ user: username,
+ tty: quser && quser[0] && quser[0].tty ? quser[0].tty : sessionid
+ });
+ }
+ });
+ return users;
+}
+
+function parseWinLoggedOn(loggedonParts) {
+ const loggedons = {};
+ loggedonParts.forEach(loggedon => {
+ const lines = loggedon.split('\r\n');
+
+ const antecendent = util.getValue(lines, 'antecedent', ':', true);
+ let parts = antecendent.split(',');
+ const domainParts = parts.length > 1 ? parts[0].split('=') : [];
+ const nameParts = parts.length > 1 ? parts[1].split('=') : [];
+ const domain = domainParts.length > 1 ? domainParts[1].replace(/"/g, '') : '';
+ const name = nameParts.length > 1 ? nameParts[1].replace(/"/g, '') : '';
+ const dependent = util.getValue(lines, 'dependent', ':', true);
+ parts = dependent.split('=');
+ const id = parts.length > 1 ? parts[1].replace(/"/g, '') : '';
+ if (id) {
+ loggedons[id] = {
+ domain,
+ user: name
+ };
+ }
+ });
+ return loggedons;
+}
+
+function parseWinUsersQuery(lines) {
+ lines = lines.filter(item => item);
+ let result = [];
+ const header = lines[0];
+ const headerDelimiter = [];
+ if (header) {
+ const start = (header[0] === ' ') ? 1 : 0;
+ headerDelimiter.push(start - 1);
+ let nextSpace = 0;
+ for (let i = start + 1; i < header.length; i++) {
+ if (header[i] === ' ' && ((header[i - 1] === ' ') || (header[i - 1] === '.'))) {
+ nextSpace = i;
+ } else {
+ if (nextSpace) {
+ headerDelimiter.push(nextSpace);
+ nextSpace = 0;
+ }
+ }
+ }
+ for (let i = 1; i < lines.length; i++) {
+ if (lines[i].trim()) {
+ const user = lines[i].substring(headerDelimiter[0] + 1, headerDelimiter[1]).trim() || '';
+ const tty = lines[i].substring(headerDelimiter[1] + 1, headerDelimiter[2] - 2).trim() || '';
+ // const dateTime = util.parseDateTime(lines[i].substring(headerDelimiter[5] + 1, 2000).trim(), culture) || '';
+ result.push({
+ user: user,
+ tty: tty,
+ });
+ }
+ }
+ }
+ return result;
+}
+
+exports.users = users;
diff --git a/node_modules/systeminformation/lib/util.js b/node_modules/systeminformation/lib/util.js
new file mode 100644
index 0000000..8ee0a61
--- /dev/null
+++ b/node_modules/systeminformation/lib/util.js
@@ -0,0 +1,1281 @@
+'use strict';
+// @ts-check
+// ==================================================================================
+// utils.js
+// ----------------------------------------------------------------------------------
+// Description: System Information - library
+// for Node.js
+// Copyright: (c) 2014 - 2022
+// Author: Sebastian Hildebrandt
+// ----------------------------------------------------------------------------------
+// License: MIT
+// ==================================================================================
+// 0. helper functions
+// ----------------------------------------------------------------------------------
+
+const os = require('os');
+const fs = require('fs');
+const path = require('path');
+const spawn = require('child_process').spawn;
+const exec = require('child_process').exec;
+const execSync = require('child_process').execSync;
+const util = require('util');
+
+let _platform = process.platform;
+const _linux = (_platform === 'linux' || _platform === 'android');
+const _darwin = (_platform === 'darwin');
+const _windows = (_platform === 'win32');
+const _freebsd = (_platform === 'freebsd');
+const _openbsd = (_platform === 'openbsd');
+const _netbsd = (_platform === 'netbsd');
+// const _sunos = (_platform === 'sunos');
+
+let _cores = 0;
+let wmicPath = '';
+let codepage = '';
+let _smartMonToolsInstalled = null;
+
+const WINDIR = process.env.WINDIR || 'C:\\Windows';
+
+// powerShell
+let _psChild;
+let _psResult = '';
+let _psCmds = [];
+let _psPersistent = false;
+const _psToUTF8 = '$OutputEncoding = [System.Console]::OutputEncoding = [System.Console]::InputEncoding = [System.Text.Encoding]::UTF8 ; ';
+const _psCmdStart = '--###START###--';
+const _psError = '--ERROR--';
+const _psCmdSeperator = '--###ENDCMD###--';
+const _psIdSeperator = '--##ID##--';
+
+const execOptsWin = {
+ windowsHide: true,
+ maxBuffer: 1024 * 20000,
+ encoding: 'UTF-8',
+ env: util._extend({}, process.env, { LANG: 'en_US.UTF-8' })
+};
+
+function toInt(value) {
+ let result = parseInt(value, 10);
+ if (isNaN(result)) {
+ result = 0;
+ }
+ return result;
+}
+
+
+const stringReplace = new String().replace;
+const stringToLower = new String().toLowerCase;
+const stringToString = new String().toString;
+const stringSubstr = new String().substr;
+const stringTrim = new String().trim;
+const stringStartWith = new String().startsWith;
+const mathMin = Math.min;
+
+function isFunction(functionToCheck) {
+ let getType = {};
+ return functionToCheck && getType.toString.call(functionToCheck) === '[object Function]';
+}
+
+function unique(obj) {
+ let uniques = [];
+ let stringify = {};
+ for (let i = 0; i < obj.length; i++) {
+ let keys = Object.keys(obj[i]);
+ keys.sort(function (a, b) { return a - b; });
+ let str = '';
+ for (let j = 0; j < keys.length; j++) {
+ str += JSON.stringify(keys[j]);
+ str += JSON.stringify(obj[i][keys[j]]);
+ }
+ if (!{}.hasOwnProperty.call(stringify, str)) {
+ uniques.push(obj[i]);
+ stringify[str] = true;
+ }
+ }
+ return uniques;
+}
+
+function sortByKey(array, keys) {
+ return array.sort(function (a, b) {
+ let x = '';
+ let y = '';
+ keys.forEach(function (key) {
+ x = x + a[key]; y = y + b[key];
+ });
+ return ((x < y) ? -1 : ((x > y) ? 1 : 0));
+ });
+}
+
+function cores() {
+ if (_cores === 0) {
+ _cores = os.cpus().length;
+ }
+ return _cores;
+}
+
+function getValue(lines, property, separator, trimmed, lineMatch) {
+ separator = separator || ':';
+ property = property.toLowerCase();
+ trimmed = trimmed || false;
+ lineMatch = lineMatch || false;
+ for (let i = 0; i < lines.length; i++) {
+ let line = lines[i].toLowerCase().replace(/\t/g, '');
+ if (trimmed) {
+ line = line.trim();
+ }
+ if (line.startsWith(property) && (lineMatch ? (line.match(property + separator)) : true)) {
+ const parts = trimmed ? lines[i].trim().split(separator) : lines[i].split(separator);
+ if (parts.length >= 2) {
+ parts.shift();
+ return parts.join(separator).trim();
+ } else {
+ return '';
+ }
+ }
+ }
+ return '';
+}
+
+function decodeEscapeSequence(str, base) {
+ base = base || 16;
+ return str.replace(/\\x([0-9A-Fa-f]{2})/g, function () {
+ return String.fromCharCode(parseInt(arguments[1], base));
+ });
+}
+
+function detectSplit(str) {
+ let seperator = '';
+ let part = 0;
+ str.split('').forEach(element => {
+ if (element >= '0' && element <= '9') {
+ if (part === 1) { part++; }
+ } else {
+ if (part === 0) { part++; }
+ if (part === 1) {
+ seperator += element;
+ }
+ }
+ });
+ return seperator;
+}
+
+function parseTime(t, pmDesignator) {
+ pmDesignator = pmDesignator || '';
+ t = t.toUpperCase();
+ let hour = 0;
+ let min = 0;
+ let splitter = detectSplit(t);
+ let parts = t.split(splitter);
+ if (parts.length >= 2) {
+ if (parts[2]) {
+ parts[1] += parts[2];
+ }
+ let isPM = (parts[1] && (parts[1].toLowerCase().indexOf('pm') > -1) || (parts[1].toLowerCase().indexOf('p.m.') > -1) || (parts[1].toLowerCase().indexOf('p. m.') > -1) || (parts[1].toLowerCase().indexOf('n') > -1) || (parts[1].toLowerCase().indexOf('ch') > -1) || (parts[1].toLowerCase().indexOf('ös') > -1) || (pmDesignator && parts[1].toLowerCase().indexOf(pmDesignator) > -1));
+ hour = parseInt(parts[0], 10);
+ min = parseInt(parts[1], 10);
+ hour = isPM && hour < 12 ? hour + 12 : hour;
+ return ('0' + hour).substr(-2) + ':' + ('0' + min).substr(-2);
+ }
+}
+
+function parseDateTime(dt, culture) {
+ const result = {
+ date: '',
+ time: ''
+ };
+ culture = culture || {};
+ let dateFormat = (culture.dateFormat || '').toLowerCase();
+ let pmDesignator = (culture.pmDesignator || '');
+
+ const parts = dt.split(' ');
+ if (parts[0]) {
+ if (parts[0].indexOf('/') >= 0) {
+ // Dateformat: mm/dd/yyyy or dd/mm/yyyy or dd/mm/yy or yyyy/mm/dd
+ const dtparts = parts[0].split('/');
+ if (dtparts.length === 3) {
+ if (dtparts[0].length === 4) {
+ // Dateformat: yyyy/mm/dd
+ result.date = dtparts[0] + '-' + ('0' + dtparts[1]).substr(-2) + '-' + ('0' + dtparts[2]).substr(-2);
+ } else if (dtparts[2].length === 2) {
+ if ((dateFormat.indexOf('/d/') > -1 || dateFormat.indexOf('/dd/') > -1)) {
+ // Dateformat: mm/dd/yy
+ result.date = '20' + dtparts[2] + '-' + ('0' + dtparts[1]).substr(-2) + '-' + ('0' + dtparts[0]).substr(-2);
+ } else {
+ // Dateformat: dd/mm/yy
+ result.date = '20' + dtparts[2] + '-' + ('0' + dtparts[1]).substr(-2) + '-' + ('0' + dtparts[0]).substr(-2);
+ }
+ } else {
+ // Dateformat: mm/dd/yyyy or dd/mm/yyyy
+ const isEN = ((dt.toLowerCase().indexOf('pm') > -1) || (dt.toLowerCase().indexOf('p.m.') > -1) || (dt.toLowerCase().indexOf('p. m.') > -1) || (dt.toLowerCase().indexOf('am') > -1) || (dt.toLowerCase().indexOf('a.m.') > -1) || (dt.toLowerCase().indexOf('a. m.') > -1));
+ if ((isEN || dateFormat.indexOf('/d/') > -1 || dateFormat.indexOf('/dd/') > -1) && dateFormat.indexOf('dd/') !== 0) {
+ // Dateformat: mm/dd/yyyy
+ result.date = dtparts[2] + '-' + ('0' + dtparts[0]).substr(-2) + '-' + ('0' + dtparts[1]).substr(-2);
+ } else {
+ // Dateformat: dd/mm/yyyy
+ result.date = dtparts[2] + '-' + ('0' + dtparts[1]).substr(-2) + '-' + ('0' + dtparts[0]).substr(-2);
+ }
+ }
+ }
+ }
+ if (parts[0].indexOf('.') >= 0) {
+ const dtparts = parts[0].split('.');
+ if (dtparts.length === 3) {
+ if (dateFormat.indexOf('.d.') > -1 || dateFormat.indexOf('.dd.') > -1) {
+ // Dateformat: mm.dd.yyyy
+ result.date = dtparts[2] + '-' + ('0' + dtparts[0]).substr(-2) + '-' + ('0' + dtparts[1]).substr(-2);
+ } else {
+ // Dateformat: dd.mm.yyyy
+ result.date = dtparts[2] + '-' + ('0' + dtparts[1]).substr(-2) + '-' + ('0' + dtparts[0]).substr(-2);
+ }
+ }
+ }
+ if (parts[0].indexOf('-') >= 0) {
+ // Dateformat: yyyy-mm-dd
+ const dtparts = parts[0].split('-');
+ if (dtparts.length === 3) {
+ result.date = dtparts[0] + '-' + ('0' + dtparts[1]).substr(-2) + '-' + ('0' + dtparts[2]).substr(-2);
+ }
+ }
+ }
+ if (parts[1]) {
+ parts.shift();
+ let time = parts.join(' ');
+ result.time = parseTime(time, pmDesignator);
+ }
+ return result;
+}
+
+function parseHead(head, rights) {
+ let space = (rights > 0);
+ let count = 1;
+ let from = 0;
+ let to = 0;
+ let result = [];
+ for (let i = 0; i < head.length; i++) {
+ if (count <= rights) {
+ // if (head[i] === ' ' && !space) {
+ if (/\s/.test(head[i]) && !space) {
+ to = i - 1;
+ result.push({
+ from: from,
+ to: to + 1,
+ cap: head.substring(from, to + 1)
+ });
+ from = to + 2;
+ count++;
+ }
+ space = head[i] === ' ';
+ } else {
+ if (!/\s/.test(head[i]) && space) {
+ to = i - 1;
+ if (from < to) {
+ result.push({
+ from: from,
+ to: to,
+ cap: head.substring(from, to)
+ });
+ }
+ from = to + 1;
+ count++;
+ }
+ space = head[i] === ' ';
+ }
+ }
+ to = 1000;
+ result.push({
+ from: from,
+ to: to,
+ cap: head.substring(from, to)
+ });
+ let len = result.length;
+ for (var i = 0; i < len; i++) {
+ if (result[i].cap.replace(/\s/g, '').length === 0) {
+ if (i + 1 < len) {
+ result[i].to = result[i + 1].to;
+ result[i].cap = result[i].cap + result[i + 1].cap;
+ result.splice(i + 1, 1);
+ len = len - 1;
+ }
+ }
+ }
+ return result;
+}
+
+function findObjectByKey(array, key, value) {
+ for (let i = 0; i < array.length; i++) {
+ if (array[i][key] === value) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+function getWmic() {
+ if (os.type() === 'Windows_NT' && !wmicPath) {
+ wmicPath = WINDIR + '\\system32\\wbem\\wmic.exe';
+ if (!fs.existsSync(wmicPath)) {
+ try {
+ const wmicPathArray = execSync('WHERE WMIC', execOptsWin).toString().split('\r\n');
+ if (wmicPathArray && wmicPathArray.length) {
+ wmicPath = wmicPathArray[0];
+ } else {
+ wmicPath = 'wmic';
+ }
+ } catch (e) {
+ wmicPath = 'wmic';
+ }
+ }
+ }
+ return wmicPath;
+}
+
+function wmic(command) {
+ return new Promise((resolve) => {
+ process.nextTick(() => {
+ try {
+ powerShell(getWmic() + ' ' + command).then(stdout => {
+ resolve(stdout, '');
+ });
+ } catch (e) {
+ resolve('', e);
+ }
+ });
+ });
+}
+
+// function wmic(command, options) {
+// options = options || execOptsWin;
+// return new Promise((resolve) => {
+// process.nextTick(() => {
+// try {
+// exec(WINDIR + '\\system32\\chcp.com 65001 | ' + getWmic() + ' ' + command, options, function (error, stdout) {
+// resolve(stdout, error);
+// }).stdin.end();
+// } catch (e) {
+// resolve('', e);
+// }
+// });
+// });
+// }
+
+function getVboxmanage() {
+ return _windows ? `"${process.env.VBOX_INSTALL_PATH || process.env.VBOX_MSI_INSTALL_PATH}\\VBoxManage.exe"` : 'vboxmanage';
+}
+
+function powerShellProceedResults(data) {
+ let id = '';
+ let parts;
+ let res = '';
+ // startID
+ if (data.indexOf(_psCmdStart) >= 0) {
+ parts = data.split(_psCmdStart);
+ const parts2 = parts[1].split(_psIdSeperator);
+ id = parts2[0];
+ if (parts2.length > 1) {
+ data = parts2.slice(1).join(_psIdSeperator);
+ }
+ }
+ // result;
+ if (data.indexOf(_psCmdSeperator) >= 0) {
+ parts = data.split(_psCmdSeperator);
+ res = parts[0];
+ }
+ let remove = -1;
+ for (let i = 0; i < _psCmds.length; i++) {
+ if (_psCmds[i].id === id) {
+ remove = i;
+ // console.log(`----- TIME : ${(new Date() - _psCmds[i].start) * 0.001} s`);
+
+ _psCmds[i].callback(res);
+ }
+ }
+ if (remove >= 0) {
+ _psCmds.splice(remove, 1);
+ }
+}
+
+function powerShellStart() {
+ if (!_psChild) {
+ _psChild = spawn('powershell.exe', ['-NoLogo', '-InputFormat', 'Text', '-NoExit', '-Command', '-'], {
+ stdio: 'pipe',
+ windowsHide: true,
+ maxBuffer: 1024 * 20000,
+ encoding: 'UTF-8',
+ env: util._extend({}, process.env, { LANG: 'en_US.UTF-8' })
+ });
+ if (_psChild && _psChild.pid) {
+ _psPersistent = true;
+ _psChild.stdout.on('data', function (data) {
+ _psResult = _psResult + data.toString('utf8');
+ if (data.indexOf(_psCmdSeperator) >= 0) {
+ powerShellProceedResults(_psResult);
+ _psResult = '';
+ }
+ });
+ _psChild.stderr.on('data', function () {
+ powerShellProceedResults(_psResult + _psError);
+ });
+ _psChild.on('error', function () {
+ powerShellProceedResults(_psResult + _psError);
+ });
+ _psChild.on('close', function () {
+ _psChild.kill();
+ });
+ }
+ }
+}
+
+function powerShellRelease() {
+ try {
+ if (_psChild) {
+ _psChild.stdin.write('exit' + os.EOL);
+ _psChild.stdin.end();
+ _psPersistent = false;
+ }
+ } catch (e) {
+ _psChild.kill();
+ }
+ _psChild = null;
+}
+
+function powerShell(cmd) {
+
+ if (_psPersistent) {
+ const id = Math.random().toString(36).substr(2, 10);
+ return new Promise((resolve) => {
+ process.nextTick(() => {
+ function callback(data) {
+ resolve(data);
+ }
+ _psCmds.push({
+ id,
+ cmd,
+ callback,
+ start: new Date()
+ });
+ try {
+ if (_psChild && _psChild.pid) {
+ _psChild.stdin.write(_psToUTF8 + 'echo ' + _psCmdStart + id + _psIdSeperator + '; ' + os.EOL + cmd + os.EOL + 'echo ' + _psCmdSeperator + os.EOL);
+ }
+ } catch (e) {
+ resolve('');
+ }
+ });
+ });
+
+ } else {
+ let result = '';
+
+ return new Promise((resolve) => {
+ process.nextTick(() => {
+ try {
+ // const start = new Date();
+ const child = spawn('powershell.exe', ['-NoLogo', '-InputFormat', 'Text', '-NoExit', '-ExecutionPolicy', 'Unrestricted', '-Command', '-'], {
+ stdio: 'pipe',
+ windowsHide: true,
+ maxBuffer: 1024 * 20000,
+ encoding: 'UTF-8',
+ env: util._extend({}, process.env, { LANG: 'en_US.UTF-8' })
+ });
+
+ if (child && !child.pid) {
+ child.on('error', function () {
+ resolve(result);
+ });
+ }
+ if (child && child.pid) {
+ child.stdout.on('data', function (data) {
+ result = result + data.toString('utf8');
+ });
+ child.stderr.on('data', function () {
+ child.kill();
+ resolve(result);
+ });
+ child.on('close', function () {
+ child.kill();
+ // console.log(`----- TIME : ${(new Date() - start) * 0.001} s`);
+
+ resolve(result);
+ });
+ child.on('error', function () {
+ child.kill();
+ resolve(result);
+ });
+ try {
+ child.stdin.write(_psToUTF8 + cmd + os.EOL);
+ child.stdin.write('exit' + os.EOL);
+ child.stdin.end();
+ } catch (e) {
+ child.kill();
+ resolve(result);
+ }
+ } else {
+ resolve(result);
+ }
+ } catch (e) {
+ resolve(result);
+ }
+ });
+ });
+ }
+}
+
+function execSafe(cmd, args, options) {
+ let result = '';
+ options = options || {};
+
+ return new Promise((resolve) => {
+ process.nextTick(() => {
+ try {
+ const child = spawn(cmd, args, options);
+
+ if (child && !child.pid) {
+ child.on('error', function () {
+ resolve(result);
+ });
+ }
+ if (child && child.pid) {
+ child.stdout.on('data', function (data) {
+ result += data.toString();
+ });
+ child.on('close', function () {
+ child.kill();
+ resolve(result);
+ });
+ child.on('error', function () {
+ child.kill();
+ resolve(result);
+ });
+ } else {
+ resolve(result);
+ }
+ } catch (e) {
+ resolve(result);
+ }
+ });
+ });
+}
+
+function getCodepage() {
+ if (_windows) {
+ if (!codepage) {
+ try {
+ const stdout = execSync('chcp', execOptsWin);
+ const lines = stdout.toString().split('\r\n');
+ const parts = lines[0].split(':');
+ codepage = parts.length > 1 ? parts[1].replace('.', '') : '';
+ } catch (err) {
+ codepage = '437';
+ }
+ }
+ return codepage;
+ }
+ if (_linux || _darwin || _freebsd || _openbsd || _netbsd) {
+ if (!codepage) {
+ try {
+ const stdout = execSync('echo $LANG');
+ const lines = stdout.toString().split('\r\n');
+ const parts = lines[0].split('.');
+ codepage = parts.length > 1 ? parts[1].trim() : '';
+ if (!codepage) {
+ codepage = 'UTF-8';
+ }
+ } catch (err) {
+ codepage = 'UTF-8';
+ }
+ }
+ return codepage;
+ }
+}
+
+function smartMonToolsInstalled() {
+ if (_smartMonToolsInstalled !== null) {
+ return _smartMonToolsInstalled;
+ }
+ _smartMonToolsInstalled = false;
+ if (_windows) {
+ try {
+ const pathArray = execSync('WHERE smartctl 2>nul', execOptsWin).toString().split('\r\n');
+ if (pathArray && pathArray.length) {
+ _smartMonToolsInstalled = pathArray[0].indexOf(':\\') >= 0;
+ } else {
+ _smartMonToolsInstalled = false;
+ }
+ } catch (e) {
+ _smartMonToolsInstalled = false;
+ }
+ }
+ if (_linux || _darwin || _freebsd || _openbsd || _netbsd) {
+ const pathArray = execSync('which smartctl 2>/dev/null', execOptsWin).toString().split('\r\n');
+ _smartMonToolsInstalled = pathArray.length > 0;
+ }
+ return _smartMonToolsInstalled;
+}
+
+function isRaspberry() {
+ const PI_MODEL_NO = [
+ 'BCM2708',
+ 'BCM2709',
+ 'BCM2710',
+ 'BCM2711',
+ 'BCM2835',
+ 'BCM2836',
+ 'BCM2837',
+ 'BCM2837B0'
+ ];
+ let cpuinfo = [];
+ try {
+ cpuinfo = fs.readFileSync('/proc/cpuinfo', { encoding: 'utf8' }).toString().split('\n');
+ } catch (e) {
+ return false;
+ }
+ const hardware = getValue(cpuinfo, 'hardware');
+ return (hardware && PI_MODEL_NO.indexOf(hardware) > -1);
+}
+
+function isRaspbian() {
+ let osrelease = [];
+ try {
+ osrelease = fs.readFileSync('/etc/os-release', { encoding: 'utf8' }).toString().split('\n');
+ } catch (e) {
+ return false;
+ }
+ const id = getValue(osrelease, 'id', '=');
+ return (id && id.indexOf('raspbian') > -1);
+}
+
+function execWin(cmd, opts, callback) {
+ if (!callback) {
+ callback = opts;
+ opts = execOptsWin;
+ }
+ let newCmd = 'chcp 65001 > nul && cmd /C ' + cmd + ' && chcp ' + codepage + ' > nul';
+ exec(newCmd, opts, function (error, stdout) {
+ callback(error, stdout);
+ });
+}
+
+function darwinXcodeExists() {
+ const cmdLineToolsExists = fs.existsSync('/Library/Developer/CommandLineTools/usr/bin/');
+ const xcodeAppExists = fs.existsSync('/Applications/Xcode.app/Contents/Developer/Tools');
+ const xcodeExists = fs.existsSync('/Library/Developer/Xcode/');
+ return (cmdLineToolsExists || xcodeExists || xcodeAppExists);
+}
+
+function nanoSeconds() {
+ const time = process.hrtime();
+ if (!Array.isArray(time) || time.length !== 2) {
+ return 0;
+ }
+ return +time[0] * 1e9 + +time[1];
+}
+
+function countUniqueLines(lines, startingWith) {
+ startingWith = startingWith || '';
+ const uniqueLines = [];
+ lines.forEach(line => {
+ if (line.startsWith(startingWith)) {
+ if (uniqueLines.indexOf(line) === -1) {
+ uniqueLines.push(line);
+ }
+ }
+ });
+ return uniqueLines.length;
+}
+
+function countLines(lines, startingWith) {
+ startingWith = startingWith || '';
+ const uniqueLines = [];
+ lines.forEach(line => {
+ if (line.startsWith(startingWith)) {
+ uniqueLines.push(line);
+ }
+ });
+ return uniqueLines.length;
+}
+
+function sanitizeShellString(str, strict) {
+ if (typeof strict === 'undefined') { strict = false; }
+ const s = str || '';
+ let result = '';
+ for (let i = 0; i <= mathMin(s.length, 2000); i++) {
+ if (!(s[i] === undefined ||
+ s[i] === '>' ||
+ s[i] === '<' ||
+ s[i] === '*' ||
+ s[i] === '?' ||
+ s[i] === '[' ||
+ s[i] === ']' ||
+ s[i] === '|' ||
+ s[i] === '˚' ||
+ s[i] === '$' ||
+ s[i] === ';' ||
+ s[i] === '&' ||
+ s[i] === '(' ||
+ s[i] === ')' ||
+ s[i] === ']' ||
+ s[i] === '#' ||
+ s[i] === '\\' ||
+ s[i] === '\t' ||
+ s[i] === '\n' ||
+ s[i] === '\'' ||
+ s[i] === '`' ||
+ s[i] === '"' ||
+ s[i].length > 1 ||
+ (strict && s[i] === '@') ||
+ (strict && s[i] === ' ') ||
+ (strict && s[i] == '{') ||
+ (strict && s[i] == ')'))) {
+ result = result + s[i];
+ }
+ }
+ return result;
+}
+
+function isPrototypePolluted() {
+ const s = '1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
+ let notPolluted = true;
+ let st = '';
+
+ st.__proto__.replace = stringReplace;
+ st.__proto__.toLowerCase = stringToLower;
+ st.__proto__.toString = stringToString;
+ st.__proto__.substr = stringSubstr;
+
+ notPolluted = notPolluted || !(s.length === 62);
+ const ms = Date.now();
+ if (typeof ms === 'number' && ms > 1600000000000) {
+ const l = ms % 100 + 15;
+ for (let i = 0; i < l; i++) {
+ const r = Math.random() * 61.99999999 + 1;
+ const rs = parseInt(Math.floor(r).toString(), 10);
+ const rs2 = parseInt(r.toString().split('.')[0], 10);
+ const q = Math.random() * 61.99999999 + 1;
+ const qs = parseInt(Math.floor(q).toString(), 10);
+ const qs2 = parseInt(q.toString().split('.')[0], 10);
+ notPolluted = notPolluted && !(r === q);
+ notPolluted = notPolluted && rs === rs2 && qs === qs2;
+ st += s[rs - 1];
+ }
+ notPolluted = notPolluted && st.length === l;
+ // string manipulation
+ let p = Math.random() * l * 0.9999999999;
+ let stm = st.substr(0, p) + ' ' + st.substr(p, 2000);
+ stm.__proto__.replace = stringReplace;
+ let sto = stm.replace(/ /g, '');
+ notPolluted = notPolluted && st === sto;
+ p = Math.random() * l * 0.9999999999;
+ stm = st.substr(0, p) + '{' + st.substr(p, 2000);
+ sto = stm.replace(/{/g, '');
+ notPolluted = notPolluted && st === sto;
+ p = Math.random() * l * 0.9999999999;
+ stm = st.substr(0, p) + '*' + st.substr(p, 2000);
+ sto = stm.replace(/\*/g, '');
+ notPolluted = notPolluted && st === sto;
+ p = Math.random() * l * 0.9999999999;
+ stm = st.substr(0, p) + '$' + st.substr(p, 2000);
+ sto = stm.replace(/\$/g, '');
+ notPolluted = notPolluted && st === sto;
+
+ // lower
+ const stl = st.toLowerCase();
+ notPolluted = notPolluted && (stl.length === l) && stl[l - 1] && !(stl[l]);
+ for (let i = 0; i < l; i++) {
+ const s1 = st[i];
+ s1.__proto__.toLowerCase = stringToLower;
+ const s2 = stl ? stl[i] : '';
+ const s1l = s1.toLowerCase();
+ notPolluted = notPolluted && s1l[0] === s2 && s1l[0] && !(s1l[1]);
+ }
+ }
+ return !notPolluted;
+}
+
+function hex2bin(hex) {
+ return ('00000000' + (parseInt(hex, 16)).toString(2)).substr(-8);
+}
+
+function getFilesInPath(source) {
+ const lstatSync = fs.lstatSync;
+ const readdirSync = fs.readdirSync;
+ const join = path.join;
+
+ function isDirectory(source) {
+ return lstatSync(source).isDirectory();
+ }
+ function isFile(source) { return lstatSync(source).isFile(); }
+
+ function getDirectories(source) {
+ return readdirSync(source).map(function (name) { return join(source, name); }).filter(isDirectory);
+ }
+ function getFiles(source) {
+ return readdirSync(source).map(function (name) { return join(source, name); }).filter(isFile);
+ }
+
+ function getFilesRecursively(source) {
+ try {
+ let dirs = getDirectories(source);
+ let files = dirs
+ .map(function (dir) { return getFilesRecursively(dir); })
+ .reduce(function (a, b) { return a.concat(b); }, []);
+ return files.concat(getFiles(source));
+ } catch (e) {
+ return [];
+ }
+ }
+
+ if (fs.existsSync(source)) {
+ return getFilesRecursively(source);
+ } else {
+ return [];
+ }
+}
+
+function decodePiCpuinfo(lines) {
+
+ // https://www.raspberrypi.org/documentation/hardware/raspberrypi/revision-codes/README.md
+
+ const oldRevisionCodes = {
+ '0002': {
+ type: 'B',
+ revision: '1.0',
+ memory: 256,
+ manufacturer: 'Egoman',
+ processor: 'BCM2835'
+ },
+ '0003': {
+ type: 'B',
+ revision: '1.0',
+ memory: 256,
+ manufacturer: 'Egoman',
+ processor: 'BCM2835'
+ },
+ '0004': {
+ type: 'B',
+ revision: '2.0',
+ memory: 256,
+ manufacturer: 'Sony UK',
+ processor: 'BCM2835'
+ },
+ '0005': {
+ type: 'B',
+ revision: '2.0',
+ memory: 256,
+ manufacturer: 'Qisda',
+ processor: 'BCM2835'
+ },
+ '0006': {
+ type: 'B',
+ revision: '2.0',
+ memory: 256,
+ manufacturer: 'Egoman',
+ processor: 'BCM2835'
+ },
+ '0007': {
+ type: 'A',
+ revision: '2.0',
+ memory: 256,
+ manufacturer: 'Egoman',
+ processor: 'BCM2835'
+ },
+ '0008': {
+ type: 'A',
+ revision: '2.0',
+ memory: 256,
+ manufacturer: 'Sony UK',
+ processor: 'BCM2835'
+ },
+ '0009': {
+ type: 'A',
+ revision: '2.0',
+ memory: 256,
+ manufacturer: 'Qisda',
+ processor: 'BCM2835'
+ },
+ '000d': {
+ type: 'B',
+ revision: '2.0',
+ memory: 512,
+ manufacturer: 'Egoman',
+ processor: 'BCM2835'
+ },
+ '000e': {
+ type: 'B',
+ revision: '2.0',
+ memory: 512,
+ manufacturer: 'Sony UK',
+ processor: 'BCM2835'
+ },
+ '000f': {
+ type: 'B',
+ revision: '2.0',
+ memory: 512,
+ manufacturer: 'Egoman',
+ processor: 'BCM2835'
+ },
+ '0010': {
+ type: 'B+',
+ revision: '1.2',
+ memory: 512,
+ manufacturer: 'Sony UK',
+ processor: 'BCM2835'
+ },
+ '0011': {
+ type: 'CM1',
+ revision: '1.0',
+ memory: 512,
+ manufacturer: 'Sony UK',
+ processor: 'BCM2835'
+ },
+ '0012': {
+ type: 'A+',
+ revision: '1.1',
+ memory: 256,
+ manufacturer: 'Sony UK',
+ processor: 'BCM2835'
+ },
+ '0013': {
+ type: 'B+',
+ revision: '1.2',
+ memory: 512,
+ manufacturer: 'Embest',
+ processor: 'BCM2835'
+ },
+ '0014': {
+ type: 'CM1',
+ revision: '1.0',
+ memory: 512,
+ manufacturer: 'Embest',
+ processor: 'BCM2835'
+ },
+ '0015': {
+ type: 'A+',
+ revision: '1.1',
+ memory: 256,
+ manufacturer: '512MB Embest',
+ processor: 'BCM2835'
+ }
+ };
+
+ const processorList = [
+ 'BCM2835',
+ 'BCM2836',
+ 'BCM2837',
+ 'BCM2711',
+ ];
+ const manufacturerList = [
+ 'Sony UK',
+ 'Egoman',
+ 'Embest',
+ 'Sony Japan',
+ 'Embest',
+ 'Stadium'
+ ];
+ const typeList = {
+ '00': 'A',
+ '01': 'B',
+ '02': 'A+',
+ '03': 'B+',
+ '04': '2B',
+ '05': 'Alpha (early prototype)',
+ '06': 'CM1',
+ '08': '3B',
+ '09': 'Zero',
+ '0a': 'CM3',
+ '0c': 'Zero W',
+ '0d': '3B+',
+ '0e': '3A+',
+ '0f': 'Internal use only',
+ '10': 'CM3+',
+ '11': '4B',
+ '12': 'Zero 2 W',
+ '13': '400',
+ '14': 'CM4'
+ };
+
+ const revisionCode = getValue(lines, 'revision', ':', true);
+ const model = getValue(lines, 'model:', ':', true);
+ const serial = getValue(lines, 'serial', ':', true);
+
+ let result = {};
+ if ({}.hasOwnProperty.call(oldRevisionCodes, revisionCode)) {
+ // old revision codes
+ result = {
+ model,
+ serial,
+ revisionCode,
+ memory: oldRevisionCodes[revisionCode].memory,
+ manufacturer: oldRevisionCodes[revisionCode].manufacturer,
+ processor: oldRevisionCodes[revisionCode].processor,
+ type: oldRevisionCodes[revisionCode].type,
+ revision: oldRevisionCodes[revisionCode].revision,
+ };
+
+ } else {
+ // new revision code
+ const revision = ('00000000' + getValue(lines, 'revision', ':', true).toLowerCase()).substr(-8);
+ // const revisionStyleNew = hex2bin(revision.substr(2, 1)).substr(4, 1) === '1';
+ const memSizeCode = parseInt(hex2bin(revision.substr(2, 1)).substr(5, 3), 2) || 0;
+ const manufacturer = manufacturerList[parseInt(revision.substr(3, 1), 10)];
+ const processor = processorList[parseInt(revision.substr(4, 1), 10)];
+ const typeCode = revision.substr(5, 2);
+
+
+ result = {
+ model,
+ serial,
+ revisionCode,
+ memory: 256 * Math.pow(2, memSizeCode),
+ manufacturer,
+ processor,
+ type: {}.hasOwnProperty.call(typeList, typeCode) ? typeList[typeCode] : '',
+ revision: '1.' + revision.substr(7, 1),
+ };
+ }
+ return result;
+}
+
+function promiseAll(promises) {
+ const resolvingPromises = promises.map(function (promise) {
+ return new Promise(function (resolve) {
+ var payload = new Array(2);
+ promise.then(function (result) {
+ payload[0] = result;
+ })
+ .catch(function (error) {
+ payload[1] = error;
+ })
+ .then(function () {
+ // The wrapped Promise returns an array: 0 = result, 1 = error ... we resolve all
+ resolve(payload);
+ });
+ });
+ });
+ var errors = [];
+ var results = [];
+
+ // Execute all wrapped Promises
+ return Promise.all(resolvingPromises)
+ .then(function (items) {
+ items.forEach(function (payload) {
+ if (payload[1]) {
+ errors.push(payload[1]);
+ results.push(null);
+ } else {
+ errors.push(null);
+ results.push(payload[0]);
+ }
+ });
+
+ return {
+ errors: errors,
+ results: results
+ };
+ });
+}
+
+function promisify(nodeStyleFunction) {
+ return function () {
+ var args = Array.prototype.slice.call(arguments);
+ return new Promise(function (resolve, reject) {
+ args.push(function (err, data) {
+ if (err) {
+ reject(err);
+ } else {
+ resolve(data);
+ }
+ });
+ nodeStyleFunction.apply(null, args);
+ });
+ };
+}
+
+function promisifySave(nodeStyleFunction) {
+ return function () {
+ var args = Array.prototype.slice.call(arguments);
+ return new Promise(function (resolve) {
+ args.push(function (err, data) {
+ resolve(data);
+ });
+ nodeStyleFunction.apply(null, args);
+ });
+ };
+}
+
+function linuxVersion() {
+ let result = '';
+ if (_linux) {
+ try {
+ result = execSync('uname -v').toString();
+ } catch (e) {
+ result = '';
+ }
+ }
+ return result;
+}
+
+function plistParser(xmlStr) {
+ const tags = ['array', 'dict', 'key', 'string', 'integer', 'date', 'real', 'data', 'boolean', 'arrayEmpty'];
+ const startStr = '<plist version';
+
+ let pos = xmlStr.indexOf(startStr);
+ let len = xmlStr.length;
+ while (xmlStr[pos] !== '>' && pos < len) {
+ pos++;
+ }
+
+ let depth = 0;
+ let inTagStart = false;
+ let inTagContent = false;
+ let inTagEnd = false;
+ let metaData = [{ tagStart: '', tagEnd: '', tagContent: '', key: '', data: null }];
+ let c = '';
+ let cn = xmlStr[pos];
+
+ while (pos < len) {
+ c = cn;
+ if (pos + 1 < len) { cn = xmlStr[pos + 1]; }
+ if (c === '<') {
+ inTagContent = false;
+ if (cn === '/') { inTagEnd = true; }
+ else if (metaData[depth].tagStart) {
+ metaData[depth].tagContent = '';
+ if (!metaData[depth].data) { metaData[depth].data = metaData[depth].tagStart === 'array' ? [] : {}; }
+ depth++;
+ metaData.push({ tagStart: '', tagEnd: '', tagContent: '', key: null, data: null });
+ inTagStart = true;
+ inTagContent = false;
+ }
+ else if (!inTagStart) { inTagStart = true; }
+ } else if (c === '>') {
+ if (metaData[depth].tagStart === 'true/') { inTagStart = false; inTagEnd = true; metaData[depth].tagStart = ''; metaData[depth].tagEnd = '/boolean'; metaData[depth].data = true; }
+ if (metaData[depth].tagStart === 'false/') { inTagStart = false; inTagEnd = true; metaData[depth].tagStart = ''; metaData[depth].tagEnd = '/boolean'; metaData[depth].data = false; }
+ if (metaData[depth].tagStart === 'array/') { inTagStart = false; inTagEnd = true; metaData[depth].tagStart = ''; metaData[depth].tagEnd = '/arrayEmpty'; metaData[depth].data = []; }
+ if (inTagContent) { inTagContent = false; }
+ if (inTagStart) {
+ inTagStart = false;
+ inTagContent = true;
+ if (metaData[depth].tagStart === 'array') {
+ metaData[depth].data = [];
+ }
+ if (metaData[depth].tagStart === 'dict') {
+ metaData[depth].data = {};
+ }
+ }
+ if (inTagEnd) {
+ inTagEnd = false;
+ if (metaData[depth].tagEnd && tags.indexOf(metaData[depth].tagEnd.substr(1)) >= 0) {
+ if (metaData[depth].tagEnd === '/dict' || metaData[depth].tagEnd === '/array') {
+ if (depth > 1 && metaData[depth - 2].tagStart === 'array') {
+ metaData[depth - 2].data.push(metaData[depth - 1].data);
+ }
+ if (depth > 1 && metaData[depth - 2].tagStart === 'dict') {
+ metaData[depth - 2].data[metaData[depth - 1].key] = metaData[depth - 1].data;
+ }
+ depth--;
+ metaData.pop();
+ metaData[depth].tagContent = '';
+ metaData[depth].tagStart = '';
+ metaData[depth].tagEnd = '';
+ }
+ else {
+ if (metaData[depth].tagEnd === '/key' && metaData[depth].tagContent) {
+ metaData[depth].key = metaData[depth].tagContent;
+ } else {
+ if (metaData[depth].tagEnd === '/real' && metaData[depth].tagContent) { metaData[depth].data = parseFloat(metaData[depth].tagContent) || 0; }
+ if (metaData[depth].tagEnd === '/integer' && metaData[depth].tagContent) { metaData[depth].data = parseInt(metaData[depth].tagContent) || 0; }
+ if (metaData[depth].tagEnd === '/string' && metaData[depth].tagContent) { metaData[depth].data = metaData[depth].tagContent || ''; }
+ if (metaData[depth].tagEnd === '/boolean') { metaData[depth].data = metaData[depth].tagContent || false; }
+ if (metaData[depth].tagEnd === '/arrayEmpty') { metaData[depth].data = metaData[depth].tagContent || []; }
+ if (depth > 0 && metaData[depth - 1].tagStart === 'array') { metaData[depth - 1].data.push(metaData[depth].data); }
+ if (depth > 0 && metaData[depth - 1].tagStart === 'dict') { metaData[depth - 1].data[metaData[depth].key] = metaData[depth].data; }
+ }
+ metaData[depth].tagContent = '';
+ metaData[depth].tagStart = '';
+ metaData[depth].tagEnd = '';
+ }
+ }
+ metaData[depth].tagEnd = '';
+ inTagStart = false;
+ inTagContent = false;
+ }
+ } else {
+ if (inTagStart) { metaData[depth].tagStart += c; }
+ if (inTagEnd) { metaData[depth].tagEnd += c; }
+ if (inTagContent) { metaData[depth].tagContent += c; }
+ }
+ pos++;
+ }
+ return metaData[0].data;
+}
+
+function semverCompare(v1, v2) {
+ let res = 0;
+ const parts1 = v1.split('.');
+ const parts2 = v2.split('.');
+ if (parts1[0] < parts2[0]) { res = 1; }
+ else if (parts1[0] > parts2[0]) { res = -1; }
+ else if (parts1[0] === parts2[0] && parts1.length >= 2 && parts2.length >= 2) {
+ if (parts1[1] < parts2[1]) { res = 1; }
+ else if (parts1[1] > parts2[1]) { res = -1; }
+ else if (parts1[1] === parts2[1]) {
+ if (parts1.length >= 3 && parts2.length >= 3) {
+ if (parts1[2] < parts2[2]) { res = 1; }
+ else if (parts1[2] > parts2[2]) { res = -1; }
+ } else if (parts2.length >= 3) {
+ res = 1;
+ }
+ }
+ }
+ return res;
+}
+
+function noop() { }
+
+exports.toInt = toInt;
+exports.execOptsWin = execOptsWin;
+exports.getCodepage = getCodepage;
+exports.execWin = execWin;
+exports.isFunction = isFunction;
+exports.unique = unique;
+exports.sortByKey = sortByKey;
+exports.cores = cores;
+exports.getValue = getValue;
+exports.decodeEscapeSequence = decodeEscapeSequence;
+exports.parseDateTime = parseDateTime;
+exports.parseHead = parseHead;
+exports.findObjectByKey = findObjectByKey;
+exports.getWmic = getWmic;
+exports.wmic = wmic;
+exports.darwinXcodeExists = darwinXcodeExists;
+exports.getVboxmanage = getVboxmanage;
+exports.powerShell = powerShell;
+exports.powerShellStart = powerShellStart;
+exports.powerShellRelease = powerShellRelease;
+exports.execSafe = execSafe;
+exports.nanoSeconds = nanoSeconds;
+exports.countUniqueLines = countUniqueLines;
+exports.countLines = countLines;
+exports.noop = noop;
+exports.isRaspberry = isRaspberry;
+exports.isRaspbian = isRaspbian;
+exports.sanitizeShellString = sanitizeShellString;
+exports.isPrototypePolluted = isPrototypePolluted;
+exports.decodePiCpuinfo = decodePiCpuinfo;
+exports.promiseAll = promiseAll;
+exports.promisify = promisify;
+exports.promisifySave = promisifySave;
+exports.smartMonToolsInstalled = smartMonToolsInstalled;
+exports.linuxVersion = linuxVersion;
+exports.plistParser = plistParser;
+exports.stringReplace = stringReplace;
+exports.stringToLower = stringToLower;
+exports.stringToString = stringToString;
+exports.stringSubstr = stringSubstr;
+exports.stringTrim = stringTrim;
+exports.stringStartWith = stringStartWith;
+exports.mathMin = mathMin;
+exports.WINDIR = WINDIR;
+exports.getFilesInPath = getFilesInPath;
+exports.semverCompare = semverCompare;
diff --git a/node_modules/systeminformation/lib/virtualbox.js b/node_modules/systeminformation/lib/virtualbox.js
new file mode 100644
index 0000000..61268b6
--- /dev/null
+++ b/node_modules/systeminformation/lib/virtualbox.js
@@ -0,0 +1,107 @@
+'use strict';
+// @ts-check
+// ==================================================================================
+// virtualbox.js
+// ----------------------------------------------------------------------------------
+// Description: System Information - library
+// for Node.js
+// Copyright: (c) 2014 - 2022
+// Author: Sebastian Hildebrandt
+// ----------------------------------------------------------------------------------
+// License: MIT
+// ==================================================================================
+// 14. Docker
+// ----------------------------------------------------------------------------------
+
+const os = require('os');
+const exec = require('child_process').exec;
+const util = require('./util');
+
+function vboxInfo(callback) {
+
+ // fallback - if only callback is given
+ let result = [];
+ return new Promise((resolve) => {
+ process.nextTick(() => {
+ try {
+ exec(util.getVboxmanage() + ' list vms --long', function (error, stdout) {
+ let parts = (os.EOL + stdout.toString()).split(os.EOL + 'Name:');
+ parts.shift();
+ parts.forEach(part => {
+ const lines = ('Name:' + part).split(os.EOL);
+ const state = util.getValue(lines, 'State');
+ const running = state.startsWith('running');
+ const runningSinceString = running ? state.replace('running (since ', '').replace(')', '').trim() : '';
+ let runningSince = 0;
+ try {
+ if (running) {
+ const sinceDateObj = new Date(runningSinceString);
+ const offset = sinceDateObj.getTimezoneOffset();
+ runningSince = Math.round((Date.now() - Date.parse(sinceDateObj)) / 1000) + offset * 60;
+ }
+ } catch (e) {
+ util.noop();
+ }
+ const stoppedSinceString = !running ? state.replace('powered off (since', '').replace(')', '').trim() : '';
+ let stoppedSince = 0;
+ try {
+ if (!running) {
+ const sinceDateObj = new Date(stoppedSinceString);
+ const offset = sinceDateObj.getTimezoneOffset();
+ stoppedSince = Math.round((Date.now() - Date.parse(sinceDateObj)) / 1000) + offset * 60;
+ }
+ } catch (e) {
+ util.noop();
+ }
+ result.push({
+ id: util.getValue(lines, 'UUID'),
+ name: util.getValue(lines, 'Name'),
+ running,
+ started: runningSinceString,
+ runningSince,
+ stopped: stoppedSinceString,
+ stoppedSince,
+ guestOS: util.getValue(lines, 'Guest OS'),
+ hardwareUUID: util.getValue(lines, 'Hardware UUID'),
+ memory: parseInt(util.getValue(lines, 'Memory size', ' '), 10),
+ vram: parseInt(util.getValue(lines, 'VRAM size'), 10),
+ cpus: parseInt(util.getValue(lines, 'Number of CPUs'), 10),
+ cpuExepCap: util.getValue(lines, 'CPU exec cap'),
+ cpuProfile: util.getValue(lines, 'CPUProfile'),
+ chipset: util.getValue(lines, 'Chipset'),
+ firmware: util.getValue(lines, 'Firmware'),
+ pageFusion: util.getValue(lines, 'Page Fusion') === 'enabled',
+ configFile: util.getValue(lines, 'Config file'),
+ snapshotFolder: util.getValue(lines, 'Snapshot folder'),
+ logFolder: util.getValue(lines, 'Log folder'),
+ hpet: util.getValue(lines, 'HPET') === 'enabled',
+ pae: util.getValue(lines, 'PAE') === 'enabled',
+ longMode: util.getValue(lines, 'Long Mode') === 'enabled',
+ tripleFaultReset: util.getValue(lines, 'Triple Fault Reset') === 'enabled',
+ apic: util.getValue(lines, 'APIC') === 'enabled',
+ x2Apic: util.getValue(lines, 'X2APIC') === 'enabled',
+ acpi: util.getValue(lines, 'ACPI') === 'enabled',
+ ioApic: util.getValue(lines, 'IOAPIC') === 'enabled',
+ biosApicMode: util.getValue(lines, 'BIOS APIC mode'),
+ bootMenuMode: util.getValue(lines, 'Boot menu mode'),
+ bootDevice1: util.getValue(lines, 'Boot Device 1'),
+ bootDevice2: util.getValue(lines, 'Boot Device 2'),
+ bootDevice3: util.getValue(lines, 'Boot Device 3'),
+ bootDevice4: util.getValue(lines, 'Boot Device 4'),
+ timeOffset: util.getValue(lines, 'Time offset'),
+ rtc: util.getValue(lines, 'RTC'),
+ });
+ });
+
+ if (callback) { callback(result); }
+ resolve(result);
+ });
+ } catch (e) {
+ if (callback) { callback(result); }
+ resolve(result);
+ }
+ });
+ });
+}
+
+exports.vboxInfo = vboxInfo;
diff --git a/node_modules/systeminformation/lib/wifi.js b/node_modules/systeminformation/lib/wifi.js
new file mode 100644
index 0000000..d5e56cb
--- /dev/null
+++ b/node_modules/systeminformation/lib/wifi.js
@@ -0,0 +1,744 @@
+'use strict';
+// @ts-check
+// ==================================================================================
+// wifi.js
+// ----------------------------------------------------------------------------------
+// Description: System Information - library
+// for Node.js
+// Copyright: (c) 2014 - 2022
+// Author: Sebastian Hildebrandt
+// ----------------------------------------------------------------------------------
+// License: MIT
+// ==================================================================================
+// 9. wifi
+// ----------------------------------------------------------------------------------
+
+const os = require('os');
+const exec = require('child_process').exec;
+const execSync = require('child_process').execSync;
+const util = require('./util');
+
+let _platform = process.platform;
+
+const _linux = (_platform === 'linux' || _platform === 'android');
+const _darwin = (_platform === 'darwin');
+const _windows = (_platform === 'win32');
+
+function wifiDBFromQuality(quality) {
+ return (parseFloat(quality) / 2 - 100);
+}
+
+function wifiQualityFromDB(db) {
+ const result = 2 * (parseFloat(db) + 100);
+ return result <= 100 ? result : 100;
+}
+
+const _wifi_frequencies = {
+ 1: 2412,
+ 2: 2417,
+ 3: 2422,
+ 4: 2427,
+ 5: 2432,
+ 6: 2437,
+ 7: 2442,
+ 8: 2447,
+ 9: 2452,
+ 10: 2457,
+ 11: 2462,
+ 12: 2467,
+ 13: 2472,
+ 14: 2484,
+ 32: 5160,
+ 34: 5170,
+ 36: 5180,
+ 38: 5190,
+ 40: 5200,
+ 42: 5210,
+ 44: 5220,
+ 46: 5230,
+ 48: 5240,
+ 50: 5250,
+ 52: 5260,
+ 54: 5270,
+ 56: 5280,
+ 58: 5290,
+ 60: 5300,
+ 62: 5310,
+ 64: 5320,
+ 68: 5340,
+ 96: 5480,
+ 100: 5500,
+ 102: 5510,
+ 104: 5520,
+ 106: 5530,
+ 108: 5540,
+ 110: 5550,
+ 112: 5560,
+ 114: 5570,
+ 116: 5580,
+ 118: 5590,
+ 120: 5600,
+ 122: 5610,
+ 124: 5620,
+ 126: 5630,
+ 128: 5640,
+ 132: 5660,
+ 134: 5670,
+ 136: 5680,
+ 138: 5690,
+ 140: 5700,
+ 142: 5710,
+ 144: 5720,
+ 149: 5745,
+ 151: 5755,
+ 153: 5765,
+ 155: 5775,
+ 157: 5785,
+ 159: 5795,
+ 161: 5805,
+ 165: 5825,
+ 169: 5845,
+ 173: 5865,
+ 183: 4915,
+ 184: 4920,
+ 185: 4925,
+ 187: 4935,
+ 188: 4940,
+ 189: 4945,
+ 192: 4960,
+ 196: 4980
+};
+
+function wifiFrequencyFromChannel(channel) {
+ return {}.hasOwnProperty.call(_wifi_frequencies, channel) ? _wifi_frequencies[channel] : null;
+}
+
+function wifiChannelFromFrequencs(frequency) {
+ let channel = 0;
+ for (let key in _wifi_frequencies) {
+ if ({}.hasOwnProperty.call(_wifi_frequencies, key)) {
+ if (_wifi_frequencies[key] === frequency) { channel = util.toInt(key); }
+ }
+ }
+ return channel;
+}
+
+function ifaceListLinux() {
+ const result = [];
+ const cmd = 'iw dev 2>/dev/null';
+ try {
+ const all = execSync(cmd).toString().split('\n').map(line => line.trim()).join('\n');
+ const parts = all.split('\nInterface ');
+ parts.shift();
+ parts.forEach(ifaceDetails => {
+ const lines = ifaceDetails.split('\n');
+ const iface = lines[0];
+ const id = util.toInt(util.getValue(lines, 'ifindex', ' '));
+ const mac = util.getValue(lines, 'addr', ' ');
+ const channel = util.toInt(util.getValue(lines, 'channel', ' '));
+ result.push({
+ id,
+ iface,
+ mac,
+ channel
+ });
+ });
+ return result;
+ } catch (e) {
+ try {
+ const all = execSync('nmcli -t -f general,wifi-properties,wired-properties,interface-flags,capabilities,nsp device show 2>/dev/null').toString();
+ const parts = all.split('\nGENERAL.DEVICE:');
+ let i = 1;
+ parts.forEach(ifaceDetails => {
+ const lines = ifaceDetails.split('\n');
+ const iface = util.getValue(lines, 'GENERAL.DEVICE');
+ const type = util.getValue(lines, 'GENERAL.TYPE');
+ const id = i++; // // util.getValue(lines, 'GENERAL.PATH');
+ const mac = util.getValue(lines, 'GENERAL.HWADDR');
+ const channel = '';
+ if (type.toLowerCase() === 'wifi') {
+ result.push({
+ id,
+ iface,
+ mac,
+ channel
+ });
+ }
+ });
+ return result;
+ } catch (e) {
+ return [];
+ }
+ }
+}
+
+function nmiDeviceLinux(iface) {
+ const cmd = `nmcli -t -f general,wifi-properties,capabilities,ip4,ip6 device show ${iface} 2>/dev/null`;
+ try {
+ const lines = execSync(cmd).toString().split('\n');
+ const ssid = util.getValue(lines, 'GENERAL.CONNECTION');
+ return {
+ iface,
+ type: util.getValue(lines, 'GENERAL.TYPE'),
+ vendor: util.getValue(lines, 'GENERAL.VENDOR'),
+ product: util.getValue(lines, 'GENERAL.PRODUCT'),
+ mac: util.getValue(lines, 'GENERAL.HWADDR').toLowerCase(),
+ ssid: ssid !== '--' ? ssid : null
+ };
+ } catch (e) {
+ return {};
+ }
+}
+
+function nmiConnectionLinux(ssid) {
+ const cmd = `nmcli -t --show-secrets connection show ${ssid} 2>/dev/null`;
+ try {
+ const lines = execSync(cmd).toString().split('\n');
+ const bssid = util.getValue(lines, '802-11-wireless.seen-bssids').toLowerCase();
+ return {
+ ssid: ssid !== '--' ? ssid : null,
+ uuid: util.getValue(lines, 'connection.uuid'),
+ type: util.getValue(lines, 'connection.type'),
+ autoconnect: util.getValue(lines, 'connection.autoconnect') === 'yes',
+ security: util.getValue(lines, '802-11-wireless-security.key-mgmt'),
+ bssid: bssid !== '--' ? bssid : null
+ };
+ } catch (e) {
+ return {};
+ }
+}
+
+function wpaConnectionLinux(iface) {
+ const cmd = `wpa_cli -i ${iface} status 2>&1`;
+ try {
+ const lines = execSync(cmd).toString().split('\n');
+ const freq = util.toInt(util.getValue(lines, 'freq', '='));
+ return {
+ ssid: util.getValue(lines, 'ssid', '='),
+ uuid: util.getValue(lines, 'uuid', '='),
+ security: util.getValue(lines, 'key_mgmt', '='),
+ freq,
+ channel: wifiChannelFromFrequencs(freq),
+ bssid: util.getValue(lines, 'bssid', '=').toLowerCase()
+ };
+ } catch (e) {
+ return {};
+ }
+}
+
+function getWifiNetworkListNmi() {
+ const result = [];
+ const cmd = 'nmcli -t -m multiline --fields active,ssid,bssid,mode,chan,freq,signal,security,wpa-flags,rsn-flags device wifi list 2>/dev/null';
+ try {
+ const stdout = execSync(cmd, { maxBuffer: 1024 * 20000 });
+ const parts = stdout.toString().split('ACTIVE:');
+ parts.shift();
+ parts.forEach(part => {
+ part = 'ACTIVE:' + part;
+ const lines = part.split(os.EOL);
+ const channel = util.getValue(lines, 'CHAN');
+ const frequency = util.getValue(lines, 'FREQ').toLowerCase().replace('mhz', '').trim();
+ const security = util.getValue(lines, 'SECURITY').replace('(', '').replace(')', '');
+ const wpaFlags = util.getValue(lines, 'WPA-FLAGS').replace('(', '').replace(')', '');
+ const rsnFlags = util.getValue(lines, 'RSN-FLAGS').replace('(', '').replace(')', '');
+ result.push({
+ ssid: util.getValue(lines, 'SSID'),
+ bssid: util.getValue(lines, 'BSSID').toLowerCase(),
+ mode: util.getValue(lines, 'MODE'),
+ channel: channel ? parseInt(channel, 10) : null,
+ frequency: frequency ? parseInt(frequency, 10) : null,
+ signalLevel: wifiDBFromQuality(util.getValue(lines, 'SIGNAL')),
+ quality: parseFloat(util.getValue(lines, 'SIGNAL')),
+ security: security && security !== 'none' ? security.split(' ') : [],
+ wpaFlags: wpaFlags && wpaFlags !== 'none' ? wpaFlags.split(' ') : [],
+ rsnFlags: rsnFlags && rsnFlags !== 'none' ? rsnFlags.split(' ') : []
+ });
+ });
+ return result;
+ } catch (e) {
+ return [];
+ }
+}
+
+function getWifiNetworkListIw(iface) {
+ const result = [];
+ try {
+ let iwlistParts = execSync(`export LC_ALL=C; iwlist ${iface} scan 2>&1; unset LC_ALL`).toString().split(' Cell ');
+ if (iwlistParts[0].indexOf('resource busy') >= 0) { return -1; }
+ if (iwlistParts.length > 1) {
+ iwlistParts.shift();
+ iwlistParts.forEach(element => {
+ const lines = element.split('\n');
+ const channel = util.getValue(lines, 'channel', ':', true);
+ const address = (lines && lines.length && lines[0].indexOf('Address:') >= 0 ? lines[0].split('Address:')[1].trim().toLowerCase() : '');
+ const mode = util.getValue(lines, 'mode', ':', true);
+ const frequency = util.getValue(lines, 'frequency', ':', true);
+ const qualityString = util.getValue(lines, 'Quality', '=', true);
+ const dbParts = qualityString.toLowerCase().split('signal level=');
+ const db = dbParts.length > 1 ? util.toInt(dbParts[1]) : 0;
+ const quality = db ? wifiQualityFromDB(db) : 0;
+ const ssid = util.getValue(lines, 'essid', ':', true);
+
+ // security and wpa-flags
+ const isWpa = element.indexOf(' WPA ') >= 0;
+ const isWpa2 = element.indexOf('WPA2 ') >= 0;
+ const security = [];
+ if (isWpa) { security.push('WPA'); }
+ if (isWpa2) { security.push('WPA2'); }
+ const wpaFlags = [];
+ let wpaFlag = '';
+ lines.forEach(function (line) {
+ const l = line.trim().toLowerCase();
+ if (l.indexOf('group cipher') >= 0) {
+ if (wpaFlag) {
+ wpaFlags.push(wpaFlag);
+ }
+ const parts = l.split(':');
+ if (parts.length > 1) {
+ wpaFlag = parts[1].trim().toUpperCase();
+ }
+ }
+ if (l.indexOf('pairwise cipher') >= 0) {
+ const parts = l.split(':');
+ if (parts.length > 1) {
+ if (parts[1].indexOf('tkip')) { wpaFlag = (wpaFlag ? 'TKIP/' + wpaFlag : 'TKIP'); }
+ else if (parts[1].indexOf('ccmp')) { wpaFlag = (wpaFlag ? 'CCMP/' + wpaFlag : 'CCMP'); }
+ else if (parts[1].indexOf('proprietary')) { wpaFlag = (wpaFlag ? 'PROP/' + wpaFlag : 'PROP'); }
+ }
+ }
+ if (l.indexOf('authentication suites') >= 0) {
+ const parts = l.split(':');
+ if (parts.length > 1) {
+ if (parts[1].indexOf('802.1x')) { wpaFlag = (wpaFlag ? '802.1x/' + wpaFlag : '802.1x'); }
+ else if (parts[1].indexOf('psk')) { wpaFlag = (wpaFlag ? 'PSK/' + wpaFlag : 'PSK'); }
+ }
+ }
+ });
+ if (wpaFlag) {
+ wpaFlags.push(wpaFlag);
+ }
+
+ result.push({
+ ssid,
+ bssid: address,
+ mode,
+ channel: channel ? util.toInt(channel) : null,
+ frequency: frequency ? util.toInt(frequency.replace('.', '')) : null,
+ signalLevel: db,
+ quality,
+ security,
+ wpaFlags,
+ rsnFlags: []
+ });
+ });
+ }
+ return result;
+ } catch (e) {
+ return -1;
+ }
+}
+
+function parseWifiDarwin(wifiObj) {
+ const result = [];
+ if (wifiObj) {
+ wifiObj.forEach(function (wifiItem) {
+ const signalLevel = wifiItem.RSSI;
+ let security = [];
+ let wpaFlags = [];
+ if (wifiItem.WPA_IE) {
+ security.push('WPA');
+ if (wifiItem.WPA_IE.IE_KEY_WPA_UCIPHERS) {
+ wifiItem.WPA_IE.IE_KEY_WPA_UCIPHERS.forEach(function (ciphers) {
+ if (ciphers === 0 && wpaFlags.indexOf('unknown/TKIP') === -1) { wpaFlags.push('unknown/TKIP'); }
+ if (ciphers === 2 && wpaFlags.indexOf('PSK/TKIP') === -1) { wpaFlags.push('PSK/TKIP'); }
+ if (ciphers === 4 && wpaFlags.indexOf('PSK/AES') === -1) { wpaFlags.push('PSK/AES'); }
+ });
+ }
+ }
+ if (wifiItem.RSN_IE) {
+ security.push('WPA2');
+ if (wifiItem.RSN_IE.IE_KEY_RSN_UCIPHERS) {
+ wifiItem.RSN_IE.IE_KEY_RSN_UCIPHERS.forEach(function (ciphers) {
+ if (ciphers === 0 && wpaFlags.indexOf('unknown/TKIP') === -1) { wpaFlags.push('unknown/TKIP'); }
+ if (ciphers === 2 && wpaFlags.indexOf('TKIP/TKIP') === -1) { wpaFlags.push('TKIP/TKIP'); }
+ if (ciphers === 4 && wpaFlags.indexOf('PSK/AES') === -1) { wpaFlags.push('PSK/AES'); }
+ });
+ }
+ }
+ result.push({
+ ssid: wifiItem.SSID_STR,
+ bssid: wifiItem.BSSID,
+ mode: '',
+ channel: wifiItem.CHANNEL,
+ frequency: wifiFrequencyFromChannel(wifiItem.CHANNEL),
+ signalLevel: signalLevel ? parseInt(signalLevel, 10) : null,
+ quality: wifiQualityFromDB(signalLevel),
+ security,
+ wpaFlags,
+ rsnFlags: []
+ });
+ });
+ }
+ return result;
+}
+function wifiNetworks(callback) {
+ return new Promise((resolve) => {
+ process.nextTick(() => {
+ let result = [];
+ if (_linux) {
+ result = getWifiNetworkListNmi();
+ if (result.length === 0) {
+ try {
+ const iwconfigParts = execSync('export LC_ALL=C; iwconfig 2>/dev/null; unset LC_ALL').toString().split('\n\n');
+ let iface = '';
+ iwconfigParts.forEach(element => {
+ if (element.indexOf('no wireless') === -1 && element.trim() !== '') {
+ iface = element.split(' ')[0];
+ }
+ });
+ if (iface) {
+ const res = getWifiNetworkListIw(iface);
+ if (res === -1) {
+ // try again after 4 secs
+ setTimeout(function (iface) {
+ const res = getWifiNetworkListIw(iface);
+ if (res != -1) { result = res; }
+ if (callback) {
+ callback(result);
+ }
+ resolve(result);
+ }, 4000);
+ } else {
+ result = res;
+ if (callback) {
+ callback(result);
+ }
+ resolve(result);
+ }
+ } else {
+ if (callback) {
+ callback(result);
+ }
+ resolve(result);
+ }
+ } catch (e) {
+ if (callback) {
+ callback(result);
+ }
+ resolve(result);
+ }
+ } else {
+ if (callback) {
+ callback(result);
+ }
+ resolve(result);
+ }
+ } else if (_darwin) {
+ let cmd = '/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport -s -x';
+ exec(cmd, { maxBuffer: 1024 * 40000 }, function (error, stdout) {
+ const output = stdout.toString();
+ result = parseWifiDarwin(util.plistParser(output));
+ if (callback) {
+ callback(result);
+ }
+ resolve(result);
+ });
+ } else if (_windows) {
+ let cmd = 'netsh wlan show networks mode=Bssid';
+ util.powerShell(cmd).then((stdout) => {
+ const ssidParts = stdout.toString('utf8').split(os.EOL + os.EOL + 'SSID ');
+ ssidParts.shift();
+
+ ssidParts.forEach(ssidPart => {
+ const ssidLines = ssidPart.split(os.EOL);
+ if (ssidLines && ssidLines.length >= 8 && ssidLines[0].indexOf(':') >= 0) {
+ const bssidsParts = ssidPart.split(' BSSID');
+ bssidsParts.shift();
+
+ bssidsParts.forEach((bssidPart) => {
+ const bssidLines = bssidPart.split(os.EOL);
+ const bssidLine = bssidLines[0].split(':');
+ bssidLine.shift();
+ const bssid = bssidLine.join(':').trim().toLowerCase();
+ const channel = bssidLines[3].split(':').pop().trim();
+ const quality = bssidLines[1].split(':').pop().trim();
+
+ result.push({
+ ssid: ssidLines[0].split(':').pop().trim(),
+ bssid,
+ mode: '',
+ channel: channel ? parseInt(channel, 10) : null,
+ frequency: wifiFrequencyFromChannel(channel),
+ signalLevel: wifiDBFromQuality(quality),
+ quality: quality ? parseInt(quality, 10) : null,
+ security: [ssidLines[2].split(':').pop().trim()],
+ wpaFlags: [ssidLines[3].split(':').pop().trim()],
+ rsnFlags: []
+ });
+ });
+ }
+ });
+
+ if (callback) {
+ callback(result);
+ }
+ resolve(result);
+ });
+ } else {
+ if (callback) {
+ callback(result);
+ }
+ resolve(result);
+ }
+ });
+ });
+}
+
+exports.wifiNetworks = wifiNetworks;
+
+function getVendor(model) {
+ model = model.toLowerCase();
+ let result = '';
+ if (model.indexOf('intel') >= 0) { result = 'Intel'; }
+ else if (model.indexOf('realtek') >= 0) { result = 'Realtek'; }
+ else if (model.indexOf('qualcom') >= 0) { result = 'Qualcom'; }
+ else if (model.indexOf('broadcom') >= 0) { result = 'Broadcom'; }
+ else if (model.indexOf('cavium') >= 0) { result = 'Cavium'; }
+ else if (model.indexOf('cisco') >= 0) { result = 'Cisco'; }
+ else if (model.indexOf('marvel') >= 0) { result = 'Marvel'; }
+ else if (model.indexOf('zyxel') >= 0) { result = 'Zyxel'; }
+ else if (model.indexOf('melanox') >= 0) { result = 'Melanox'; }
+ else if (model.indexOf('d-link') >= 0) { result = 'D-Link'; }
+ else if (model.indexOf('tp-link') >= 0) { result = 'TP-Link'; }
+ else if (model.indexOf('asus') >= 0) { result = 'Asus'; }
+ else if (model.indexOf('linksys') >= 0) { result = 'Linksys'; }
+ return result;
+}
+
+function wifiConnections(callback) {
+
+ return new Promise((resolve) => {
+ process.nextTick(() => {
+ const result = [];
+
+ if (_linux) {
+ const ifaces = ifaceListLinux();
+ const networkList = getWifiNetworkListNmi();
+ ifaces.forEach(ifaceDetail => {
+ const nmiDetails = nmiDeviceLinux(ifaceDetail.iface);
+ const wpaDetails = wpaConnectionLinux(ifaceDetail.iface);
+ const ssid = nmiDetails.ssid || wpaDetails.ssid;
+ const network = networkList.filter(nw => nw.ssid === ssid);
+ const nmiConnection = nmiConnectionLinux(ssid);
+ const channel = network && network.length && network[0].channel ? network[0].channel : (wpaDetails.channel ? wpaDetails.channel : null);
+ const bssid = network && network.length && network[0].bssid ? network[0].bssid : (wpaDetails.bssid ? wpaDetails.bssid : null);
+ if (ssid && bssid) {
+ result.push({
+ id: ifaceDetail.id,
+ iface: ifaceDetail.iface,
+ model: nmiDetails.product,
+ ssid,
+ bssid: network && network.length && network[0].bssid ? network[0].bssid : (wpaDetails.bssid ? wpaDetails.bssid : null),
+ channel,
+ frequency: channel ? wifiFrequencyFromChannel(channel) : null,
+ type: nmiConnection.type ? nmiConnection.type : '802.11',
+ security: nmiConnection.security ? nmiConnection.security : (wpaDetails.security ? wpaDetails.security : null),
+ signalLevel: network && network.length && network[0].signalLevel ? network[0].signalLevel : null,
+ txRate: null
+ });
+ }
+ });
+ if (callback) {
+ callback(result);
+ }
+ resolve(result);
+ } else if (_darwin) {
+ let cmd = 'system_profiler SPNetworkDataType';
+ exec(cmd, function (error, stdout) {
+ const parts1 = stdout.toString().split('\n\n Wi-Fi:\n\n');
+ if (parts1.length > 1) {
+ const lines = parts1[1].split('\n\n')[0].split('\n');
+ const iface = util.getValue(lines, 'BSD Device Name', ':', true);
+ const model = util.getValue(lines, 'hardware', ':', true);
+ cmd = '/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport -I';
+ exec(cmd, function (error, stdout) {
+ const lines2 = stdout.toString().split('\n');
+ if (lines.length > 10) {
+ const ssid = util.getValue(lines2, 'ssid', ':', true);
+ const bssid = util.getValue(lines2, 'bssid', ':', true);
+ const security = util.getValue(lines2, 'link auth', ':', true);
+ const txRate = util.getValue(lines2, 'lastTxRate', ':', true);
+ const channel = util.getValue(lines2, 'channel', ':', true).split(',')[0];
+ const type = '802.11';
+ const rssi = util.toInt(util.getValue(lines2, 'agrCtlRSSI', ':', true));
+ const noise = util.toInt(util.getValue(lines2, 'agrCtlNoise', ':', true));
+ const signalLevel = rssi - noise;
+ if (ssid || bssid) {
+ result.push({
+ id: 'Wi-Fi',
+ iface,
+ model,
+ ssid,
+ bssid,
+ channel: util.toInt(channel),
+ frequency: channel ? wifiFrequencyFromChannel(channel) : null,
+ type,
+ security,
+ signalLevel,
+ txRate
+ });
+ }
+ }
+ if (callback) {
+ callback(result);
+ }
+ resolve(result);
+ });
+ }
+ });
+ } else if (_windows) {
+ let cmd = 'netsh wlan show interfaces';
+ util.powerShell(cmd).then(function (stdout) {
+ const allLines = stdout.toString().split('\r\n');
+ for (let i = 0; i < allLines.length; i++) {
+ allLines[i] = allLines[i].trim();
+ }
+ const parts = allLines.join('\r\n').split(':\r\n\r\n');
+ parts.shift();
+ parts.forEach(part => {
+ const lines = part.split('\r\n');
+ if (lines.length >= 5) {
+ const iface = lines[0].indexOf(':') >= 0 ? lines[0].split(':')[1].trim() : '';
+ const model = lines[1].indexOf(':') >= 0 ? lines[1].split(':')[1].trim() : '';
+ const id = lines[2].indexOf(':') >= 0 ? lines[2].split(':')[1].trim() : '';
+ const ssid = util.getValue(lines, 'SSID', ':', true);
+ const bssid = util.getValue(lines, 'BSSID', ':', true);
+ const signalLevel = util.getValue(lines, 'Signal', ':', true);
+ const type = util.getValue(lines, 'Radio type', ':', true) || util.getValue(lines, 'Type de radio', ':', true) || util.getValue(lines, 'Funktyp', ':', true) || null;
+ const security = util.getValue(lines, 'authentication', ':', true) || util.getValue(lines, 'Authentification', ':', true) || util.getValue(lines, 'Authentifizierung', ':', true) || null;
+ const channel = util.getValue(lines, 'Channel', ':', true) || util.getValue(lines, 'Canal', ':', true) || util.getValue(lines, 'Kanal', ':', true) || null;
+ const txRate = util.getValue(lines, 'Transmit rate (mbps)', ':', true) || util.getValue(lines, 'Transmission (mbit/s)', ':', true) || util.getValue(lines, 'Empfangsrate (MBit/s)', ':', true) || null;
+ if (model && id && ssid && bssid) {
+ result.push({
+ id,
+ iface,
+ model,
+ ssid,
+ bssid,
+ channel: util.toInt(channel),
+ frequency: channel ? wifiFrequencyFromChannel(channel) : null,
+ type,
+ security,
+ signalLevel,
+ txRate: util.toInt(txRate) || null
+ });
+ }
+ }
+ });
+ if (callback) {
+ callback(result);
+ }
+ resolve(result);
+ });
+ } else {
+ if (callback) {
+ callback(result);
+ }
+ resolve(result);
+ }
+ });
+ });
+}
+
+exports.wifiConnections = wifiConnections;
+
+function wifiInterfaces(callback) {
+
+ return new Promise((resolve) => {
+ process.nextTick(() => {
+ const result = [];
+
+ if (_linux) {
+ const ifaces = ifaceListLinux();
+ ifaces.forEach(ifaceDetail => {
+ const nmiDetails = nmiDeviceLinux(ifaceDetail.iface);
+ result.push({
+ id: ifaceDetail.id,
+ iface: ifaceDetail.iface,
+ model: nmiDetails.product ? nmiDetails.product : null,
+ vendor: nmiDetails.vendor ? nmiDetails.vendor : null,
+ mac: ifaceDetail.mac,
+ });
+ });
+ if (callback) {
+ callback(result);
+ }
+ resolve(result);
+ } else if (_darwin) {
+ let cmd = 'system_profiler SPNetworkDataType';
+ exec(cmd, function (error, stdout) {
+ const parts1 = stdout.toString().split('\n\n Wi-Fi:\n\n');
+ if (parts1.length > 1) {
+ const lines = parts1[1].split('\n\n')[0].split('\n');
+ const iface = util.getValue(lines, 'BSD Device Name', ':', true);
+ const mac = util.getValue(lines, 'MAC Address', ':', true);
+ const model = util.getValue(lines, 'hardware', ':', true);
+ result.push({
+ id: 'Wi-Fi',
+ iface,
+ model,
+ vendor: '',
+ mac
+ });
+ }
+ if (callback) {
+ callback(result);
+ }
+ resolve(result);
+ });
+ } else if (_windows) {
+ let cmd = 'netsh wlan show interfaces';
+ util.powerShell(cmd).then(function (stdout) {
+ const allLines = stdout.toString().split('\r\n');
+ for (let i = 0; i < allLines.length; i++) {
+ allLines[i] = allLines[i].trim();
+ }
+ const parts = allLines.join('\r\n').split(':\r\n\r\n');
+ parts.shift();
+ parts.forEach(part => {
+ const lines = part.split('\r\n');
+ if (lines.length >= 5) {
+ const iface = lines[0].indexOf(':') >= 0 ? lines[0].split(':')[1].trim() : '';
+ const model = lines[1].indexOf(':') >= 0 ? lines[1].split(':')[1].trim() : '';
+ const id = lines[2].indexOf(':') >= 0 ? lines[2].split(':')[1].trim() : '';
+ const macParts = lines[3].indexOf(':') >= 0 ? lines[3].split(':') : [];
+ macParts.shift();
+ const mac = macParts.join(':').trim();
+ const vendor = getVendor(model);
+ if (iface && model && id && mac) {
+ result.push({
+ id,
+ iface,
+ model,
+ vendor,
+ mac,
+ });
+ }
+ }
+ });
+ if (callback) {
+ callback(result);
+ }
+ resolve(result);
+ });
+ } else {
+ if (callback) {
+ callback(result);
+ }
+ resolve(result);
+ }
+ });
+ });
+}
+
+exports.wifiInterfaces = wifiInterfaces;
diff --git a/node_modules/systeminformation/package.json b/node_modules/systeminformation/package.json
new file mode 100644
index 0000000..8017da4
--- /dev/null
+++ b/node_modules/systeminformation/package.json
@@ -0,0 +1,99 @@
+{
+ "name": "systeminformation",
+ "version": "5.12.11",
+ "description": "Advanced, lightweight system and OS information library",
+ "license": "MIT",
+ "author": "Sebastian Hildebrandt <hildebrandt@plus-innovations.com> (https://plus-innovations.com)",
+ "homepage": "https://systeminformation.io",
+ "main": "./lib/index.js",
+ "bin": {
+ "systeminformation": "lib/cli.js"
+ },
+ "types": "./lib/index.d.ts",
+ "scripts": {
+ "test": "node ./test/test.js"
+ },
+ "files": [
+ "lib/"
+ ],
+ "keywords": [
+ "system information",
+ "sysinfo",
+ "monitor",
+ "monitoring",
+ "os",
+ "linux",
+ "osx",
+ "windows",
+ "freebsd",
+ "openbsd",
+ "netbsd",
+ "cpu",
+ "cpuload",
+ "physical cores",
+ "logical cores",
+ "processor",
+ "cores",
+ "threads",
+ "socket type",
+ "memory",
+ "file system",
+ "fsstats",
+ "diskio",
+ "block devices",
+ "netstats",
+ "network",
+ "network interfaces",
+ "network connections",
+ "network stats",
+ "iface",
+ "printer",
+ "processes",
+ "users",
+ "internet",
+ "battery",
+ "docker",
+ "docker stats",
+ "docker processes",
+ "graphics",
+ "graphic card",
+ "graphic controller",
+ "gpu",
+ "display",
+ "smart",
+ "disk layout",
+ "usb",
+ "audio",
+ "bluetooth",
+ "wifi",
+ "wifinetworks",
+ "virtual box",
+ "virtualbox",
+ "vm",
+ "backend",
+ "hardware",
+ "BIOS",
+ "chassis"
+ ],
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/sebhildebrandt/systeminformation.git"
+ },
+ "funding": {
+ "type": "Buy me a coffee",
+ "url": "https://www.buymeacoffee.com/systeminfo"
+ },
+ "os": [
+ "darwin",
+ "linux",
+ "win32",
+ "freebsd",
+ "openbsd",
+ "netbsd",
+ "sunos",
+ "android"
+ ],
+ "engines": {
+ "node": ">=8.0.0"
+ }
+}
diff --git a/node_modules/table-layout/LICENSE b/node_modules/table-layout/LICENSE
new file mode 100644
index 0000000..9d2d6db
--- /dev/null
+++ b/node_modules/table-layout/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2015-21 Lloyd Brookes <75pound@gmail.com>
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/node_modules/table-layout/README.hbs b/node_modules/table-layout/README.hbs
new file mode 100644
index 0000000..022e4ef
--- /dev/null
+++ b/node_modules/table-layout/README.hbs
@@ -0,0 +1,84 @@
+[![view on npm](https://badgen.net/npm/v/table-layout)](https://www.npmjs.org/package/table-layout)
+[![npm module downloads](https://badgen.net/npm/dt/table-layout)](https://www.npmjs.org/package/table-layout)
+[![Gihub repo dependents](https://badgen.net/github/dependents-repo/75lb/table-layout)](https://github.com/75lb/table-layout/network/dependents?dependent_type=REPOSITORY)
+[![Gihub package dependents](https://badgen.net/github/dependents-pkg/75lb/table-layout)](https://github.com/75lb/table-layout/network/dependents?dependent_type=PACKAGE)
+[![Build Status](https://travis-ci.org/75lb/table-layout.svg?branch=master)](https://travis-ci.org/75lb/table-layout)
+[![Coverage Status](https://coveralls.io/repos/github/75lb/table-layout/badge.svg)](https://coveralls.io/github/75lb/table-layout)
+[![js-standard-style](https://img.shields.io/badge/code%20style-standard-brightgreen.svg)](https://github.com/feross/standard)
+
+# table-layout
+
+Generates plain-text tables from JSON recordset input (array of objects). Useful for presenting text in column layout or data in table layout in text-based user interfaces. Also [available as a command-line tool](https://github.com/75lb/table-layout-cli).
+
+## Synopsis
+
+Where input looks like this:
+
+```json
+[
+ {
+ "number": 15134,
+ "title": "Coveralls has no source available ",
+ "login": "ndelangen",
+ "comments": 0
+ },
+ {
+ "number": 15133,
+ "title": "Fixing --preserve-symlinks. Enhancing node to exploit.",
+ "login": "phestermcs",
+ "comments": 0
+ },
+ {
+ "number": 15131,
+ "title": "Question - Confused about NPM's local installation philosophy",
+ "login": "the1mills",
+ "comments": 0
+ },
+ {
+ "number": 15130,
+ "title": "Question - global npm cache directory if user is root?",
+ "login": "ORESoftware",
+ "comments": 0
+ }
+]
+```
+
+This code...
+
+```js
+const Table = require('table-layout')
+const issues = require('./issues.json')
+const table = new Table(issues, { maxWidth: 60 })
+console.log(table.toString())
+```
+
+...produces this output:
+
+```
+ 15134 Coveralls has no source available ndelangen 0
+ 15133 Fixing --preserve-symlinks. phestermcs 0
+ Enhancing node to exploit.
+ 15131 Question - Confused about NPM's the1mills 0
+ local installation philosophy
+ 15130 Question - global npm cache ORESoftware 0
+ directory if user is root?
+ 15127 how to installa gulp fontfacegen aramgreat 0
+ on Windows 10
+ 15097 Cannot install package from mastertinner 3
+ tarball out of package.json entry
+ generated by npm
+ 15067 npm "SELF_SIGNED_CERT_IN_CHAIN" LegendsLyfe 3
+ error when installing discord.js
+ with .log
+```
+
+## API Reference
+{{#module name="table-layout"}}
+{{>body~}}
+{{>member-index~}}
+{{>members~}}
+{{/module}}
+
+* * *
+
+&copy; 2015-21 Lloyd Brookes \<75pound@gmail.com\>. Documented by [jsdoc-to-markdown](https://github.com/jsdoc2md/jsdoc-to-markdown).
diff --git a/node_modules/table-layout/README.md b/node_modules/table-layout/README.md
new file mode 100644
index 0000000..71b884d
--- /dev/null
+++ b/node_modules/table-layout/README.md
@@ -0,0 +1,154 @@
+[![view on npm](https://badgen.net/npm/v/table-layout)](https://www.npmjs.org/package/table-layout)
+[![npm module downloads](https://badgen.net/npm/dt/table-layout)](https://www.npmjs.org/package/table-layout)
+[![Gihub repo dependents](https://badgen.net/github/dependents-repo/75lb/table-layout)](https://github.com/75lb/table-layout/network/dependents?dependent_type=REPOSITORY)
+[![Gihub package dependents](https://badgen.net/github/dependents-pkg/75lb/table-layout)](https://github.com/75lb/table-layout/network/dependents?dependent_type=PACKAGE)
+[![Build Status](https://travis-ci.org/75lb/table-layout.svg?branch=master)](https://travis-ci.org/75lb/table-layout)
+[![Coverage Status](https://coveralls.io/repos/github/75lb/table-layout/badge.svg)](https://coveralls.io/github/75lb/table-layout)
+[![js-standard-style](https://img.shields.io/badge/code%20style-standard-brightgreen.svg)](https://github.com/feross/standard)
+
+# table-layout
+
+Generates plain-text tables from JSON recordset input (array of objects). Useful for presenting text in column layout or data in table layout in text-based user interfaces. Also [available as a command-line tool](https://github.com/75lb/table-layout-cli).
+
+## Synopsis
+
+Where input looks like this:
+
+```json
+[
+ {
+ "number": 15134,
+ "title": "Coveralls has no source available ",
+ "login": "ndelangen",
+ "comments": 0
+ },
+ {
+ "number": 15133,
+ "title": "Fixing --preserve-symlinks. Enhancing node to exploit.",
+ "login": "phestermcs",
+ "comments": 0
+ },
+ {
+ "number": 15131,
+ "title": "Question - Confused about NPM's local installation philosophy",
+ "login": "the1mills",
+ "comments": 0
+ },
+ {
+ "number": 15130,
+ "title": "Question - global npm cache directory if user is root?",
+ "login": "ORESoftware",
+ "comments": 0
+ }
+]
+```
+
+This code...
+
+```js
+const Table = require('table-layout')
+const issues = require('./issues.json')
+const table = new Table(issues, { maxWidth: 60 })
+console.log(table.toString())
+```
+
+...produces this output:
+
+```
+ 15134 Coveralls has no source available ndelangen 0
+ 15133 Fixing --preserve-symlinks. phestermcs 0
+ Enhancing node to exploit.
+ 15131 Question - Confused about NPM's the1mills 0
+ local installation philosophy
+ 15130 Question - global npm cache ORESoftware 0
+ directory if user is root?
+ 15127 how to installa gulp fontfacegen aramgreat 0
+ on Windows 10
+ 15097 Cannot install package from mastertinner 3
+ tarball out of package.json entry
+ generated by npm
+ 15067 npm "SELF_SIGNED_CERT_IN_CHAIN" LegendsLyfe 3
+ error when installing discord.js
+ with .log
+```
+
+## API Reference
+
+* [table-layout](#module_table-layout)
+ * [Table](#exp_module_table-layout--Table) ⏏
+ * [new Table(data, [options])](#new_module_table-layout--Table_new)
+ * [table.renderLines()](#module_table-layout--Table+renderLines) ⇒ <code>Array.&lt;string&gt;</code>
+ * [table.toString()](#module_table-layout--Table+toString) ⇒ <code>string</code>
+ * [Table~columnOption](#module_table-layout--Table..columnOption)
+
+<a name="exp_module_table-layout--Table"></a>
+
+### Table ⏏
+Recordset data in (array of objects), text table out.
+
+**Kind**: Exported class
+<a name="new_module_table-layout--Table_new"></a>
+
+#### new Table(data, [options])
+**Params**
+
+- data <code>Array.&lt;object&gt;</code> - input data
+- [options] <code>object</code> - optional settings
+ - [.maxWidth] <code>number</code> - maximum width of layout
+ - [.noWrap] <code>boolean</code> - disable wrapping on all columns
+ - [.noTrim] <code>boolean</code> - disable line-trimming
+ - [.break] <code>boolean</code> - enable word-breaking on all columns
+ - [.columns] [<code>columnOption</code>](#module_table-layout--Table..columnOption) - array of column-specific options
+ - [.ignoreEmptyColumns] <code>boolean</code> - if set, empty columns or columns containing only whitespace are not rendered.
+ - [.padding] <code>object</code> - Padding values to set on each column. Per-column overrides can be set in the `options.columns` array.
+ - [.left] <code>string</code> - Defaults to a single space.
+ - [.right] <code>string</code> - Defaults to a single space.
+
+**Example**
+```js
+> Table = require('table-layout')
+> jsonData = [{
+ col1: 'Some text you wish to read in table layout',
+ col2: 'And some more text in column two. '
+}]
+> table = new Table(jsonData, { maxWidth: 30 })
+> console.log(table.toString())
+ Some text you And some more
+ wish to read text in
+ in table column two.
+ layout
+```
+<a name="module_table-layout--Table+renderLines"></a>
+
+#### table.renderLines() ⇒ <code>Array.&lt;string&gt;</code>
+Identical to `.toString()` with the exception that the result will be an array of lines, rather than a single, multi-line string.
+
+**Kind**: instance method of [<code>Table</code>](#exp_module_table-layout--Table)
+<a name="module_table-layout--Table+toString"></a>
+
+#### table.toString() ⇒ <code>string</code>
+Returns the input data as a text table.
+
+**Kind**: instance method of [<code>Table</code>](#exp_module_table-layout--Table)
+<a name="module_table-layout--Table..columnOption"></a>
+
+#### Table~columnOption
+**Kind**: inner typedef of [<code>Table</code>](#exp_module_table-layout--Table)
+**Properties**
+
+| Name | Type | Description |
+| --- | --- | --- |
+| name | <code>string</code> | column name, must match a property name in the input |
+| [width] | <code>number</code> | A specific column width. Supply either this or a min and/or max width. |
+| [minWidth] | <code>number</code> | column min width |
+| [maxWidth] | <code>number</code> | column max width |
+| [nowrap] | <code>boolean</code> | disable wrapping for this column |
+| [break] | <code>boolean</code> | enable word-breaking for this columns |
+| [padding] | <code>object</code> | padding options |
+| [padding.left] | <code>string</code> | a string to pad the left of each cell (default: `' '`) |
+| [padding.right] | <code>string</code> | a string to pad the right of each cell (default: `' '`) |
+
+
+* * *
+
+&copy; 2015-21 Lloyd Brookes \<75pound@gmail.com\>. Documented by [jsdoc-to-markdown](https://github.com/jsdoc2md/jsdoc-to-markdown).
diff --git a/node_modules/table-layout/index.js b/node_modules/table-layout/index.js
new file mode 100644
index 0000000..7a94692
--- /dev/null
+++ b/node_modules/table-layout/index.js
@@ -0,0 +1,197 @@
+const os = require('os')
+
+/**
+ * @module table-layout
+ */
+
+/**
+ * Recordset data in (array of objects), text table out.
+ * @alias module:table-layout
+ * @example
+ * > Table = require('table-layout')
+ * > jsonData = [{
+ * col1: 'Some text you wish to read in table layout',
+ * col2: 'And some more text in column two. '
+ * }]
+ * > table = new Table(jsonData, { maxWidth: 30 })
+ * > console.log(table.toString())
+ * Some text you And some more
+ * wish to read text in
+ * in table column two.
+ * layout
+ */
+class Table {
+ /**
+ * @param {object[]} - input data
+ * @param [options] {object} - optional settings
+ * @param [options.maxWidth] {number} - maximum width of layout
+ * @param [options.noWrap] {boolean} - disable wrapping on all columns
+ * @param [options.noTrim] {boolean} - disable line-trimming
+ * @param [options.break] {boolean} - enable word-breaking on all columns
+ * @param [options.columns] {module:table-layout~columnOption} - array of column-specific options
+ * @param [options.ignoreEmptyColumns] {boolean} - if set, empty columns or columns containing only whitespace are not rendered.
+ * @param [options.padding] {object} - Padding values to set on each column. Per-column overrides can be set in the `options.columns` array.
+ * @param [options.padding.left] {string} - Defaults to a single space.
+ * @param [options.padding.right] {string} - Defaults to a single space.
+ * @alias module:table-layout
+ */
+ constructor (data, options) {
+ let ttyWidth = (process && (process.stdout.columns || process.stderr.columns)) || 0
+
+ /* Windows quirk workaround */
+ if (ttyWidth && os.platform() === 'win32') ttyWidth--
+
+ let defaults = {
+ padding: {
+ left: ' ',
+ right: ' '
+ },
+ maxWidth: ttyWidth || 80,
+ columns: []
+ }
+
+ const extend = require('deep-extend')
+ this.options = extend(defaults, options)
+ this.load(data)
+ }
+
+ load (data) {
+ const Rows = require('./lib/rows')
+ const Columns = require('./lib/columns')
+
+ let options = this.options
+
+ /* remove empty columns */
+ if (options.ignoreEmptyColumns) {
+ data = Rows.removeEmptyColumns(data)
+ }
+
+ this.columns = Columns.getColumns(data)
+ this.rows = new Rows(data, this.columns)
+
+ /* load default column properties from options */
+ this.columns.maxWidth = options.maxWidth
+ this.columns.list.forEach(column => {
+ if (options.padding) column.padding = options.padding
+ if (options.noWrap) column.noWrap = options.noWrap
+ if (options.break) {
+ column.break = options.break
+ column.contentWrappable = true
+ }
+ })
+
+ /* load column properties from options.columns */
+ options.columns.forEach(optionColumn => {
+ let column = this.columns.get(optionColumn.name)
+ if (column) {
+ if (optionColumn.padding) {
+ column.padding.left = optionColumn.padding.left
+ column.padding.right = optionColumn.padding.right
+ }
+ if (optionColumn.width) column.width = optionColumn.width
+ if (optionColumn.maxWidth) column.maxWidth = optionColumn.maxWidth
+ if (optionColumn.minWidth) column.minWidth = optionColumn.minWidth
+ if (optionColumn.noWrap) column.noWrap = optionColumn.noWrap
+ if (optionColumn.break) {
+ column.break = optionColumn.break
+ column.contentWrappable = true
+ }
+ }
+ })
+
+ this.columns.autoSize()
+ return this
+ }
+
+ getWrapped () {
+ const wrap = require('wordwrapjs')
+
+ this.columns.autoSize()
+ return this.rows.list.map(row => {
+ let line = []
+ row.forEach((cell, column) => {
+ if (column.noWrap) {
+ line.push(cell.value.split(/\r\n?|\n/))
+ } else {
+ line.push(wrap.lines(cell.value, {
+ width: column.wrappedContentWidth,
+ break: column.break,
+ noTrim: this.options.noTrim
+ }))
+ }
+ })
+ return line
+ })
+ }
+
+ getLines () {
+ var wrappedLines = this.getWrapped()
+ var lines = []
+ wrappedLines.forEach(wrapped => {
+ let mostLines = getLongestArray(wrapped)
+ for (let i = 0; i < mostLines; i++) {
+ let line = []
+ wrapped.forEach(cell => {
+ line.push(cell[i] || '')
+ })
+ lines.push(line)
+ }
+ })
+ return lines
+ }
+
+ /**
+ * Identical to `.toString()` with the exception that the result will be an array of lines, rather than a single, multi-line string.
+ * @returns {string[]}
+ */
+ renderLines () {
+ var lines = this.getLines()
+ return lines.map(line => {
+ return line.reduce((prev, cell, index) => {
+ let column = this.columns.list[index]
+ return prev + padCell(cell, column.padding, column.generatedWidth)
+ }, '')
+ })
+ }
+
+ /**
+ * Returns the input data as a text table.
+ * @returns {string}
+ */
+ toString () {
+ return this.renderLines().join(os.EOL) + os.EOL
+ }
+}
+
+/**
+ * Array of arrays in.. Returns the length of the longest one
+ * @returns {number}
+ * @private
+ */
+function getLongestArray (arrays) {
+ var lengths = arrays.map(array => array.length)
+ return Math.max.apply(null, lengths)
+}
+
+function padCell (cellValue, padding, width) {
+ const ansi = require('./lib/ansi')
+ var ansiLength = cellValue.length - ansi.remove(cellValue).length
+ cellValue = cellValue || ''
+ return (padding.left || '') +
+ cellValue.padEnd(width - padding.length() + ansiLength) + (padding.right || '')
+}
+
+/**
+ * @typedef module:table-layout~columnOption
+ * @property name {string} - column name, must match a property name in the input
+ * @property [width] {number} - A specific column width. Supply either this or a min and/or max width.
+ * @property [minWidth] {number} - column min width
+ * @property [maxWidth] {number} - column max width
+ * @property [nowrap] {boolean} - disable wrapping for this column
+ * @property [break] {boolean} - enable word-breaking for this columns
+ * @property [padding] {object} - padding options
+ * @property [padding.left] {string} - a string to pad the left of each cell (default: `' '`)
+ * @property [padding.right] {string} - a string to pad the right of each cell (default: `' '`)
+ */
+
+module.exports = Table
diff --git a/node_modules/table-layout/lib/ansi.js b/node_modules/table-layout/lib/ansi.js
new file mode 100644
index 0000000..e98aa6d
--- /dev/null
+++ b/node_modules/table-layout/lib/ansi.js
@@ -0,0 +1,15 @@
+const ansiEscapeSequence = /\u001b.*?m/g
+
+/**
+ * @module ansi
+ */
+exports.remove = remove
+exports.has = has
+
+function remove (input) {
+ return input.replace(ansiEscapeSequence, '')
+}
+
+function has (input) {
+ return ansiEscapeSequence.test(input)
+}
diff --git a/node_modules/table-layout/lib/cell.js b/node_modules/table-layout/lib/cell.js
new file mode 100644
index 0000000..4351e8d
--- /dev/null
+++ b/node_modules/table-layout/lib/cell.js
@@ -0,0 +1,28 @@
+const t = require('typical')
+
+const _value = new WeakMap()
+const _column = new WeakMap()
+
+class Cell {
+ constructor (value, column) {
+ this.value = value
+ _column.set(this, column)
+ }
+
+ set value (val) {
+ _value.set(this, val)
+ }
+
+ get value () {
+ let cellValue = _value.get(this)
+ if (typeof cellValue === 'function') cellValue = cellValue.call(_column.get(this))
+ if (cellValue === undefined) {
+ cellValue = ''
+ } else {
+ cellValue = String(cellValue)
+ }
+ return cellValue
+ }
+}
+
+module.exports = Cell
diff --git a/node_modules/table-layout/lib/column.js b/node_modules/table-layout/lib/column.js
new file mode 100644
index 0000000..8defc88
--- /dev/null
+++ b/node_modules/table-layout/lib/column.js
@@ -0,0 +1,67 @@
+const t = require('typical')
+const Padding = require('./padding')
+
+/**
+ * @module column
+ */
+
+const _padding = new WeakMap()
+
+// setting any column property which is a factor of the width should trigger autoSize()
+
+/**
+ * Represents a table column
+ */
+class Column {
+ constructor (column) {
+ /**
+ * @type {string}
+ */
+ if (t.isDefined(column.name)) this.name = column.name
+ /**
+ * @type {number}
+ */
+ if (t.isDefined(column.width)) this.width = column.width
+ if (t.isDefined(column.maxWidth)) this.maxWidth = column.maxWidth
+ if (t.isDefined(column.minWidth)) this.minWidth = column.minWidth
+ if (t.isDefined(column.noWrap)) this.noWrap = column.noWrap
+ if (t.isDefined(column.break)) this.break = column.break
+ if (t.isDefined(column.contentWrappable)) this.contentWrappable = column.contentWrappable
+ if (t.isDefined(column.contentWidth)) this.contentWidth = column.contentWidth
+ if (t.isDefined(column.minContentWidth)) this.minContentWidth = column.minContentWidth
+ this.padding = column.padding || { left: ' ', right: ' ' }
+ this.generatedWidth = null
+ }
+
+ set padding (padding) {
+ _padding.set(this, new Padding(padding))
+ }
+ get padding () {
+ return _padding.get(this)
+ }
+
+ /**
+ * the width of the content (excluding padding) after being wrapped
+ */
+ get wrappedContentWidth () {
+ return Math.max(this.generatedWidth - this.padding.length(), 0)
+ }
+
+ isResizable () {
+ return !this.isFixed()
+ }
+
+ isFixed () {
+ return t.isDefined(this.width) || this.noWrap || !this.contentWrappable
+ }
+
+ generateWidth () {
+ this.generatedWidth = this.width || (this.contentWidth + this.padding.length())
+ }
+
+ generateMinWidth () {
+ this.minWidth = this.minContentWidth + this.padding.length()
+ }
+}
+
+module.exports = Column
diff --git a/node_modules/table-layout/lib/columns.js b/node_modules/table-layout/lib/columns.js
new file mode 100644
index 0000000..5135ffd
--- /dev/null
+++ b/node_modules/table-layout/lib/columns.js
@@ -0,0 +1,156 @@
+const t = require('typical')
+const arrayify = require('array-back')
+const Column = require('./column')
+const wrap = require('wordwrapjs')
+const Cell = require('./cell')
+const ansi = require('./ansi')
+
+const _maxWidth = new WeakMap()
+
+/**
+ * @module columns
+ */
+
+class Columns {
+ constructor (columns) {
+ this.list = []
+ arrayify(columns).forEach(this.add.bind(this))
+ }
+
+ /**
+ * sum of all generatedWidth fields
+ * @return {number}
+ */
+ totalWidth () {
+ return this.list.length
+ ? this.list.map(col => col.generatedWidth).reduce((a, b) => a + b)
+ : 0
+ }
+
+ totalFixedWidth () {
+ return this.getFixed()
+ .map(col => col.generatedWidth)
+ .reduce((a, b) => a + b, 0)
+ }
+
+ get (columnName) {
+ return this.list.find(column => column.name === columnName)
+ }
+
+ getResizable () {
+ return this.list.filter(column => column.isResizable())
+ }
+
+ getFixed () {
+ return this.list.filter(column => column.isFixed())
+ }
+
+ add (column) {
+ const col = column instanceof Column ? column : new Column(column)
+ this.list.push(col)
+ return col
+ }
+
+ set maxWidth (val) {
+ _maxWidth.set(this, val)
+ }
+
+ /**
+ * sets `generatedWidth` for each column
+ * @chainable
+ */
+ autoSize () {
+ const maxWidth = _maxWidth.get(this)
+
+ /* size */
+ this.list.forEach(column => {
+ column.generateWidth()
+ column.generateMinWidth()
+ })
+
+ /* adjust if user set a min or maxWidth */
+ this.list.forEach(column => {
+ if (t.isDefined(column.maxWidth) && column.generatedWidth > column.maxWidth) {
+ column.generatedWidth = column.maxWidth
+ }
+
+ if (t.isDefined(column.minWidth) && column.generatedWidth < column.minWidth) {
+ column.generatedWidth = column.minWidth
+ }
+ })
+
+ const width = {
+ total: this.totalWidth(),
+ view: maxWidth,
+ diff: this.totalWidth() - maxWidth,
+ totalFixed: this.totalFixedWidth(),
+ totalResizable: Math.max(maxWidth - this.totalFixedWidth(), 0)
+ }
+
+ /* adjust if short of space */
+ if (width.diff > 0) {
+ /* share the available space between resizeable columns */
+ let resizableColumns = this.getResizable()
+ resizableColumns.forEach(column => {
+ column.generatedWidth = Math.floor(width.totalResizable / resizableColumns.length)
+ })
+
+ /* at this point, the generatedWidth should never end up bigger than the contentWidth */
+ const grownColumns = this.list.filter(column => column.generatedWidth > column.contentWidth)
+ const shrunkenColumns = this.list.filter(column => column.generatedWidth < column.contentWidth)
+ let salvagedSpace = 0
+ grownColumns.forEach(column => {
+ const currentGeneratedWidth = column.generatedWidth
+ column.generateWidth()
+ salvagedSpace += currentGeneratedWidth - column.generatedWidth
+ })
+ shrunkenColumns.forEach(column => {
+ column.generatedWidth += Math.floor(salvagedSpace / shrunkenColumns.length)
+ })
+
+ /* if, after autosizing, we still don't fit within maxWidth then give up */
+ }
+
+ return this
+ }
+
+ /**
+ * Factory method returning all distinct columns from input
+ * @param {object[]} - input recordset
+ * @return {module:columns}
+ */
+ static getColumns (rows) {
+ var columns = new Columns()
+ arrayify(rows).forEach(row => {
+ for (let columnName in row) {
+ let column = columns.get(columnName)
+ if (!column) {
+ column = columns.add({ name: columnName, contentWidth: 0, minContentWidth: 0 })
+ }
+ let cell = new Cell(row[columnName], column)
+ let cellValue = cell.value
+ if (ansi.has(cellValue)) {
+ cellValue = ansi.remove(cellValue)
+ }
+
+ if (cellValue.length > column.contentWidth) column.contentWidth = cellValue.length
+
+ let longestWord = getLongestWord(cellValue)
+ if (longestWord > column.minContentWidth) {
+ column.minContentWidth = longestWord
+ }
+ if (!column.contentWrappable) column.contentWrappable = wrap.isWrappable(cellValue)
+ }
+ })
+ return columns
+ }
+}
+
+function getLongestWord (line) {
+ const words = wrap.getChunks(line)
+ return words.reduce((max, word) => {
+ return Math.max(word.length, max)
+ }, 0)
+}
+
+module.exports = Columns
diff --git a/node_modules/table-layout/lib/padding.js b/node_modules/table-layout/lib/padding.js
new file mode 100644
index 0000000..4af7910
--- /dev/null
+++ b/node_modules/table-layout/lib/padding.js
@@ -0,0 +1,14 @@
+class Padding {
+ constructor (padding) {
+ this.left = padding.left
+ this.right = padding.right
+ }
+ length () {
+ return this.left.length + this.right.length
+ }
+}
+
+/**
+@module padding
+*/
+module.exports = Padding
diff --git a/node_modules/table-layout/lib/rows.js b/node_modules/table-layout/lib/rows.js
new file mode 100644
index 0000000..3972f07
--- /dev/null
+++ b/node_modules/table-layout/lib/rows.js
@@ -0,0 +1,52 @@
+const arrayify = require('array-back')
+const Cell = require('./cell')
+const t = require('typical')
+
+/**
+ *
+ */
+class Rows {
+ constructor (rows, columns) {
+ this.list = []
+ this.load(rows, columns)
+ }
+
+ load (rows, columns) {
+ arrayify(rows).forEach(row => {
+ this.list.push(new Map(objectToIterable(row, columns)))
+ })
+ }
+
+ static removeEmptyColumns (data) {
+ const distinctColumnNames = data.reduce((columnNames, row) => {
+ Object.keys(row).forEach(key => {
+ if (columnNames.indexOf(key) === -1) columnNames.push(key)
+ })
+ return columnNames
+ }, [])
+
+ const emptyColumns = distinctColumnNames.filter(columnName => {
+ const hasValue = data.some(row => {
+ const value = row[columnName]
+ return (t.isDefined(value) && typeof value !== 'string') || (typeof value === 'string' && /\S+/.test(value))
+ })
+ return !hasValue
+ })
+
+ return data.map(row => {
+ emptyColumns.forEach(emptyCol => delete row[emptyCol])
+ return row
+ })
+ }
+}
+
+function objectToIterable (row, columns) {
+ return columns.list.map(column => {
+ return [ column, new Cell(row[column.name], column) ]
+ })
+}
+
+/**
+ * @module rows
+ */
+module.exports = Rows
diff --git a/node_modules/table-layout/node_modules/array-back/LICENSE b/node_modules/table-layout/node_modules/array-back/LICENSE
new file mode 100644
index 0000000..203018f
--- /dev/null
+++ b/node_modules/table-layout/node_modules/array-back/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2015-19 Lloyd Brookes <75pound@gmail.com>
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/node_modules/table-layout/node_modules/array-back/README.hbs b/node_modules/table-layout/node_modules/array-back/README.hbs
new file mode 100644
index 0000000..7d84bd2
--- /dev/null
+++ b/node_modules/table-layout/node_modules/array-back/README.hbs
@@ -0,0 +1,40 @@
+[![view on npm](https://img.shields.io/npm/v/array-back.svg)](https://www.npmjs.org/package/array-back)
+[![npm module downloads](https://img.shields.io/npm/dt/array-back.svg)](https://www.npmjs.org/package/array-back)
+[![Build Status](https://travis-ci.org/75lb/array-back.svg?branch=master)](https://travis-ci.org/75lb/array-back)
+[![Coverage Status](https://coveralls.io/repos/github/75lb/array-back/badge.svg?branch=master)](https://coveralls.io/github/75lb/array-back?branch=master)
+[![Dependency Status](https://badgen.net/david/dep/75lb/array-back)](https://david-dm.org/75lb/array-back)
+[![js-standard-style](https://img.shields.io/badge/code%20style-standard-brightgreen.svg)](https://github.com/feross/standard)
+
+{{>main}}
+
+### Load anywhere
+
+This library is compatible with Node.js, the Web and any style of module loader. It can be loaded anywhere, natively without transpilation.
+
+Node.js:
+
+```js
+const arrayify = require('array-back')
+```
+
+Within Node.js with ECMAScript Module support enabled:
+
+```js
+import arrayify from 'array-back'
+```
+
+Within an modern browser ECMAScript Module:
+
+```js
+import arrayify from './node_modules/array-back/index.mjs'
+```
+
+Old browser (adds `window.arrayBack`):
+
+```html
+<script nomodule src="./node_modules/array-back/dist/index.js"></script>
+```
+
+* * *
+
+&copy; 2015-19 Lloyd Brookes \<75pound@gmail.com\>. Documented by [jsdoc-to-markdown](https://github.com/75lb/jsdoc-to-markdown).
diff --git a/node_modules/table-layout/node_modules/array-back/README.md b/node_modules/table-layout/node_modules/array-back/README.md
new file mode 100644
index 0000000..431339e
--- /dev/null
+++ b/node_modules/table-layout/node_modules/array-back/README.md
@@ -0,0 +1,81 @@
+[![view on npm](https://img.shields.io/npm/v/array-back.svg)](https://www.npmjs.org/package/array-back)
+[![npm module downloads](https://img.shields.io/npm/dt/array-back.svg)](https://www.npmjs.org/package/array-back)
+[![Build Status](https://travis-ci.org/75lb/array-back.svg?branch=master)](https://travis-ci.org/75lb/array-back)
+[![Coverage Status](https://coveralls.io/repos/github/75lb/array-back/badge.svg?branch=master)](https://coveralls.io/github/75lb/array-back?branch=master)
+[![Dependency Status](https://badgen.net/david/dep/75lb/array-back)](https://david-dm.org/75lb/array-back)
+[![js-standard-style](https://img.shields.io/badge/code%20style-standard-brightgreen.svg)](https://github.com/feross/standard)
+
+<a name="module_array-back"></a>
+
+## array-back
+Takes any input and guarantees an array back.
+
+- Converts array-like objects (e.g. `arguments`, `Set`) to a real array.
+- Converts `undefined` to an empty array.
+- Converts any another other, singular value (including `null`, objects and iterables other than `Set`) into an array containing that value.
+- Ignores input which is already an array.
+
+**Example**
+```js
+> const arrayify = require('array-back')
+
+> arrayify(undefined)
+[]
+
+> arrayify(null)
+[ null ]
+
+> arrayify(0)
+[ 0 ]
+
+> arrayify([ 1, 2 ])
+[ 1, 2 ]
+
+> arrayify(new Set([ 1, 2 ]))
+[ 1, 2 ]
+
+> function f(){ return arrayify(arguments); }
+> f(1,2,3)
+[ 1, 2, 3 ]
+```
+<a name="exp_module_array-back--arrayify"></a>
+
+### arrayify(input) ⇒ <code>Array</code> ⏏
+**Kind**: Exported function
+
+| Param | Type | Description |
+| --- | --- | --- |
+| input | <code>\*</code> | The input value to convert to an array |
+
+
+### Load anywhere
+
+This library is compatible with Node.js, the Web and any style of module loader. It can be loaded anywhere, natively without transpilation.
+
+Node.js:
+
+```js
+const arrayify = require('array-back')
+```
+
+Within Node.js with ECMAScript Module support enabled:
+
+```js
+import arrayify from 'array-back'
+```
+
+Within an modern browser ECMAScript Module:
+
+```js
+import arrayify from './node_modules/array-back/index.mjs'
+```
+
+Old browser (adds `window.arrayBack`):
+
+```html
+<script nomodule src="./node_modules/array-back/dist/index.js"></script>
+```
+
+* * *
+
+&copy; 2015-19 Lloyd Brookes \<75pound@gmail.com\>. Documented by [jsdoc-to-markdown](https://github.com/75lb/jsdoc-to-markdown).
diff --git a/node_modules/table-layout/node_modules/array-back/dist/index.js b/node_modules/table-layout/node_modules/array-back/dist/index.js
new file mode 100644
index 0000000..3b97b84
--- /dev/null
+++ b/node_modules/table-layout/node_modules/array-back/dist/index.js
@@ -0,0 +1,70 @@
+(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
+ typeof define === 'function' && define.amd ? define(factory) :
+ (global = global || self, global.arrayBack = factory());
+}(this, (function () { 'use strict';
+
+ /**
+ * Takes any input and guarantees an array back.
+ *
+ * - Converts array-like objects (e.g. `arguments`, `Set`) to a real array.
+ * - Converts `undefined` to an empty array.
+ * - Converts any another other, singular value (including `null`, objects and iterables other than `Set`) into an array containing that value.
+ * - Ignores input which is already an array.
+ *
+ * @module array-back
+ * @example
+ * > const arrayify = require('array-back')
+ *
+ * > arrayify(undefined)
+ * []
+ *
+ * > arrayify(null)
+ * [ null ]
+ *
+ * > arrayify(0)
+ * [ 0 ]
+ *
+ * > arrayify([ 1, 2 ])
+ * [ 1, 2 ]
+ *
+ * > arrayify(new Set([ 1, 2 ]))
+ * [ 1, 2 ]
+ *
+ * > function f(){ return arrayify(arguments); }
+ * > f(1,2,3)
+ * [ 1, 2, 3 ]
+ */
+
+ function isObject (input) {
+ return typeof input === 'object' && input !== null
+ }
+
+ function isArrayLike (input) {
+ return isObject(input) && typeof input.length === 'number'
+ }
+
+ /**
+ * @param {*} - The input value to convert to an array
+ * @returns {Array}
+ * @alias module:array-back
+ */
+ function arrayify (input) {
+ if (Array.isArray(input)) {
+ return input
+ }
+
+ if (input === undefined) {
+ return []
+ }
+
+ if (isArrayLike(input) || input instanceof Set) {
+ return Array.from(input)
+ }
+
+ return [input]
+ }
+
+ return arrayify;
+
+})));
diff --git a/node_modules/table-layout/node_modules/array-back/index.mjs b/node_modules/table-layout/node_modules/array-back/index.mjs
new file mode 100644
index 0000000..1090399
--- /dev/null
+++ b/node_modules/table-layout/node_modules/array-back/index.mjs
@@ -0,0 +1,62 @@
+/**
+ * Takes any input and guarantees an array back.
+ *
+ * - Converts array-like objects (e.g. `arguments`, `Set`) to a real array.
+ * - Converts `undefined` to an empty array.
+ * - Converts any another other, singular value (including `null`, objects and iterables other than `Set`) into an array containing that value.
+ * - Ignores input which is already an array.
+ *
+ * @module array-back
+ * @example
+ * > const arrayify = require('array-back')
+ *
+ * > arrayify(undefined)
+ * []
+ *
+ * > arrayify(null)
+ * [ null ]
+ *
+ * > arrayify(0)
+ * [ 0 ]
+ *
+ * > arrayify([ 1, 2 ])
+ * [ 1, 2 ]
+ *
+ * > arrayify(new Set([ 1, 2 ]))
+ * [ 1, 2 ]
+ *
+ * > function f(){ return arrayify(arguments); }
+ * > f(1,2,3)
+ * [ 1, 2, 3 ]
+ */
+
+function isObject (input) {
+ return typeof input === 'object' && input !== null
+}
+
+function isArrayLike (input) {
+ return isObject(input) && typeof input.length === 'number'
+}
+
+/**
+ * @param {*} - The input value to convert to an array
+ * @returns {Array}
+ * @alias module:array-back
+ */
+function arrayify (input) {
+ if (Array.isArray(input)) {
+ return input
+ }
+
+ if (input === undefined) {
+ return []
+ }
+
+ if (isArrayLike(input) || input instanceof Set) {
+ return Array.from(input)
+ }
+
+ return [input]
+}
+
+export default arrayify
diff --git a/node_modules/table-layout/node_modules/array-back/package.json b/node_modules/table-layout/node_modules/array-back/package.json
new file mode 100644
index 0000000..a677a10
--- /dev/null
+++ b/node_modules/table-layout/node_modules/array-back/package.json
@@ -0,0 +1,46 @@
+{
+ "name": "array-back",
+ "author": "Lloyd Brookes <75pound@gmail.com>",
+ "version": "4.0.2",
+ "description": "Guarantees an array back",
+ "repository": "https://github.com/75lb/array-back.git",
+ "license": "MIT",
+ "main": "dist/index.js",
+ "keywords": [
+ "to",
+ "convert",
+ "return",
+ "array",
+ "arrayify"
+ ],
+ "engines": {
+ "node": ">=8"
+ },
+ "files": [
+ "index.mjs",
+ "dist/index.js"
+ ],
+ "scripts": {
+ "test": "npm run dist && npm run test:esm && npm run test:web",
+ "test:esm": "esm-runner test.mjs",
+ "test:web": "web-runner test.mjs",
+ "docs": "jsdoc2md -t README.hbs index.mjs -c jsdoc.conf > README.md",
+ "dist": "rollup -f umd -n arrayBack -o dist/index.js index.mjs",
+ "cover": "c8 npm run test:esm && c8 report --reporter=text-lcov | coveralls"
+ },
+ "dependencies": {},
+ "devDependencies": {
+ "@test-runner/web": "^0.2.1",
+ "c8": "^6.0.1",
+ "coveralls": "^3.0.7",
+ "esm-runner": "^0.2.0",
+ "isomorphic-assert": "^0.1.1",
+ "jsdoc-to-markdown": "^5.0.2",
+ "rollup": "^1.26.5"
+ },
+ "standard": {
+ "ignore": [
+ "dist"
+ ]
+ }
+}
diff --git a/node_modules/table-layout/node_modules/typical/LICENSE b/node_modules/table-layout/node_modules/typical/LICENSE
new file mode 100644
index 0000000..700561a
--- /dev/null
+++ b/node_modules/table-layout/node_modules/typical/LICENSE
@@ -0,0 +1,22 @@
+The MIT License (MIT)
+
+Copyright (c) 2014-19 Lloyd Brookes <75pound@gmail.com>
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
diff --git a/node_modules/table-layout/node_modules/typical/README.hbs b/node_modules/table-layout/node_modules/typical/README.hbs
new file mode 100644
index 0000000..bb092a1
--- /dev/null
+++ b/node_modules/table-layout/node_modules/typical/README.hbs
@@ -0,0 +1,40 @@
+[![view on npm](http://img.shields.io/npm/v/typical.svg)](https://www.npmjs.org/package/typical)
+[![npm module downloads](http://img.shields.io/npm/dt/typical.svg)](https://www.npmjs.org/package/typical)
+[![Build Status](https://travis-ci.org/75lb/typical.svg?branch=master)](https://travis-ci.org/75lb/typical)
+[![Coverage Status](https://coveralls.io/repos/github/75lb/typical/badge.svg?branch=master)](https://coveralls.io/github/75lb/typical?branch=master)
+[![Dependency Status](https://badgen.net/david/dep/75lb/typical)](https://david-dm.org/75lb/typical)
+[![js-standard-style](https://img.shields.io/badge/code%20style-standard-brightgreen.svg)](https://github.com/feross/standard)
+
+{{>main}}
+
+## Load anywhere
+
+This library is compatible with Node.js, the Web and any style of module loader. It can be loaded anywhere, natively without transpilation.
+
+Node.js:
+
+```js
+const typical = require('typical')
+```
+
+Within Node.js with ECMAScript Module support enabled:
+
+```js
+import typical from 'typical'
+```
+
+Within a modern browser ECMAScript Module:
+
+```js
+import typical from './node_modules/typical/index.mjs'
+```
+
+Old browser (adds `window.typical`):
+
+```html
+<script nomodule src="./node_modules/typical/dist/index.js"></script>
+```
+
+* * *
+
+&copy; 2014-19 Lloyd Brookes \<75pound@gmail.com\>. Documented by [jsdoc-to-markdown](https://github.com/jsdoc2md/jsdoc-to-markdown).
diff --git a/node_modules/table-layout/node_modules/typical/README.md b/node_modules/table-layout/node_modules/typical/README.md
new file mode 100644
index 0000000..6e3d513
--- /dev/null
+++ b/node_modules/table-layout/node_modules/typical/README.md
@@ -0,0 +1,302 @@
+[![view on npm](http://img.shields.io/npm/v/typical.svg)](https://www.npmjs.org/package/typical)
+[![npm module downloads](http://img.shields.io/npm/dt/typical.svg)](https://www.npmjs.org/package/typical)
+[![Build Status](https://travis-ci.org/75lb/typical.svg?branch=master)](https://travis-ci.org/75lb/typical)
+[![Coverage Status](https://coveralls.io/repos/github/75lb/typical/badge.svg?branch=master)](https://coveralls.io/github/75lb/typical?branch=master)
+[![Dependency Status](https://badgen.net/david/dep/75lb/typical)](https://david-dm.org/75lb/typical)
+[![js-standard-style](https://img.shields.io/badge/code%20style-standard-brightgreen.svg)](https://github.com/feross/standard)
+
+<a name="module_typical"></a>
+
+## typical
+Isomorphic, functional type-checking for Javascript.
+
+**Example**
+```js
+const t = require('typical')
+const allDefined = array.every(t.isDefined)
+```
+
+* [typical](#module_typical)
+ * [.isNumber(n)](#module_typical.isNumber) ⇒ <code>boolean</code>
+ * [.isPlainObject(input)](#module_typical.isPlainObject) ⇒ <code>boolean</code>
+ * [.isArrayLike(input)](#module_typical.isArrayLike) ⇒ <code>boolean</code>
+ * [.isObject(input)](#module_typical.isObject) ⇒ <code>boolean</code>
+ * [.isDefined(input)](#module_typical.isDefined) ⇒ <code>boolean</code>
+ * [.isUndefined(input)](#module_typical.isUndefined) ⇒ <code>boolean</code>
+ * [.isNull(input)](#module_typical.isNull) ⇒ <code>boolean</code>
+ * [.isDefinedValue(input)](#module_typical.isDefinedValue) ⇒ <code>boolean</code>
+ * [.isClass(input)](#module_typical.isClass) ⇒ <code>boolean</code>
+ * [.isPrimitive(input)](#module_typical.isPrimitive) ⇒ <code>boolean</code>
+ * [.isPromise(input)](#module_typical.isPromise) ⇒ <code>boolean</code>
+ * [.isIterable(input)](#module_typical.isIterable) ⇒ <code>boolean</code>
+ * [.isString(input)](#module_typical.isString) ⇒ <code>boolean</code>
+ * [.isFunction(input)](#module_typical.isFunction) ⇒ <code>boolean</code>
+
+<a name="module_typical.isNumber"></a>
+
+### t.isNumber(n) ⇒ <code>boolean</code>
+Returns true if input is a number. It is a more reasonable alternative to `typeof n` which returns `number` for `NaN` and `Infinity`.
+
+**Kind**: static method of [<code>typical</code>](#module_typical)
+
+| Param | Type | Description |
+| --- | --- | --- |
+| n | <code>\*</code> | the input to test |
+
+**Example**
+```js
+> t.isNumber(0)
+true
+> t.isNumber(1)
+true
+> t.isNumber(1.1)
+true
+> t.isNumber(0xff)
+true
+> t.isNumber(0644)
+true
+> t.isNumber(6.2e5)
+true
+> t.isNumber(NaN)
+false
+> t.isNumber(Infinity)
+false
+```
+<a name="module_typical.isPlainObject"></a>
+
+### t.isPlainObject(input) ⇒ <code>boolean</code>
+A plain object is a simple object literal, it is not an instance of a class. Returns true if the input `typeof` is `object` and directly decends from `Object`.
+
+**Kind**: static method of [<code>typical</code>](#module_typical)
+
+| Param | Type | Description |
+| --- | --- | --- |
+| input | <code>\*</code> | the input to test |
+
+**Example**
+```js
+> t.isPlainObject({ something: 'one' })
+true
+> t.isPlainObject(new Date())
+false
+> t.isPlainObject([ 0, 1 ])
+false
+> t.isPlainObject(/test/)
+false
+> t.isPlainObject(1)
+false
+> t.isPlainObject('one')
+false
+> t.isPlainObject(null)
+false
+> t.isPlainObject((function * () {})())
+false
+> t.isPlainObject(function * () {})
+false
+```
+<a name="module_typical.isArrayLike"></a>
+
+### t.isArrayLike(input) ⇒ <code>boolean</code>
+An array-like value has all the properties of an array yet is not an array instance. An example is the `arguments` object. Returns `true`` if the input value is an object, not `null`` and has a `length` property set with a numeric value.
+
+**Kind**: static method of [<code>typical</code>](#module_typical)
+
+| Param | Type | Description |
+| --- | --- | --- |
+| input | <code>\*</code> | the input to test |
+
+**Example**
+```js
+function sum(x, y){
+ console.log(t.isArrayLike(arguments))
+ // prints `true`
+}
+```
+<a name="module_typical.isObject"></a>
+
+### t.isObject(input) ⇒ <code>boolean</code>
+Returns true if the typeof input is `'object'` but not null.
+
+**Kind**: static method of [<code>typical</code>](#module_typical)
+
+| Param | Type | Description |
+| --- | --- | --- |
+| input | <code>\*</code> | the input to test |
+
+<a name="module_typical.isDefined"></a>
+
+### t.isDefined(input) ⇒ <code>boolean</code>
+Returns true if the input value is defined.
+
+**Kind**: static method of [<code>typical</code>](#module_typical)
+
+| Param | Type | Description |
+| --- | --- | --- |
+| input | <code>\*</code> | the input to test |
+
+<a name="module_typical.isUndefined"></a>
+
+### t.isUndefined(input) ⇒ <code>boolean</code>
+Returns true if the input value is undefined.
+
+**Kind**: static method of [<code>typical</code>](#module_typical)
+
+| Param | Type | Description |
+| --- | --- | --- |
+| input | <code>\*</code> | the input to test |
+
+<a name="module_typical.isNull"></a>
+
+### t.isNull(input) ⇒ <code>boolean</code>
+Returns true if the input value is null.
+
+**Kind**: static method of [<code>typical</code>](#module_typical)
+
+| Param | Type | Description |
+| --- | --- | --- |
+| input | <code>\*</code> | the input to test |
+
+<a name="module_typical.isDefinedValue"></a>
+
+### t.isDefinedValue(input) ⇒ <code>boolean</code>
+Returns true if the input value is not one of `undefined`, `null`, or `NaN`.
+
+**Kind**: static method of [<code>typical</code>](#module_typical)
+
+| Param | Type | Description |
+| --- | --- | --- |
+| input | <code>\*</code> | the input to test |
+
+<a name="module_typical.isClass"></a>
+
+### t.isClass(input) ⇒ <code>boolean</code>
+Returns true if the input value is an ES2015 `class`.
+
+**Kind**: static method of [<code>typical</code>](#module_typical)
+
+| Param | Type | Description |
+| --- | --- | --- |
+| input | <code>\*</code> | the input to test |
+
+<a name="module_typical.isPrimitive"></a>
+
+### t.isPrimitive(input) ⇒ <code>boolean</code>
+Returns true if the input is a string, number, symbol, boolean, null or undefined value.
+
+**Kind**: static method of [<code>typical</code>](#module_typical)
+
+| Param | Type | Description |
+| --- | --- | --- |
+| input | <code>\*</code> | the input to test |
+
+<a name="module_typical.isPromise"></a>
+
+### t.isPromise(input) ⇒ <code>boolean</code>
+Returns true if the input is a Promise.
+
+**Kind**: static method of [<code>typical</code>](#module_typical)
+
+| Param | Type | Description |
+| --- | --- | --- |
+| input | <code>\*</code> | the input to test |
+
+<a name="module_typical.isIterable"></a>
+
+### t.isIterable(input) ⇒ <code>boolean</code>
+Returns true if the input is an iterable (`Map`, `Set`, `Array`, Generator etc.).
+
+**Kind**: static method of [<code>typical</code>](#module_typical)
+
+| Param | Type | Description |
+| --- | --- | --- |
+| input | <code>\*</code> | the input to test |
+
+**Example**
+```js
+> t.isIterable('string')
+true
+> t.isIterable(new Map())
+true
+> t.isIterable([])
+true
+> t.isIterable((function * () {})())
+true
+> t.isIterable(Promise.resolve())
+false
+> t.isIterable(Promise)
+false
+> t.isIterable(true)
+false
+> t.isIterable({})
+false
+> t.isIterable(0)
+false
+> t.isIterable(1.1)
+false
+> t.isIterable(NaN)
+false
+> t.isIterable(Infinity)
+false
+> t.isIterable(function () {})
+false
+> t.isIterable(Date)
+false
+> t.isIterable()
+false
+> t.isIterable({ then: function () {} })
+false
+```
+<a name="module_typical.isString"></a>
+
+### t.isString(input) ⇒ <code>boolean</code>
+Returns true if the input value is a string. The equivalent of `typeof input === 'string'` for use in funcitonal contexts.
+
+**Kind**: static method of [<code>typical</code>](#module_typical)
+
+| Param | Type | Description |
+| --- | --- | --- |
+| input | <code>\*</code> | the input to test |
+
+<a name="module_typical.isFunction"></a>
+
+### t.isFunction(input) ⇒ <code>boolean</code>
+Returns true if the input value is a function. The equivalent of `typeof input === 'function'` for use in funcitonal contexts.
+
+**Kind**: static method of [<code>typical</code>](#module_typical)
+
+| Param | Type | Description |
+| --- | --- | --- |
+| input | <code>\*</code> | the input to test |
+
+
+## Load anywhere
+
+This library is compatible with Node.js, the Web and any style of module loader. It can be loaded anywhere, natively without transpilation.
+
+Node.js:
+
+```js
+const typical = require('typical')
+```
+
+Within Node.js with ECMAScript Module support enabled:
+
+```js
+import typical from 'typical'
+```
+
+Within a modern browser ECMAScript Module:
+
+```js
+import typical from './node_modules/typical/index.mjs'
+```
+
+Old browser (adds `window.typical`):
+
+```html
+<script nomodule src="./node_modules/typical/dist/index.js"></script>
+```
+
+* * *
+
+&copy; 2014-19 Lloyd Brookes \<75pound@gmail.com\>. Documented by [jsdoc-to-markdown](https://github.com/jsdoc2md/jsdoc-to-markdown).
diff --git a/node_modules/table-layout/node_modules/typical/dist/index.js b/node_modules/table-layout/node_modules/typical/dist/index.js
new file mode 100644
index 0000000..ed8b168
--- /dev/null
+++ b/node_modules/table-layout/node_modules/typical/dist/index.js
@@ -0,0 +1,295 @@
+(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
+ typeof define === 'function' && define.amd ? define(['exports'], factory) :
+ (global = global || self, factory(global.typical = {}));
+}(this, function (exports) { 'use strict';
+
+ /**
+ * Isomorphic, functional type-checking for Javascript.
+ * @module typical
+ * @typicalname t
+ * @example
+ * const t = require('typical')
+ * const allDefined = array.every(t.isDefined)
+ */
+
+ /**
+ * Returns true if input is a number. It is a more reasonable alternative to `typeof n` which returns `number` for `NaN` and `Infinity`.
+ *
+ * @param {*} - the input to test
+ * @returns {boolean}
+ * @static
+ * @example
+ * > t.isNumber(0)
+ * true
+ * > t.isNumber(1)
+ * true
+ * > t.isNumber(1.1)
+ * true
+ * > t.isNumber(0xff)
+ * true
+ * > t.isNumber(0644)
+ * true
+ * > t.isNumber(6.2e5)
+ * true
+ * > t.isNumber(NaN)
+ * false
+ * > t.isNumber(Infinity)
+ * false
+ */
+ function isNumber (n) {
+ return !isNaN(parseFloat(n)) && isFinite(n)
+ }
+
+ /**
+ * A plain object is a simple object literal, it is not an instance of a class. Returns true if the input `typeof` is `object` and directly decends from `Object`.
+ *
+ * @param {*} - the input to test
+ * @returns {boolean}
+ * @static
+ * @example
+ * > t.isPlainObject({ something: 'one' })
+ * true
+ * > t.isPlainObject(new Date())
+ * false
+ * > t.isPlainObject([ 0, 1 ])
+ * false
+ * > t.isPlainObject(/test/)
+ * false
+ * > t.isPlainObject(1)
+ * false
+ * > t.isPlainObject('one')
+ * false
+ * > t.isPlainObject(null)
+ * false
+ * > t.isPlainObject((function * () {})())
+ * false
+ * > t.isPlainObject(function * () {})
+ * false
+ */
+ function isPlainObject (input) {
+ return input !== null && typeof input === 'object' && input.constructor === Object
+ }
+
+ /**
+ * An array-like value has all the properties of an array yet is not an array instance. An example is the `arguments` object. Returns `true`` if the input value is an object, not `null`` and has a `length` property set with a numeric value.
+ *
+ * @param {*} - the input to test
+ * @returns {boolean}
+ * @static
+ * @example
+ * function sum(x, y){
+ * console.log(t.isArrayLike(arguments))
+ * // prints `true`
+ * }
+ */
+ function isArrayLike (input) {
+ return isObject(input) && typeof input.length === 'number'
+ }
+
+ /**
+ * Returns true if the typeof input is `'object'` but not null.
+ * @param {*} - the input to test
+ * @returns {boolean}
+ * @static
+ */
+ function isObject (input) {
+ return typeof input === 'object' && input !== null
+ }
+
+ /**
+ * Returns true if the input value is defined.
+ * @param {*} - the input to test
+ * @returns {boolean}
+ * @static
+ */
+ function isDefined (input) {
+ return typeof input !== 'undefined'
+ }
+
+ /**
+ * Returns true if the input value is undefined.
+ * @param {*} - the input to test
+ * @returns {boolean}
+ * @static
+ */
+ function isUndefined (input) {
+ return !isDefined(input)
+ }
+
+ /**
+ * Returns true if the input value is null.
+ * @param {*} - the input to test
+ * @returns {boolean}
+ * @static
+ */
+ function isNull (input) {
+ return input === null
+ }
+
+ /**
+ * Returns true if the input value is both defined and not null.
+ * @param {*} - the input to test
+ * @returns {boolean}
+ * @static
+ */
+ function isDefinedValue (input) {
+ return isDefined(input) && !isNull(input) && !Number.isNaN(input)
+ }
+
+ /**
+ * Returns true if the input value is an ES2015 `class`.
+ * @param {*} - the input to test
+ * @returns {boolean}
+ * @static
+ */
+ function isClass (input) {
+ if (typeof input === 'function') {
+ return /^class /.test(Function.prototype.toString.call(input))
+ } else {
+ return false
+ }
+ }
+
+ /**
+ * Returns true if the input is a string, number, symbol, boolean, null or undefined value.
+ * @param {*} - the input to test
+ * @returns {boolean}
+ * @static
+ */
+ function isPrimitive (input) {
+ if (input === null) return true
+ switch (typeof input) {
+ case 'string':
+ case 'number':
+ case 'symbol':
+ case 'undefined':
+ case 'boolean':
+ return true
+ default:
+ return false
+ }
+ }
+
+ /**
+ * Returns true if the input is a Promise.
+ * @param {*} - the input to test
+ * @returns {boolean}
+ * @static
+ */
+ function isPromise (input) {
+ if (input) {
+ const isPromise = isDefined(Promise) && input instanceof Promise;
+ const isThenable = input.then && typeof input.then === 'function';
+ return !!(isPromise || isThenable)
+ } else {
+ return false
+ }
+ }
+
+ /**
+ * Returns true if the input is an iterable (`Map`, `Set`, `Array`, Generator etc.).
+ * @param {*} - the input to test
+ * @returns {boolean}
+ * @static
+ * @example
+ * > t.isIterable('string')
+ * true
+ * > t.isIterable(new Map())
+ * true
+ * > t.isIterable([])
+ * true
+ * > t.isIterable((function * () {})())
+ * true
+ * > t.isIterable(Promise.resolve())
+ * false
+ * > t.isIterable(Promise)
+ * false
+ * > t.isIterable(true)
+ * false
+ * > t.isIterable({})
+ * false
+ * > t.isIterable(0)
+ * false
+ * > t.isIterable(1.1)
+ * false
+ * > t.isIterable(NaN)
+ * false
+ * > t.isIterable(Infinity)
+ * false
+ * > t.isIterable(function () {})
+ * false
+ * > t.isIterable(Date)
+ * false
+ * > t.isIterable()
+ * false
+ * > t.isIterable({ then: function () {} })
+ * false
+ */
+ function isIterable (input) {
+ if (input === null || !isDefined(input)) {
+ return false
+ } else {
+ return (
+ typeof input[Symbol.iterator] === 'function' ||
+ typeof input[Symbol.asyncIterator] === 'function'
+ )
+ }
+ }
+
+ /**
+ * Returns true if the input value is a string. The equivalent of `typeof input === 'string'` for use in funcitonal contexts.
+ * @param {*} - the input to test
+ * @returns {boolean}
+ * @static
+ */
+ function isString (input) {
+ return typeof input === 'string'
+ }
+
+ /**
+ * Returns true if the input value is a function. The equivalent of `typeof input === 'function'` for use in funcitonal contexts.
+ * @param {*} - the input to test
+ * @returns {boolean}
+ * @static
+ */
+ function isFunction (input) {
+ return typeof input === 'function'
+ }
+
+ var index = {
+ isNumber,
+ isPlainObject,
+ isArrayLike,
+ isObject,
+ isDefined,
+ isUndefined,
+ isNull,
+ isDefinedValue,
+ isClass,
+ isPrimitive,
+ isPromise,
+ isIterable,
+ isString,
+ isFunction
+ };
+
+ exports.default = index;
+ exports.isArrayLike = isArrayLike;
+ exports.isClass = isClass;
+ exports.isDefined = isDefined;
+ exports.isDefinedValue = isDefinedValue;
+ exports.isFunction = isFunction;
+ exports.isIterable = isIterable;
+ exports.isNull = isNull;
+ exports.isNumber = isNumber;
+ exports.isObject = isObject;
+ exports.isPlainObject = isPlainObject;
+ exports.isPrimitive = isPrimitive;
+ exports.isPromise = isPromise;
+ exports.isString = isString;
+ exports.isUndefined = isUndefined;
+
+ Object.defineProperty(exports, '__esModule', { value: true });
+
+}));
diff --git a/node_modules/table-layout/node_modules/typical/index.mjs b/node_modules/table-layout/node_modules/typical/index.mjs
new file mode 100644
index 0000000..d3468a9
--- /dev/null
+++ b/node_modules/table-layout/node_modules/typical/index.mjs
@@ -0,0 +1,269 @@
+/**
+ * Isomorphic, functional type-checking for Javascript.
+ * @module typical
+ * @typicalname t
+ * @example
+ * const t = require('typical')
+ * const allDefined = array.every(t.isDefined)
+ */
+
+/**
+ * Returns true if input is a number. It is a more reasonable alternative to `typeof n` which returns `number` for `NaN` and `Infinity`.
+ *
+ * @param {*} - the input to test
+ * @returns {boolean}
+ * @static
+ * @example
+ * > t.isNumber(0)
+ * true
+ * > t.isNumber(1)
+ * true
+ * > t.isNumber(1.1)
+ * true
+ * > t.isNumber(0xff)
+ * true
+ * > t.isNumber(0644)
+ * true
+ * > t.isNumber(6.2e5)
+ * true
+ * > t.isNumber(NaN)
+ * false
+ * > t.isNumber(Infinity)
+ * false
+ */
+export function isNumber (n) {
+ return !isNaN(parseFloat(n)) && isFinite(n)
+}
+
+/**
+ * A plain object is a simple object literal, it is not an instance of a class. Returns true if the input `typeof` is `object` and directly decends from `Object`.
+ *
+ * @param {*} - the input to test
+ * @returns {boolean}
+ * @static
+ * @example
+ * > t.isPlainObject({ something: 'one' })
+ * true
+ * > t.isPlainObject(new Date())
+ * false
+ * > t.isPlainObject([ 0, 1 ])
+ * false
+ * > t.isPlainObject(/test/)
+ * false
+ * > t.isPlainObject(1)
+ * false
+ * > t.isPlainObject('one')
+ * false
+ * > t.isPlainObject(null)
+ * false
+ * > t.isPlainObject((function * () {})())
+ * false
+ * > t.isPlainObject(function * () {})
+ * false
+ */
+export function isPlainObject (input) {
+ return input !== null && typeof input === 'object' && input.constructor === Object
+}
+
+/**
+ * An array-like value has all the properties of an array yet is not an array instance. An example is the `arguments` object. Returns `true`` if the input value is an object, not `null`` and has a `length` property set with a numeric value.
+ *
+ * @param {*} - the input to test
+ * @returns {boolean}
+ * @static
+ * @example
+ * function sum(x, y){
+ * console.log(t.isArrayLike(arguments))
+ * // prints `true`
+ * }
+ */
+export function isArrayLike (input) {
+ return isObject(input) && typeof input.length === 'number'
+}
+
+/**
+ * Returns true if the typeof input is `'object'` but not null.
+ * @param {*} - the input to test
+ * @returns {boolean}
+ * @static
+ */
+export function isObject (input) {
+ return typeof input === 'object' && input !== null
+}
+
+/**
+ * Returns true if the input value is defined.
+ * @param {*} - the input to test
+ * @returns {boolean}
+ * @static
+ */
+export function isDefined (input) {
+ return typeof input !== 'undefined'
+}
+
+/**
+ * Returns true if the input value is undefined.
+ * @param {*} - the input to test
+ * @returns {boolean}
+ * @static
+ */
+export function isUndefined (input) {
+ return !isDefined(input)
+}
+
+/**
+ * Returns true if the input value is null.
+ * @param {*} - the input to test
+ * @returns {boolean}
+ * @static
+ */
+export function isNull (input) {
+ return input === null
+}
+
+/**
+ * Returns true if the input value is not one of `undefined`, `null`, or `NaN`.
+ * @param {*} - the input to test
+ * @returns {boolean}
+ * @static
+ */
+export function isDefinedValue (input) {
+ return isDefined(input) && !isNull(input) && !Number.isNaN(input)
+}
+
+/**
+ * Returns true if the input value is an ES2015 `class`.
+ * @param {*} - the input to test
+ * @returns {boolean}
+ * @static
+ */
+export function isClass (input) {
+ if (typeof input === 'function') {
+ return /^class /.test(Function.prototype.toString.call(input))
+ } else {
+ return false
+ }
+}
+
+/**
+ * Returns true if the input is a string, number, symbol, boolean, null or undefined value.
+ * @param {*} - the input to test
+ * @returns {boolean}
+ * @static
+ */
+export function isPrimitive (input) {
+ if (input === null) return true
+ switch (typeof input) {
+ case 'string':
+ case 'number':
+ case 'symbol':
+ case 'undefined':
+ case 'boolean':
+ return true
+ default:
+ return false
+ }
+}
+
+/**
+ * Returns true if the input is a Promise.
+ * @param {*} - the input to test
+ * @returns {boolean}
+ * @static
+ */
+export function isPromise (input) {
+ if (input) {
+ const isPromise = isDefined(Promise) && input instanceof Promise
+ const isThenable = input.then && typeof input.then === 'function'
+ return !!(isPromise || isThenable)
+ } else {
+ return false
+ }
+}
+
+/**
+ * Returns true if the input is an iterable (`Map`, `Set`, `Array`, Generator etc.).
+ * @param {*} - the input to test
+ * @returns {boolean}
+ * @static
+ * @example
+ * > t.isIterable('string')
+ * true
+ * > t.isIterable(new Map())
+ * true
+ * > t.isIterable([])
+ * true
+ * > t.isIterable((function * () {})())
+ * true
+ * > t.isIterable(Promise.resolve())
+ * false
+ * > t.isIterable(Promise)
+ * false
+ * > t.isIterable(true)
+ * false
+ * > t.isIterable({})
+ * false
+ * > t.isIterable(0)
+ * false
+ * > t.isIterable(1.1)
+ * false
+ * > t.isIterable(NaN)
+ * false
+ * > t.isIterable(Infinity)
+ * false
+ * > t.isIterable(function () {})
+ * false
+ * > t.isIterable(Date)
+ * false
+ * > t.isIterable()
+ * false
+ * > t.isIterable({ then: function () {} })
+ * false
+ */
+export function isIterable (input) {
+ if (input === null || !isDefined(input)) {
+ return false
+ } else {
+ return (
+ typeof input[Symbol.iterator] === 'function' ||
+ typeof input[Symbol.asyncIterator] === 'function'
+ )
+ }
+}
+
+/**
+ * Returns true if the input value is a string. The equivalent of `typeof input === 'string'` for use in funcitonal contexts.
+ * @param {*} - the input to test
+ * @returns {boolean}
+ * @static
+ */
+export function isString (input) {
+ return typeof input === 'string'
+}
+
+/**
+ * Returns true if the input value is a function. The equivalent of `typeof input === 'function'` for use in funcitonal contexts.
+ * @param {*} - the input to test
+ * @returns {boolean}
+ * @static
+ */
+export function isFunction (input) {
+ return typeof input === 'function'
+}
+
+export default {
+ isNumber,
+ isPlainObject,
+ isArrayLike,
+ isObject,
+ isDefined,
+ isUndefined,
+ isNull,
+ isDefinedValue,
+ isClass,
+ isPrimitive,
+ isPromise,
+ isIterable,
+ isString,
+ isFunction
+}
diff --git a/node_modules/table-layout/node_modules/typical/package.json b/node_modules/table-layout/node_modules/typical/package.json
new file mode 100644
index 0000000..d664f1b
--- /dev/null
+++ b/node_modules/table-layout/node_modules/typical/package.json
@@ -0,0 +1,63 @@
+{
+ "name": "typical",
+ "author": "Lloyd Brookes <75pound@gmail.com>",
+ "version": "5.2.0",
+ "description": "Isomorphic, functional type-checking for Javascript",
+ "repository": "https://github.com/75lb/typical",
+ "license": "MIT",
+ "main": "dist/index.js",
+ "keywords": [
+ "type",
+ "checking",
+ "check",
+ "value",
+ "valid",
+ "is",
+ "number",
+ "object",
+ "plainobject",
+ "array",
+ "like",
+ "defined",
+ "string",
+ "boolean",
+ "function",
+ "promise",
+ "iterable",
+ "class",
+ "primitive",
+ "isstring",
+ "isclass",
+ "isiterable",
+ "isdefined",
+ "isobject",
+ "isomorphic"
+ ],
+ "engines": {
+ "node": ">=8"
+ },
+ "scripts": {
+ "test": "npm run dist && npm run test:js && npm run test:esm",
+ "test:all": "npm run test:js && npm run test:esm && npm run test:web",
+ "test:js": "rollup test/*.mjs -f cjs -d tmp/test -e assert && test-runner tmp/test/test*.js",
+ "test:esm": "esm-runner test/*.mjs",
+ "test:web": "web-runner test/test.mjs",
+ "test:v8": "rollup test/test.mjs test/test-default.mjs -f cjs -d tmp/testv8 && test-runner tmp/testv8/test*.js",
+ "dist": "rollup index.mjs -f umd -n typical -o dist/index.js --exports named",
+ "docs": "jsdoc2md -c jsdoc.conf -t README.hbs index.mjs > README.md; echo",
+ "cover": "nyc npm test && nyc report --reporter=text-lcov | coveralls"
+ },
+ "devDependencies": {
+ "coveralls": "^3.0.7",
+ "esm-runner": "^0.1.5",
+ "jsdoc-to-markdown": "^5.0.2",
+ "nyc": "^14.1.1",
+ "rollup": "^1.25.1",
+ "test-object-model": "^0.4.4",
+ "test-runner": "^0.6.0"
+ },
+ "files": [
+ "index.mjs",
+ "dist/index.js"
+ ]
+}
diff --git a/node_modules/table-layout/package.json b/node_modules/table-layout/package.json
new file mode 100644
index 0000000..efd03e1
--- /dev/null
+++ b/node_modules/table-layout/package.json
@@ -0,0 +1,41 @@
+{
+ "name": "table-layout",
+ "author": "Lloyd Brookes <75pound@gmail.com>",
+ "version": "1.0.2",
+ "description": "Stylable text tables, handling ansi colour. Useful for console output.",
+ "repository": "https://github.com/75lb/table-layout.git",
+ "license": "MIT",
+ "keywords": [
+ "wrap",
+ "terminal",
+ "data",
+ "columns",
+ "format",
+ "json",
+ "command line"
+ ],
+ "engines": {
+ "node": ">=8.0.0"
+ },
+ "scripts": {
+ "test": "test-runner test/*.js",
+ "docs": "jsdoc2md -t README.hbs index.js -p list --member-index-format list > README.md; echo",
+ "cover": "nyc npm test && nyc report --reporter=text-lcov | coveralls"
+ },
+ "dependencies": {
+ "array-back": "^4.0.1",
+ "deep-extend": "~0.6.0",
+ "typical": "^5.2.0",
+ "wordwrapjs": "^4.0.0"
+ },
+ "devDependencies": {
+ "coveralls": "^3.1.0",
+ "jsdoc-to-markdown": "^7.0.0",
+ "nyc": "^15.1.0",
+ "test-runner": "^0.6.3"
+ },
+ "files": [
+ "index.js",
+ "lib/*.js"
+ ]
+}
diff --git a/node_modules/typical/LICENSE b/node_modules/typical/LICENSE
new file mode 100644
index 0000000..700561a
--- /dev/null
+++ b/node_modules/typical/LICENSE
@@ -0,0 +1,22 @@
+The MIT License (MIT)
+
+Copyright (c) 2014-19 Lloyd Brookes <75pound@gmail.com>
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
diff --git a/node_modules/typical/README.hbs b/node_modules/typical/README.hbs
new file mode 100644
index 0000000..bb092a1
--- /dev/null
+++ b/node_modules/typical/README.hbs
@@ -0,0 +1,40 @@
+[![view on npm](http://img.shields.io/npm/v/typical.svg)](https://www.npmjs.org/package/typical)
+[![npm module downloads](http://img.shields.io/npm/dt/typical.svg)](https://www.npmjs.org/package/typical)
+[![Build Status](https://travis-ci.org/75lb/typical.svg?branch=master)](https://travis-ci.org/75lb/typical)
+[![Coverage Status](https://coveralls.io/repos/github/75lb/typical/badge.svg?branch=master)](https://coveralls.io/github/75lb/typical?branch=master)
+[![Dependency Status](https://badgen.net/david/dep/75lb/typical)](https://david-dm.org/75lb/typical)
+[![js-standard-style](https://img.shields.io/badge/code%20style-standard-brightgreen.svg)](https://github.com/feross/standard)
+
+{{>main}}
+
+## Load anywhere
+
+This library is compatible with Node.js, the Web and any style of module loader. It can be loaded anywhere, natively without transpilation.
+
+Node.js:
+
+```js
+const typical = require('typical')
+```
+
+Within Node.js with ECMAScript Module support enabled:
+
+```js
+import typical from 'typical'
+```
+
+Within a modern browser ECMAScript Module:
+
+```js
+import typical from './node_modules/typical/index.mjs'
+```
+
+Old browser (adds `window.typical`):
+
+```html
+<script nomodule src="./node_modules/typical/dist/index.js"></script>
+```
+
+* * *
+
+&copy; 2014-19 Lloyd Brookes \<75pound@gmail.com\>. Documented by [jsdoc-to-markdown](https://github.com/jsdoc2md/jsdoc-to-markdown).
diff --git a/node_modules/typical/README.md b/node_modules/typical/README.md
new file mode 100644
index 0000000..cc64654
--- /dev/null
+++ b/node_modules/typical/README.md
@@ -0,0 +1,277 @@
+[![view on npm](http://img.shields.io/npm/v/typical.svg)](https://www.npmjs.org/package/typical)
+[![npm module downloads](http://img.shields.io/npm/dt/typical.svg)](https://www.npmjs.org/package/typical)
+[![Build Status](https://travis-ci.org/75lb/typical.svg?branch=master)](https://travis-ci.org/75lb/typical)
+[![Coverage Status](https://coveralls.io/repos/github/75lb/typical/badge.svg?branch=master)](https://coveralls.io/github/75lb/typical?branch=master)
+[![Dependency Status](https://badgen.net/david/dep/75lb/typical)](https://david-dm.org/75lb/typical)
+[![js-standard-style](https://img.shields.io/badge/code%20style-standard-brightgreen.svg)](https://github.com/feross/standard)
+
+<a name="module_typical"></a>
+
+## typical
+For type-checking Javascript values.
+
+**Example**
+```js
+const t = require('typical')
+```
+
+* [typical](#module_typical)
+ * [.isNumber(n)](#module_typical.isNumber) ⇒ <code>boolean</code>
+ * [.isPlainObject(input)](#module_typical.isPlainObject) ⇒ <code>boolean</code>
+ * [.isArrayLike(input)](#module_typical.isArrayLike) ⇒ <code>boolean</code>
+ * [.isObject(input)](#module_typical.isObject) ⇒ <code>boolean</code>
+ * [.isDefined(input)](#module_typical.isDefined) ⇒ <code>boolean</code>
+ * [.isString(input)](#module_typical.isString) ⇒ <code>boolean</code>
+ * [.isBoolean(input)](#module_typical.isBoolean) ⇒ <code>boolean</code>
+ * [.isFunction(input)](#module_typical.isFunction) ⇒ <code>boolean</code>
+ * [.isClass(input)](#module_typical.isClass) ⇒ <code>boolean</code>
+ * [.isPrimitive(input)](#module_typical.isPrimitive) ⇒ <code>boolean</code>
+ * [.isPromise(input)](#module_typical.isPromise) ⇒ <code>boolean</code>
+ * [.isIterable(input)](#module_typical.isIterable) ⇒ <code>boolean</code>
+
+<a name="module_typical.isNumber"></a>
+
+### t.isNumber(n) ⇒ <code>boolean</code>
+Returns true if input is a number
+
+**Kind**: static method of [<code>typical</code>](#module_typical)
+
+| Param | Type | Description |
+| --- | --- | --- |
+| n | <code>\*</code> | the input to test |
+
+**Example**
+```js
+> t.isNumber(0)
+true
+> t.isNumber(1)
+true
+> t.isNumber(1.1)
+true
+> t.isNumber(0xff)
+true
+> t.isNumber(0644)
+true
+> t.isNumber(6.2e5)
+true
+> t.isNumber(NaN)
+false
+> t.isNumber(Infinity)
+false
+```
+<a name="module_typical.isPlainObject"></a>
+
+### t.isPlainObject(input) ⇒ <code>boolean</code>
+A plain object is a simple object literal, it is not an instance of a class. Returns true if the input `typeof` is `object` and directly decends from `Object`.
+
+**Kind**: static method of [<code>typical</code>](#module_typical)
+
+| Param | Type | Description |
+| --- | --- | --- |
+| input | <code>\*</code> | the input to test |
+
+**Example**
+```js
+> t.isPlainObject({ something: 'one' })
+true
+> t.isPlainObject(new Date())
+false
+> t.isPlainObject([ 0, 1 ])
+false
+> t.isPlainObject(/test/)
+false
+> t.isPlainObject(1)
+false
+> t.isPlainObject('one')
+false
+> t.isPlainObject(null)
+false
+> t.isPlainObject((function * () {})())
+false
+> t.isPlainObject(function * () {})
+false
+```
+<a name="module_typical.isArrayLike"></a>
+
+### t.isArrayLike(input) ⇒ <code>boolean</code>
+An array-like value has all the properties of an array, but is not an array instance. Examples in the `arguments` object. Returns true if the input value is an object, not null and has a `length` property with a numeric value.
+
+**Kind**: static method of [<code>typical</code>](#module_typical)
+
+| Param | Type | Description |
+| --- | --- | --- |
+| input | <code>\*</code> | the input to test |
+
+**Example**
+```js
+function sum(x, y){
+ console.log(t.isArrayLike(arguments))
+ // prints `true`
+}
+```
+<a name="module_typical.isObject"></a>
+
+### t.isObject(input) ⇒ <code>boolean</code>
+returns true if the typeof input is `'object'`, but not null!
+
+**Kind**: static method of [<code>typical</code>](#module_typical)
+
+| Param | Type | Description |
+| --- | --- | --- |
+| input | <code>\*</code> | the input to test |
+
+<a name="module_typical.isDefined"></a>
+
+### t.isDefined(input) ⇒ <code>boolean</code>
+Returns true if the input value is defined
+
+**Kind**: static method of [<code>typical</code>](#module_typical)
+
+| Param | Type | Description |
+| --- | --- | --- |
+| input | <code>\*</code> | the input to test |
+
+<a name="module_typical.isString"></a>
+
+### t.isString(input) ⇒ <code>boolean</code>
+Returns true if the input value is a string
+
+**Kind**: static method of [<code>typical</code>](#module_typical)
+
+| Param | Type | Description |
+| --- | --- | --- |
+| input | <code>\*</code> | the input to test |
+
+<a name="module_typical.isBoolean"></a>
+
+### t.isBoolean(input) ⇒ <code>boolean</code>
+Returns true if the input value is a boolean
+
+**Kind**: static method of [<code>typical</code>](#module_typical)
+
+| Param | Type | Description |
+| --- | --- | --- |
+| input | <code>\*</code> | the input to test |
+
+<a name="module_typical.isFunction"></a>
+
+### t.isFunction(input) ⇒ <code>boolean</code>
+Returns true if the input value is a function
+
+**Kind**: static method of [<code>typical</code>](#module_typical)
+
+| Param | Type | Description |
+| --- | --- | --- |
+| input | <code>\*</code> | the input to test |
+
+<a name="module_typical.isClass"></a>
+
+### t.isClass(input) ⇒ <code>boolean</code>
+Returns true if the input value is an es2015 `class`.
+
+**Kind**: static method of [<code>typical</code>](#module_typical)
+
+| Param | Type | Description |
+| --- | --- | --- |
+| input | <code>\*</code> | the input to test |
+
+<a name="module_typical.isPrimitive"></a>
+
+### t.isPrimitive(input) ⇒ <code>boolean</code>
+Returns true if the input is a string, number, symbol, boolean, null or undefined value.
+
+**Kind**: static method of [<code>typical</code>](#module_typical)
+
+| Param | Type | Description |
+| --- | --- | --- |
+| input | <code>\*</code> | the input to test |
+
+<a name="module_typical.isPromise"></a>
+
+### t.isPromise(input) ⇒ <code>boolean</code>
+Returns true if the input is a Promise.
+
+**Kind**: static method of [<code>typical</code>](#module_typical)
+
+| Param | Type | Description |
+| --- | --- | --- |
+| input | <code>\*</code> | the input to test |
+
+<a name="module_typical.isIterable"></a>
+
+### t.isIterable(input) ⇒ <code>boolean</code>
+Returns true if the input is an iterable (`Map`, `Set`, `Array`, Generator etc.).
+
+**Kind**: static method of [<code>typical</code>](#module_typical)
+
+| Param | Type | Description |
+| --- | --- | --- |
+| input | <code>\*</code> | the input to test |
+
+**Example**
+```js
+> t.isIterable('string')
+true
+> t.isIterable(new Map())
+true
+> t.isIterable([])
+true
+> t.isIterable((function * () {})())
+true
+> t.isIterable(Promise.resolve())
+false
+> t.isIterable(Promise)
+false
+> t.isIterable(true)
+false
+> t.isIterable({})
+false
+> t.isIterable(0)
+false
+> t.isIterable(1.1)
+false
+> t.isIterable(NaN)
+false
+> t.isIterable(Infinity)
+false
+> t.isIterable(function () {})
+false
+> t.isIterable(Date)
+false
+> t.isIterable()
+false
+> t.isIterable({ then: function () {} })
+false
+```
+
+## Load anywhere
+
+This library is compatible with Node.js, the Web and any style of module loader. It can be loaded anywhere, natively without transpilation.
+
+Node.js:
+
+```js
+const typical = require('typical')
+```
+
+Within Node.js with ECMAScript Module support enabled:
+
+```js
+import typical from 'typical'
+```
+
+Within a modern browser ECMAScript Module:
+
+```js
+import typical from './node_modules/typical/index.mjs'
+```
+
+Old browser (adds `window.typical`):
+
+```html
+<script nomodule src="./node_modules/typical/dist/index.js"></script>
+```
+
+* * *
+
+&copy; 2014-19 Lloyd Brookes \<75pound@gmail.com\>. Documented by [jsdoc-to-markdown](https://github.com/jsdoc2md/jsdoc-to-markdown).
diff --git a/node_modules/typical/dist/index.js b/node_modules/typical/dist/index.js
new file mode 100644
index 0000000..8168931
--- /dev/null
+++ b/node_modules/typical/dist/index.js
@@ -0,0 +1,255 @@
+(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
+ typeof define === 'function' && define.amd ? define(factory) :
+ (global = global || self, global.typical = factory());
+}(this, function () { 'use strict';
+
+ /**
+ * For type-checking Javascript values.
+ * @module typical
+ * @typicalname t
+ * @example
+ * const t = require('typical')
+ */
+
+ /**
+ * Returns true if input is a number
+ * @param {*} - the input to test
+ * @returns {boolean}
+ * @static
+ * @example
+ * > t.isNumber(0)
+ * true
+ * > t.isNumber(1)
+ * true
+ * > t.isNumber(1.1)
+ * true
+ * > t.isNumber(0xff)
+ * true
+ * > t.isNumber(0644)
+ * true
+ * > t.isNumber(6.2e5)
+ * true
+ * > t.isNumber(NaN)
+ * false
+ * > t.isNumber(Infinity)
+ * false
+ */
+ function isNumber (n) {
+ return !isNaN(parseFloat(n)) && isFinite(n)
+ }
+
+ /**
+ * A plain object is a simple object literal, it is not an instance of a class. Returns true if the input `typeof` is `object` and directly decends from `Object`.
+ *
+ * @param {*} - the input to test
+ * @returns {boolean}
+ * @static
+ * @example
+ * > t.isPlainObject({ something: 'one' })
+ * true
+ * > t.isPlainObject(new Date())
+ * false
+ * > t.isPlainObject([ 0, 1 ])
+ * false
+ * > t.isPlainObject(/test/)
+ * false
+ * > t.isPlainObject(1)
+ * false
+ * > t.isPlainObject('one')
+ * false
+ * > t.isPlainObject(null)
+ * false
+ * > t.isPlainObject((function * () {})())
+ * false
+ * > t.isPlainObject(function * () {})
+ * false
+ */
+ function isPlainObject (input) {
+ return input !== null && typeof input === 'object' && input.constructor === Object
+ }
+
+ /**
+ * An array-like value has all the properties of an array, but is not an array instance. Examples in the `arguments` object. Returns true if the input value is an object, not null and has a `length` property with a numeric value.
+ *
+ * @param {*} - the input to test
+ * @returns {boolean}
+ * @static
+ * @example
+ * function sum(x, y){
+ * console.log(t.isArrayLike(arguments))
+ * // prints `true`
+ * }
+ */
+ function isArrayLike (input) {
+ return isObject(input) && typeof input.length === 'number'
+ }
+
+ /**
+ * returns true if the typeof input is `'object'`, but not null!
+ * @param {*} - the input to test
+ * @returns {boolean}
+ * @static
+ */
+ function isObject (input) {
+ return typeof input === 'object' && input !== null
+ }
+
+ /**
+ * Returns true if the input value is defined
+ * @param {*} - the input to test
+ * @returns {boolean}
+ * @static
+ */
+ function isDefined (input) {
+ return typeof input !== 'undefined'
+ }
+
+ /**
+ * Returns true if the input value is a string
+ * @param {*} - the input to test
+ * @returns {boolean}
+ * @static
+ */
+ function isString (input) {
+ return typeof input === 'string'
+ }
+
+ /**
+ * Returns true if the input value is a boolean
+ * @param {*} - the input to test
+ * @returns {boolean}
+ * @static
+ */
+ function isBoolean (input) {
+ return typeof input === 'boolean'
+ }
+
+ /**
+ * Returns true if the input value is a function
+ * @param {*} - the input to test
+ * @returns {boolean}
+ * @static
+ */
+ function isFunction (input) {
+ return typeof input === 'function'
+ }
+
+ /**
+ * Returns true if the input value is an es2015 `class`.
+ * @param {*} - the input to test
+ * @returns {boolean}
+ * @static
+ */
+ function isClass (input) {
+ if (isFunction(input)) {
+ return /^class /.test(Function.prototype.toString.call(input))
+ } else {
+ return false
+ }
+ }
+
+ /**
+ * Returns true if the input is a string, number, symbol, boolean, null or undefined value.
+ * @param {*} - the input to test
+ * @returns {boolean}
+ * @static
+ */
+ function isPrimitive (input) {
+ if (input === null) return true
+ switch (typeof input) {
+ case 'string':
+ case 'number':
+ case 'symbol':
+ case 'undefined':
+ case 'boolean':
+ return true
+ default:
+ return false
+ }
+ }
+
+ /**
+ * Returns true if the input is a Promise.
+ * @param {*} - the input to test
+ * @returns {boolean}
+ * @static
+ */
+ function isPromise (input) {
+ if (input) {
+ const isPromise = isDefined(Promise) && input instanceof Promise;
+ const isThenable = input.then && typeof input.then === 'function';
+ return !!(isPromise || isThenable)
+ } else {
+ return false
+ }
+ }
+
+ /**
+ * Returns true if the input is an iterable (`Map`, `Set`, `Array`, Generator etc.).
+ * @param {*} - the input to test
+ * @returns {boolean}
+ * @static
+ * @example
+ * > t.isIterable('string')
+ * true
+ * > t.isIterable(new Map())
+ * true
+ * > t.isIterable([])
+ * true
+ * > t.isIterable((function * () {})())
+ * true
+ * > t.isIterable(Promise.resolve())
+ * false
+ * > t.isIterable(Promise)
+ * false
+ * > t.isIterable(true)
+ * false
+ * > t.isIterable({})
+ * false
+ * > t.isIterable(0)
+ * false
+ * > t.isIterable(1.1)
+ * false
+ * > t.isIterable(NaN)
+ * false
+ * > t.isIterable(Infinity)
+ * false
+ * > t.isIterable(function () {})
+ * false
+ * > t.isIterable(Date)
+ * false
+ * > t.isIterable()
+ * false
+ * > t.isIterable({ then: function () {} })
+ * false
+ */
+ function isIterable (input) {
+ if (input === null || !isDefined(input)) {
+ return false
+ } else {
+ return (
+ typeof input[Symbol.iterator] === 'function' ||
+ typeof input[Symbol.asyncIterator] === 'function'
+ )
+ }
+ }
+
+ var index = {
+ isNumber,
+ isString,
+ isBoolean,
+ isPlainObject,
+ isArrayLike,
+ isObject,
+ isDefined,
+ isFunction,
+ isClass,
+ isPrimitive,
+ isPromise,
+ isIterable
+ };
+
+ return index;
+
+}));
diff --git a/node_modules/typical/index.mjs b/node_modules/typical/index.mjs
new file mode 100644
index 0000000..e3ef5bb
--- /dev/null
+++ b/node_modules/typical/index.mjs
@@ -0,0 +1,245 @@
+/**
+ * For type-checking Javascript values.
+ * @module typical
+ * @typicalname t
+ * @example
+ * const t = require('typical')
+ */
+
+/**
+ * Returns true if input is a number
+ * @param {*} - the input to test
+ * @returns {boolean}
+ * @static
+ * @example
+ * > t.isNumber(0)
+ * true
+ * > t.isNumber(1)
+ * true
+ * > t.isNumber(1.1)
+ * true
+ * > t.isNumber(0xff)
+ * true
+ * > t.isNumber(0644)
+ * true
+ * > t.isNumber(6.2e5)
+ * true
+ * > t.isNumber(NaN)
+ * false
+ * > t.isNumber(Infinity)
+ * false
+ */
+function isNumber (n) {
+ return !isNaN(parseFloat(n)) && isFinite(n)
+}
+
+/**
+ * A plain object is a simple object literal, it is not an instance of a class. Returns true if the input `typeof` is `object` and directly decends from `Object`.
+ *
+ * @param {*} - the input to test
+ * @returns {boolean}
+ * @static
+ * @example
+ * > t.isPlainObject({ something: 'one' })
+ * true
+ * > t.isPlainObject(new Date())
+ * false
+ * > t.isPlainObject([ 0, 1 ])
+ * false
+ * > t.isPlainObject(/test/)
+ * false
+ * > t.isPlainObject(1)
+ * false
+ * > t.isPlainObject('one')
+ * false
+ * > t.isPlainObject(null)
+ * false
+ * > t.isPlainObject((function * () {})())
+ * false
+ * > t.isPlainObject(function * () {})
+ * false
+ */
+function isPlainObject (input) {
+ return input !== null && typeof input === 'object' && input.constructor === Object
+}
+
+/**
+ * An array-like value has all the properties of an array, but is not an array instance. Examples in the `arguments` object. Returns true if the input value is an object, not null and has a `length` property with a numeric value.
+ *
+ * @param {*} - the input to test
+ * @returns {boolean}
+ * @static
+ * @example
+ * function sum(x, y){
+ * console.log(t.isArrayLike(arguments))
+ * // prints `true`
+ * }
+ */
+function isArrayLike (input) {
+ return isObject(input) && typeof input.length === 'number'
+}
+
+/**
+ * returns true if the typeof input is `'object'`, but not null!
+ * @param {*} - the input to test
+ * @returns {boolean}
+ * @static
+ */
+function isObject (input) {
+ return typeof input === 'object' && input !== null
+}
+
+/**
+ * Returns true if the input value is defined
+ * @param {*} - the input to test
+ * @returns {boolean}
+ * @static
+ */
+function isDefined (input) {
+ return typeof input !== 'undefined'
+}
+
+/**
+ * Returns true if the input value is a string
+ * @param {*} - the input to test
+ * @returns {boolean}
+ * @static
+ */
+function isString (input) {
+ return typeof input === 'string'
+}
+
+/**
+ * Returns true if the input value is a boolean
+ * @param {*} - the input to test
+ * @returns {boolean}
+ * @static
+ */
+function isBoolean (input) {
+ return typeof input === 'boolean'
+}
+
+/**
+ * Returns true if the input value is a function
+ * @param {*} - the input to test
+ * @returns {boolean}
+ * @static
+ */
+function isFunction (input) {
+ return typeof input === 'function'
+}
+
+/**
+ * Returns true if the input value is an es2015 `class`.
+ * @param {*} - the input to test
+ * @returns {boolean}
+ * @static
+ */
+function isClass (input) {
+ if (isFunction(input)) {
+ return /^class /.test(Function.prototype.toString.call(input))
+ } else {
+ return false
+ }
+}
+
+/**
+ * Returns true if the input is a string, number, symbol, boolean, null or undefined value.
+ * @param {*} - the input to test
+ * @returns {boolean}
+ * @static
+ */
+function isPrimitive (input) {
+ if (input === null) return true
+ switch (typeof input) {
+ case 'string':
+ case 'number':
+ case 'symbol':
+ case 'undefined':
+ case 'boolean':
+ return true
+ default:
+ return false
+ }
+}
+
+/**
+ * Returns true if the input is a Promise.
+ * @param {*} - the input to test
+ * @returns {boolean}
+ * @static
+ */
+function isPromise (input) {
+ if (input) {
+ const isPromise = isDefined(Promise) && input instanceof Promise
+ const isThenable = input.then && typeof input.then === 'function'
+ return !!(isPromise || isThenable)
+ } else {
+ return false
+ }
+}
+
+/**
+ * Returns true if the input is an iterable (`Map`, `Set`, `Array`, Generator etc.).
+ * @param {*} - the input to test
+ * @returns {boolean}
+ * @static
+ * @example
+ * > t.isIterable('string')
+ * true
+ * > t.isIterable(new Map())
+ * true
+ * > t.isIterable([])
+ * true
+ * > t.isIterable((function * () {})())
+ * true
+ * > t.isIterable(Promise.resolve())
+ * false
+ * > t.isIterable(Promise)
+ * false
+ * > t.isIterable(true)
+ * false
+ * > t.isIterable({})
+ * false
+ * > t.isIterable(0)
+ * false
+ * > t.isIterable(1.1)
+ * false
+ * > t.isIterable(NaN)
+ * false
+ * > t.isIterable(Infinity)
+ * false
+ * > t.isIterable(function () {})
+ * false
+ * > t.isIterable(Date)
+ * false
+ * > t.isIterable()
+ * false
+ * > t.isIterable({ then: function () {} })
+ * false
+ */
+function isIterable (input) {
+ if (input === null || !isDefined(input)) {
+ return false
+ } else {
+ return (
+ typeof input[Symbol.iterator] === 'function' ||
+ typeof input[Symbol.asyncIterator] === 'function'
+ )
+ }
+}
+
+export default {
+ isNumber,
+ isString,
+ isBoolean,
+ isPlainObject,
+ isArrayLike,
+ isObject,
+ isDefined,
+ isFunction,
+ isClass,
+ isPrimitive,
+ isPromise,
+ isIterable
+}
diff --git a/node_modules/typical/package.json b/node_modules/typical/package.json
new file mode 100644
index 0000000..9642da0
--- /dev/null
+++ b/node_modules/typical/package.json
@@ -0,0 +1,55 @@
+{
+ "name": "typical",
+ "author": "Lloyd Brookes <75pound@gmail.com>",
+ "version": "4.0.0",
+ "description": "Robust Javascript type-checking",
+ "repository": "https://github.com/75lb/typical",
+ "license": "MIT",
+ "main": "dist/index.js",
+ "keywords": [
+ "type",
+ "checking",
+ "check",
+ "value",
+ "valid",
+ "is",
+ "number",
+ "object",
+ "plainobject",
+ "array",
+ "like",
+ "defined",
+ "string",
+ "boolean",
+ "function",
+ "promise",
+ "iterable",
+ "class",
+ "primitive"
+ ],
+ "engines": {
+ "node": ">=8"
+ },
+ "scripts": {
+ "test": "npm run test:js && npm run test:esm && npm run test:web",
+ "test:js": "rollup test.mjs -f cjs -o dist/test.js && rollup test-v10.mjs -f cjs -o dist/test-v10.js && test-runner dist/test*.js",
+ "test:esm": "esm-runner test*.mjs",
+ "test:web": "web-runner test.mjs",
+ "dist": "rollup index.mjs -f umd -n typical -o dist/index.js",
+ "docs": "jsdoc2md -c jsdoc.conf -t README.hbs index.mjs > README.md; echo",
+ "cover": "nyc --reporter=text-lcov test-runner test.js | coveralls"
+ },
+ "devDependencies": {
+ "@test-runner/web": "^0.1.4",
+ "coveralls": "^3.0.3",
+ "esm-runner": "^0.1.2",
+ "jsdoc-to-markdown": "^4.0.1",
+ "rollup": "^1.7.0",
+ "test-object-model": "^0.3.8",
+ "test-runner": "^0.6.0-14"
+ },
+ "files": [
+ "index.mjs",
+ "dist/index.js"
+ ]
+}
diff --git a/node_modules/wordwrapjs/LICENSE b/node_modules/wordwrapjs/LICENSE
new file mode 100644
index 0000000..9d2d6db
--- /dev/null
+++ b/node_modules/wordwrapjs/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2015-21 Lloyd Brookes <75pound@gmail.com>
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/node_modules/wordwrapjs/README.hbs b/node_modules/wordwrapjs/README.hbs
new file mode 100644
index 0000000..29da627
--- /dev/null
+++ b/node_modules/wordwrapjs/README.hbs
@@ -0,0 +1,61 @@
+[![view on npm](https://badgen.net/npm/v/wordwrapjs)](https://www.npmjs.org/package/wordwrapjs)
+[![npm module downloads](https://badgen.net/npm/dt/wordwrapjs)](https://www.npmjs.org/package/wordwrapjs)
+[![Gihub repo dependents](https://badgen.net/github/dependents-repo/75lb/wordwrapjs)](https://github.com/75lb/wordwrapjs/network/dependents?dependent_type=REPOSITORY)
+[![Gihub package dependents](https://badgen.net/github/dependents-pkg/75lb/wordwrapjs)](https://github.com/75lb/wordwrapjs/network/dependents?dependent_type=PACKAGE)
+[![Build Status](https://travis-ci.org/75lb/wordwrapjs.svg?branch=master)](https://travis-ci.org/75lb/wordwrapjs)
+[![js-standard-style](https://img.shields.io/badge/code%20style-standard-brightgreen.svg)](https://github.com/feross/standard)
+
+# wordwrapjs
+
+Word wrapping, with a few features.
+
+- force-break option
+- wraps hypenated words
+- multilingual - wraps any language that uses whitespace for word separation.
+
+## Synopsis
+
+Wrap some text in a 20 character column.
+
+```js
+> wordwrap = require('wordwrapjs')
+
+> text = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.'
+
+> result = wordwrap.wrap(text, { width: 20 })
+```
+
+`result` now looks like this:
+```
+Lorem ipsum dolor
+sit amet,
+consectetur
+adipiscing elit, sed
+do eiusmod tempor
+incididunt ut labore
+et dolore magna
+aliqua.
+```
+
+By default, long words will not break. Unless you set the `break` option.
+```js
+> url = 'https://github.com/75lb/wordwrapjs'
+
+> wrap.lines(url, { width: 18 })
+[ 'https://github.com/75lb/wordwrapjs' ]
+
+> wrap.lines(url, { width: 18, break: true })
+[ 'https://github.com', '/75lb/wordwrapjs' ]
+```
+
+## API Reference
+
+{{#module name="wordwrapjs"}}
+{{>body~}}
+{{>member-index~}}
+{{>members~}}
+{{/module}}
+
+* * *
+
+&copy; 2015-21 Lloyd Brookes \<75pound@gmail.com\>. Documented by [jsdoc-to-markdown](https://github.com/jsdoc2md/jsdoc-to-markdown).
diff --git a/node_modules/wordwrapjs/README.md b/node_modules/wordwrapjs/README.md
new file mode 100644
index 0000000..d04692a
--- /dev/null
+++ b/node_modules/wordwrapjs/README.md
@@ -0,0 +1,115 @@
+[![view on npm](https://badgen.net/npm/v/wordwrapjs)](https://www.npmjs.org/package/wordwrapjs)
+[![npm module downloads](https://badgen.net/npm/dt/wordwrapjs)](https://www.npmjs.org/package/wordwrapjs)
+[![Gihub repo dependents](https://badgen.net/github/dependents-repo/75lb/wordwrapjs)](https://github.com/75lb/wordwrapjs/network/dependents?dependent_type=REPOSITORY)
+[![Gihub package dependents](https://badgen.net/github/dependents-pkg/75lb/wordwrapjs)](https://github.com/75lb/wordwrapjs/network/dependents?dependent_type=PACKAGE)
+[![Build Status](https://travis-ci.org/75lb/wordwrapjs.svg?branch=master)](https://travis-ci.org/75lb/wordwrapjs)
+[![js-standard-style](https://img.shields.io/badge/code%20style-standard-brightgreen.svg)](https://github.com/feross/standard)
+
+# wordwrapjs
+
+Word wrapping, with a few features.
+
+- force-break option
+- wraps hypenated words
+- multilingual - wraps any language that uses whitespace for word separation.
+
+## Synopsis
+
+Wrap some text in a 20 character column.
+
+```js
+> wordwrap = require('wordwrapjs')
+
+> text = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.'
+
+> result = wordwrap.wrap(text, { width: 20 })
+```
+
+`result` now looks like this:
+```
+Lorem ipsum dolor
+sit amet,
+consectetur
+adipiscing elit, sed
+do eiusmod tempor
+incididunt ut labore
+et dolore magna
+aliqua.
+```
+
+By default, long words will not break. Unless you set the `break` option.
+```js
+> url = 'https://github.com/75lb/wordwrapjs'
+
+> wrap.lines(url, { width: 18 })
+[ 'https://github.com/75lb/wordwrapjs' ]
+
+> wrap.lines(url, { width: 18, break: true })
+[ 'https://github.com', '/75lb/wordwrapjs' ]
+```
+
+## API Reference
+
+
+* [wordwrapjs](#module_wordwrapjs)
+ * [WordWrap](#exp_module_wordwrapjs--WordWrap) ⏏
+ * [.wrap(text, [options])](#module_wordwrapjs--WordWrap.wrap) ⇒ <code>string</code>
+ * [.lines(text, options)](#module_wordwrapjs--WordWrap.lines)
+ * [.isWrappable(text)](#module_wordwrapjs--WordWrap.isWrappable) ⇒ <code>boolean</code>
+ * [.getChunks(text)](#module_wordwrapjs--WordWrap.getChunks) ⇒ <code>Array.&lt;string&gt;</code>
+
+<a name="exp_module_wordwrapjs--WordWrap"></a>
+
+### WordWrap ⏏
+**Kind**: Exported class
+<a name="module_wordwrapjs--WordWrap.wrap"></a>
+
+#### WordWrap.wrap(text, [options]) ⇒ <code>string</code>
+**Kind**: static method of [<code>WordWrap</code>](#exp_module_wordwrapjs--WordWrap)
+
+| Param | Type | Description |
+| --- | --- | --- |
+| text | <code>string</code> | the input text to wrap |
+| [options] | <code>object</code> | optional configuration |
+| [options.width] | <code>number</code> | the max column width in characters (defaults to 30). |
+| [options.break] | <code>boolean</code> | if true, words exceeding the specified `width` will be forcefully broken |
+| [options.noTrim] | <code>boolean</code> | By default, each line output is trimmed. If `noTrim` is set, no line-trimming occurs - all whitespace from the input text is left in. |
+
+<a name="module_wordwrapjs--WordWrap.lines"></a>
+
+#### WordWrap.lines(text, options)
+Wraps the input text, returning an array of strings (lines).
+
+**Kind**: static method of [<code>WordWrap</code>](#exp_module_wordwrapjs--WordWrap)
+
+| Param | Type | Description |
+| --- | --- | --- |
+| text | <code>string</code> | input text |
+| options | <code>object</code> | Accepts same options as constructor. |
+
+<a name="module_wordwrapjs--WordWrap.isWrappable"></a>
+
+#### WordWrap.isWrappable(text) ⇒ <code>boolean</code>
+Returns true if the input text would be wrapped if passed into `.wrap()`.
+
+**Kind**: static method of [<code>WordWrap</code>](#exp_module_wordwrapjs--WordWrap)
+
+| Param | Type | Description |
+| --- | --- | --- |
+| text | <code>string</code> | input text |
+
+<a name="module_wordwrapjs--WordWrap.getChunks"></a>
+
+#### WordWrap.getChunks(text) ⇒ <code>Array.&lt;string&gt;</code>
+Splits the input text into an array of words and whitespace.
+
+**Kind**: static method of [<code>WordWrap</code>](#exp_module_wordwrapjs--WordWrap)
+
+| Param | Type | Description |
+| --- | --- | --- |
+| text | <code>string</code> | input text |
+
+
+* * *
+
+&copy; 2015-21 Lloyd Brookes \<75pound@gmail.com\>. Documented by [jsdoc-to-markdown](https://github.com/jsdoc2md/jsdoc-to-markdown).
diff --git a/node_modules/wordwrapjs/index.js b/node_modules/wordwrapjs/index.js
new file mode 100644
index 0000000..5ec85db
--- /dev/null
+++ b/node_modules/wordwrapjs/index.js
@@ -0,0 +1,148 @@
+const os = require('os')
+const t = require('typical')
+
+/**
+ * @module wordwrapjs
+ */
+
+const re = {
+ chunk: /[^\s-]+?-\b|\S+|\s+|\r\n?|\n/g,
+ ansiEscapeSequence: /\u001b.*?m/g
+}
+
+/**
+ * @alias module:wordwrapjs
+ * @typicalname wordwrap
+ */
+class WordWrap {
+ constructor (text, options) {
+ options = options || {}
+ if (!t.isDefined(text)) text = ''
+
+ this._lines = String(text).split(/\r\n|\n/g)
+ this.options = options
+ this.options.width = options.width === undefined ? 30 : options.width
+ }
+
+ lines () {
+ const flatten = require('reduce-flatten')
+
+ /* trim each line of the supplied text */
+ return this._lines.map(trimLine.bind(this))
+
+ /* split each line into an array of chunks, else mark it empty */
+ .map(line => line.match(re.chunk) || [ '~~empty~~' ])
+
+ /* optionally, break each word on the line into pieces */
+ .map(lineWords => {
+ if (this.options.break) {
+ return lineWords.map(breakWord.bind(this))
+ } else {
+ return lineWords
+ }
+ })
+ .map(lineWords => lineWords.reduce(flatten, []))
+
+ /* transforming the line of words to one or more new lines wrapped to size */
+ .map(lineWords => {
+ return lineWords
+ .reduce((lines, word) => {
+ let currentLine = lines[lines.length - 1]
+ if (replaceAnsi(word).length + replaceAnsi(currentLine).length > this.options.width) {
+ lines.push(word)
+ } else {
+ lines[lines.length - 1] += word
+ }
+ return lines
+ }, [ '' ])
+ })
+ .reduce(flatten, [])
+
+ /* trim the wrapped lines */
+ .map(trimLine.bind(this))
+
+ /* filter out empty lines */
+ .filter(line => line.trim())
+
+ /* restore the user's original empty lines */
+ .map(line => line.replace('~~empty~~', ''))
+ }
+
+ wrap () {
+ return this.lines().join(os.EOL)
+ }
+
+ toString () {
+ return this.wrap()
+ }
+
+ /**
+ * @param {string} - the input text to wrap
+ * @param [options] {object} - optional configuration
+ * @param [options.width] {number} - the max column width in characters (defaults to 30).
+ * @param [options.break] {boolean} - if true, words exceeding the specified `width` will be forcefully broken
+ * @param [options.noTrim] {boolean} - By default, each line output is trimmed. If `noTrim` is set, no line-trimming occurs - all whitespace from the input text is left in.
+ * @return {string}
+ */
+ static wrap (text, options) {
+ const block = new this(text, options)
+ return block.wrap()
+ }
+
+ /**
+ * Wraps the input text, returning an array of strings (lines).
+ * @param {string} - input text
+ * @param {object} - Accepts same options as constructor.
+ */
+ static lines (text, options) {
+ const block = new this(text, options)
+ return block.lines()
+ }
+
+ /**
+ * Returns true if the input text would be wrapped if passed into `.wrap()`.
+ * @param {string} - input text
+ * @return {boolean}
+ */
+ static isWrappable (text) {
+ if (t.isDefined(text)) {
+ text = String(text)
+ var matches = text.match(re.chunk)
+ return matches ? matches.length > 1 : false
+ }
+ }
+
+ /**
+ * Splits the input text into an array of words and whitespace.
+ * @param {string} - input text
+ * @returns {string[]}
+ */
+ static getChunks (text) {
+ return text.match(re.chunk) || []
+ }
+}
+
+function trimLine (line) {
+ return this.options.noTrim ? line : line.trim()
+}
+
+function replaceAnsi (string) {
+ return string.replace(re.ansiEscapeSequence, '')
+}
+
+/* break a word into several pieces */
+function breakWord (word) {
+ if (replaceAnsi(word).length > this.options.width) {
+ const letters = word.split('')
+ let piece
+ const pieces = []
+ while ((piece = letters.splice(0, this.options.width)).length) {
+ pieces.push(piece.join(''))
+ }
+ return pieces
+ } else {
+ return word
+ }
+}
+
+module.exports = WordWrap
diff --git a/node_modules/wordwrapjs/node_modules/typical/LICENSE b/node_modules/wordwrapjs/node_modules/typical/LICENSE
new file mode 100644
index 0000000..700561a
--- /dev/null
+++ b/node_modules/wordwrapjs/node_modules/typical/LICENSE
@@ -0,0 +1,22 @@
+The MIT License (MIT)
+
+Copyright (c) 2014-19 Lloyd Brookes <75pound@gmail.com>
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
diff --git a/node_modules/wordwrapjs/node_modules/typical/README.hbs b/node_modules/wordwrapjs/node_modules/typical/README.hbs
new file mode 100644
index 0000000..bb092a1
--- /dev/null
+++ b/node_modules/wordwrapjs/node_modules/typical/README.hbs
@@ -0,0 +1,40 @@
+[![view on npm](http://img.shields.io/npm/v/typical.svg)](https://www.npmjs.org/package/typical)
+[![npm module downloads](http://img.shields.io/npm/dt/typical.svg)](https://www.npmjs.org/package/typical)
+[![Build Status](https://travis-ci.org/75lb/typical.svg?branch=master)](https://travis-ci.org/75lb/typical)
+[![Coverage Status](https://coveralls.io/repos/github/75lb/typical/badge.svg?branch=master)](https://coveralls.io/github/75lb/typical?branch=master)
+[![Dependency Status](https://badgen.net/david/dep/75lb/typical)](https://david-dm.org/75lb/typical)
+[![js-standard-style](https://img.shields.io/badge/code%20style-standard-brightgreen.svg)](https://github.com/feross/standard)
+
+{{>main}}
+
+## Load anywhere
+
+This library is compatible with Node.js, the Web and any style of module loader. It can be loaded anywhere, natively without transpilation.
+
+Node.js:
+
+```js
+const typical = require('typical')
+```
+
+Within Node.js with ECMAScript Module support enabled:
+
+```js
+import typical from 'typical'
+```
+
+Within a modern browser ECMAScript Module:
+
+```js
+import typical from './node_modules/typical/index.mjs'
+```
+
+Old browser (adds `window.typical`):
+
+```html
+<script nomodule src="./node_modules/typical/dist/index.js"></script>
+```
+
+* * *
+
+&copy; 2014-19 Lloyd Brookes \<75pound@gmail.com\>. Documented by [jsdoc-to-markdown](https://github.com/jsdoc2md/jsdoc-to-markdown).
diff --git a/node_modules/wordwrapjs/node_modules/typical/README.md b/node_modules/wordwrapjs/node_modules/typical/README.md
new file mode 100644
index 0000000..6e3d513
--- /dev/null
+++ b/node_modules/wordwrapjs/node_modules/typical/README.md
@@ -0,0 +1,302 @@
+[![view on npm](http://img.shields.io/npm/v/typical.svg)](https://www.npmjs.org/package/typical)
+[![npm module downloads](http://img.shields.io/npm/dt/typical.svg)](https://www.npmjs.org/package/typical)
+[![Build Status](https://travis-ci.org/75lb/typical.svg?branch=master)](https://travis-ci.org/75lb/typical)
+[![Coverage Status](https://coveralls.io/repos/github/75lb/typical/badge.svg?branch=master)](https://coveralls.io/github/75lb/typical?branch=master)
+[![Dependency Status](https://badgen.net/david/dep/75lb/typical)](https://david-dm.org/75lb/typical)
+[![js-standard-style](https://img.shields.io/badge/code%20style-standard-brightgreen.svg)](https://github.com/feross/standard)
+
+<a name="module_typical"></a>
+
+## typical
+Isomorphic, functional type-checking for Javascript.
+
+**Example**
+```js
+const t = require('typical')
+const allDefined = array.every(t.isDefined)
+```
+
+* [typical](#module_typical)
+ * [.isNumber(n)](#module_typical.isNumber) ⇒ <code>boolean</code>
+ * [.isPlainObject(input)](#module_typical.isPlainObject) ⇒ <code>boolean</code>
+ * [.isArrayLike(input)](#module_typical.isArrayLike) ⇒ <code>boolean</code>
+ * [.isObject(input)](#module_typical.isObject) ⇒ <code>boolean</code>
+ * [.isDefined(input)](#module_typical.isDefined) ⇒ <code>boolean</code>
+ * [.isUndefined(input)](#module_typical.isUndefined) ⇒ <code>boolean</code>
+ * [.isNull(input)](#module_typical.isNull) ⇒ <code>boolean</code>
+ * [.isDefinedValue(input)](#module_typical.isDefinedValue) ⇒ <code>boolean</code>
+ * [.isClass(input)](#module_typical.isClass) ⇒ <code>boolean</code>
+ * [.isPrimitive(input)](#module_typical.isPrimitive) ⇒ <code>boolean</code>
+ * [.isPromise(input)](#module_typical.isPromise) ⇒ <code>boolean</code>
+ * [.isIterable(input)](#module_typical.isIterable) ⇒ <code>boolean</code>
+ * [.isString(input)](#module_typical.isString) ⇒ <code>boolean</code>
+ * [.isFunction(input)](#module_typical.isFunction) ⇒ <code>boolean</code>
+
+<a name="module_typical.isNumber"></a>
+
+### t.isNumber(n) ⇒ <code>boolean</code>
+Returns true if input is a number. It is a more reasonable alternative to `typeof n` which returns `number` for `NaN` and `Infinity`.
+
+**Kind**: static method of [<code>typical</code>](#module_typical)
+
+| Param | Type | Description |
+| --- | --- | --- |
+| n | <code>\*</code> | the input to test |
+
+**Example**
+```js
+> t.isNumber(0)
+true
+> t.isNumber(1)
+true
+> t.isNumber(1.1)
+true
+> t.isNumber(0xff)
+true
+> t.isNumber(0644)
+true
+> t.isNumber(6.2e5)
+true
+> t.isNumber(NaN)
+false
+> t.isNumber(Infinity)
+false
+```
+<a name="module_typical.isPlainObject"></a>
+
+### t.isPlainObject(input) ⇒ <code>boolean</code>
+A plain object is a simple object literal, it is not an instance of a class. Returns true if the input `typeof` is `object` and directly decends from `Object`.
+
+**Kind**: static method of [<code>typical</code>](#module_typical)
+
+| Param | Type | Description |
+| --- | --- | --- |
+| input | <code>\*</code> | the input to test |
+
+**Example**
+```js
+> t.isPlainObject({ something: 'one' })
+true
+> t.isPlainObject(new Date())
+false
+> t.isPlainObject([ 0, 1 ])
+false
+> t.isPlainObject(/test/)
+false
+> t.isPlainObject(1)
+false
+> t.isPlainObject('one')
+false
+> t.isPlainObject(null)
+false
+> t.isPlainObject((function * () {})())
+false
+> t.isPlainObject(function * () {})
+false
+```
+<a name="module_typical.isArrayLike"></a>
+
+### t.isArrayLike(input) ⇒ <code>boolean</code>
+An array-like value has all the properties of an array yet is not an array instance. An example is the `arguments` object. Returns `true`` if the input value is an object, not `null`` and has a `length` property set with a numeric value.
+
+**Kind**: static method of [<code>typical</code>](#module_typical)
+
+| Param | Type | Description |
+| --- | --- | --- |
+| input | <code>\*</code> | the input to test |
+
+**Example**
+```js
+function sum(x, y){
+ console.log(t.isArrayLike(arguments))
+ // prints `true`
+}
+```
+<a name="module_typical.isObject"></a>
+
+### t.isObject(input) ⇒ <code>boolean</code>
+Returns true if the typeof input is `'object'` but not null.
+
+**Kind**: static method of [<code>typical</code>](#module_typical)
+
+| Param | Type | Description |
+| --- | --- | --- |
+| input | <code>\*</code> | the input to test |
+
+<a name="module_typical.isDefined"></a>
+
+### t.isDefined(input) ⇒ <code>boolean</code>
+Returns true if the input value is defined.
+
+**Kind**: static method of [<code>typical</code>](#module_typical)
+
+| Param | Type | Description |
+| --- | --- | --- |
+| input | <code>\*</code> | the input to test |
+
+<a name="module_typical.isUndefined"></a>
+
+### t.isUndefined(input) ⇒ <code>boolean</code>
+Returns true if the input value is undefined.
+
+**Kind**: static method of [<code>typical</code>](#module_typical)
+
+| Param | Type | Description |
+| --- | --- | --- |
+| input | <code>\*</code> | the input to test |
+
+<a name="module_typical.isNull"></a>
+
+### t.isNull(input) ⇒ <code>boolean</code>
+Returns true if the input value is null.
+
+**Kind**: static method of [<code>typical</code>](#module_typical)
+
+| Param | Type | Description |
+| --- | --- | --- |
+| input | <code>\*</code> | the input to test |
+
+<a name="module_typical.isDefinedValue"></a>
+
+### t.isDefinedValue(input) ⇒ <code>boolean</code>
+Returns true if the input value is not one of `undefined`, `null`, or `NaN`.
+
+**Kind**: static method of [<code>typical</code>](#module_typical)
+
+| Param | Type | Description |
+| --- | --- | --- |
+| input | <code>\*</code> | the input to test |
+
+<a name="module_typical.isClass"></a>
+
+### t.isClass(input) ⇒ <code>boolean</code>
+Returns true if the input value is an ES2015 `class`.
+
+**Kind**: static method of [<code>typical</code>](#module_typical)
+
+| Param | Type | Description |
+| --- | --- | --- |
+| input | <code>\*</code> | the input to test |
+
+<a name="module_typical.isPrimitive"></a>
+
+### t.isPrimitive(input) ⇒ <code>boolean</code>
+Returns true if the input is a string, number, symbol, boolean, null or undefined value.
+
+**Kind**: static method of [<code>typical</code>](#module_typical)
+
+| Param | Type | Description |
+| --- | --- | --- |
+| input | <code>\*</code> | the input to test |
+
+<a name="module_typical.isPromise"></a>
+
+### t.isPromise(input) ⇒ <code>boolean</code>
+Returns true if the input is a Promise.
+
+**Kind**: static method of [<code>typical</code>](#module_typical)
+
+| Param | Type | Description |
+| --- | --- | --- |
+| input | <code>\*</code> | the input to test |
+
+<a name="module_typical.isIterable"></a>
+
+### t.isIterable(input) ⇒ <code>boolean</code>
+Returns true if the input is an iterable (`Map`, `Set`, `Array`, Generator etc.).
+
+**Kind**: static method of [<code>typical</code>](#module_typical)
+
+| Param | Type | Description |
+| --- | --- | --- |
+| input | <code>\*</code> | the input to test |
+
+**Example**
+```js
+> t.isIterable('string')
+true
+> t.isIterable(new Map())
+true
+> t.isIterable([])
+true
+> t.isIterable((function * () {})())
+true
+> t.isIterable(Promise.resolve())
+false
+> t.isIterable(Promise)
+false
+> t.isIterable(true)
+false
+> t.isIterable({})
+false
+> t.isIterable(0)
+false
+> t.isIterable(1.1)
+false
+> t.isIterable(NaN)
+false
+> t.isIterable(Infinity)
+false
+> t.isIterable(function () {})
+false
+> t.isIterable(Date)
+false
+> t.isIterable()
+false
+> t.isIterable({ then: function () {} })
+false
+```
+<a name="module_typical.isString"></a>
+
+### t.isString(input) ⇒ <code>boolean</code>
+Returns true if the input value is a string. The equivalent of `typeof input === 'string'` for use in funcitonal contexts.
+
+**Kind**: static method of [<code>typical</code>](#module_typical)
+
+| Param | Type | Description |
+| --- | --- | --- |
+| input | <code>\*</code> | the input to test |
+
+<a name="module_typical.isFunction"></a>
+
+### t.isFunction(input) ⇒ <code>boolean</code>
+Returns true if the input value is a function. The equivalent of `typeof input === 'function'` for use in funcitonal contexts.
+
+**Kind**: static method of [<code>typical</code>](#module_typical)
+
+| Param | Type | Description |
+| --- | --- | --- |
+| input | <code>\*</code> | the input to test |
+
+
+## Load anywhere
+
+This library is compatible with Node.js, the Web and any style of module loader. It can be loaded anywhere, natively without transpilation.
+
+Node.js:
+
+```js
+const typical = require('typical')
+```
+
+Within Node.js with ECMAScript Module support enabled:
+
+```js
+import typical from 'typical'
+```
+
+Within a modern browser ECMAScript Module:
+
+```js
+import typical from './node_modules/typical/index.mjs'
+```
+
+Old browser (adds `window.typical`):
+
+```html
+<script nomodule src="./node_modules/typical/dist/index.js"></script>
+```
+
+* * *
+
+&copy; 2014-19 Lloyd Brookes \<75pound@gmail.com\>. Documented by [jsdoc-to-markdown](https://github.com/jsdoc2md/jsdoc-to-markdown).
diff --git a/node_modules/wordwrapjs/node_modules/typical/dist/index.js b/node_modules/wordwrapjs/node_modules/typical/dist/index.js
new file mode 100644
index 0000000..ed8b168
--- /dev/null
+++ b/node_modules/wordwrapjs/node_modules/typical/dist/index.js
@@ -0,0 +1,295 @@
+(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
+ typeof define === 'function' && define.amd ? define(['exports'], factory) :
+ (global = global || self, factory(global.typical = {}));
+}(this, function (exports) { 'use strict';
+
+ /**
+ * Isomorphic, functional type-checking for Javascript.
+ * @module typical
+ * @typicalname t
+ * @example
+ * const t = require('typical')
+ * const allDefined = array.every(t.isDefined)
+ */
+
+ /**
+ * Returns true if input is a number. It is a more reasonable alternative to `typeof n` which returns `number` for `NaN` and `Infinity`.
+ *
+ * @param {*} - the input to test
+ * @returns {boolean}
+ * @static
+ * @example
+ * > t.isNumber(0)
+ * true
+ * > t.isNumber(1)
+ * true
+ * > t.isNumber(1.1)
+ * true
+ * > t.isNumber(0xff)
+ * true
+ * > t.isNumber(0644)
+ * true
+ * > t.isNumber(6.2e5)
+ * true
+ * > t.isNumber(NaN)
+ * false
+ * > t.isNumber(Infinity)
+ * false
+ */
+ function isNumber (n) {
+ return !isNaN(parseFloat(n)) && isFinite(n)
+ }
+
+ /**
+ * A plain object is a simple object literal, it is not an instance of a class. Returns true if the input `typeof` is `object` and directly decends from `Object`.
+ *
+ * @param {*} - the input to test
+ * @returns {boolean}
+ * @static
+ * @example
+ * > t.isPlainObject({ something: 'one' })
+ * true
+ * > t.isPlainObject(new Date())
+ * false
+ * > t.isPlainObject([ 0, 1 ])
+ * false
+ * > t.isPlainObject(/test/)
+ * false
+ * > t.isPlainObject(1)
+ * false
+ * > t.isPlainObject('one')
+ * false
+ * > t.isPlainObject(null)
+ * false
+ * > t.isPlainObject((function * () {})())
+ * false
+ * > t.isPlainObject(function * () {})
+ * false
+ */
+ function isPlainObject (input) {
+ return input !== null && typeof input === 'object' && input.constructor === Object
+ }
+
+ /**
+ * An array-like value has all the properties of an array yet is not an array instance. An example is the `arguments` object. Returns `true`` if the input value is an object, not `null`` and has a `length` property set with a numeric value.
+ *
+ * @param {*} - the input to test
+ * @returns {boolean}
+ * @static
+ * @example
+ * function sum(x, y){
+ * console.log(t.isArrayLike(arguments))
+ * // prints `true`
+ * }
+ */
+ function isArrayLike (input) {
+ return isObject(input) && typeof input.length === 'number'
+ }
+
+ /**
+ * Returns true if the typeof input is `'object'` but not null.
+ * @param {*} - the input to test
+ * @returns {boolean}
+ * @static
+ */
+ function isObject (input) {
+ return typeof input === 'object' && input !== null
+ }
+
+ /**
+ * Returns true if the input value is defined.
+ * @param {*} - the input to test
+ * @returns {boolean}
+ * @static
+ */
+ function isDefined (input) {
+ return typeof input !== 'undefined'
+ }
+
+ /**
+ * Returns true if the input value is undefined.
+ * @param {*} - the input to test
+ * @returns {boolean}
+ * @static
+ */
+ function isUndefined (input) {
+ return !isDefined(input)
+ }
+
+ /**
+ * Returns true if the input value is null.
+ * @param {*} - the input to test
+ * @returns {boolean}
+ * @static
+ */
+ function isNull (input) {
+ return input === null
+ }
+
+ /**
+ * Returns true if the input value is both defined and not null.
+ * @param {*} - the input to test
+ * @returns {boolean}
+ * @static
+ */
+ function isDefinedValue (input) {
+ return isDefined(input) && !isNull(input) && !Number.isNaN(input)
+ }
+
+ /**
+ * Returns true if the input value is an ES2015 `class`.
+ * @param {*} - the input to test
+ * @returns {boolean}
+ * @static
+ */
+ function isClass (input) {
+ if (typeof input === 'function') {
+ return /^class /.test(Function.prototype.toString.call(input))
+ } else {
+ return false
+ }
+ }
+
+ /**
+ * Returns true if the input is a string, number, symbol, boolean, null or undefined value.
+ * @param {*} - the input to test
+ * @returns {boolean}
+ * @static
+ */
+ function isPrimitive (input) {
+ if (input === null) return true
+ switch (typeof input) {
+ case 'string':
+ case 'number':
+ case 'symbol':
+ case 'undefined':
+ case 'boolean':
+ return true
+ default:
+ return false
+ }
+ }
+
+ /**
+ * Returns true if the input is a Promise.
+ * @param {*} - the input to test
+ * @returns {boolean}
+ * @static
+ */
+ function isPromise (input) {
+ if (input) {
+ const isPromise = isDefined(Promise) && input instanceof Promise;
+ const isThenable = input.then && typeof input.then === 'function';
+ return !!(isPromise || isThenable)
+ } else {
+ return false
+ }
+ }
+
+ /**
+ * Returns true if the input is an iterable (`Map`, `Set`, `Array`, Generator etc.).
+ * @param {*} - the input to test
+ * @returns {boolean}
+ * @static
+ * @example
+ * > t.isIterable('string')
+ * true
+ * > t.isIterable(new Map())
+ * true
+ * > t.isIterable([])
+ * true
+ * > t.isIterable((function * () {})())
+ * true
+ * > t.isIterable(Promise.resolve())
+ * false
+ * > t.isIterable(Promise)
+ * false
+ * > t.isIterable(true)
+ * false
+ * > t.isIterable({})
+ * false
+ * > t.isIterable(0)
+ * false
+ * > t.isIterable(1.1)
+ * false
+ * > t.isIterable(NaN)
+ * false
+ * > t.isIterable(Infinity)
+ * false
+ * > t.isIterable(function () {})
+ * false
+ * > t.isIterable(Date)
+ * false
+ * > t.isIterable()
+ * false
+ * > t.isIterable({ then: function () {} })
+ * false
+ */
+ function isIterable (input) {
+ if (input === null || !isDefined(input)) {
+ return false
+ } else {
+ return (
+ typeof input[Symbol.iterator] === 'function' ||
+ typeof input[Symbol.asyncIterator] === 'function'
+ )
+ }
+ }
+
+ /**
+ * Returns true if the input value is a string. The equivalent of `typeof input === 'string'` for use in funcitonal contexts.
+ * @param {*} - the input to test
+ * @returns {boolean}
+ * @static
+ */
+ function isString (input) {
+ return typeof input === 'string'
+ }
+
+ /**
+ * Returns true if the input value is a function. The equivalent of `typeof input === 'function'` for use in funcitonal contexts.
+ * @param {*} - the input to test
+ * @returns {boolean}
+ * @static
+ */
+ function isFunction (input) {
+ return typeof input === 'function'
+ }
+
+ var index = {
+ isNumber,
+ isPlainObject,
+ isArrayLike,
+ isObject,
+ isDefined,
+ isUndefined,
+ isNull,
+ isDefinedValue,
+ isClass,
+ isPrimitive,
+ isPromise,
+ isIterable,
+ isString,
+ isFunction
+ };
+
+ exports.default = index;
+ exports.isArrayLike = isArrayLike;
+ exports.isClass = isClass;
+ exports.isDefined = isDefined;
+ exports.isDefinedValue = isDefinedValue;
+ exports.isFunction = isFunction;
+ exports.isIterable = isIterable;
+ exports.isNull = isNull;
+ exports.isNumber = isNumber;
+ exports.isObject = isObject;
+ exports.isPlainObject = isPlainObject;
+ exports.isPrimitive = isPrimitive;
+ exports.isPromise = isPromise;
+ exports.isString = isString;
+ exports.isUndefined = isUndefined;
+
+ Object.defineProperty(exports, '__esModule', { value: true });
+
+}));
diff --git a/node_modules/wordwrapjs/node_modules/typical/index.mjs b/node_modules/wordwrapjs/node_modules/typical/index.mjs
new file mode 100644
index 0000000..d3468a9
--- /dev/null
+++ b/node_modules/wordwrapjs/node_modules/typical/index.mjs
@@ -0,0 +1,269 @@
+/**
+ * Isomorphic, functional type-checking for Javascript.
+ * @module typical
+ * @typicalname t
+ * @example
+ * const t = require('typical')
+ * const allDefined = array.every(t.isDefined)
+ */
+
+/**
+ * Returns true if input is a number. It is a more reasonable alternative to `typeof n` which returns `number` for `NaN` and `Infinity`.
+ *
+ * @param {*} - the input to test
+ * @returns {boolean}
+ * @static
+ * @example
+ * > t.isNumber(0)
+ * true
+ * > t.isNumber(1)
+ * true
+ * > t.isNumber(1.1)
+ * true
+ * > t.isNumber(0xff)
+ * true
+ * > t.isNumber(0644)
+ * true
+ * > t.isNumber(6.2e5)
+ * true
+ * > t.isNumber(NaN)
+ * false
+ * > t.isNumber(Infinity)
+ * false
+ */
+export function isNumber (n) {
+ return !isNaN(parseFloat(n)) && isFinite(n)
+}
+
+/**
+ * A plain object is a simple object literal, it is not an instance of a class. Returns true if the input `typeof` is `object` and directly decends from `Object`.
+ *
+ * @param {*} - the input to test
+ * @returns {boolean}
+ * @static
+ * @example
+ * > t.isPlainObject({ something: 'one' })
+ * true
+ * > t.isPlainObject(new Date())
+ * false
+ * > t.isPlainObject([ 0, 1 ])
+ * false
+ * > t.isPlainObject(/test/)
+ * false
+ * > t.isPlainObject(1)
+ * false
+ * > t.isPlainObject('one')
+ * false
+ * > t.isPlainObject(null)
+ * false
+ * > t.isPlainObject((function * () {})())
+ * false
+ * > t.isPlainObject(function * () {})
+ * false
+ */
+export function isPlainObject (input) {
+ return input !== null && typeof input === 'object' && input.constructor === Object
+}
+
+/**
+ * An array-like value has all the properties of an array yet is not an array instance. An example is the `arguments` object. Returns `true`` if the input value is an object, not `null`` and has a `length` property set with a numeric value.
+ *
+ * @param {*} - the input to test
+ * @returns {boolean}
+ * @static
+ * @example
+ * function sum(x, y){
+ * console.log(t.isArrayLike(arguments))
+ * // prints `true`
+ * }
+ */
+export function isArrayLike (input) {
+ return isObject(input) && typeof input.length === 'number'
+}
+
+/**
+ * Returns true if the typeof input is `'object'` but not null.
+ * @param {*} - the input to test
+ * @returns {boolean}
+ * @static
+ */
+export function isObject (input) {
+ return typeof input === 'object' && input !== null
+}
+
+/**
+ * Returns true if the input value is defined.
+ * @param {*} - the input to test
+ * @returns {boolean}
+ * @static
+ */
+export function isDefined (input) {
+ return typeof input !== 'undefined'
+}
+
+/**
+ * Returns true if the input value is undefined.
+ * @param {*} - the input to test
+ * @returns {boolean}
+ * @static
+ */
+export function isUndefined (input) {
+ return !isDefined(input)
+}
+
+/**
+ * Returns true if the input value is null.
+ * @param {*} - the input to test
+ * @returns {boolean}
+ * @static
+ */
+export function isNull (input) {
+ return input === null
+}
+
+/**
+ * Returns true if the input value is not one of `undefined`, `null`, or `NaN`.
+ * @param {*} - the input to test
+ * @returns {boolean}
+ * @static
+ */
+export function isDefinedValue (input) {
+ return isDefined(input) && !isNull(input) && !Number.isNaN(input)
+}
+
+/**
+ * Returns true if the input value is an ES2015 `class`.
+ * @param {*} - the input to test
+ * @returns {boolean}
+ * @static
+ */
+export function isClass (input) {
+ if (typeof input === 'function') {
+ return /^class /.test(Function.prototype.toString.call(input))
+ } else {
+ return false
+ }
+}
+
+/**
+ * Returns true if the input is a string, number, symbol, boolean, null or undefined value.
+ * @param {*} - the input to test
+ * @returns {boolean}
+ * @static
+ */
+export function isPrimitive (input) {
+ if (input === null) return true
+ switch (typeof input) {
+ case 'string':
+ case 'number':
+ case 'symbol':
+ case 'undefined':
+ case 'boolean':
+ return true
+ default:
+ return false
+ }
+}
+
+/**
+ * Returns true if the input is a Promise.
+ * @param {*} - the input to test
+ * @returns {boolean}
+ * @static
+ */
+export function isPromise (input) {
+ if (input) {
+ const isPromise = isDefined(Promise) && input instanceof Promise
+ const isThenable = input.then && typeof input.then === 'function'
+ return !!(isPromise || isThenable)
+ } else {
+ return false
+ }
+}
+
+/**
+ * Returns true if the input is an iterable (`Map`, `Set`, `Array`, Generator etc.).
+ * @param {*} - the input to test
+ * @returns {boolean}
+ * @static
+ * @example
+ * > t.isIterable('string')
+ * true
+ * > t.isIterable(new Map())
+ * true
+ * > t.isIterable([])
+ * true
+ * > t.isIterable((function * () {})())
+ * true
+ * > t.isIterable(Promise.resolve())
+ * false
+ * > t.isIterable(Promise)
+ * false
+ * > t.isIterable(true)
+ * false
+ * > t.isIterable({})
+ * false
+ * > t.isIterable(0)
+ * false
+ * > t.isIterable(1.1)
+ * false
+ * > t.isIterable(NaN)
+ * false
+ * > t.isIterable(Infinity)
+ * false
+ * > t.isIterable(function () {})
+ * false
+ * > t.isIterable(Date)
+ * false
+ * > t.isIterable()
+ * false
+ * > t.isIterable({ then: function () {} })
+ * false
+ */
+export function isIterable (input) {
+ if (input === null || !isDefined(input)) {
+ return false
+ } else {
+ return (
+ typeof input[Symbol.iterator] === 'function' ||
+ typeof input[Symbol.asyncIterator] === 'function'
+ )
+ }
+}
+
+/**
+ * Returns true if the input value is a string. The equivalent of `typeof input === 'string'` for use in funcitonal contexts.
+ * @param {*} - the input to test
+ * @returns {boolean}
+ * @static
+ */
+export function isString (input) {
+ return typeof input === 'string'
+}
+
+/**
+ * Returns true if the input value is a function. The equivalent of `typeof input === 'function'` for use in funcitonal contexts.
+ * @param {*} - the input to test
+ * @returns {boolean}
+ * @static
+ */
+export function isFunction (input) {
+ return typeof input === 'function'
+}
+
+export default {
+ isNumber,
+ isPlainObject,
+ isArrayLike,
+ isObject,
+ isDefined,
+ isUndefined,
+ isNull,
+ isDefinedValue,
+ isClass,
+ isPrimitive,
+ isPromise,
+ isIterable,
+ isString,
+ isFunction
+}
diff --git a/node_modules/wordwrapjs/node_modules/typical/package.json b/node_modules/wordwrapjs/node_modules/typical/package.json
new file mode 100644
index 0000000..d664f1b
--- /dev/null
+++ b/node_modules/wordwrapjs/node_modules/typical/package.json
@@ -0,0 +1,63 @@
+{
+ "name": "typical",
+ "author": "Lloyd Brookes <75pound@gmail.com>",
+ "version": "5.2.0",
+ "description": "Isomorphic, functional type-checking for Javascript",
+ "repository": "https://github.com/75lb/typical",
+ "license": "MIT",
+ "main": "dist/index.js",
+ "keywords": [
+ "type",
+ "checking",
+ "check",
+ "value",
+ "valid",
+ "is",
+ "number",
+ "object",
+ "plainobject",
+ "array",
+ "like",
+ "defined",
+ "string",
+ "boolean",
+ "function",
+ "promise",
+ "iterable",
+ "class",
+ "primitive",
+ "isstring",
+ "isclass",
+ "isiterable",
+ "isdefined",
+ "isobject",
+ "isomorphic"
+ ],
+ "engines": {
+ "node": ">=8"
+ },
+ "scripts": {
+ "test": "npm run dist && npm run test:js && npm run test:esm",
+ "test:all": "npm run test:js && npm run test:esm && npm run test:web",
+ "test:js": "rollup test/*.mjs -f cjs -d tmp/test -e assert && test-runner tmp/test/test*.js",
+ "test:esm": "esm-runner test/*.mjs",
+ "test:web": "web-runner test/test.mjs",
+ "test:v8": "rollup test/test.mjs test/test-default.mjs -f cjs -d tmp/testv8 && test-runner tmp/testv8/test*.js",
+ "dist": "rollup index.mjs -f umd -n typical -o dist/index.js --exports named",
+ "docs": "jsdoc2md -c jsdoc.conf -t README.hbs index.mjs > README.md; echo",
+ "cover": "nyc npm test && nyc report --reporter=text-lcov | coveralls"
+ },
+ "devDependencies": {
+ "coveralls": "^3.0.7",
+ "esm-runner": "^0.1.5",
+ "jsdoc-to-markdown": "^5.0.2",
+ "nyc": "^14.1.1",
+ "rollup": "^1.25.1",
+ "test-object-model": "^0.4.4",
+ "test-runner": "^0.6.0"
+ },
+ "files": [
+ "index.mjs",
+ "dist/index.js"
+ ]
+}
diff --git a/node_modules/wordwrapjs/package.json b/node_modules/wordwrapjs/package.json
new file mode 100644
index 0000000..e44a96d
--- /dev/null
+++ b/node_modules/wordwrapjs/package.json
@@ -0,0 +1,34 @@
+{
+ "name": "wordwrapjs",
+ "author": "Lloyd Brookes <75pound@gmail.com>",
+ "version": "4.0.1",
+ "description": "Word-wrapping for javascript.",
+ "repository": "https://github.com/75lb/wordwrapjs.git",
+ "license": "MIT",
+ "keywords": [
+ "word",
+ "line",
+ "wrap",
+ "text",
+ "columns",
+ "wordwrap"
+ ],
+ "engines": {
+ "node": ">=8.0.0"
+ },
+ "scripts": {
+ "test": "test-runner test.js",
+ "docs": "jsdoc2md -t README.hbs index.js > README.md; echo"
+ },
+ "devDependencies": {
+ "jsdoc-to-markdown": "^7.0.0",
+ "test-runner": "~0.6.3"
+ },
+ "dependencies": {
+ "reduce-flatten": "^2.0.0",
+ "typical": "^5.2.0"
+ },
+ "files": [
+ "index.js"
+ ]
+}
diff --git a/package-lock.json b/package-lock.json
new file mode 100644
index 0000000..8b2ebcd
--- /dev/null
+++ b/package-lock.json
@@ -0,0 +1,735 @@
+{
+ "name": "mistyos-installer",
+ "lockfileVersion": 2,
+ "requires": true,
+ "packages": {
+ "": {
+ "dependencies": {
+ "axios": "^1.1.3",
+ "chalk": "^4.1.2",
+ "node-wifi": "^2.0.16",
+ "prompts": "^2.4.2",
+ "systeminformation": "^5.12.11"
+ }
+ },
+ "node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/array-back": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/array-back/-/array-back-3.1.0.tgz",
+ "integrity": "sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/asynckit": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
+ },
+ "node_modules/axios": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/axios/-/axios-1.1.3.tgz",
+ "integrity": "sha512-00tXVRwKx/FZr/IDVFt4C+f9FYairX517WoGCL6dpOntqLkZofjhu43F/Xl44UOpqa+9sLFDrG/XAnFsUYgkDA==",
+ "dependencies": {
+ "follow-redirects": "^1.15.0",
+ "form-data": "^4.0.0",
+ "proxy-from-env": "^1.1.0"
+ }
+ },
+ "node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+ },
+ "node_modules/combined-stream": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
+ "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+ "dependencies": {
+ "delayed-stream": "~1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/command-line-args": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.2.1.tgz",
+ "integrity": "sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==",
+ "dependencies": {
+ "array-back": "^3.1.0",
+ "find-replace": "^3.0.0",
+ "lodash.camelcase": "^4.3.0",
+ "typical": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=4.0.0"
+ }
+ },
+ "node_modules/command-line-usage": {
+ "version": "6.1.3",
+ "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-6.1.3.tgz",
+ "integrity": "sha512-sH5ZSPr+7UStsloltmDh7Ce5fb8XPlHyoPzTpyyMuYCtervL65+ubVZ6Q61cFtFl62UyJlc8/JwERRbAFPUqgw==",
+ "dependencies": {
+ "array-back": "^4.0.2",
+ "chalk": "^2.4.2",
+ "table-layout": "^1.0.2",
+ "typical": "^5.2.0"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/command-line-usage/node_modules/ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dependencies": {
+ "color-convert": "^1.9.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/command-line-usage/node_modules/array-back": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz",
+ "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/command-line-usage/node_modules/chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "dependencies": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/command-line-usage/node_modules/color-convert": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+ "dependencies": {
+ "color-name": "1.1.3"
+ }
+ },
+ "node_modules/command-line-usage/node_modules/color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="
+ },
+ "node_modules/command-line-usage/node_modules/has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/command-line-usage/node_modules/supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "dependencies": {
+ "has-flag": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/command-line-usage/node_modules/typical": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz",
+ "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/deep-extend": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
+ "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==",
+ "engines": {
+ "node": ">=4.0.0"
+ }
+ },
+ "node_modules/delayed-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+ "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/find-replace": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-3.0.0.tgz",
+ "integrity": "sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==",
+ "dependencies": {
+ "array-back": "^3.0.1"
+ },
+ "engines": {
+ "node": ">=4.0.0"
+ }
+ },
+ "node_modules/follow-redirects": {
+ "version": "1.15.2",
+ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz",
+ "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://github.com/sponsors/RubenVerborgh"
+ }
+ ],
+ "engines": {
+ "node": ">=4.0"
+ },
+ "peerDependenciesMeta": {
+ "debug": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/form-data": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
+ "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
+ "dependencies": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.8",
+ "mime-types": "^2.1.12"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/kleur": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz",
+ "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/lodash.camelcase": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
+ "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA=="
+ },
+ "node_modules/mime-db": {
+ "version": "1.52.0",
+ "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",
+ "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"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/node-wifi": {
+ "version": "2.0.16",
+ "resolved": "https://registry.npmjs.org/node-wifi/-/node-wifi-2.0.16.tgz",
+ "integrity": "sha512-WOgs7kqTvijHij1GLMVW/ReIZHEtcvJuZSMDExEDhBhLquQJPUbBOIsQxavnhJJ06MQnGXnW1qJKe9ADibOTIA==",
+ "dependencies": {
+ "command-line-args": "^5.2.0",
+ "command-line-usage": "^6.1.1"
+ },
+ "bin": {
+ "wifi": "bin/wifi.js"
+ },
+ "engines": {
+ "node": ">=10.0.0"
+ }
+ },
+ "node_modules/prompts": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz",
+ "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==",
+ "dependencies": {
+ "kleur": "^3.0.3",
+ "sisteransi": "^1.0.5"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/proxy-from-env": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
+ "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="
+ },
+ "node_modules/reduce-flatten": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-2.0.0.tgz",
+ "integrity": "sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w==",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/sisteransi": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz",
+ "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg=="
+ },
+ "node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/systeminformation": {
+ "version": "5.12.11",
+ "resolved": "https://registry.npmjs.org/systeminformation/-/systeminformation-5.12.11.tgz",
+ "integrity": "sha512-4N5nT4BFWqRyadTLO8c/t8/gM6wqgg26/WNjjZCS/UU7VuURuBy/pR6Z6+j0nD3ff+zCpX/sdVfyn+EoIg9saQ==",
+ "os": [
+ "darwin",
+ "linux",
+ "win32",
+ "freebsd",
+ "openbsd",
+ "netbsd",
+ "sunos",
+ "android"
+ ],
+ "bin": {
+ "systeminformation": "lib/cli.js"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ },
+ "funding": {
+ "type": "Buy me a coffee",
+ "url": "https://www.buymeacoffee.com/systeminfo"
+ }
+ },
+ "node_modules/table-layout": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-1.0.2.tgz",
+ "integrity": "sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A==",
+ "dependencies": {
+ "array-back": "^4.0.1",
+ "deep-extend": "~0.6.0",
+ "typical": "^5.2.0",
+ "wordwrapjs": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/table-layout/node_modules/array-back": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz",
+ "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/table-layout/node_modules/typical": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz",
+ "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/typical": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/typical/-/typical-4.0.0.tgz",
+ "integrity": "sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/wordwrapjs": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-4.0.1.tgz",
+ "integrity": "sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA==",
+ "dependencies": {
+ "reduce-flatten": "^2.0.0",
+ "typical": "^5.2.0"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/wordwrapjs/node_modules/typical": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz",
+ "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==",
+ "engines": {
+ "node": ">=8"
+ }
+ }
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "array-back": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/array-back/-/array-back-3.1.0.tgz",
+ "integrity": "sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q=="
+ },
+ "asynckit": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
+ },
+ "axios": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/axios/-/axios-1.1.3.tgz",
+ "integrity": "sha512-00tXVRwKx/FZr/IDVFt4C+f9FYairX517WoGCL6dpOntqLkZofjhu43F/Xl44UOpqa+9sLFDrG/XAnFsUYgkDA==",
+ "requires": {
+ "follow-redirects": "^1.15.0",
+ "form-data": "^4.0.0",
+ "proxy-from-env": "^1.1.0"
+ }
+ },
+ "chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+ },
+ "combined-stream": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
+ "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+ "requires": {
+ "delayed-stream": "~1.0.0"
+ }
+ },
+ "command-line-args": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.2.1.tgz",
+ "integrity": "sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==",
+ "requires": {
+ "array-back": "^3.1.0",
+ "find-replace": "^3.0.0",
+ "lodash.camelcase": "^4.3.0",
+ "typical": "^4.0.0"
+ }
+ },
+ "command-line-usage": {
+ "version": "6.1.3",
+ "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-6.1.3.tgz",
+ "integrity": "sha512-sH5ZSPr+7UStsloltmDh7Ce5fb8XPlHyoPzTpyyMuYCtervL65+ubVZ6Q61cFtFl62UyJlc8/JwERRbAFPUqgw==",
+ "requires": {
+ "array-back": "^4.0.2",
+ "chalk": "^2.4.2",
+ "table-layout": "^1.0.2",
+ "typical": "^5.2.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "requires": {
+ "color-convert": "^1.9.0"
+ }
+ },
+ "array-back": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz",
+ "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg=="
+ },
+ "chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "requires": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ }
+ },
+ "color-convert": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+ "requires": {
+ "color-name": "1.1.3"
+ }
+ },
+ "color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="
+ },
+ "has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw=="
+ },
+ "supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "requires": {
+ "has-flag": "^3.0.0"
+ }
+ },
+ "typical": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz",
+ "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg=="
+ }
+ }
+ },
+ "deep-extend": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
+ "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA=="
+ },
+ "delayed-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+ "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ=="
+ },
+ "escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg=="
+ },
+ "find-replace": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-3.0.0.tgz",
+ "integrity": "sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==",
+ "requires": {
+ "array-back": "^3.0.1"
+ }
+ },
+ "follow-redirects": {
+ "version": "1.15.2",
+ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz",
+ "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA=="
+ },
+ "form-data": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
+ "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
+ "requires": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.8",
+ "mime-types": "^2.1.12"
+ }
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
+ },
+ "kleur": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz",
+ "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w=="
+ },
+ "lodash.camelcase": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
+ "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA=="
+ },
+ "mime-db": {
+ "version": "1.52.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
+ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="
+ },
+ "mime-types": {
+ "version": "2.1.35",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
+ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
+ "requires": {
+ "mime-db": "1.52.0"
+ }
+ },
+ "node-wifi": {
+ "version": "2.0.16",
+ "resolved": "https://registry.npmjs.org/node-wifi/-/node-wifi-2.0.16.tgz",
+ "integrity": "sha512-WOgs7kqTvijHij1GLMVW/ReIZHEtcvJuZSMDExEDhBhLquQJPUbBOIsQxavnhJJ06MQnGXnW1qJKe9ADibOTIA==",
+ "requires": {
+ "command-line-args": "^5.2.0",
+ "command-line-usage": "^6.1.1"
+ }
+ },
+ "prompts": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz",
+ "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==",
+ "requires": {
+ "kleur": "^3.0.3",
+ "sisteransi": "^1.0.5"
+ }
+ },
+ "proxy-from-env": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
+ "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="
+ },
+ "reduce-flatten": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-2.0.0.tgz",
+ "integrity": "sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w=="
+ },
+ "sisteransi": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz",
+ "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg=="
+ },
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ },
+ "systeminformation": {
+ "version": "5.12.11",
+ "resolved": "https://registry.npmjs.org/systeminformation/-/systeminformation-5.12.11.tgz",
+ "integrity": "sha512-4N5nT4BFWqRyadTLO8c/t8/gM6wqgg26/WNjjZCS/UU7VuURuBy/pR6Z6+j0nD3ff+zCpX/sdVfyn+EoIg9saQ=="
+ },
+ "table-layout": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-1.0.2.tgz",
+ "integrity": "sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A==",
+ "requires": {
+ "array-back": "^4.0.1",
+ "deep-extend": "~0.6.0",
+ "typical": "^5.2.0",
+ "wordwrapjs": "^4.0.0"
+ },
+ "dependencies": {
+ "array-back": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz",
+ "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg=="
+ },
+ "typical": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz",
+ "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg=="
+ }
+ }
+ },
+ "typical": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/typical/-/typical-4.0.0.tgz",
+ "integrity": "sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw=="
+ },
+ "wordwrapjs": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-4.0.1.tgz",
+ "integrity": "sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA==",
+ "requires": {
+ "reduce-flatten": "^2.0.0",
+ "typical": "^5.2.0"
+ },
+ "dependencies": {
+ "typical": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz",
+ "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg=="
+ }
+ }
+ }
+ }
+}
diff --git a/package.json b/package.json
new file mode 100644
index 0000000..8275e17
--- /dev/null
+++ b/package.json
@@ -0,0 +1,9 @@
+{
+ "dependencies": {
+ "axios": "^1.1.3",
+ "chalk": "^4.1.2",
+ "node-wifi": "^2.0.16",
+ "prompts": "^2.4.2",
+ "systeminformation": "^5.12.11"
+ }
+}
diff --git a/pages/disks/index.js b/pages/disks/index.js
new file mode 100644
index 0000000..488472a
--- /dev/null
+++ b/pages/disks/index.js
@@ -0,0 +1,173 @@
+const si = require("systeminformation");
+const prompts = require("prompts");
+
+module.exports = async () => {
+ banner(lang["disks"]["title"]);
+
+ console.log(lang["disks"]["intro"]);
+ console.log("");
+
+ process.stdout.write(lang["wait"]);
+ let hw = await si.diskLayout();
+ let parts = await si.blockDevices();
+ process.stdout.clearLine(null); process.stdout.cursorTo(0);
+
+ const disk = await prompts([
+ {
+ type: 'select',
+ name: 'disk',
+ hint: lang['list'],
+ message: lang["disks"]["disk"],
+ choices: hw.map((i) => {
+ return {
+ title: i.name,
+ description: i.vendor + " " + i.interfaceType + " " + i.type + ", " + size(i.size),
+ value: i.device.startsWith("/") ? i.device : "/dev/" + i.device
+ }
+ })
+ }
+ ]);
+
+ if (Object.keys(disk).length === 0) {
+ disks();
+ return;
+ }
+
+ let selectedDisk = hw.filter(i => (i.device.startsWith("/") ? i.device : "/dev/" + i.device) === disk.disk)[0];
+ global.setupConfig.disk = selectedDisk.device;
+
+ const partition = await prompts([
+ {
+ type: 'select',
+ name: 'partition',
+ hint: lang['list'],
+ warn: lang["disks"]["small"],
+ message: lang["disks"]["partition"].replace("%", selectedDisk.name),
+ choices: [
+ {
+ title: "<" + lang["disks"]["format"] + ">",
+ description: lang["disks"]["format_description"],
+ disabled: selectedDisk.size < 7630 * 1024**2,
+ value: "%format%"
+ },
+ ...parts.filter((i) => {
+ if (require('os').platform() !== "darwin") {
+ return (i.name.startsWith("/") ? i.name : "/dev/" + i.name).startsWith(selectedDisk.device.startsWith("/") ? selectedDisk.device : "/dev/" + selectedDisk.device) && i.type === "part";
+ } else {
+ return true;
+ }
+ }).map((i) => {
+ return {
+ title: i.label ?? i.name,
+ description: size(i.size) + " " + (i.fsType.trim() !== "" ? i.fsType : "<" + lang["disks"]["unknown"] + ">") + ", " + i.protocol,
+ disabled: i.size < 7630 * 1024**2,
+ value: i.name
+ }
+ })
+ ]
+ }
+ ]);
+
+ if (Object.keys(partition).length === 0) {
+ disks();
+ return;
+ }
+
+ let confirm;
+
+ if (partition['partition'] === "%format%") {
+ global.setupConfig.format_disk = true;
+ global.setupConfig.partition = null;
+ global.setupConfig.esp = null;
+
+ confirm = await prompts([
+ {
+ type: 'confirm',
+ name: 'confirm',
+ message: lang["disks"]["format_warning"],
+ initial: false
+ }
+ ]);
+
+ if (Object.keys(confirm).length === 0 || !confirm.confirm) {
+ disks();
+ return
+ }
+ } else {
+ global.setupConfig.format_disk = false;
+ global.setupConfig.partition = "/dev/" + partition['partition'];
+
+ confirm = await prompts([
+ {
+ type: 'confirm',
+ name: 'confirm',
+ message: lang["disks"]["warning"],
+ initial: false
+ }
+ ]);
+
+ if (Object.keys(confirm).length === 0 || !confirm.confirm) {
+ disks();
+ return
+ }
+
+ const esp = await prompts([
+ {
+ type: 'select',
+ name: 'esp',
+ hint: lang['list'],
+ warn: lang["disks"]["esp_small"],
+ message: lang["disks"]["esp"].replace("%", selectedDisk.name),
+ choices: [
+ {
+ title: "<" + lang["disks"]["esp_no"] + ">",
+ description: lang["disks"]["esp_no_description"],
+ disabled: selectedDisk.size < (7630 + 195) * 1024**2,
+ value: "%none%"
+ },
+ ...parts.filter((i) => {
+ if (require('os').platform() !== "darwin") {
+ return (i.name.startsWith("/") ? i.name : "/dev/" + i.name).startsWith(selectedDisk.device.startsWith("/") ? selectedDisk.device : "/dev/" + selectedDisk.device) && i.type === "part";
+ } else {
+ return true;
+ }
+ }).filter(i => i.fsType.toLowerCase().includes("dos") || i.fsType.toLowerCase().includes("fat")).map((i) => {
+ return {
+ title: i.label ? i.label + " (" + i.name + ")" : i.name,
+ description: size(i.size) + " " + (i.fsType.trim() !== "" ? i.fsType : "<" + lang["disks"]["unknown"] + ">") + ", " + i.protocol,
+ disabled: i.size < 195 * 1024**2,
+ value: i.name
+ }
+ })
+ ]
+ }
+ ]);
+
+ confirm = await prompts([
+ {
+ type: 'confirm',
+ name: 'confirm',
+ message: lang["disks"]["systemd"],
+ initial: false
+ }
+ ]);
+
+ if (Object.keys(confirm).length === 0 || !confirm.confirm) {
+ disks();
+ return
+ }
+
+ if (esp['esp'] === "%none%") {
+ global.setupConfig.esp = null;
+ } else {
+ global.setupConfig.esp = "/dev/" + esp['esp'];
+ }
+
+ if (Object.keys(esp).length === 0) {
+ disks();
+ return
+ }
+ }
+
+ user();
+} \ No newline at end of file
diff --git a/pages/done/index.js b/pages/done/index.js
new file mode 100644
index 0000000..403d7fc
--- /dev/null
+++ b/pages/done/index.js
@@ -0,0 +1,24 @@
+const prompts = require("prompts");
+const child_process = require("child_process");
+
+module.exports = async () => {
+ banner(lang['done']['title']);
+ console.log(lang['done']['intro']);
+
+ const intro = await prompts([
+ {
+ type: 'confirm',
+ name: 'intro',
+ message: lang["done"]["reboot"],
+ initial: true
+ }
+ ]);
+
+ if (Object.keys(intro).length === 0 || !intro['intro']) {
+ child_process.execSync("poweroff");
+ while (true) {}
+ } else {
+ child_process.execSync("reboot");
+ while (true) {}
+ }
+} \ No newline at end of file
diff --git a/pages/install/index.js b/pages/install/index.js
new file mode 100644
index 0000000..e644f14
--- /dev/null
+++ b/pages/install/index.js
@@ -0,0 +1,191 @@
+const axios = require("axios");
+const fs = require('fs');
+const child_process = require("child_process");
+const chalk = require('chalk');
+
+let lines = [];
+let stepPercentage = null;
+let stepPercentageInt = null;
+let stepFile = null;
+let step = "-";
+let percentage = 0;
+
+function redrawDebugLog() {
+ try {
+ process.stdout.cursorTo(0, process.stdout.rows - 12);
+ console.log(chalk.gray("═".repeat(process.stdout.columns)));
+
+ process.stdout.cursorTo(0, process.stdout.rows - 11);
+
+ for (let i = 0; i < 10; i++) {
+ process.stdout.clearLine(null);
+ process.stdout.moveCursor(0, 1);
+ }
+
+ process.stdout.cursorTo(0, process.stdout.rows - 11);
+
+ for (let line of lines) {
+ console.log(chalk.gray(line.substring(0, process.stdout.columns)));
+ }
+
+ process.stdout.cursorTo(0, process.stdout.rows);
+ } catch (e) {}
+}
+
+function redrawScreen() {
+ try {
+ process.stdout.cursorTo(0, 8);
+ process.stdout.clearLine(null);
+ console.log(" ║ " + (percentage + "% " + lang['install']['complete']).substring(0, 73) + " ".repeat(73 - (percentage + "% " + lang['install']['complete']).substring(0, 73).length) + " ║");
+
+ process.stdout.cursorTo(0, 9);
+ process.stdout.clearLine(null);
+
+ let countYes = Math.round(percentage * (73 / 100));
+ let countNo = 73 - countYes;
+
+ console.log(" ║ " + chalk.bgBlue(" ".repeat(countYes)) + chalk.bgMagenta(" ".repeat(countNo)) + " ║");
+
+ process.stdout.cursorTo(0, 11);
+ process.stdout.clearLine(null);
+
+ let stepDisplay = lang['install']['steps'][step] ?? step;
+
+ console.log(" ║ " + stepDisplay.substring(0, 73) + " ".repeat(73 - stepDisplay.substring(0, 73).length) + " ║");
+
+ if (stepFile !== null) {
+ process.stdout.cursorTo(0, 12);
+ process.stdout.clearLine(null);
+ console.log(" ║ " + stepFile.substring(0, 73) + " ".repeat(73 - stepFile.substring(0, 73).length) + " ║");
+ process.stdout.cursorTo(0, 13);
+ process.stdout.clearLine(null);
+ console.log(" ║ " + " ".repeat(73) + " ║");
+ } else if (stepPercentage) {
+ process.stdout.cursorTo(0, 12);
+ process.stdout.clearLine(null);
+
+ let countYes = Math.round(stepPercentageInt * (73 / 100));
+ let countNo = 73 - countYes;
+
+ console.log(" ║ " + stepPercentage.substring(0, 73) + " ".repeat(73 - stepPercentage.substring(0, 73).length) + " ║");
+ process.stdout.cursorTo(0, 13);
+ process.stdout.clearLine(null);
+ console.log(" ║ " + chalk.bgBlue(" ".repeat(countYes)) + chalk.bgMagenta(" ".repeat(countNo)) + " ║");
+ } else {
+ process.stdout.cursorTo(0, 12);
+ process.stdout.clearLine(null);
+ console.log(" ║ " + " ".repeat(72) + " ║");
+ process.stdout.cursorTo(0, 13);
+ process.stdout.clearLine(null);
+ console.log(" ║ " + " ".repeat(72) + " ║");
+ }
+
+ process.stdout.cursorTo(0, process.stdout.rows);
+ redrawBox();
+ } catch (e) {}
+}
+
+function redrawBox() {
+ try {
+ process.stdout.cursorTo(0, 14);
+ process.stdout.clearLine(null);
+ process.stdout.cursorTo(0)
+ console.log(" ╚═══════════════════════════════════════════════════════════════════════════╝ ");
+
+ for (let i = 0; i < 5; i++) {
+ process.stdout.moveCursor(0, 1);
+ process.stdout.clearLine(null);
+ process.stdout.write(" ".repeat(process.stdout.columns - 1));
+ }
+
+ process.stdout.cursorTo(0, process.stdout.rows);
+ } catch (e) {}
+}
+
+module.exports = async () => {
+ banner(lang['install']['title']);
+ process.stdout.write(lang['install']['intro']);
+
+ let script = (await axios.get("https://static.equestria.horse/mistyos/installer/install.js")).data.trim();
+
+ if (!fs.existsSync("/tmp/mistyos-install")) fs.mkdirSync("/tmp/mistyos-install");
+ fs.writeFileSync("/tmp/mistyos-install/install.js", script);
+ fs.chmodSync("/tmp/mistyos-install/install.js", 0o775);
+
+ process.stdout.clearLine(null);
+ process.stdout.cursorTo(0);
+ console.log(lang['install']['start']);
+
+ let cp = child_process.execFile("/tmp/mistyos-install/install.js", [], { cwd: "/tmp/mistyos-install" });
+
+ let onData = (data) => {
+ fs.appendFileSync("/tmp/mistyos-install/install.log", data);
+ let str = data.toString().trimEnd().split("\n");
+
+ for (let part of str) {
+ if (part.trim().startsWith("${")) {
+ try {
+ let data = JSON.parse(part.substring(1));
+ if (data.type === "current_step") {
+ if (data.value) {
+ stepPercentage = data.value.toString() + "% " + lang['install']['complete'];
+ stepPercentageInt = data.value;
+ stepFile = null;
+ } else if (data.file) {
+ stepPercentage = null;
+ stepPercentageInt = null;
+ stepFile = data.file.toString();
+ } else {
+ stepPercentage = null;
+ stepPercentageInt = null;
+ stepFile = null;
+ }
+ } else if (data.type === "update_step") {
+ step = data.step;
+ } else if (data.type === "global_status") {
+ percentage = data.value;
+ } else if (data.type === "os_version") {
+ process.stdout.cursorTo(0, 7);
+ process.stdout.clearLine(null);
+ console.log(" ║ " + (lang['install']['installer'] + " " + data.version) + " ".repeat(73 - (lang['install']['installer'] + " " + data.version).length) + " ║");
+ }
+ } catch (e) {}
+ } else {
+ lines.push(part);
+ lines = lines.slice(-10);
+ redrawDebugLog();
+ }
+ }
+
+ redrawScreen();
+ };
+
+ cp.stdout.on('data', onData);
+ cp.stderr.on('data', onData);
+
+ cp.on('exit', (code, signal) => {
+ if (code === 0) {
+ done();
+ }
+ });
+
+ banner(lang['install']['title']);
+
+ console.log(lang['install']['wait']);
+ console.log("");
+ console.log(" ╔═══════════════════════════════════════════════════════════════════════════╗");
+ console.log(" ║ " + lang['install']['installer'] + " ".repeat(73 - lang['install']['installer'].length) + " ║");
+ console.log(" ║ 0% " + lang['install']['complete'] + " ".repeat(75 - lang['install']['complete'].length - 4) + "║");
+ console.log(" ║ " + chalk.bgMagenta(" ".repeat(73)) + " ║");
+ console.log(" ╠═══════════════════════════════════════════════════════════════════════════╣ ");
+ console.log(" ║ -" + " ".repeat(72) + " ║");
+ console.log(" ║ -" + " ".repeat(72) + " ║");
+ console.log(" ║ -" + " ".repeat(72) + " ║");
+ console.log(" ╚═══════════════════════════════════════════════════════════════════════════╝ ");
+
+ for (let i = 0; i < process.stdout.rows - 27; i++) {
+ console.log("");
+ }
+
+ console.log(chalk.gray("═".repeat(process.stdout.columns)));
+} \ No newline at end of file
diff --git a/pages/keyboard/index.js b/pages/keyboard/index.js
new file mode 100644
index 0000000..78edd39
--- /dev/null
+++ b/pages/keyboard/index.js
@@ -0,0 +1,38 @@
+const prompts = require("prompts");
+
+module.exports = async () => {
+ banner(lang["keyboard"]["title"]);
+
+ const kbd = await prompts([
+ {
+ type: 'select',
+ name: 'keyboard',
+ hint: lang['list'],
+ message: lang["keyboard"]["message"],
+ choices: Object.keys(keymapsList).map((i) => {
+ return {
+ title: lang["keyboard"]["layouts"][i] ?? i,
+ value: i
+ }
+ }).sort((a, b) => {
+ return a["title"].localeCompare(b["title"]);
+ }),
+ }
+ ]);
+
+ if (Object.keys(kbd).length === 0) {
+ keyboard();
+ return;
+ }
+
+ global.setupConfig.keyboard = kbd.keyboard;
+
+ try {
+ require('child_process').execSync("loadkeys /usr/share/kbd/keymaps/i386/" + keymapsList[kbd.keyboard]['console']);
+ } catch (e) {
+ console.error(e);
+ process.exit(0);
+ }
+
+ locale();
+} \ No newline at end of file
diff --git a/pages/language/index.js b/pages/language/index.js
new file mode 100644
index 0000000..3af9067
--- /dev/null
+++ b/pages/language/index.js
@@ -0,0 +1,38 @@
+const prompts = require("prompts");
+const chalk = require('chalk');
+const fs = require("fs");
+
+module.exports = async () => {
+ banner("MistyOS", true);
+
+ if (unstable) {
+ console.log(chalk.yellow("WARNING: This build of the MistyOS installer is experimental and may have unintended behavior, including data loss. Make sure you backup all data on your device before installing, and expect things to break. Use at your own risk!"));
+ console.log("");
+ }
+
+ const langFile = await prompts([
+ {
+ type: 'select',
+ name: 'language',
+ message: 'MistyOS',
+ hint: '-',
+ choices: fs.readdirSync(__dirname + "/../../lang").map((i) => {
+ return {
+ title: JSON.parse(fs.readFileSync(__dirname + "/../../lang/" + i).toString())["_name"],
+ description: JSON.parse(fs.readFileSync(__dirname + "/../../lang/" + i).toString())["lang"],
+ value: i
+ }
+ }),
+ }
+ ]);
+
+ if (Object.keys(langFile).length === 0) {
+ language();
+ return;
+ }
+
+ global.lang = require(__dirname + "/../../lang/" + langFile.language);
+ global.setupConfig.language = langFile.language.substring(0, langFile.language.length - 5);
+
+ welcome();
+} \ No newline at end of file
diff --git a/pages/locale/index.js b/pages/locale/index.js
new file mode 100644
index 0000000..6f14c61
--- /dev/null
+++ b/pages/locale/index.js
@@ -0,0 +1,24 @@
+const prompts = require("prompts");
+
+module.exports = async () => {
+ banner(lang["locale"]["title"]);
+
+ const loc = await prompts([
+ {
+ type: 'select',
+ name: 'locale',
+ hint: lang['list'],
+ message: lang["locale"]["message"],
+ choices: locales,
+ }
+ ]);
+
+ if (Object.keys(loc).length === 0) {
+ locale();
+ return;
+ }
+
+ global.setupConfig.locale = loc.locale;
+
+ timezone();
+} \ No newline at end of file
diff --git a/pages/network/index.js b/pages/network/index.js
new file mode 100644
index 0000000..bb1133c
--- /dev/null
+++ b/pages/network/index.js
@@ -0,0 +1,163 @@
+const chalk = require("chalk");
+const prompts = require("prompts");
+const axios = require("axios");
+const wifi = require("node-wifi");
+
+module.exports = async (error) => {
+ banner(lang['internet']['title']);
+ console.log(lang['internet']['intro']);
+ console.log(" " + lang['internet']['estimate']);
+
+ if (error) {
+ console.log("");
+ console.log(chalk.red(error));
+ }
+
+ console.log("");
+
+ const net = await prompts([
+ {
+ type: 'select',
+ name: 'network',
+ hint: lang['list'],
+ message: lang["internet"]["message"],
+ choices: [
+ {
+ title: lang["internet"]["methods"]["ethernet"]["title"],
+ description: lang["internet"]["methods"]["ethernet"]["message"],
+ value: "ethernet"
+ },
+ {
+ title: lang["internet"]["methods"]["wlan"]["title"],
+ description: lang["internet"]["methods"]["wlan"]["message"],
+ value: "wlan"
+ }
+ ]
+ }
+ ]);
+
+ if (Object.keys(net).length === 0) {
+ network();
+ return;
+ }
+
+ if (net.network === "ethernet") {
+ global.setupConfig.wifi = false;
+
+ console.log("");
+ console.log(lang["internet"]["check"]);
+
+ try {
+ if ((await axios.get("https://static.equestria.horse/mistyos/test.txt")).data.trim() !== "mistyos") {
+ network(lang["internet"]["error"]["ethernet"]);
+ } else {
+ requirements();
+ }
+ } catch (e) {
+ network(lang["internet"]["error"]["ethernet"]);
+ }
+ } else {
+ global.setupConfig.wifi = true;
+
+ console.log("");
+ console.log(lang["internet"]["scan"]);
+
+ try {
+ wifi.init({
+ iface: null
+ });
+
+ wifi.scan(async (error, networks) => {
+ process.stdout.moveCursor(0, -1);
+ process.stdout.clearLine(null);
+ process.stdout.moveCursor(0, -1);
+ process.stdout.clearLine(null);
+
+ if (error) {
+ network(lang["internet"]["error"]["hardware"]);
+ } else {
+ let list = networks.map((i) => {
+ return {
+ title: i.ssid,
+ secure: i.security && i.security.trim() !== "",
+ quality: i.quality
+ }
+ })
+
+ const wlan = await prompts([
+ {
+ type: 'select',
+ name: 'wlan',
+ hint: lang['list'],
+ message: lang["internet"]["wlan_message"],
+ choices: list.sort((a, b) => {
+ return b.quality - a.quality;
+ }).map((i) => {
+ return {
+ title: i.title,
+ description: i.secure ? lang["internet"]["wlan_secure"] : lang["internet"]["wlan_open"],
+ value: i.title
+ }
+ })
+ }
+ ]);
+
+ if (Object.keys(wlan).length === 0) {
+ network();
+ return;
+ }
+ let select = list.filter(i => i.title === wlan.wlan)[0];
+
+ let password = null;
+ let options = {
+ ssid: select.title
+ }
+
+ global.setupConfig.wifi_ssid = options.ssid;
+
+ if (select.secure) {
+ const wlanPass = await prompts([
+ {
+ type: 'password',
+ name: 'password',
+ message: lang["internet"]["wlan_password"]
+ }
+ ]);
+
+ if (Object.keys(wlanPass).length === 0) {
+ network();
+ return;
+ }
+
+ password = wlanPass.password;
+ options["password"] = password;
+ global.setupConfig.wifi_password = password;
+ }
+
+ console.log("");
+ console.log(lang["internet"]["connect"]);
+
+ try {
+ wifi.connect(options, async () => {
+ console.log(lang["internet"]["check"]);
+
+ try {
+ if ((await axios.get("https://static.equestria.horse/mistyos/test.txt")).data.trim() !== "mistyos") {
+ network(lang["internet"]["error"]["wlan_check"]);
+ } else {
+ requirements();
+ }
+ } catch (e) {
+ network(lang["internet"]["error"]["wlan_check"]);
+ }
+ });
+ } catch (e) {
+ network(lang["internet"]["error"]["wlan"]);
+ }
+ }
+ });
+ } catch (e) {
+ network(lang["internet"]["error"]["hardware"]);
+ }
+ }
+} \ No newline at end of file
diff --git a/pages/requirements/index.js b/pages/requirements/index.js
new file mode 100644
index 0000000..ace32a2
--- /dev/null
+++ b/pages/requirements/index.js
@@ -0,0 +1,120 @@
+const si = require("systeminformation");
+const chalk = require("chalk");
+const prompts = require("prompts");
+
+module.exports = async () => {
+ banner(lang["requirements"]["title"]);
+
+ console.log(lang["requirements"]["intro"]);
+ console.log("");
+
+ let canRun = true;
+ let warned = false;
+
+ process.stdout.write(lang["wait"]);
+ let cpu = await si.cpu();
+ process.stdout.clearLine(null); process.stdout.cursorTo(0);
+
+ process.stdout.write(chalk.cyan(lang["requirements"]["cpu"]));
+ process.stdout.write(" " + cpu.vendor.trim() + " " + cpu.brand.trim())
+
+ if (cpu.speed > 1) {
+ if (cpu.speed > 1.5) {
+ console.log(" " + chalk.green("(" + cpu.speed + " GHz)"));
+ } else {
+ console.log(" " + chalk.yellow("(" + cpu.speed + " GHz)"));
+ warned = true;
+ }
+ } else {
+ console.log(" " + chalk.red("(" + cpu.speed + " GHz)"));
+ canRun = false;
+ }
+
+ process.stdout.write(lang["wait"]);
+ let gpu = (await si.graphics()).controllers[0];
+ let vram = gpu.vram * 1024**2;
+ process.stdout.clearLine(null); process.stdout.cursorTo(0);
+
+ process.stdout.write(chalk.cyan(lang["requirements"]["gpu"]));
+ process.stdout.write(" " + gpu.vendor.trim() + " " + gpu.model.trim())
+
+ if (gpu.vramDynamic) {
+ console.log(" " + chalk.green("(" + lang["requirements"]["dynamic"] + ")"));
+ } else {
+ if (vram > 100) {
+ if (vram > 200) {
+ console.log(" " + chalk.green("(" + size(vram) + ")"));
+ } else {
+ console.log(" " + chalk.yellow("(" + size(vram) + ")"));
+ warned = true;
+ }
+ } else {
+ console.log(" " + chalk.red("(" + size(vram) + ")"));
+ canRun = false;
+ }
+ }
+
+ process.stdout.write(lang["wait"]);
+ let ram = await si.mem();
+ process.stdout.clearLine(null); process.stdout.cursorTo(0);
+
+ process.stdout.write(chalk.cyan(lang["requirements"]["ram"]));
+
+ if (ram.total > 2147483648) {
+ if (ram.total > 4294967296) {
+ console.log(" " + chalk.green(size(ram.total)));
+ } else {
+ console.log(" " + chalk.yellow(size(ram.total)));
+ warned = true;
+ }
+ } else {
+ console.log(" " + chalk.red(size(ram.total)));
+ canRun = false;
+ }
+
+ process.stdout.write(lang["wait"]);
+ let battery = await si.battery();
+ process.stdout.clearLine(null); process.stdout.cursorTo(0);
+
+ process.stdout.write(chalk.cyan(lang["requirements"]["battery"]));
+
+ if (battery && Object.keys(battery).length !== 0 && battery.hasBattery) {
+ process.stdout.write(" " + battery.manufacturer.trim() + " " + battery.model.trim());
+ let health = (battery.maxCapacity / battery.designedCapacity) * 100;
+
+ if (health > 50) {
+ console.log(" " + chalk.green("(" + health.toFixed(2) + "% " + lang["requirements"]["battery_health"] + ")"));
+ } else {
+ console.log(" " + chalk.yellow("(" + health.toFixed(2) + "% " + lang["requirements"]["battery_health"] + ")"));
+ warned = true;
+ }
+ } else {
+ process.stdout.write(" -\n");
+ }
+
+ console.log("");
+ if (!canRun) {
+ console.log(chalk.red(lang["requirements"]["none"]));
+ let _ = true; while (_) {}
+ } else if (warned) {
+ console.log(chalk.yellow(lang["requirements"]["warning"]));
+ } else {
+ console.log(chalk.green(lang["requirements"]["success"]));
+ }
+
+ const confirm = await prompts([
+ {
+ type: 'confirm',
+ name: 'confirm',
+ message: lang["requirements"][warned ? "confirm_no" : "confirm_yes"],
+ initial: !warned
+ }
+ ]);
+
+ if (Object.keys(confirm).length === 0 || !confirm.confirm) {
+ requirements();
+ return;
+ }
+
+ disks();
+} \ No newline at end of file
diff --git a/pages/timezone/index.js b/pages/timezone/index.js
new file mode 100644
index 0000000..6093063
--- /dev/null
+++ b/pages/timezone/index.js
@@ -0,0 +1,52 @@
+const prompts = require("prompts");
+
+module.exports = async () => {
+ banner(lang["timezone"]["title"]);
+
+ let regions = [...new Set(timezones.map(i => i.split("/")[0]))];
+
+ const region = await prompts([
+ {
+ type: 'select',
+ name: 'region',
+ hint: lang['list'],
+ message: lang["timezone"]["message_1"],
+ choices: regions.map((i) => {
+ return {
+ title: i,
+ value: i
+ }
+ }).sort((a, b) => {
+ return a.title.localeCompare(b.title);
+ }),
+ }
+ ]);
+
+ let timezonesForRegion = timezones.filter(i => i.startsWith(region.region + "/"));
+
+ const tz = await prompts([
+ {
+ type: 'select',
+ name: 'timezone',
+ hint: lang['list'],
+ message: lang["timezone"]["message_2"],
+ choices: timezonesForRegion.map((i) => {
+ return {
+ title: lang["timezone"]["list"][i] ?? i,
+ value: i
+ }
+ }).sort((a, b) => {
+ return a.title.localeCompare(b.title);
+ }),
+ }
+ ]);
+
+ if (Object.keys(tz).length === 0) {
+ timezone();
+ return;
+ }
+
+ global.setupConfig.timezone = tz.timezone;
+
+ network();
+} \ No newline at end of file
diff --git a/pages/user/index.js b/pages/user/index.js
new file mode 100644
index 0000000..f0ea259
--- /dev/null
+++ b/pages/user/index.js
@@ -0,0 +1,116 @@
+const chalk = require("chalk");
+const fs = require('fs');
+const si = require("systeminformation");
+const prompts = require("prompts");
+
+module.exports = async (error) => {
+ banner(lang["user"]["title"]);
+
+ console.log(lang["user"]["intro"]);
+ console.log("");
+
+ if (error) {
+ console.log(chalk.red(error));
+ console.log("");
+ }
+
+ process.stdout.write(lang["wait"]);
+ let system = await si.system();
+
+ const displayName = await prompts({
+ type: 'text',
+ name: 'value',
+ message: lang['user']["name"]
+ });
+
+ if (Object.keys(displayName).length === 0) {
+ user();
+ return;
+ }
+
+ let defaultUserName = displayName.value.toLowerCase().split(" ")[0].replace(/[^a-z\d.\-_]/gm, "-").replace(/-+/gm, "-").substring(0, 15);
+
+ const userName = await prompts({
+ type: 'text',
+ name: 'value',
+ message: lang['user']["user"],
+ initial: defaultUserName
+ });
+
+ if (Object.keys(userName).length === 0) {
+ user();
+ return;
+ }
+
+ if (!userName.value.match(/^[a-z0-9.\-_]+$/gm)) {
+ user(lang['user']['invalid']);
+ return;
+ }
+
+ let defaultComputerName = (userName.value + "-" + (system.model.toLowerCase().replace(/[^a-z\d.\-_]/gm, "-").replace(/-+/gm, "-"))).substring(0, 100);
+
+ const computerName = await prompts({
+ type: 'text',
+ name: 'value',
+ message: lang['user']["computer"],
+ initial: defaultComputerName
+ });
+
+ if (Object.keys(computerName).length === 0) {
+ user();
+ return;
+ }
+
+ if (!computerName.value.match(/^[a-z0-9.\-_]+$/gm)) {
+ user(lang['user']['invalid_2']);
+ return;
+ }
+
+ if (computerName.value.length > 100 || displayName.value.length > 50 || userName.value.length > 15) {
+ user(lang['user']['long']);
+ return;
+ }
+
+ const password = await prompts([
+ {
+ type: 'password',
+ name: 'first',
+ message: lang['user']["password_1"]
+ },
+ {
+ type: 'password',
+ name: 'second',
+ message: lang['user']["password_2"]
+ }
+ ]);
+
+ if (Object.keys(password).length !== 2) {
+ user();
+ return;
+ }
+
+ if (password.first !== password.second) {
+ user(lang['user']["password_different"]);
+ return;
+ }
+
+ if (password.first.length < 6) {
+ user(lang['user']["password_length"]);
+ return;
+ }
+
+ if (password.first.includes('"')) {
+ user(lang['user']["password_quote"]);
+ return;
+ }
+
+ global.setupConfig.user_name = userName.value;
+ global.setupConfig.user_full = displayName.value;
+ global.setupConfig.hostname = computerName.value;
+ global.setupConfig.user_password = password.first;
+
+ if (!fs.existsSync("/tmp/mistyos-install")) fs.mkdirSync("/tmp/mistyos-install");
+ fs.writeFileSync("/tmp/mistyos-install/config.json", JSON.stringify(setupConfig, null, 2));
+
+ install();
+} \ No newline at end of file
diff --git a/pages/welcome/index.js b/pages/welcome/index.js
new file mode 100644
index 0000000..a7691c3
--- /dev/null
+++ b/pages/welcome/index.js
@@ -0,0 +1,24 @@
+const prompts = require("prompts");
+
+module.exports = async () => {
+ banner(lang['welcome']['title']);
+ console.log(lang['welcome']['intro']);
+ console.log("");
+ console.log(lang['welcome']['disclaimer']);
+ console.log("");
+
+ const intro = await prompts([
+ {
+ type: 'confirm',
+ name: 'intro',
+ message: lang["welcome"]["continue"],
+ initial: true
+ }
+ ]);
+
+ if (Object.keys(intro).length === 0 || !intro.intro) {
+ process.exit(); // TODO: Reboot instead of this
+ }
+
+ keyboard();
+} \ No newline at end of file