diff --git a/.gitignore b/.gitignore index aa52fb4..abe85d8 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,7 @@ .DS_Store # json config -backend/sub-store.json -backend/root.json +backend/src/sub-store.json +backend/src/root.json # Logs logs diff --git a/backend/banner b/backend/banner new file mode 100644 index 0000000..83cfa38 --- /dev/null +++ b/backend/banner @@ -0,0 +1,14 @@ +/** + * ███████╗██╗ ██╗██████╗ ███████╗████████╗ ██████╗ ██████╗ ███████╗ + * ██╔════╝██║ ██║██╔══██╗ ██╔════╝╚══██╔══╝██╔═══██╗██╔══██╗██╔════╝ + * ███████╗██║ ██║██████╔╝█████╗███████╗ ██║ ██║ ██║██████╔╝█████╗ + * ╚════██║██║ ██║██╔══██╗╚════╝╚════██║ ██║ ██║ ██║██╔══██╗██╔══╝ + * ███████║╚██████╔╝██████╔╝ ███████║ ██║ ╚██████╔╝██║ ██║███████╗ + * ╚══════╝ ╚═════╝ ╚═════╝ ╚══════╝ ╚═╝ ╚═════╝ ╚═╝ ╚═╝╚══════╝ + * Advanced Subscription Manager for QX, Loon, Surge and Clash. + * @version: 1.5 + * @author: Peng-YM + * @github: https://github.com/Peng-YM/Sub-Store + * @documentation: https://www.notion.so/Sub-Store-6259586994d34c11a4ced5c406264b46 + */ + diff --git a/backend/package-lock.json b/backend/package-lock.json index aeb3fb6..fe94f26 100644 --- a/backend/package-lock.json +++ b/backend/package-lock.json @@ -1,57 +1,4283 @@ { "name": "sub-store-backend", "version": "0.0.1", - "lockfileVersion": 1, + "lockfileVersion": 2, "requires": true, - "dependencies": { - "@sindresorhus/is": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-3.1.2.tgz", - "integrity": "sha512-JiX9vxoKMmu8Y3Zr2RVathBL1Cdu4Nt4MuNWemt1Nc06A0RAin9c5FArkhGsyMBWfCu4zj+9b+GxtjAnE4qqLQ==" - }, - "@szmarczak/http-timer": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.5.tgz", - "integrity": "sha512-PyRA9sm1Yayuj5OIoJ1hGt2YISX45w9WcFbh6ddT0Z/0yaFxOtGLInr4jUfU1EAFVs0Yfyfev4RNwBlUaHdlDQ==", - "requires": { - "defer-to-connect": "^2.0.0" + "packages": { + "": { + "name": "sub-store-backend", + "version": "0.0.1", + "license": "GPL", + "dependencies": { + "body-parser": "^1.19.0", + "express": "^4.17.1", + "js-base64": "^3.7.2", + "request": "^2.88.2", + "static-js-yaml": "^1.0.0" + }, + "devDependencies": { + "axios": "^0.20.0", + "browserify": "^17.0.0", + "tinyify": "^3.0.0" } }, - "@types/cacheable-request": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.1.tgz", - "integrity": "sha512-ykFq2zmBGOCbpIXtoVbz4SKY5QriWPh3AjyU4G74RYbtt5yOc5OfaY75ftjg7mikMOla1CTGpX3lLbuJh8DTrQ==", - "requires": { - "@types/http-cache-semantics": "*", - "@types/keyv": "*", - "@types/node": "*", - "@types/responselike": "*" + "node_modules/@goto-bus-stop/common-shake": { + "version": "2.4.0", + "resolved": "https://registry.npmmirror.com/@goto-bus-stop/common-shake/-/common-shake-2.4.0.tgz", + "integrity": "sha512-LO+7v+UbxE3IyAS4Suf/KYB7Zq9DEIHibwDe6Wph4apNEfDyyxP7BSxzRS/Qa9lUH5gsm9eL9nF8EE1E0/nQkQ==", + "dev": true, + "dependencies": { + "acorn-walk": "^7.0.0", + "debug": "^3.2.6", + "escope": "^3.6.0" } }, - "@types/http-cache-semantics": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.0.tgz", - "integrity": "sha512-c3Xy026kOF7QOTn00hbIllV1dLR9hG9NkSrLQgCVs8NF6sBU+VGWjD3wLPhmh1TYAc7ugCFsvHYMN4VcBN1U1A==" - }, - "@types/keyv": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.1.tgz", - "integrity": "sha512-MPtoySlAZQ37VoLaPcTHCu1RWJ4llDkULYZIzOYxlhxBqYPB0RsRlmMU0R6tahtFe27mIdkHV+551ZWV4PLmVw==", - "requires": { - "@types/node": "*" + "node_modules/@goto-bus-stop/common-shake/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmmirror.com/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" } }, - "@types/node": { - "version": "14.6.4", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.6.4.tgz", - "integrity": "sha512-Wk7nG1JSaMfMpoMJDKUsWYugliB2Vy55pdjLpmLixeyMi7HizW2I/9QoxsPCkXl3dO+ZOVqPumKaDUv5zJu2uQ==" + "node_modules/@goto-bus-stop/common-shake/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true }, - "@types/responselike": { + "node_modules/@goto-bus-stop/envify": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/@goto-bus-stop/envify/-/envify-5.0.0.tgz", + "integrity": "sha512-xAnxuDWmwQxO8CgVuPTxKuNsKDfwyXXTyAabG4sNoK59H/ZMC7BHxTA/4ehtinsxbcH7/9L65F5VhyNdQfUyqA==", + "dev": true, + "dependencies": { + "acorn-node": "^2.0.1", + "dash-ast": "^2.0.1", + "multisplice": "^1.0.0", + "through2": "^2.0.5" + }, + "bin": { + "envify": "bin/envify" + } + }, + "node_modules/@goto-bus-stop/envify/node_modules/acorn-node": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/acorn-node/-/acorn-node-2.0.1.tgz", + "integrity": "sha512-VLR5sHqjk+8c5hrKeP2fWaIHb8eewsoxnZ8r2qpwRHXMHuC7KyOPflnOx9dLssVQUurzJ7rO0OzIFjHcndafWw==", + "dev": true, + "dependencies": { + "acorn": "^7.0.0", + "acorn-walk": "^7.0.0", + "xtend": "^4.0.2" + } + }, + "node_modules/@goto-bus-stop/envify/node_modules/dash-ast": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/dash-ast/-/dash-ast-2.0.1.tgz", + "integrity": "sha512-5TXltWJGc+RdnabUGzhRae1TRq6m4gr+3K2wQX0is5/F2yS6MJXJvLyI3ErAnsAXuJoGqvfVD5icRgim07DrxQ==", + "dev": true + }, + "node_modules/accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "dependencies": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmmirror.com/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-node": { + "version": "1.8.2", + "resolved": "https://registry.npmmirror.com/acorn-node/-/acorn-node-1.8.2.tgz", + "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==", + "dev": true, + "dependencies": { + "acorn": "^7.0.0", + "acorn-walk": "^7.0.0", + "xtend": "^4.0.2" + } + }, + "node_modules/acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmmirror.com/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/ajv": { + "version": "6.12.4", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.4.tgz", + "integrity": "sha512-eienB2c9qVQs2KWexhkrdMLVDoIQCz5KSeLxwg9Lzk4DOfBtIK9PQwwufcsn1jjGuf9WZmqPMbGxOzfcuphJCQ==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "node_modules/amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg==", + "devOptional": true, + "engines": { + "node": ">=0.4.2" + } + }, + "node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmmirror.com/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + }, + "node_modules/array-from": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/array-from/-/array-from-2.1.1.tgz", + "integrity": "sha512-GQTc6Uupx1FCavi5mPzBvVT7nEOeWMmUA9P95wpfpW1XwMSKs+KaymD5C2Up7KAUKg/mYwbsUYzdZWcoajlNZg==", + "dev": true + }, + "node_modules/asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "dependencies": { + "safer-buffer": "~2.1.0" + } + }, + "node_modules/asn1.js": { + "version": "5.4.1", + "resolved": "https://registry.npmmirror.com/asn1.js/-/asn1.js-5.4.1.tgz", + "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", + "dev": true, + "dependencies": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "safer-buffer": "^2.1.0" + } + }, + "node_modules/asn1.js/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmmirror.com/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "node_modules/assert": { + "version": "1.5.0", + "resolved": "https://registry.npmmirror.com/assert/-/assert-1.5.0.tgz", + "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", + "dev": true, + "dependencies": { + "object-assign": "^4.1.1", + "util": "0.10.3" + } + }, + "node_modules/assert-plus": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz", - "integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/assert/node_modules/inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha512-8nWq2nLTAwd02jTqJExUYFSD/fKq6VH9Y/oG2accc/kdI0V98Bag8d5a4gi3XHz73rDWa2PvTtvcWYquKqSENA==", + "dev": true + }, + "node_modules/assert/node_modules/util": { + "version": "0.10.3", + "resolved": "https://registry.npmmirror.com/util/-/util-0.10.3.tgz", + "integrity": "sha512-5KiHfsmkqacuKjkRkdV7SsfDJ2EGiPsK92s2MhNSY0craxjTdKTtqKsJaCWp4LW33ZZ0OPUv1WO/TFvNQRiQxQ==", + "dev": true, + "dependencies": { + "inherits": "2.0.1" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "node_modules/available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmmirror.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "engines": { + "node": "*" + } + }, + "node_modules/aws4": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.10.1.tgz", + "integrity": "sha512-zg7Hz2k5lI8kb7U32998pRRFin7zJlkfezGJjUc2heaD4Pw2wObakCDVzkKztTm/Ln7eiVvYsjqak0Ed4LkMDA==" + }, + "node_modules/axios": { + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.20.0.tgz", + "integrity": "sha512-ANA4rr2BDcmmAQLOKft2fufrtuvlqR+cXNNinUmvfeSNCOF98PZL+7M/v1zIdGo7OLjEA9J2gXJL+j4zGsl0bA==", + "deprecated": "Critical security vulnerability fixed in v0.21.1. For more information, see https://github.com/axios/axios/pull/3410", + "dev": true, + "dependencies": { + "follow-redirects": "^1.10.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmmirror.com/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true + }, + "node_modules/bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "dependencies": { + "tweetnacl": "^0.14.3" + } + }, + "node_modules/bn.js": { + "version": "5.2.0", + "resolved": "https://registry.npmmirror.com/bn.js/-/bn.js-5.2.0.tgz", + "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==", + "dev": true + }, + "node_modules/body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "dependencies": { + "bytes": "3.1.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==", + "dev": true + }, + "node_modules/browser-pack": { + "version": "6.1.0", + "resolved": "https://registry.npmmirror.com/browser-pack/-/browser-pack-6.1.0.tgz", + "integrity": "sha512-erYug8XoqzU3IfcU8fUgyHqyOXqIE4tUTTQ+7mqUjQlvnXkOO6OlT9c/ZoJVHYoAaqGxr09CN53G7XIsO4KtWA==", + "dev": true, + "dependencies": { + "combine-source-map": "~0.8.0", + "defined": "^1.0.0", + "JSONStream": "^1.0.3", + "safe-buffer": "^5.1.1", + "through2": "^2.0.0", + "umd": "^3.0.0" + }, + "bin": { + "browser-pack": "bin/cmd.js" + } + }, + "node_modules/browser-pack-flat": { + "version": "3.4.2", + "resolved": "https://registry.npmmirror.com/browser-pack-flat/-/browser-pack-flat-3.4.2.tgz", + "integrity": "sha512-TrUo6n2fGSOCYFAKkt/EkgenytAuuCI88fmXFA60aNFVHvz3CZEBTXYSvvXVpU6xpjM8lj/6vkC6Exn8KPjtPw==", + "dev": true, + "dependencies": { + "combine-source-map": "^0.8.0", + "convert-source-map": "^1.5.1", + "count-lines": "^0.1.2", + "dedent": "^0.7.0", + "estree-is-member-expression": "^1.0.0", + "estree-is-require": "^1.0.0", + "esutils": "^2.0.2", + "JSONStream": "^1.3.2", + "path-parse": "^1.0.5", + "scope-analyzer": "^2.0.0", + "stream-combiner": "^0.2.2", + "through2": "^2.0.3", + "transform-ast": "^2.4.2", + "umd": "^3.0.3", + "wrap-comment": "^1.0.0" + }, + "bin": { + "browser-pack-flat": "cli.js" + } + }, + "node_modules/browser-pack-flat/node_modules/convert-source-map": { + "version": "1.8.0", + "resolved": "https://registry.npmmirror.com/convert-source-map/-/convert-source-map-1.8.0.tgz", + "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.1" + } + }, + "node_modules/browser-process-hrtime": { + "version": "0.1.3", + "resolved": "https://registry.npmmirror.com/browser-process-hrtime/-/browser-process-hrtime-0.1.3.tgz", + "integrity": "sha512-bRFnI4NnjO6cnyLmOV/7PVoDEMJChlcfN0z4s1YMBY989/SvlfMI1lgCnkFUs53e9gQF+w7qu7XdllSTiSl8Aw==", + "dev": true + }, + "node_modules/browser-resolve": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/browser-resolve/-/browser-resolve-2.0.0.tgz", + "integrity": "sha512-7sWsQlYL2rGLy2IWm8WL8DCTJvYLc/qlOnsakDac87SOoCd16WLsaAMdCiAqsTNHIe+SXfaqyxyo6THoWqs8WQ==", + "dev": true, + "dependencies": { + "resolve": "^1.17.0" + } + }, + "node_modules/browser-unpack": { + "version": "1.4.2", + "resolved": "https://registry.npmmirror.com/browser-unpack/-/browser-unpack-1.4.2.tgz", + "integrity": "sha512-uHkiY4bmXjjBBWoKH1aRnEGTQxUUCCcVtoJfH9w1lmGGjETY4u93Zk+GRYkCE/SRMrdoMTINQ/1/manr/3aMVA==", + "dev": true, + "dependencies": { + "acorn-node": "^1.5.2", + "concat-stream": "^1.5.0", + "minimist": "^1.1.1" + }, + "bin": { + "browser-unpack": "bin/cmd.js" + } + }, + "node_modules/browserify": { + "version": "17.0.0", + "resolved": "https://registry.npmmirror.com/browserify/-/browserify-17.0.0.tgz", + "integrity": "sha512-SaHqzhku9v/j6XsQMRxPyBrSP3gnwmE27gLJYZgMT2GeK3J0+0toN+MnuNYDfHwVGQfLiMZ7KSNSIXHemy905w==", + "dev": true, + "dependencies": { + "assert": "^1.4.0", + "browser-pack": "^6.0.1", + "browser-resolve": "^2.0.0", + "browserify-zlib": "~0.2.0", + "buffer": "~5.2.1", + "cached-path-relative": "^1.0.0", + "concat-stream": "^1.6.0", + "console-browserify": "^1.1.0", + "constants-browserify": "~1.0.0", + "crypto-browserify": "^3.0.0", + "defined": "^1.0.0", + "deps-sort": "^2.0.1", + "domain-browser": "^1.2.0", + "duplexer2": "~0.1.2", + "events": "^3.0.0", + "glob": "^7.1.0", + "has": "^1.0.0", + "htmlescape": "^1.1.0", + "https-browserify": "^1.0.0", + "inherits": "~2.0.1", + "insert-module-globals": "^7.2.1", + "JSONStream": "^1.0.3", + "labeled-stream-splicer": "^2.0.0", + "mkdirp-classic": "^0.5.2", + "module-deps": "^6.2.3", + "os-browserify": "~0.3.0", + "parents": "^1.0.1", + "path-browserify": "^1.0.0", + "process": "~0.11.0", + "punycode": "^1.3.2", + "querystring-es3": "~0.2.0", + "read-only-stream": "^2.0.0", + "readable-stream": "^2.0.2", + "resolve": "^1.1.4", + "shasum-object": "^1.0.0", + "shell-quote": "^1.6.1", + "stream-browserify": "^3.0.0", + "stream-http": "^3.0.0", + "string_decoder": "^1.1.1", + "subarg": "^1.0.0", + "syntax-error": "^1.1.1", + "through2": "^2.0.0", + "timers-browserify": "^1.0.1", + "tty-browserify": "0.0.1", + "url": "~0.11.0", + "util": "~0.12.0", + "vm-browserify": "^1.0.0", + "xtend": "^4.0.0" + }, + "bin": { + "browserify": "bin/cmd.js" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "dev": true, + "dependencies": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "dev": true, + "dependencies": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "node_modules/browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "dev": true, + "dependencies": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/browserify-rsa": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/browserify-rsa/-/browserify-rsa-4.1.0.tgz", + "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", + "dev": true, + "dependencies": { + "bn.js": "^5.0.0", + "randombytes": "^2.0.1" + } + }, + "node_modules/browserify-sign": { + "version": "4.2.1", + "resolved": "https://registry.npmmirror.com/browserify-sign/-/browserify-sign-4.2.1.tgz", + "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", + "dev": true, + "dependencies": { + "bn.js": "^5.1.1", + "browserify-rsa": "^4.0.1", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "elliptic": "^6.5.3", + "inherits": "^2.0.4", + "parse-asn1": "^5.1.5", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + } + }, + "node_modules/browserify-sign/node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/browserify-sign/node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/browserify-sign/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + }, + "node_modules/browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmmirror.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "dev": true, + "dependencies": { + "pako": "~1.0.5" + } + }, + "node_modules/browserify/node_modules/punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmmirror.com/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", + "dev": true + }, + "node_modules/buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmmirror.com/buffer/-/buffer-5.2.1.tgz", + "integrity": "sha512-c+Ko0loDaFfuPWiL02ls9Xd3GO3cPVmUobQ6t3rXNUk304u6hGq+8N/kFi+QEIKhzK3uwolVhLzszmfLmMLnqg==", + "dev": true, + "dependencies": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "node_modules/buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==", + "dev": true + }, + "node_modules/builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==", + "dev": true + }, + "node_modules/bundle-collapser": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/bundle-collapser/-/bundle-collapser-1.4.0.tgz", + "integrity": "sha512-Gd3K3+3KI1Utuk+gwAvuOVOjT/2XLGL8tU6FwDKk04LlOZkYfT0pwQllsG1Dv8RRhgcjNxZSDmmSXb0AOkwSwg==", + "dev": true, + "dependencies": { + "browser-pack": "^6.0.2", + "browser-unpack": "^1.1.0", + "concat-stream": "^1.5.0", + "falafel": "^2.1.0", + "minimist": "^1.1.1", + "through2": "^2.0.0" + }, + "bin": { + "bundle-collapser": "bin/cmd.js" + } + }, + "node_modules/bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cached-path-relative": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/cached-path-relative/-/cached-path-relative-1.1.0.tgz", + "integrity": "sha512-WF0LihfemtesFcJgO7xfOoOcnWzY/QHR4qeDqV44jPU3HTI54+LnfXK3SA27AVVGCdZFgjjFFaqUA9Jx7dMJZA==", + "dev": true + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "node_modules/call-matcher": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/call-matcher/-/call-matcher-2.0.0.tgz", + "integrity": "sha512-CIDC5wZZfZ2VjZu849WQckS58Z3pJXFfRaSjNjgo/q3in5zxkhTwVL83vttgtmvyLG7TuDlLlBya7SKP6CjDIA==", + "dev": true, + "dependencies": { + "deep-equal": "^1.0.0", + "espurify": "^2.0.0", + "estraverse": "^4.0.0" + } + }, + "node_modules/caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" + }, + "node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmmirror.com/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/combine-source-map": { + "version": "0.8.0", + "resolved": "https://registry.npmmirror.com/combine-source-map/-/combine-source-map-0.8.0.tgz", + "integrity": "sha512-UlxQ9Vw0b/Bt/KYwCFqdEwsQ1eL8d1gibiFb7lxQJFdvTgc2hIZi6ugsg+kyhzhPV+QEpUiEIwInIAIrgoEkrg==", + "dev": true, + "dependencies": { + "convert-source-map": "~1.1.0", + "inline-source-map": "~0.6.0", + "lodash.memoize": "~3.0.3", + "source-map": "~0.5.3" + } + }, + "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/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmmirror.com/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "node_modules/common-shakeify": { + "version": "0.6.2", + "resolved": "https://registry.npmmirror.com/common-shakeify/-/common-shakeify-0.6.2.tgz", + "integrity": "sha512-vxlXr26fqxm8ZJ0jh8MlvpeN6IbyUKqsVmgb4rAjDM/0f4nKebiHaAXpF/Mm86W9ENR5iSI7UOnUTylpVyplUA==", + "dev": true, + "dependencies": { + "@goto-bus-stop/common-shake": "^2.2.0", + "convert-source-map": "^1.5.1", + "through2": "^2.0.3", + "transform-ast": "^2.4.3", + "wrap-comment": "^1.0.1" + } + }, + "node_modules/common-shakeify/node_modules/convert-source-map": { + "version": "1.8.0", + "resolved": "https://registry.npmmirror.com/convert-source-map/-/convert-source-map-1.8.0.tgz", + "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.1" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmmirror.com/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmmirror.com/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "engines": [ + "node >= 0.8" + ], + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/console-browserify": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/console-browserify/-/console-browserify-1.2.0.tgz", + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", + "dev": true + }, + "node_modules/constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==", + "dev": true + }, + "node_modules/content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "dependencies": { + "safe-buffer": "5.1.2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "1.1.3", + "resolved": "https://registry.npmmirror.com/convert-source-map/-/convert-source-map-1.1.3.tgz", + "integrity": "sha512-Y8L5rp6jo+g9VEPgvqNfEopjTR4OTYct8lXlS8iVQdmnjDvbdbzYe9rjtFCB9egC86JoNCU61WRY+ScjkZpnIg==", + "dev": true + }, + "node_modules/cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + }, + "node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "node_modules/count-lines": { + "version": "0.1.2", + "resolved": "https://registry.npmmirror.com/count-lines/-/count-lines-0.1.2.tgz", + "integrity": "sha512-YS8P4UYXX/hrDyLU3r/A5OcCNwdNbJFJckbe8j+x2Jhxsr2J4/rYl0sDwOljLZL7Uxc4s7mRSNcQD8dSjobz+g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/create-ecdh": { + "version": "4.0.4", + "resolved": "https://registry.npmmirror.com/create-ecdh/-/create-ecdh-4.0.4.tgz", + "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", + "dev": true, + "dependencies": { + "bn.js": "^4.1.0", + "elliptic": "^6.5.3" + } + }, + "node_modules/create-ecdh/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmmirror.com/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "node_modules/create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "dev": true, + "dependencies": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "node_modules/create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmmirror.com/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "dev": true, + "dependencies": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "node_modules/crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmmirror.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "dev": true, + "dependencies": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + }, + "engines": { + "node": "*" + } + }, + "node_modules/d": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "dev": true, + "dependencies": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } + }, + "node_modules/dash-ast": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/dash-ast/-/dash-ast-1.0.0.tgz", + "integrity": "sha512-Vy4dx7gquTeMcQR/hDkYLGUnwVil6vk4FOOct+djUnHOUWt+zJPJAaRIXaAFkPXtJjvlY7o3rfRu0/3hpnwoUA==", + "dev": true + }, + "node_modules/dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dependencies": { + "assert-plus": "^1.0.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/dedent": { + "version": "0.7.0", + "resolved": "https://registry.npmmirror.com/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", + "dev": true + }, + "node_modules/deep-equal": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/deep-equal/-/deep-equal-1.1.1.tgz", + "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", + "dev": true, + "dependencies": { + "is-arguments": "^1.0.4", + "is-date-object": "^1.0.1", + "is-regex": "^1.0.4", + "object-is": "^1.0.1", + "object-keys": "^1.1.1", + "regexp.prototype.flags": "^1.2.0" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmmirror.com/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "node_modules/define-properties": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/define-properties/-/define-properties-1.1.4.tgz", + "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", + "dev": true, + "dependencies": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/defined": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/defined/-/defined-1.0.0.tgz", + "integrity": "sha512-Y2caI5+ZwS5c3RiNDJ6u53VhQHv+hHKwhkI1iHvceKUHw9Df6EK2zRLfjejRgMuCuxK7PfSWIMwWecceVvThjQ==", + "dev": true + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/deps-sort": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/deps-sort/-/deps-sort-2.0.1.tgz", + "integrity": "sha512-1orqXQr5po+3KI6kQb9A4jnXT1PBwggGl2d7Sq2xsnOeI9GPcE/tGcF9UiSZtZBM7MukY4cAh7MemS6tZYipfw==", + "dev": true, + "dependencies": { + "JSONStream": "^1.0.3", + "shasum-object": "^1.0.0", + "subarg": "^1.0.0", + "through2": "^2.0.0" + }, + "bin": { + "deps-sort": "bin/cmd.js" + } + }, + "node_modules/des.js": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/des.js/-/des.js-1.0.1.tgz", + "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, + "node_modules/detective": { + "version": "5.2.0", + "resolved": "https://registry.npmmirror.com/detective/-/detective-5.2.0.tgz", + "integrity": "sha512-6SsIx+nUUbuK0EthKjv0zrdnajCCXVYGmbYYiYjFVpzcjwEs/JMDZ8tPRG29J/HhN56t3GJp2cGSWDRjjot8Pg==", + "dev": true, + "dependencies": { + "acorn-node": "^1.6.1", + "defined": "^1.0.0", + "minimist": "^1.1.1" + }, + "bin": { + "detective": "bin/detective.js" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmmirror.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "dev": true, + "dependencies": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + } + }, + "node_modules/diffie-hellman/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmmirror.com/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "node_modules/domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", + "dev": true, + "engines": { + "node": ">=0.4", + "npm": ">=1.2" + } + }, + "node_modules/duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmmirror.com/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", + "dev": true + }, + "node_modules/duplexer2": { + "version": "0.1.4", + "resolved": "https://registry.npmmirror.com/duplexer2/-/duplexer2-0.1.4.tgz", + "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==", + "dev": true, + "dependencies": { + "readable-stream": "^2.0.2" + } + }, + "node_modules/duplexify": { + "version": "4.1.2", + "resolved": "https://registry.npmmirror.com/duplexify/-/duplexify-4.1.2.tgz", + "integrity": "sha512-fz3OjcNCHmRP12MJoZMPglx8m4rrFP8rovnk4vT8Fs+aonZoCwGg10dSsQsfP/E62eZcPTMSMP6686fu9Qlqtw==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.4.1", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1", + "stream-shift": "^1.0.0" + } + }, + "node_modules/duplexify/node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "dependencies": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, + "node_modules/elliptic": { + "version": "6.5.4", + "resolved": "https://registry.npmmirror.com/elliptic/-/elliptic-6.5.4.tgz", + "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "dev": true, + "dependencies": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/elliptic/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmmirror.com/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "node_modules/elliptic/node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/es-abstract": { + "version": "1.20.1", + "resolved": "https://registry.npmmirror.com/es-abstract/-/es-abstract-1.20.1.tgz", + "integrity": "sha512-WEm2oBhfoI2sImeM4OF2zE2V3BYdSF+KnSi9Sidz51fQHd7+JuF8Xgcj9/0o+OWeIeIS/MiuNnlruQrJf16GQA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "function.prototype.name": "^1.1.5", + "get-intrinsic": "^1.1.1", + "get-symbol-description": "^1.0.0", + "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.3", + "is-callable": "^1.2.4", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "regexp.prototype.flags": "^1.4.3", + "string.prototype.trimend": "^1.0.5", + "string.prototype.trimstart": "^1.0.5", + "unbox-primitive": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es5-ext": { + "version": "0.10.61", + "resolved": "https://registry.npmmirror.com/es5-ext/-/es5-ext-0.10.61.tgz", + "integrity": "sha512-yFhIqQAzu2Ca2I4SE2Au3rxVfmohU9Y7wqGR+s7+H7krk26NXhIRAZDgqd6xqjCEFUomDEA3/Bo/7fKmIkW1kA==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.3", + "next-tick": "^1.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", + "dev": true, + "dependencies": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "node_modules/es6-map": { + "version": "0.1.5", + "resolved": "https://registry.npmmirror.com/es6-map/-/es6-map-0.1.5.tgz", + "integrity": "sha512-mz3UqCh0uPCIqsw1SSAkB/p0rOzF/M0V++vyN7JqlPtSW/VsYgQBvVvqMLmfBuyMzTpLnNqi6JmcSizs4jy19A==", + "dev": true, + "dependencies": { + "d": "1", + "es5-ext": "~0.10.14", + "es6-iterator": "~2.0.1", + "es6-set": "~0.1.5", + "es6-symbol": "~3.1.1", + "event-emitter": "~0.3.5" + } + }, + "node_modules/es6-set": { + "version": "0.1.5", + "resolved": "https://registry.npmmirror.com/es6-set/-/es6-set-0.1.5.tgz", + "integrity": "sha512-7S8YXIcUfPMOr3rqJBVMePAbRsD1nWeSMQ86K/lDI76S3WKXz+KWILvTIPbTroubOkZTGh+b+7/xIIphZXNYbA==", + "dev": true, + "dependencies": { + "d": "1", + "es5-ext": "~0.10.14", + "es6-iterator": "~2.0.1", + "es6-symbol": "3.1.1", + "event-emitter": "~0.3.5" + } + }, + "node_modules/es6-set/node_modules/es6-symbol": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/es6-symbol/-/es6-symbol-3.1.1.tgz", + "integrity": "sha512-exfuQY8UGtn/N+gL1iKkH8fpNd5sJ760nJq6mmZAHldfxMD5kX07lbQuYlspoXsuknXNv9Fb7y2GsPOnQIbxHg==", + "dev": true, + "dependencies": { + "d": "1", + "es5-ext": "~0.10.14" + } + }, + "node_modules/es6-symbol": { + "version": "3.1.3", + "resolved": "https://registry.npmmirror.com/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "dev": true, + "dependencies": { + "d": "^1.0.1", + "ext": "^1.1.2" + } + }, + "node_modules/es6-weak-map": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/es6-weak-map/-/es6-weak-map-2.0.3.tgz", + "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", + "dev": true, + "dependencies": { + "d": "1", + "es5-ext": "^0.10.46", + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.1" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/escodegen": { + "version": "1.14.3", + "resolved": "https://registry.npmmirror.com/escodegen/-/escodegen-1.14.3.tgz", + "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", + "dev": true, + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=4.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/escodegen/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/escope": { + "version": "3.6.0", + "resolved": "https://registry.npmmirror.com/escope/-/escope-3.6.0.tgz", + "integrity": "sha512-75IUQsusDdalQEW/G/2esa87J7raqdJF+Ca0/Xm5C3Q58Nr4yVYjZGp/P1+2xiEVgXRrA39dpRb8LcshajbqDQ==", + "dev": true, + "dependencies": { + "es6-map": "^0.1.3", + "es6-weak-map": "^2.0.1", + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmmirror.com/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/espurify": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/espurify/-/espurify-2.1.1.tgz", + "integrity": "sha512-zttWvnkhcDyGOhSH4vO2qCBILpdCMv/MX8lp4cqgRkQoDRGK2oZxi2GfWhlP2dIXmk7BaKeOTuzbHhyC68o8XQ==", + "dev": true + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmmirror.com/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmmirror.com/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmmirror.com/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-is-function": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/estree-is-function/-/estree-is-function-1.0.0.tgz", + "integrity": "sha512-nSCWn1jkSq2QAtkaVLJZY2ezwcFO161HVc174zL1KPW3RJ+O6C3eJb8Nx7OXzvhoEv+nLgSR1g71oWUHUDTrJA==", + "dev": true + }, + "node_modules/estree-is-identifier": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/estree-is-identifier/-/estree-is-identifier-1.0.0.tgz", + "integrity": "sha512-2BDRGrkQJV/NhCAmmE33A35WAaxq3WQaGHgQuD//7orGWfpFqj8Srkwvx0TH+20yIdOF1yMQwi8anv5ISec2AQ==", + "dev": true + }, + "node_modules/estree-is-member-expression": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/estree-is-member-expression/-/estree-is-member-expression-1.0.0.tgz", + "integrity": "sha512-Ec+X44CapIGExvSZN+pGkmr5p7HwUVQoPQSd458Lqwvaf4/61k/invHSh4BYK8OXnCkfEhWuIoG5hayKLQStIg==", + "dev": true + }, + "node_modules/estree-is-require": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/estree-is-require/-/estree-is-require-1.0.0.tgz", + "integrity": "sha512-oWxQdSEmnUwNZsDQYiBNpVxKEhMmsJQSSxnDrwsr1MWtooCLfhgzsNGzmokdmfK0EzEIS5V4LPvqxv1Kmb1vvA==", + "dev": true, + "dependencies": { + "estree-is-identifier": "^1.0.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmmirror.com/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==", + "dev": true, + "dependencies": { + "d": "1", + "es5-ext": "~0.10.14" + } + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmmirror.com/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dev": true, + "dependencies": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/express": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "dependencies": { + "accepts": "~1.3.7", + "array-flatten": "1.1.1", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", + "content-type": "~1.0.4", + "cookie": "0.4.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.1.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.5", + "qs": "6.7.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.1.2", + "send": "0.17.1", + "serve-static": "1.14.1", + "setprototypeof": "1.1.1", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/ext": { + "version": "1.6.0", + "resolved": "https://registry.npmmirror.com/ext/-/ext-1.6.0.tgz", + "integrity": "sha512-sdBImtzkq2HpkdRLtlLWDa6w4DX22ijZLKx8BMPUuKe1c5lbN6xwQDQCxSfxBQnHZ13ls/FH0MQZx/q/gr6FQg==", + "dev": true, + "dependencies": { + "type": "^2.5.0" + } + }, + "node_modules/ext/node_modules/type": { + "version": "2.6.0", + "resolved": "https://registry.npmmirror.com/type/-/type-2.6.0.tgz", + "integrity": "sha512-eiDBDOmkih5pMbo9OqsqPRGMljLodLcwd5XD5JbtNB0o89xZAwynY9EdCDsJU7LtcVCClu9DvM7/0Ep1hYX3EQ==", + "dev": true + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "node_modules/extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "engines": [ + "node >=0.6.0" + ] + }, + "node_modules/falafel": { + "version": "2.2.5", + "resolved": "https://registry.npmmirror.com/falafel/-/falafel-2.2.5.tgz", + "integrity": "sha512-HuC1qF9iTnHDnML9YZAdCDQwT0yKl/U55K4XSUXqGAA2GLoafFgWRqdAbhWJxXaYD4pyoVxAJ8wH670jMpI9DQ==", + "dependencies": { + "acorn": "^7.1.1", + "isarray": "^2.0.1" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/falafel/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmmirror.com/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmmirror.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "node_modules/fast-safe-stringify": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", + "dev": true + }, + "node_modules/finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/follow-redirects": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.0.tgz", + "integrity": "sha512-aq6gF1BEKje4a9i9+5jimNFIpq4Q1WiwBToeRK5NvZBd/TRsmW8BsJfOEGkr76TbOyPVD3OVDN910EcUNtRYEA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmmirror.com/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "node_modules/forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "engines": { + "node": "*" + } + }, + "node_modules/form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" + } + }, + "node_modules/forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/from2": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/from2/-/from2-2.3.0.tgz", + "integrity": "sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "node_modules/from2-string": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/from2-string/-/from2-string-1.1.0.tgz", + "integrity": "sha512-m8vCh+KnXXXBtfF2VUbiYlQ+nczLcntB0BrtNgpmLkHylhObe9WF1b2LZjBBzrZzA6P4mkEla6ZYQoOUTG8cYA==", + "dev": true, + "dependencies": { + "from2": "^2.0.3" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "node_modules/function.prototype.name": { + "version": "1.1.5", + "resolved": "https://registry.npmmirror.com/function.prototype.name/-/function.prototype.name-1.1.5.tgz", + "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0", + "functions-have-names": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmmirror.com/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true + }, + "node_modules/get-assigned-identifiers": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/get-assigned-identifiers/-/get-assigned-identifiers-1.2.0.tgz", + "integrity": "sha512-mBBwmeGTrxEMO4pMaaf/uUEFHnYtwr8FTe8Y/mer4rcV/bye0qGm6pw1bGZFGStxC5O76c5ZAVBGnqHmOaJpdQ==", + "dev": true + }, + "node_modules/get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, + "node_modules/get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dependencies": { + "assert-plus": "^1.0.0" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmmirror.com/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "engines": { + "node": ">=4" + } + }, + "node_modules/har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "deprecated": "this library is no longer supported", + "dependencies": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==", + "dev": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true + }, + "node_modules/has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.1" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hash-base": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/hash-base/-/hash-base-3.1.0.tgz", + "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/hash-base/node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/hash-base/node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/hash-base/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + }, + "node_modules/hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmmirror.com/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "node_modules/hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", + "dev": true, + "dependencies": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/htmlescape": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/htmlescape/-/htmlescape-1.1.1.tgz", + "integrity": "sha512-eVcrzgbR4tim7c7soKQKtxa/kQM4TzjnlU83rcZ9bHU6t31ehfV7SktN6McWgwPWg+JYMA/O3qpGxBvFq1z2Jg==", + "dev": true, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/http-errors": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dependencies": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + }, + "engines": { + "node": ">=0.8", + "npm": ">=1.3.7" + } + }, + "node_modules/https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==", + "dev": true + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmmirror.com/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "node_modules/inline-source-map": { + "version": "0.6.2", + "resolved": "https://registry.npmmirror.com/inline-source-map/-/inline-source-map-0.6.2.tgz", + "integrity": "sha512-0mVWSSbNDvedDWIN4wxLsdPM4a7cIPcpyMxj3QZ406QRwQ6ePGB1YIHxVPjqpcUGbWQ5C+nHTwGNWAGvt7ggVA==", + "dev": true, + "dependencies": { + "source-map": "~0.5.3" + } + }, + "node_modules/insert-module-globals": { + "version": "7.2.1", + "resolved": "https://registry.npmmirror.com/insert-module-globals/-/insert-module-globals-7.2.1.tgz", + "integrity": "sha512-ufS5Qq9RZN+Bu899eA9QCAYThY+gGW7oRkmb0vC93Vlyu/CFGcH0OYPEjVkDXA5FEbTt1+VWzdoOD3Ny9N+8tg==", + "dev": true, + "dependencies": { + "acorn-node": "^1.5.2", + "combine-source-map": "^0.8.0", + "concat-stream": "^1.6.1", + "is-buffer": "^1.1.0", + "JSONStream": "^1.0.3", + "path-is-absolute": "^1.0.1", + "process": "~0.11.0", + "through2": "^2.0.0", + "undeclared-identifiers": "^1.1.2", + "xtend": "^4.0.0" + }, + "bin": { + "insert-module-globals": "bin/cmd.js" + } + }, + "node_modules/internal-slot": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/internal-slot/-/internal-slot-1.0.3.tgz", + "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "dependencies": { + "has-bigints": "^1.0.1" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmmirror.com/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "node_modules/is-callable": { + "version": "1.2.4", + "resolved": "https://registry.npmmirror.com/is-callable/-/is-callable-1.2.4.tgz", + "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-core-module": { + "version": "2.9.0", + "resolved": "https://registry.npmmirror.com/is-core-module/-/is-core-module-2.9.0.tgz", + "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmmirror.com/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmmirror.com/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmmirror.com/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + } + }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmmirror.com/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.9", + "resolved": "https://registry.npmmirror.com/is-typed-array/-/is-typed-array-1.1.9.tgz", + "integrity": "sha512-kfrlnTTn8pZkfpJMUgYD7YZ3qzeJgWUn8XfVYBARc4wnmNOmLbmuuaAs3q5fvB0UJOn6yHAKaGTPM7d6ezoD/A==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "es-abstract": "^1.20.0", + "for-each": "^0.3.3", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + }, + "node_modules/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "node_modules/isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + }, + "node_modules/js-base64": { + "version": "3.7.2", + "resolved": "https://registry.npmmirror.com/js-base64/-/js-base64-3.7.2.tgz", + "integrity": "sha512-NnRs6dsyqUXejqk/yv2aiXlAvOs56sLkX6nUdeaNezI5LFFLlsZjOThmwnrcwh5ZZRwZlCMnVAY3CvhIhoVEKQ==" + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmmirror.com/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" + }, + "node_modules/json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" + }, + "node_modules/jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmmirror.com/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", + "dev": true, + "engines": [ + "node >= 0.2.0" + ] + }, + "node_modules/JSONStream": { + "version": "1.3.5", + "resolved": "https://registry.npmmirror.com/JSONStream/-/JSONStream-1.3.5.tgz", + "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", + "dev": true, + "dependencies": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + }, + "bin": { + "JSONStream": "bin.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "engines": [ + "node >=0.6.0" + ], + "dependencies": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "node_modules/labeled-stream-splicer": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/labeled-stream-splicer/-/labeled-stream-splicer-2.0.2.tgz", + "integrity": "sha512-Ca4LSXFFZUjPScRaqOcFxneA0VpKZr4MMYCljyQr4LIewTLb3Y0IUTIsnBBsVubIeEfxeSZpSjSsRM8APEQaAw==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "stream-splicer": "^2.0.0" + } + }, + "node_modules/levn": { + "version": "0.3.0", + "resolved": "https://registry.npmmirror.com/levn/-/levn-0.3.0.tgz", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", + "dev": true, + "dependencies": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lodash.memoize": { + "version": "3.0.4", + "resolved": "https://registry.npmmirror.com/lodash.memoize/-/lodash.memoize-3.0.4.tgz", + "integrity": "sha512-eDn9kqrAmVUC1wmZvlQ6Uhde44n+tXpqPrN8olQJbttgh0oKclk+SF54P47VEGE9CEiMeRwAP8BaM7UHvBkz2A==", + "dev": true + }, + "node_modules/magic-string": { + "version": "0.23.2", + "resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.23.2.tgz", + "integrity": "sha512-oIUZaAxbcxYIp4AyLafV6OVKoB3YouZs0UTCJ8mOKBHNyJgGDaMJ4TgA+VylJh6fx7EQCC52XkbURxxG9IoJXA==", + "dev": true, + "dependencies": { + "sourcemap-codec": "^1.4.1" + } + }, + "node_modules/md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmmirror.com/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "dev": true, + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + }, + "node_modules/merge-source-map": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/merge-source-map/-/merge-source-map-1.0.4.tgz", + "integrity": "sha512-PGSmS0kfnTnMJCzJ16BLLCEe6oeYCamKFFdQKshi4BmM6FUwipjVOcBFGxqtQtirtAG4iZvHlqST9CpZKqlRjA==", + "dev": true, + "dependencies": { + "source-map": "^0.5.6" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmmirror.com/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "dev": true, + "dependencies": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + }, + "bin": { + "miller-rabin": "bin/miller-rabin" + } + }, + "node_modules/miller-rabin/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmmirror.com/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.44.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", + "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.27", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", + "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", + "dependencies": { + "mime-db": "1.44.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minify-stream": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/minify-stream/-/minify-stream-2.1.0.tgz", + "integrity": "sha512-P5xE4EQRkn7Td54VGcgfDMFx1jmKPPIXCdcMfrbXS6cNHK4dO1LXwtYFb48hHrSmZfT+jlGImvHgSZEkbpNtCw==", + "dev": true, + "dependencies": { + "concat-stream": "^2.0.0", + "convert-source-map": "^1.5.0", + "duplexify": "^4.1.1", + "from2-string": "^1.1.0", + "terser": "^4.7.0", + "xtend": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/minify-stream/node_modules/concat-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/concat-stream/-/concat-stream-2.0.0.tgz", + "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", + "dev": true, + "engines": [ + "node >= 6.0" + ], + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.0.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/minify-stream/node_modules/convert-source-map": { + "version": "1.8.0", + "resolved": "https://registry.npmmirror.com/convert-source-map/-/convert-source-map-1.8.0.tgz", + "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.1" + } + }, + "node_modules/minify-stream/node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true + }, + "node_modules/minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==", + "dev": true + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.6", + "resolved": "https://registry.npmmirror.com/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", + "dev": true + }, + "node_modules/mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmmirror.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", + "dev": true + }, + "node_modules/module-deps": { + "version": "6.2.3", + "resolved": "https://registry.npmmirror.com/module-deps/-/module-deps-6.2.3.tgz", + "integrity": "sha512-fg7OZaQBcL4/L+AK5f4iVqf9OMbCclXfy/znXRxTVhJSeW5AIlS9AwheYwDaXM3lVW7OBeaeUEY3gbaC6cLlSA==", + "dev": true, + "dependencies": { + "browser-resolve": "^2.0.0", + "cached-path-relative": "^1.0.2", + "concat-stream": "~1.6.0", + "defined": "^1.0.0", + "detective": "^5.2.0", + "duplexer2": "^0.1.2", + "inherits": "^2.0.1", + "JSONStream": "^1.0.3", + "parents": "^1.0.0", + "readable-stream": "^2.0.2", + "resolve": "^1.4.0", + "stream-combiner2": "^1.1.1", + "subarg": "^1.0.0", + "through2": "^2.0.0", + "xtend": "^4.0.0" + }, + "bin": { + "module-deps": "bin/cmd.js" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "node_modules/multi-stage-sourcemap": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/multi-stage-sourcemap/-/multi-stage-sourcemap-0.2.1.tgz", + "integrity": "sha512-umaOM+8BZByZIB/ciD3dQLzTv50rEkkGJV78ta/tIVc/J/rfGZY5y1R+fBD3oTaolx41mK8rRcyGtYbDXlzx8Q==", + "dev": true, + "dependencies": { + "source-map": "^0.1.34" + } + }, + "node_modules/multi-stage-sourcemap/node_modules/source-map": { + "version": "0.1.43", + "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.1.43.tgz", + "integrity": "sha512-VtCvB9SIQhk3aF6h+N85EaqIaBFIAfZ9Cu+NJHHVvc8BbEcnvDcFw6sqQ2dQrT6SlOrZq3tIvyD9+EGq/lJryQ==", + "dev": true, + "dependencies": { + "amdefine": ">=0.0.4" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/multisplice": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/multisplice/-/multisplice-1.0.0.tgz", + "integrity": "sha512-KU5tVjIdTGsMb92JlWwEZCGrvtI1ku9G9GuNbWdQT/Ici1ztFXX0L8lWpbbC3pISVMfBNL56wdqplHvva2XSlA==", + "dev": true + }, + "node_modules/mutexify": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/mutexify/-/mutexify-1.4.0.tgz", + "integrity": "sha512-pbYSsOrSB/AKN5h/WzzLRMFgZhClWccf2XIB4RSMC8JbquiB0e0/SH5AIfdQMdyHmYtv4seU7yV/TvAwPLJ1Yg==", + "dev": true, + "dependencies": { + "queue-tick": "^1.0.0" + } + }, + "node_modules/nanobench": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/nanobench/-/nanobench-2.1.1.tgz", + "integrity": "sha512-z+Vv7zElcjN+OpzAxAquUayFLGK3JI/ubCl0Oh64YQqsTGG09CGqieJVQw4ui8huDnnAgrvTv93qi5UaOoNj8A==", + "dev": true, + "dependencies": { + "browser-process-hrtime": "^0.1.2", + "chalk": "^1.1.3", + "mutexify": "^1.1.0", + "pretty-hrtime": "^1.0.2" + }, + "bin": { + "nanobench": "run.js", + "nanobench-compare": "compare.js" + } + }, + "node_modules/negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/next-tick": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/next-tick/-/next-tick-1.1.0.tgz", + "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==", + "dev": true + }, + "node_modules/oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "engines": { + "node": "*" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmmirror.com/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.12.1", + "resolved": "https://registry.npmmirror.com/object-inspect/-/object-inspect-1.12.1.tgz", + "integrity": "sha512-Y/jF6vnvEtOPGiKD1+q+X0CiUYRQtEHp89MLLUJ7TUivtH8Ugn2+3A7Rynqk7BRsAoqeOQWnFnjpDrKSxDgIGA==", + "dev": true + }, + "node_modules/object-is": { + "version": "1.1.5", + "resolved": "https://registry.npmmirror.com/object-is/-/object-is-1.1.5.tgz", + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmmirror.com/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmmirror.com/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dev": true, + "dependencies": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmmirror.com/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==", + "dev": true + }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmmirror.com/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "dev": true + }, + "node_modules/parents": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/parents/-/parents-1.0.1.tgz", + "integrity": "sha512-mXKF3xkoUt5td2DoxpLmtOmZvko9VfFpwRwkKDHSNvgmpLAeBo18YDhcPbBzJq+QLCHMbGOfzia2cX4U+0v9Mg==", + "dev": true, + "dependencies": { + "path-platform": "~0.11.15" + } + }, + "node_modules/parse-asn1": { + "version": "5.1.6", + "resolved": "https://registry.npmmirror.com/parse-asn1/-/parse-asn1-5.1.6.tgz", + "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", + "dev": true, + "dependencies": { + "asn1.js": "^5.2.0", + "browserify-aes": "^1.0.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "dev": true + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmmirror.com/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/path-platform": { + "version": "0.11.15", + "resolved": "https://registry.npmmirror.com/path-platform/-/path-platform-0.11.15.tgz", + "integrity": "sha512-Y30dB6rab1A/nfEKsZxmr01nUotHX0c/ZiIAsCTatEe1CmS5Pm5He7fZ195bPT7RdquoaL8lLxFCMQi/bS7IJg==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" + }, + "node_modules/pbkdf2": { + "version": "3.1.2", + "resolved": "https://registry.npmmirror.com/pbkdf2/-/pbkdf2-3.1.2.tgz", + "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", + "dev": true, + "dependencies": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + }, + "node_modules/prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/pretty-hrtime": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", + "integrity": "sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmmirror.com/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "dev": true, + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "node_modules/proxy-addr": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", + "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", + "dependencies": { + "forwarded": "~0.1.2", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/psl": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" + }, + "node_modules/public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmmirror.com/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "dev": true, + "dependencies": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/public-encrypt/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmmirror.com/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "node_modules/punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "engines": { + "node": ">=6" + } + }, + "node_modules/qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmmirror.com/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==", + "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.", + "dev": true, + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==", + "dev": true, + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/queue-tick": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/queue-tick/-/queue-tick-1.0.0.tgz", + "integrity": "sha512-ULWhjjE8BmiICGn3G8+1L9wFpERNxkf8ysxkAer4+TFdRefDaXOCV5m92aMB9FtBVmn/8sETXLXY6BfW7hyaWQ==", + "dev": true + }, + "node_modules/quote-stream": { + "version": "0.0.0", + "resolved": "https://registry.npmmirror.com/quote-stream/-/quote-stream-0.0.0.tgz", + "integrity": "sha512-m4VtvjAMx00wgAS6eOy50ZDat1EBQeFKBIrtF/oxUt0MenEI33y7runJcRiOihc+JBBIt2aFFJhILIh4e9shJA==", + "dependencies": { + "minimist": "0.0.8", + "through2": "~0.4.1" + } + }, + "node_modules/quote-stream/node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmmirror.com/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" + }, + "node_modules/quote-stream/node_modules/minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmmirror.com/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha512-miQKw5Hv4NS1Psg2517mV4e4dYNaO3++hjAvLOAzKqZ61rH8NS1SK+vbfBWZ5PY/Me/bEWhUwqMghEW5Fb9T7Q==" + }, + "node_modules/quote-stream/node_modules/object-keys": { + "version": "0.4.0", + "resolved": "https://registry.npmmirror.com/object-keys/-/object-keys-0.4.0.tgz", + "integrity": "sha512-ncrLw+X55z7bkl5PnUvHwFK9FcGuFYo9gtjws2XtSzL+aZ8tm830P60WJ0dSmFVaSalWieW5MD7kEdnXda9yJw==" + }, + "node_modules/quote-stream/node_modules/readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "node_modules/quote-stream/node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmmirror.com/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==" + }, + "node_modules/quote-stream/node_modules/through2": { + "version": "0.4.2", + "resolved": "https://registry.npmmirror.com/through2/-/through2-0.4.2.tgz", + "integrity": "sha512-45Llu+EwHKtAZYTPPVn3XZHBgakWMN3rokhEv5hu596XP+cNgplMg+Gj+1nmAvj+L0K7+N49zBKx5rah5u0QIQ==", + "dependencies": { + "readable-stream": "~1.0.17", + "xtend": "~2.1.1" + } + }, + "node_modules/quote-stream/node_modules/xtend": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/xtend/-/xtend-2.1.2.tgz", + "integrity": "sha512-vMNKzr2rHP9Dp/e1NQFnLQlwlhp9L/LfvnsVdHxN1f+uggyVI3i08uD14GPvCToPkdsRfyPqIyYGmIk58V98ZQ==", + "dependencies": { + "object-keys": "~0.4.0" + }, + "engines": { + "node": ">=0.4" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "dev": true, + "dependencies": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "dependencies": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/read-only-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/read-only-stream/-/read-only-stream-2.0.0.tgz", + "integrity": "sha512-3ALe0bjBVZtkdWKIcThYpQCLbBMd/+Tbh2CDSrAIDO3UsZ4Xs+tnyjv2MjCOMMgBG+AsUOeuP1cgtY1INISc8w==", + "dev": true, + "dependencies": { + "readable-stream": "^2.0.2" + } + }, + "node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/readable-stream/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.4.3", + "resolved": "https://registry.npmmirror.com/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", + "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "functions-have-names": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", + "dependencies": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/request/node_modules/qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/resolve": { + "version": "1.22.0", + "resolved": "https://registry.npmmirror.com/resolve/-/resolve-1.22.0.tgz", + "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.8.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + } + }, + "node_modules/ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dev": true, + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/scope-analyzer": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/scope-analyzer/-/scope-analyzer-2.1.2.tgz", + "integrity": "sha512-5cfCmsTYV/wPaRIItNxatw02ua/MThdIUNnUOCYp+3LSEJvnG804ANw2VLaavNILIfWXF1D1G2KNANkBBvInwQ==", + "dev": true, + "dependencies": { + "array-from": "^2.1.1", + "dash-ast": "^2.0.1", + "es6-map": "^0.1.5", + "es6-set": "^0.1.5", + "es6-symbol": "^3.1.1", + "estree-is-function": "^1.0.0", + "get-assigned-identifiers": "^1.1.0" + } + }, + "node_modules/scope-analyzer/node_modules/dash-ast": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/dash-ast/-/dash-ast-2.0.1.tgz", + "integrity": "sha512-5TXltWJGc+RdnabUGzhRae1TRq6m4gr+3K2wQX0is5/F2yS6MJXJvLyI3ErAnsAXuJoGqvfVD5icRgim07DrxQ==", + "dev": true + }, + "node_modules/send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "dependencies": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + }, + "node_modules/serve-static": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", + "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" + }, + "node_modules/sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmmirror.com/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + }, + "bin": { + "sha.js": "bin.js" + } + }, + "node_modules/shallow-copy": { + "version": "0.0.1", + "resolved": "https://registry.npmmirror.com/shallow-copy/-/shallow-copy-0.0.1.tgz", + "integrity": "sha512-b6i4ZpVuUxB9h5gfCxPiusKYkqTMOjEbBs4wMaFbkfia4yFv92UKZ6Df8WXcKbn08JNL/abvg3FnMAOfakDvUw==" + }, + "node_modules/shasum-object": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/shasum-object/-/shasum-object-1.0.0.tgz", + "integrity": "sha512-Iqo5rp/3xVi6M4YheapzZhhGPVs0yZwHj7wvwQ1B9z8H6zk+FEnI7y3Teq7qwnekfEhu8WmG2z0z4iWZaxLWVg==", + "dev": true, + "dependencies": { + "fast-safe-stringify": "^2.0.7" + } + }, + "node_modules/shell-quote": { + "version": "1.7.3", + "resolved": "https://registry.npmmirror.com/shell-quote/-/shell-quote-1.7.3.tgz", + "integrity": "sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw==", + "dev": true + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "node_modules/simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "dev": true + }, + "node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "devOptional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmmirror.com/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmmirror.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "dev": true + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" + }, + "node_modules/sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "dependencies": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + }, + "bin": { + "sshpk-conv": "bin/sshpk-conv", + "sshpk-sign": "bin/sshpk-sign", + "sshpk-verify": "bin/sshpk-verify" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-eval": { + "version": "0.2.4", + "resolved": "https://registry.npmmirror.com/static-eval/-/static-eval-0.2.4.tgz", + "integrity": "sha512-6dWWPfa/0+1zULdQi7ssT5EQZHsGK8LygBzhE/HdafNCo4e/Ibt7vLPfxBw9VcdVV+t0ARtN4ZAJKtApVc0A5Q==", + "dependencies": { + "escodegen": "~0.0.24" + } + }, + "node_modules/static-eval/node_modules/escodegen": { + "version": "0.0.28", + "resolved": "https://registry.npmmirror.com/escodegen/-/escodegen-0.0.28.tgz", + "integrity": "sha512-6ioQhg16lFs5c7XJlJFXIDxBjO4yRvXC9yK6dLNNGuhI3a/fJukHanPF6qtpjGDgAFzI8Wuq3PSIarWmaOq/5A==", + "dependencies": { + "esprima": "~1.0.2", + "estraverse": "~1.3.0" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=0.4.0" + }, + "optionalDependencies": { + "source-map": ">= 0.1.2" + } + }, + "node_modules/static-eval/node_modules/esprima": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/esprima/-/esprima-1.0.4.tgz", + "integrity": "sha512-rp5dMKN8zEs9dfi9g0X1ClLmV//WRyk/R15mppFNICIFRG5P92VP7Z04p8pk++gABo9W2tY+kHyu6P1mEHgmTA==", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/static-eval/node_modules/estraverse": { + "version": "1.3.2", + "resolved": "https://registry.npmmirror.com/estraverse/-/estraverse-1.3.2.tgz", + "integrity": "sha512-OkbCPVUu8D9tbsLcUR+CKFRBbhZlogmkbWaP3BPERlkqzWL5Q6IdTz6eUk+b5cid2MTaCqJb2nNRGoJ8TpfPrg==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/static-js-yaml": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/static-js-yaml/-/static-js-yaml-1.0.0.tgz", + "integrity": "sha512-SHd8UBXpEUeFEhexli7Nn1+fysyhU3LiQFKcwnqM3l5wzvJU6QoXg4cMtjjZjfc4ngRj934188v7FHgDyZ6U9A==", + "dependencies": { + "js-yaml": "^3.3.0", + "static-module": "^1.1.2", + "through2": "^0.6.5" + } + }, + "node_modules/static-js-yaml/node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmmirror.com/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" + }, + "node_modules/static-js-yaml/node_modules/readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "node_modules/static-js-yaml/node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmmirror.com/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==" + }, + "node_modules/static-js-yaml/node_modules/through2": { + "version": "0.6.5", + "resolved": "https://registry.npmmirror.com/through2/-/through2-0.6.5.tgz", + "integrity": "sha512-RkK/CCESdTKQZHdmKICijdKKsCRVHs5KsLZ6pACAmF/1GPUQhonHSXWNERctxEp7RmvjdNbZTL5z9V7nSCXKcg==", + "dependencies": { + "readable-stream": ">=1.0.33-1 <1.1.0-0", + "xtend": ">=4.0.0 <4.1.0-0" + } + }, + "node_modules/static-module": { + "version": "1.5.0", + "resolved": "https://registry.npmmirror.com/static-module/-/static-module-1.5.0.tgz", + "integrity": "sha512-XTj7pQOHT33l77lK/Pu8UXqzI44C6LYAqwAc9hLTTESHRqJAFudBpReuopFPpoRr5CtOoSmGfFQC6FPlbDnyCw==", + "dependencies": { + "concat-stream": "~1.6.0", + "duplexer2": "~0.0.2", + "escodegen": "~1.3.2", + "falafel": "^2.1.0", + "has": "^1.0.0", + "object-inspect": "~0.4.0", + "quote-stream": "~0.0.0", + "readable-stream": "~1.0.27-1", + "shallow-copy": "~0.0.1", + "static-eval": "~0.2.0", + "through2": "~0.4.1" + } + }, + "node_modules/static-module/node_modules/duplexer2": { + "version": "0.0.2", + "resolved": "https://registry.npmmirror.com/duplexer2/-/duplexer2-0.0.2.tgz", + "integrity": "sha512-+AWBwjGadtksxjOQSFDhPNQbed7icNXApT4+2BNpsXzcCBiInq2H9XW0O8sfHFaPmnQRs7cg/P0fAr2IWQSW0g==", + "dependencies": { + "readable-stream": "~1.1.9" + } + }, + "node_modules/static-module/node_modules/duplexer2/node_modules/readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "node_modules/static-module/node_modules/escodegen": { + "version": "1.3.3", + "resolved": "https://registry.npmmirror.com/escodegen/-/escodegen-1.3.3.tgz", + "integrity": "sha512-z9FWgKc48wjMlpzF5ymKS1AF8OIgnKLp9VyN7KbdtyrP/9lndwUFqCtMm+TAJmJf7KJFFYc4cFJfVTTGkKEwsA==", + "dependencies": { + "esprima": "~1.1.1", + "estraverse": "~1.5.0", + "esutils": "~1.0.0" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=0.10.0" + }, + "optionalDependencies": { + "source-map": "~0.1.33" + } + }, + "node_modules/static-module/node_modules/esprima": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/esprima/-/esprima-1.1.1.tgz", + "integrity": "sha512-qxxB994/7NtERxgXdFgLHIs9M6bhLXc6qtUmWZ3L8+gTQ9qaoyki2887P2IqAYsoENyr8SUbTutStDniOHSDHg==", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/static-module/node_modules/estraverse": { + "version": "1.5.1", + "resolved": "https://registry.npmmirror.com/estraverse/-/estraverse-1.5.1.tgz", + "integrity": "sha512-FpCjJDfmo3vsc/1zKSeqR5k42tcIhxFIlvq+h9j0fO2q/h2uLKyweq7rYJ+0CoVvrGQOxIS5wyBrW/+vF58BUQ==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/static-module/node_modules/esutils": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/esutils/-/esutils-1.0.0.tgz", + "integrity": "sha512-x/iYH53X3quDwfHRz4y8rn4XcEwwCJeWsul9pF1zldMbGtgOtMNBEOuYWwB1EQlK2LRa1fev3YAgym/RElp5Cg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-module/node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmmirror.com/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" + }, + "node_modules/static-module/node_modules/object-inspect": { + "version": "0.4.0", + "resolved": "https://registry.npmmirror.com/object-inspect/-/object-inspect-0.4.0.tgz", + "integrity": "sha512-8WvkvUZiKAjjsy/63rJjA7jw9uyF0CLVLjBKEfnPHE3Jxvs1LgwqL2OmJN+LliIX1vrzKW+AAu02Cc+xv27ncQ==" + }, + "node_modules/static-module/node_modules/object-keys": { + "version": "0.4.0", + "resolved": "https://registry.npmmirror.com/object-keys/-/object-keys-0.4.0.tgz", + "integrity": "sha512-ncrLw+X55z7bkl5PnUvHwFK9FcGuFYo9gtjws2XtSzL+aZ8tm830P60WJ0dSmFVaSalWieW5MD7kEdnXda9yJw==" + }, + "node_modules/static-module/node_modules/readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "node_modules/static-module/node_modules/source-map": { + "version": "0.1.43", + "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.1.43.tgz", + "integrity": "sha512-VtCvB9SIQhk3aF6h+N85EaqIaBFIAfZ9Cu+NJHHVvc8BbEcnvDcFw6sqQ2dQrT6SlOrZq3tIvyD9+EGq/lJryQ==", + "optional": true, + "dependencies": { + "amdefine": ">=0.0.4" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/static-module/node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmmirror.com/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==" + }, + "node_modules/static-module/node_modules/through2": { + "version": "0.4.2", + "resolved": "https://registry.npmmirror.com/through2/-/through2-0.4.2.tgz", + "integrity": "sha512-45Llu+EwHKtAZYTPPVn3XZHBgakWMN3rokhEv5hu596XP+cNgplMg+Gj+1nmAvj+L0K7+N49zBKx5rah5u0QIQ==", + "dependencies": { + "readable-stream": "~1.0.17", + "xtend": "~2.1.1" + } + }, + "node_modules/static-module/node_modules/xtend": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/xtend/-/xtend-2.1.2.tgz", + "integrity": "sha512-vMNKzr2rHP9Dp/e1NQFnLQlwlhp9L/LfvnsVdHxN1f+uggyVI3i08uD14GPvCToPkdsRfyPqIyYGmIk58V98ZQ==", + "dependencies": { + "object-keys": "~0.4.0" + }, + "engines": { + "node": ">=0.4" + } + }, + "node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/stream-browserify": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/stream-browserify/-/stream-browserify-3.0.0.tgz", + "integrity": "sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==", + "dev": true, + "dependencies": { + "inherits": "~2.0.4", + "readable-stream": "^3.5.0" + } + }, + "node_modules/stream-browserify/node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/stream-browserify/node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/stream-combiner": { + "version": "0.2.2", + "resolved": "https://registry.npmmirror.com/stream-combiner/-/stream-combiner-0.2.2.tgz", + "integrity": "sha512-6yHMqgLYDzQDcAkL+tjJDC5nSNuNIx0vZtRZeiPh7Saef7VHX9H5Ijn9l2VIol2zaNYlYEX6KyuT/237A58qEQ==", + "dev": true, + "dependencies": { + "duplexer": "~0.1.1", + "through": "~2.3.4" + } + }, + "node_modules/stream-combiner2": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/stream-combiner2/-/stream-combiner2-1.1.1.tgz", + "integrity": "sha512-3PnJbYgS56AeWgtKF5jtJRT6uFJe56Z0Hc5Ngg/6sI6rIt8iiMBTa9cvdyFfpMQjaVHr8dusbNeFGIIonxOvKw==", + "dev": true, + "dependencies": { + "duplexer2": "~0.1.0", + "readable-stream": "^2.0.2" + } + }, + "node_modules/stream-http": { + "version": "3.2.0", + "resolved": "https://registry.npmmirror.com/stream-http/-/stream-http-3.2.0.tgz", + "integrity": "sha512-Oq1bLqisTyK3TSCXpPbT4sdeYNdmyZJv1LxpEm2vu1ZhK89kSE5YXwZc3cWk0MagGaKriBh9mCFbVGtO+vY29A==", + "dev": true, + "dependencies": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "xtend": "^4.0.2" + } + }, + "node_modules/stream-http/node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/stream-http/node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/stream-shift": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/stream-shift/-/stream-shift-1.0.1.tgz", + "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", + "dev": true + }, + "node_modules/stream-splicer": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/stream-splicer/-/stream-splicer-2.0.1.tgz", + "integrity": "sha512-Xizh4/NPuYSyAXyT7g8IvdJ9HJpxIGL9PjyhtywCZvvP0OPIdqyrr4dMikeuvY8xahpdKEBlBTySe583totajg==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.2" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string_decoder/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.5", + "resolved": "https://registry.npmmirror.com/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz", + "integrity": "sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.19.5" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.5", + "resolved": "https://registry.npmmirror.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz", + "integrity": "sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.19.5" + } + }, + "node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "dev": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/subarg": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/subarg/-/subarg-1.0.0.tgz", + "integrity": "sha512-RIrIdRY0X1xojthNcVtgT9sjpOGagEUKpZdgBUi054OEPFo282yg+zE+t1Rj3+RqKq2xStL7uUHhY+AjbC4BXg==", + "dev": true, + "dependencies": { + "minimist": "^1.1.0" + } + }, + "node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/syntax-error": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/syntax-error/-/syntax-error-1.4.0.tgz", + "integrity": "sha512-YPPlu67mdnHGTup2A8ff7BC2Pjq0e0Yp/IyTFN03zWO0RcK07uLcbi7C2KpGR2FvWbaB0+bfE27a+sBKebSo7w==", + "dev": true, + "dependencies": { + "acorn-node": "^1.2.0" + } + }, + "node_modules/terser": { + "version": "4.8.0", + "resolved": "https://registry.npmmirror.com/terser/-/terser-4.8.0.tgz", + "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==", + "dev": true, + "dependencies": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/terser/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmmirror.com/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "dev": true + }, + "node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmmirror.com/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/timers-browserify": { + "version": "1.4.2", + "resolved": "https://registry.npmmirror.com/timers-browserify/-/timers-browserify-1.4.2.tgz", + "integrity": "sha512-PIxwAupJZiYU4JmVZYwXp9FKsHMXb5h0ZEFyuXTAn8WLHOlcij+FEcbrvDsom1o5dr1YggEtFbECvGCW2sT53Q==", + "dev": true, + "dependencies": { + "process": "~0.11.0" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/tinyify": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/tinyify/-/tinyify-3.0.0.tgz", + "integrity": "sha512-RtjVjC1xwwxt8AMVfxEmo+FzRJB6p5sAOtFaJj8vMrkWShtArsM4dLVRWhx2Vc07Me3NWgmP7pi9UPm/a2XNNA==", + "dev": true, + "dependencies": { + "@goto-bus-stop/envify": "^5.0.0", + "acorn-node": "^1.8.2", + "browser-pack-flat": "^3.0.9", + "bundle-collapser": "^1.3.0", + "common-shakeify": "^0.6.0", + "dash-ast": "^1.0.0", + "minify-stream": "^2.0.1", + "multisplice": "^1.0.0", + "through2": "^3.0.1", + "uglifyify": "^5.0.0", + "unassertify": "^2.1.1" + } + }, + "node_modules/tinyify/node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/tinyify/node_modules/through2": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/through2/-/through2-3.0.2.tgz", + "integrity": "sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ==", + "dev": true, + "dependencies": { + "inherits": "^2.0.4", + "readable-stream": "2 || 3" + } + }, + "node_modules/toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dependencies": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/transform-ast": { + "version": "2.4.4", + "resolved": "https://registry.npmmirror.com/transform-ast/-/transform-ast-2.4.4.tgz", + "integrity": "sha512-AxjeZAcIOUO2lev2GDe3/xZ1Q0cVGjIMk5IsriTy8zbWlsEnjeB025AhkhBJHoy997mXpLd4R+kRbvnnQVuQHQ==", + "dev": true, + "dependencies": { + "acorn-node": "^1.3.0", + "convert-source-map": "^1.5.1", + "dash-ast": "^1.0.0", + "is-buffer": "^2.0.0", + "magic-string": "^0.23.2", + "merge-source-map": "1.0.4", + "nanobench": "^2.1.1" + } + }, + "node_modules/transform-ast/node_modules/convert-source-map": { + "version": "1.8.0", + "resolved": "https://registry.npmmirror.com/convert-source-map/-/convert-source-map-1.8.0.tgz", + "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.1" + } + }, + "node_modules/transform-ast/node_modules/is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmmirror.com/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/tty-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmmirror.com/tty-browserify/-/tty-browserify-0.0.1.tgz", + "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==", + "dev": true + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" + }, + "node_modules/type": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==", + "dev": true + }, + "node_modules/type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmmirror.com/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", + "dev": true, + "dependencies": { + "prelude-ls": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmmirror.com/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" + }, + "node_modules/uglifyify": { + "version": "5.0.2", + "resolved": "https://registry.npmmirror.com/uglifyify/-/uglifyify-5.0.2.tgz", + "integrity": "sha512-NcSk6pgoC+IgwZZ2tVLVHq+VNKSvLPlLkF5oUiHPVOJI0s/OlSVYEGXG9PCAH0hcyFZLyvt4KBdPAQBRlVDn1Q==", + "dev": true, + "dependencies": { + "convert-source-map": "~1.1.0", + "minimatch": "^3.0.2", + "terser": "^3.7.5", + "through": "~2.3.4", + "xtend": "^4.0.1" + } + }, + "node_modules/uglifyify/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/uglifyify/node_modules/terser": { + "version": "3.17.0", + "resolved": "https://registry.npmmirror.com/terser/-/terser-3.17.0.tgz", + "integrity": "sha512-/FQzzPJmCpjAH9Xvk2paiWrFq+5M6aVOf+2KRbwhByISDX/EujxsK+BAvrhb6H+2rtrLCHK9N01wO014vrIwVQ==", + "dev": true, + "dependencies": { + "commander": "^2.19.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.10" + }, + "bin": { + "terser": "bin/uglifyjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/umd": { + "version": "3.0.3", + "resolved": "https://registry.npmmirror.com/umd/-/umd-3.0.3.tgz", + "integrity": "sha512-4IcGSufhFshvLNcMCV80UnQVlZ5pMOC8mvNPForqwA4+lzYQuetTESLDQkeLmihq8bRcnpbQa48Wb8Lh16/xow==", + "dev": true, + "bin": { + "umd": "bin/cli.js" + } + }, + "node_modules/unassert": { + "version": "1.6.0", + "resolved": "https://registry.npmmirror.com/unassert/-/unassert-1.6.0.tgz", + "integrity": "sha512-GoMtWTwGSxSFuRD0NKmbjlx3VJkgvSogzDzMPpJXYmBZv6MIWButsyMqEYhMx3NI4osXACcZA9mXiBteXyJtRw==", + "dev": true, + "dependencies": { + "acorn": "^7.0.0", + "call-matcher": "^2.0.0", + "deep-equal": "^1.0.0", + "espurify": "^2.0.1", + "estraverse": "^4.1.0", + "esutils": "^2.0.2", + "object-assign": "^4.1.0" + } + }, + "node_modules/unassertify": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/unassertify/-/unassertify-2.1.1.tgz", + "integrity": "sha512-YIAaIlc6/KC9Oib8cVZLlpDDhK1UTEuaDyx9BwD97xqxDZC0cJOqwFcs/Y6K3m73B5VzHsRTBLXNO0dxS/GkTw==", + "dev": true, + "dependencies": { + "acorn": "^5.1.0", + "convert-source-map": "^1.1.1", + "escodegen": "^1.6.1", + "multi-stage-sourcemap": "^0.2.1", + "through": "^2.3.7", + "unassert": "^1.3.1" + } + }, + "node_modules/unassertify/node_modules/acorn": { + "version": "5.7.4", + "resolved": "https://registry.npmmirror.com/acorn/-/acorn-5.7.4.tgz", + "integrity": "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + } + }, + "node_modules/undeclared-identifiers": { + "version": "1.1.3", + "resolved": "https://registry.npmmirror.com/undeclared-identifiers/-/undeclared-identifiers-1.1.3.tgz", + "integrity": "sha512-pJOW4nxjlmfwKApE4zvxLScM/njmwj/DiUBv7EabwE4O8kRUy+HIwxQtZLBPll/jx1LJyBcqNfB3/cpv9EZwOw==", + "dev": true, + "dependencies": { + "acorn-node": "^1.3.0", + "dash-ast": "^1.0.0", + "get-assigned-identifiers": "^1.2.0", + "simple-concat": "^1.0.0", + "xtend": "^4.0.1" + }, + "bin": { + "undeclared-identifiers": "bin.js" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/url": { + "version": "0.11.0", + "resolved": "https://registry.npmmirror.com/url/-/url-0.11.0.tgz", + "integrity": "sha512-kbailJa29QrtXnxgq+DdCEGlbTeYM2eJUxsz6vjZavrCYPMIFHMKQmSKYAIuUK2i7hgPm28a8piX5NTUtM/LKQ==", + "dev": true, + "dependencies": { + "punycode": "1.3.2", + "querystring": "0.2.0" + } + }, + "node_modules/url/node_modules/punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmmirror.com/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==", + "dev": true + }, + "node_modules/util": { + "version": "0.12.4", + "resolved": "https://registry.npmmirror.com/util/-/util-0.12.4.tgz", + "integrity": "sha512-bxZ9qtSlGUWSOy9Qa9Xgk11kSslpuZwaxCg4sNIDj6FLucDab2JxnHwyNTCpHMtK1MjoQiWQ6DiUMZYbSrO+Sw==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "safe-buffer": "^5.1.2", + "which-typed-array": "^1.1.2" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "engines": [ + "node >=0.6.0" + ], + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "node_modules/vm-browserify": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/vm-browserify/-/vm-browserify-1.1.2.tgz", + "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", + "dev": true + }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.8", + "resolved": "https://registry.npmmirror.com/which-typed-array/-/which-typed-array-1.1.8.tgz", + "integrity": "sha512-Jn4e5PItbcAHyLoRDwvPj1ypu27DJbtdYXUa5zsinrUx77Uvfb0cXwwnGMTn7cjUfhhqgVQnVJCwF+7cgU7tpw==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "es-abstract": "^1.20.0", + "for-each": "^0.3.3", + "has-tostringtag": "^1.0.0", + "is-typed-array": "^1.1.9" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmmirror.com/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrap-comment": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/wrap-comment/-/wrap-comment-1.0.1.tgz", + "integrity": "sha512-APccrMwl/ont0RHFTXNAQfM647duYYEfs6cngrIyTByTI0xbWnDnPSptFZhS68L4WCjt2ZxuhCFwuY6Pe88KZQ==", + "dev": true + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmmirror.com/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "engines": { + "node": ">=0.4" + } + } + }, + "dependencies": { + "@goto-bus-stop/common-shake": { + "version": "2.4.0", + "resolved": "https://registry.npmmirror.com/@goto-bus-stop/common-shake/-/common-shake-2.4.0.tgz", + "integrity": "sha512-LO+7v+UbxE3IyAS4Suf/KYB7Zq9DEIHibwDe6Wph4apNEfDyyxP7BSxzRS/Qa9lUH5gsm9eL9nF8EE1E0/nQkQ==", + "dev": true, "requires": { - "@types/node": "*" + "acorn-walk": "^7.0.0", + "debug": "^3.2.6", + "escope": "^3.6.0" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmmirror.com/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + } + } + }, + "@goto-bus-stop/envify": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/@goto-bus-stop/envify/-/envify-5.0.0.tgz", + "integrity": "sha512-xAnxuDWmwQxO8CgVuPTxKuNsKDfwyXXTyAabG4sNoK59H/ZMC7BHxTA/4ehtinsxbcH7/9L65F5VhyNdQfUyqA==", + "dev": true, + "requires": { + "acorn-node": "^2.0.1", + "dash-ast": "^2.0.1", + "multisplice": "^1.0.0", + "through2": "^2.0.5" + }, + "dependencies": { + "acorn-node": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/acorn-node/-/acorn-node-2.0.1.tgz", + "integrity": "sha512-VLR5sHqjk+8c5hrKeP2fWaIHb8eewsoxnZ8r2qpwRHXMHuC7KyOPflnOx9dLssVQUurzJ7rO0OzIFjHcndafWw==", + "dev": true, + "requires": { + "acorn": "^7.0.0", + "acorn-walk": "^7.0.0", + "xtend": "^4.0.2" + } + }, + "dash-ast": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/dash-ast/-/dash-ast-2.0.1.tgz", + "integrity": "sha512-5TXltWJGc+RdnabUGzhRae1TRq6m4gr+3K2wQX0is5/F2yS6MJXJvLyI3ErAnsAXuJoGqvfVD5icRgim07DrxQ==", + "dev": true + } } }, "accepts": { @@ -63,6 +4289,28 @@ "negotiator": "0.6.2" } }, + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmmirror.com/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==" + }, + "acorn-node": { + "version": "1.8.2", + "resolved": "https://registry.npmmirror.com/acorn-node/-/acorn-node-1.8.2.tgz", + "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==", + "dev": true, + "requires": { + "acorn": "^7.0.0", + "acorn-walk": "^7.0.0", + "xtend": "^4.0.2" + } + }, + "acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmmirror.com/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "dev": true + }, "ajv": { "version": "6.12.4", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.4.tgz", @@ -74,11 +4322,43 @@ "uri-js": "^4.2.2" } }, + "amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg==", + "devOptional": true + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "dev": true + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmmirror.com/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "requires": { + "sprintf-js": "~1.0.2" + } + }, "array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" }, + "array-from": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/array-from/-/array-from-2.1.1.tgz", + "integrity": "sha512-GQTc6Uupx1FCavi5mPzBvVT7nEOeWMmUA9P95wpfpW1XwMSKs+KaymD5C2Up7KAUKg/mYwbsUYzdZWcoajlNZg==", + "dev": true + }, "asn1": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", @@ -87,6 +4367,53 @@ "safer-buffer": "~2.1.0" } }, + "asn1.js": { + "version": "5.4.1", + "resolved": "https://registry.npmmirror.com/asn1.js/-/asn1.js-5.4.1.tgz", + "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "safer-buffer": "^2.1.0" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmmirror.com/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + } + } + }, + "assert": { + "version": "1.5.0", + "resolved": "https://registry.npmmirror.com/assert/-/assert-1.5.0.tgz", + "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", + "dev": true, + "requires": { + "object-assign": "^4.1.1", + "util": "0.10.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha512-8nWq2nLTAwd02jTqJExUYFSD/fKq6VH9Y/oG2accc/kdI0V98Bag8d5a4gi3XHz73rDWa2PvTtvcWYquKqSENA==", + "dev": true + }, + "util": { + "version": "0.10.3", + "resolved": "https://registry.npmmirror.com/util/-/util-0.10.3.tgz", + "integrity": "sha512-5KiHfsmkqacuKjkRkdV7SsfDJ2EGiPsK92s2MhNSY0craxjTdKTtqKsJaCWp4LW33ZZ0OPUv1WO/TFvNQRiQxQ==", + "dev": true, + "requires": { + "inherits": "2.0.1" + } + } + } + }, "assert-plus": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", @@ -97,6 +4424,12 @@ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" }, + "available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmmirror.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "dev": true + }, "aws-sign2": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", @@ -116,6 +4449,18 @@ "follow-redirects": "^1.10.0" } }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmmirror.com/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true + }, "bcrypt-pbkdf": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", @@ -124,6 +4469,12 @@ "tweetnacl": "^0.14.3" } }, + "bn.js": { + "version": "5.2.0", + "resolved": "https://registry.npmmirror.com/bn.js/-/bn.js-5.2.0.tgz", + "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==", + "dev": true + }, "body-parser": { "version": "1.19.0", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", @@ -141,28 +4492,329 @@ "type-is": "~1.6.17" } }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==", + "dev": true + }, + "browser-pack": { + "version": "6.1.0", + "resolved": "https://registry.npmmirror.com/browser-pack/-/browser-pack-6.1.0.tgz", + "integrity": "sha512-erYug8XoqzU3IfcU8fUgyHqyOXqIE4tUTTQ+7mqUjQlvnXkOO6OlT9c/ZoJVHYoAaqGxr09CN53G7XIsO4KtWA==", + "dev": true, + "requires": { + "combine-source-map": "~0.8.0", + "defined": "^1.0.0", + "JSONStream": "^1.0.3", + "safe-buffer": "^5.1.1", + "through2": "^2.0.0", + "umd": "^3.0.0" + } + }, + "browser-pack-flat": { + "version": "3.4.2", + "resolved": "https://registry.npmmirror.com/browser-pack-flat/-/browser-pack-flat-3.4.2.tgz", + "integrity": "sha512-TrUo6n2fGSOCYFAKkt/EkgenytAuuCI88fmXFA60aNFVHvz3CZEBTXYSvvXVpU6xpjM8lj/6vkC6Exn8KPjtPw==", + "dev": true, + "requires": { + "combine-source-map": "^0.8.0", + "convert-source-map": "^1.5.1", + "count-lines": "^0.1.2", + "dedent": "^0.7.0", + "estree-is-member-expression": "^1.0.0", + "estree-is-require": "^1.0.0", + "esutils": "^2.0.2", + "JSONStream": "^1.3.2", + "path-parse": "^1.0.5", + "scope-analyzer": "^2.0.0", + "stream-combiner": "^0.2.2", + "through2": "^2.0.3", + "transform-ast": "^2.4.2", + "umd": "^3.0.3", + "wrap-comment": "^1.0.0" + }, + "dependencies": { + "convert-source-map": { + "version": "1.8.0", + "resolved": "https://registry.npmmirror.com/convert-source-map/-/convert-source-map-1.8.0.tgz", + "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + } + } + } + }, + "browser-process-hrtime": { + "version": "0.1.3", + "resolved": "https://registry.npmmirror.com/browser-process-hrtime/-/browser-process-hrtime-0.1.3.tgz", + "integrity": "sha512-bRFnI4NnjO6cnyLmOV/7PVoDEMJChlcfN0z4s1YMBY989/SvlfMI1lgCnkFUs53e9gQF+w7qu7XdllSTiSl8Aw==", + "dev": true + }, + "browser-resolve": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/browser-resolve/-/browser-resolve-2.0.0.tgz", + "integrity": "sha512-7sWsQlYL2rGLy2IWm8WL8DCTJvYLc/qlOnsakDac87SOoCd16WLsaAMdCiAqsTNHIe+SXfaqyxyo6THoWqs8WQ==", + "dev": true, + "requires": { + "resolve": "^1.17.0" + } + }, + "browser-unpack": { + "version": "1.4.2", + "resolved": "https://registry.npmmirror.com/browser-unpack/-/browser-unpack-1.4.2.tgz", + "integrity": "sha512-uHkiY4bmXjjBBWoKH1aRnEGTQxUUCCcVtoJfH9w1lmGGjETY4u93Zk+GRYkCE/SRMrdoMTINQ/1/manr/3aMVA==", + "dev": true, + "requires": { + "acorn-node": "^1.5.2", + "concat-stream": "^1.5.0", + "minimist": "^1.1.1" + } + }, + "browserify": { + "version": "17.0.0", + "resolved": "https://registry.npmmirror.com/browserify/-/browserify-17.0.0.tgz", + "integrity": "sha512-SaHqzhku9v/j6XsQMRxPyBrSP3gnwmE27gLJYZgMT2GeK3J0+0toN+MnuNYDfHwVGQfLiMZ7KSNSIXHemy905w==", + "dev": true, + "requires": { + "assert": "^1.4.0", + "browser-pack": "^6.0.1", + "browser-resolve": "^2.0.0", + "browserify-zlib": "~0.2.0", + "buffer": "~5.2.1", + "cached-path-relative": "^1.0.0", + "concat-stream": "^1.6.0", + "console-browserify": "^1.1.0", + "constants-browserify": "~1.0.0", + "crypto-browserify": "^3.0.0", + "defined": "^1.0.0", + "deps-sort": "^2.0.1", + "domain-browser": "^1.2.0", + "duplexer2": "~0.1.2", + "events": "^3.0.0", + "glob": "^7.1.0", + "has": "^1.0.0", + "htmlescape": "^1.1.0", + "https-browserify": "^1.0.0", + "inherits": "~2.0.1", + "insert-module-globals": "^7.2.1", + "JSONStream": "^1.0.3", + "labeled-stream-splicer": "^2.0.0", + "mkdirp-classic": "^0.5.2", + "module-deps": "^6.2.3", + "os-browserify": "~0.3.0", + "parents": "^1.0.1", + "path-browserify": "^1.0.0", + "process": "~0.11.0", + "punycode": "^1.3.2", + "querystring-es3": "~0.2.0", + "read-only-stream": "^2.0.0", + "readable-stream": "^2.0.2", + "resolve": "^1.1.4", + "shasum-object": "^1.0.0", + "shell-quote": "^1.6.1", + "stream-browserify": "^3.0.0", + "stream-http": "^3.0.0", + "string_decoder": "^1.1.1", + "subarg": "^1.0.0", + "syntax-error": "^1.1.1", + "through2": "^2.0.0", + "timers-browserify": "^1.0.1", + "tty-browserify": "0.0.1", + "url": "~0.11.0", + "util": "~0.12.0", + "vm-browserify": "^1.0.0", + "xtend": "^4.0.0" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmmirror.com/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", + "dev": true + } + } + }, + "browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "dev": true, + "requires": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "dev": true, + "requires": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "browserify-rsa": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/browserify-rsa/-/browserify-rsa-4.1.0.tgz", + "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", + "dev": true, + "requires": { + "bn.js": "^5.0.0", + "randombytes": "^2.0.1" + } + }, + "browserify-sign": { + "version": "4.2.1", + "resolved": "https://registry.npmmirror.com/browserify-sign/-/browserify-sign-4.2.1.tgz", + "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", + "dev": true, + "requires": { + "bn.js": "^5.1.1", + "browserify-rsa": "^4.0.1", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "elliptic": "^6.5.3", + "inherits": "^2.0.4", + "parse-asn1": "^5.1.5", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "dependencies": { + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + } + } + }, + "browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmmirror.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "dev": true, + "requires": { + "pako": "~1.0.5" + } + }, + "buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmmirror.com/buffer/-/buffer-5.2.1.tgz", + "integrity": "sha512-c+Ko0loDaFfuPWiL02ls9Xd3GO3cPVmUobQ6t3rXNUk304u6hGq+8N/kFi+QEIKhzK3uwolVhLzszmfLmMLnqg==", + "dev": true, + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4" + } + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==", + "dev": true + }, + "builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==", + "dev": true + }, + "bundle-collapser": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/bundle-collapser/-/bundle-collapser-1.4.0.tgz", + "integrity": "sha512-Gd3K3+3KI1Utuk+gwAvuOVOjT/2XLGL8tU6FwDKk04LlOZkYfT0pwQllsG1Dv8RRhgcjNxZSDmmSXb0AOkwSwg==", + "dev": true, + "requires": { + "browser-pack": "^6.0.2", + "browser-unpack": "^1.1.0", + "concat-stream": "^1.5.0", + "falafel": "^2.1.0", + "minimist": "^1.1.1", + "through2": "^2.0.0" + } + }, "bytes": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" }, - "cacheable-lookup": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.3.tgz", - "integrity": "sha512-W+JBqF9SWe18A72XFzN/V/CULFzPm7sBXzzR6ekkE+3tLG72wFZrBiBZhrZuDoYexop4PHJVdFAKb/Nj9+tm9w==" + "cached-path-relative": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/cached-path-relative/-/cached-path-relative-1.1.0.tgz", + "integrity": "sha512-WF0LihfemtesFcJgO7xfOoOcnWzY/QHR4qeDqV44jPU3HTI54+LnfXK3SA27AVVGCdZFgjjFFaqUA9Jx7dMJZA==", + "dev": true }, - "cacheable-request": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.1.tgz", - "integrity": "sha512-lt0mJ6YAnsrBErpTMWeu5kl/tg9xMAWjavYTN6VQXM1A/teBITuNcccXsCxF0tDQQJf9DfAaX5O4e0zp0KlfZw==", + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, "requires": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^4.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^4.1.0", - "responselike": "^2.0.0" + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "call-matcher": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/call-matcher/-/call-matcher-2.0.0.tgz", + "integrity": "sha512-CIDC5wZZfZ2VjZu849WQckS58Z3pJXFfRaSjNjgo/q3in5zxkhTwVL83vttgtmvyLG7TuDlLlBya7SKP6CjDIA==", + "dev": true, + "requires": { + "deep-equal": "^1.0.0", + "espurify": "^2.0.0", + "estraverse": "^4.0.0" } }, "caseless": { @@ -170,12 +4822,39 @@ "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" }, - "clone-response": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", - "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmmirror.com/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "dev": true, "requires": { - "mimic-response": "^1.0.0" + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "combine-source-map": { + "version": "0.8.0", + "resolved": "https://registry.npmmirror.com/combine-source-map/-/combine-source-map-0.8.0.tgz", + "integrity": "sha512-UlxQ9Vw0b/Bt/KYwCFqdEwsQ1eL8d1gibiFb7lxQJFdvTgc2hIZi6ugsg+kyhzhPV+QEpUiEIwInIAIrgoEkrg==", + "dev": true, + "requires": { + "convert-source-map": "~1.1.0", + "inline-source-map": "~0.6.0", + "lodash.memoize": "~3.0.3", + "source-map": "~0.5.3" } }, "combined-stream": { @@ -186,6 +4865,65 @@ "delayed-stream": "~1.0.0" } }, + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmmirror.com/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "common-shakeify": { + "version": "0.6.2", + "resolved": "https://registry.npmmirror.com/common-shakeify/-/common-shakeify-0.6.2.tgz", + "integrity": "sha512-vxlXr26fqxm8ZJ0jh8MlvpeN6IbyUKqsVmgb4rAjDM/0f4nKebiHaAXpF/Mm86W9ENR5iSI7UOnUTylpVyplUA==", + "dev": true, + "requires": { + "@goto-bus-stop/common-shake": "^2.2.0", + "convert-source-map": "^1.5.1", + "through2": "^2.0.3", + "transform-ast": "^2.4.3", + "wrap-comment": "^1.0.1" + }, + "dependencies": { + "convert-source-map": { + "version": "1.8.0", + "resolved": "https://registry.npmmirror.com/convert-source-map/-/convert-source-map-1.8.0.tgz", + "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + } + } + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmmirror.com/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmmirror.com/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "console-browserify": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/console-browserify/-/console-browserify-1.2.0.tgz", + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", + "dev": true + }, + "constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==", + "dev": true + }, "content-disposition": { "version": "0.5.3", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", @@ -199,6 +4937,12 @@ "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" }, + "convert-source-map": { + "version": "1.1.3", + "resolved": "https://registry.npmmirror.com/convert-source-map/-/convert-source-map-1.1.3.tgz", + "integrity": "sha512-Y8L5rp6jo+g9VEPgvqNfEopjTR4OTYct8lXlS8iVQdmnjDvbdbzYe9rjtFCB9egC86JoNCU61WRY+ScjkZpnIg==", + "dev": true + }, "cookie": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", @@ -214,6 +4958,92 @@ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, + "count-lines": { + "version": "0.1.2", + "resolved": "https://registry.npmmirror.com/count-lines/-/count-lines-0.1.2.tgz", + "integrity": "sha512-YS8P4UYXX/hrDyLU3r/A5OcCNwdNbJFJckbe8j+x2Jhxsr2J4/rYl0sDwOljLZL7Uxc4s7mRSNcQD8dSjobz+g==", + "dev": true + }, + "create-ecdh": { + "version": "4.0.4", + "resolved": "https://registry.npmmirror.com/create-ecdh/-/create-ecdh-4.0.4.tgz", + "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "elliptic": "^6.5.3" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmmirror.com/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + } + } + }, + "create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmmirror.com/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "dev": true, + "requires": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmmirror.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "dev": true, + "requires": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + } + }, + "d": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "dev": true, + "requires": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } + }, + "dash-ast": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/dash-ast/-/dash-ast-1.0.0.tgz", + "integrity": "sha512-Vy4dx7gquTeMcQR/hDkYLGUnwVil6vk4FOOct+djUnHOUWt+zJPJAaRIXaAFkPXtJjvlY7o3rfRu0/3hpnwoUA==", + "dev": true + }, "dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", @@ -230,25 +5060,47 @@ "ms": "2.0.0" } }, - "decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dedent": { + "version": "0.7.0", + "resolved": "https://registry.npmmirror.com/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", + "dev": true + }, + "deep-equal": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/deep-equal/-/deep-equal-1.1.1.tgz", + "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", + "dev": true, "requires": { - "mimic-response": "^3.1.0" - }, - "dependencies": { - "mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==" - } + "is-arguments": "^1.0.4", + "is-date-object": "^1.0.1", + "is-regex": "^1.0.4", + "object-is": "^1.0.1", + "object-keys": "^1.1.1", + "regexp.prototype.flags": "^1.2.0" } }, - "defer-to-connect": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.0.tgz", - "integrity": "sha512-bYL2d05vOSf1JEZNx5vSAtPuBMkX8K9EUutg7zlKvTqKXHt7RhWJFbmd7qakVuf13i+IkGmp6FwSsONOf6VYIg==" + "deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmmirror.com/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "define-properties": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/define-properties/-/define-properties-1.1.4.tgz", + "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", + "dev": true, + "requires": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + } + }, + "defined": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/defined/-/defined-1.0.0.tgz", + "integrity": "sha512-Y2caI5+ZwS5c3RiNDJ6u53VhQHv+hHKwhkI1iHvceKUHw9Df6EK2zRLfjejRgMuCuxK7PfSWIMwWecceVvThjQ==", + "dev": true }, "delayed-stream": { "version": "1.0.0", @@ -260,11 +5112,109 @@ "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" }, + "deps-sort": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/deps-sort/-/deps-sort-2.0.1.tgz", + "integrity": "sha512-1orqXQr5po+3KI6kQb9A4jnXT1PBwggGl2d7Sq2xsnOeI9GPcE/tGcF9UiSZtZBM7MukY4cAh7MemS6tZYipfw==", + "dev": true, + "requires": { + "JSONStream": "^1.0.3", + "shasum-object": "^1.0.0", + "subarg": "^1.0.0", + "through2": "^2.0.0" + } + }, + "des.js": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/des.js/-/des.js-1.0.1.tgz", + "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, "destroy": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" }, + "detective": { + "version": "5.2.0", + "resolved": "https://registry.npmmirror.com/detective/-/detective-5.2.0.tgz", + "integrity": "sha512-6SsIx+nUUbuK0EthKjv0zrdnajCCXVYGmbYYiYjFVpzcjwEs/JMDZ8tPRG29J/HhN56t3GJp2cGSWDRjjot8Pg==", + "dev": true, + "requires": { + "acorn-node": "^1.6.1", + "defined": "^1.0.0", + "minimist": "^1.1.1" + } + }, + "diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmmirror.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmmirror.com/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + } + } + }, + "domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", + "dev": true + }, + "duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmmirror.com/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", + "dev": true + }, + "duplexer2": { + "version": "0.1.4", + "resolved": "https://registry.npmmirror.com/duplexer2/-/duplexer2-0.1.4.tgz", + "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==", + "dev": true, + "requires": { + "readable-stream": "^2.0.2" + } + }, + "duplexify": { + "version": "4.1.2", + "resolved": "https://registry.npmmirror.com/duplexify/-/duplexify-4.1.2.tgz", + "integrity": "sha512-fz3OjcNCHmRP12MJoZMPglx8m4rrFP8rovnk4vT8Fs+aonZoCwGg10dSsQsfP/E62eZcPTMSMP6686fu9Qlqtw==", + "dev": true, + "requires": { + "end-of-stream": "^1.4.1", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1", + "stream-shift": "^1.0.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, "ecc-jsbn": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", @@ -279,6 +5229,35 @@ "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" }, + "elliptic": { + "version": "6.5.4", + "resolved": "https://registry.npmmirror.com/elliptic/-/elliptic-6.5.4.tgz", + "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "dev": true, + "requires": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmmirror.com/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + } + } + }, "encodeurl": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", @@ -288,20 +5267,279 @@ "version": "1.4.4", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, "requires": { "once": "^1.4.0" } }, + "es-abstract": { + "version": "1.20.1", + "resolved": "https://registry.npmmirror.com/es-abstract/-/es-abstract-1.20.1.tgz", + "integrity": "sha512-WEm2oBhfoI2sImeM4OF2zE2V3BYdSF+KnSi9Sidz51fQHd7+JuF8Xgcj9/0o+OWeIeIS/MiuNnlruQrJf16GQA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "function.prototype.name": "^1.1.5", + "get-intrinsic": "^1.1.1", + "get-symbol-description": "^1.0.0", + "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.3", + "is-callable": "^1.2.4", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "regexp.prototype.flags": "^1.4.3", + "string.prototype.trimend": "^1.0.5", + "string.prototype.trimstart": "^1.0.5", + "unbox-primitive": "^1.0.2" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "es5-ext": { + "version": "0.10.61", + "resolved": "https://registry.npmmirror.com/es5-ext/-/es5-ext-0.10.61.tgz", + "integrity": "sha512-yFhIqQAzu2Ca2I4SE2Au3rxVfmohU9Y7wqGR+s7+H7krk26NXhIRAZDgqd6xqjCEFUomDEA3/Bo/7fKmIkW1kA==", + "dev": true, + "requires": { + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.3", + "next-tick": "^1.1.0" + } + }, + "es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "es6-map": { + "version": "0.1.5", + "resolved": "https://registry.npmmirror.com/es6-map/-/es6-map-0.1.5.tgz", + "integrity": "sha512-mz3UqCh0uPCIqsw1SSAkB/p0rOzF/M0V++vyN7JqlPtSW/VsYgQBvVvqMLmfBuyMzTpLnNqi6JmcSizs4jy19A==", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "~0.10.14", + "es6-iterator": "~2.0.1", + "es6-set": "~0.1.5", + "es6-symbol": "~3.1.1", + "event-emitter": "~0.3.5" + } + }, + "es6-set": { + "version": "0.1.5", + "resolved": "https://registry.npmmirror.com/es6-set/-/es6-set-0.1.5.tgz", + "integrity": "sha512-7S8YXIcUfPMOr3rqJBVMePAbRsD1nWeSMQ86K/lDI76S3WKXz+KWILvTIPbTroubOkZTGh+b+7/xIIphZXNYbA==", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "~0.10.14", + "es6-iterator": "~2.0.1", + "es6-symbol": "3.1.1", + "event-emitter": "~0.3.5" + }, + "dependencies": { + "es6-symbol": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/es6-symbol/-/es6-symbol-3.1.1.tgz", + "integrity": "sha512-exfuQY8UGtn/N+gL1iKkH8fpNd5sJ760nJq6mmZAHldfxMD5kX07lbQuYlspoXsuknXNv9Fb7y2GsPOnQIbxHg==", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "~0.10.14" + } + } + } + }, + "es6-symbol": { + "version": "3.1.3", + "resolved": "https://registry.npmmirror.com/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "dev": true, + "requires": { + "d": "^1.0.1", + "ext": "^1.1.2" + } + }, + "es6-weak-map": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/es6-weak-map/-/es6-weak-map-2.0.3.tgz", + "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "^0.10.46", + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.1" + } + }, "escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true + }, + "escodegen": { + "version": "1.14.3", + "resolved": "https://registry.npmmirror.com/escodegen/-/escodegen-1.14.3.tgz", + "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", + "dev": true, + "requires": { + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "optional": true + } + } + }, + "escope": { + "version": "3.6.0", + "resolved": "https://registry.npmmirror.com/escope/-/escope-3.6.0.tgz", + "integrity": "sha512-75IUQsusDdalQEW/G/2esa87J7raqdJF+Ca0/Xm5C3Q58Nr4yVYjZGp/P1+2xiEVgXRrA39dpRb8LcshajbqDQ==", + "dev": true, + "requires": { + "es6-map": "^0.1.3", + "es6-weak-map": "^2.0.1", + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmmirror.com/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" + }, + "espurify": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/espurify/-/espurify-2.1.1.tgz", + "integrity": "sha512-zttWvnkhcDyGOhSH4vO2qCBILpdCMv/MX8lp4cqgRkQoDRGK2oZxi2GfWhlP2dIXmk7BaKeOTuzbHhyC68o8XQ==", + "dev": true + }, + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmmirror.com/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "requires": { + "estraverse": "^5.2.0" + }, + "dependencies": { + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmmirror.com/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + } + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmmirror.com/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + }, + "estree-is-function": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/estree-is-function/-/estree-is-function-1.0.0.tgz", + "integrity": "sha512-nSCWn1jkSq2QAtkaVLJZY2ezwcFO161HVc174zL1KPW3RJ+O6C3eJb8Nx7OXzvhoEv+nLgSR1g71oWUHUDTrJA==", + "dev": true + }, + "estree-is-identifier": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/estree-is-identifier/-/estree-is-identifier-1.0.0.tgz", + "integrity": "sha512-2BDRGrkQJV/NhCAmmE33A35WAaxq3WQaGHgQuD//7orGWfpFqj8Srkwvx0TH+20yIdOF1yMQwi8anv5ISec2AQ==", + "dev": true + }, + "estree-is-member-expression": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/estree-is-member-expression/-/estree-is-member-expression-1.0.0.tgz", + "integrity": "sha512-Ec+X44CapIGExvSZN+pGkmr5p7HwUVQoPQSd458Lqwvaf4/61k/invHSh4BYK8OXnCkfEhWuIoG5hayKLQStIg==", + "dev": true + }, + "estree-is-require": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/estree-is-require/-/estree-is-require-1.0.0.tgz", + "integrity": "sha512-oWxQdSEmnUwNZsDQYiBNpVxKEhMmsJQSSxnDrwsr1MWtooCLfhgzsNGzmokdmfK0EzEIS5V4LPvqxv1Kmb1vvA==", + "dev": true, + "requires": { + "estree-is-identifier": "^1.0.0" + } + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, "etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" }, + "event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmmirror.com/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "~0.10.14" + } + }, + "events": { + "version": "3.3.0", + "resolved": "https://registry.npmmirror.com/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true + }, + "evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dev": true, + "requires": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, "express": { "version": "4.17.1", "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", @@ -339,6 +5577,23 @@ "vary": "~1.1.2" } }, + "ext": { + "version": "1.6.0", + "resolved": "https://registry.npmmirror.com/ext/-/ext-1.6.0.tgz", + "integrity": "sha512-sdBImtzkq2HpkdRLtlLWDa6w4DX22ijZLKx8BMPUuKe1c5lbN6xwQDQCxSfxBQnHZ13ls/FH0MQZx/q/gr6FQg==", + "dev": true, + "requires": { + "type": "^2.5.0" + }, + "dependencies": { + "type": { + "version": "2.6.0", + "resolved": "https://registry.npmmirror.com/type/-/type-2.6.0.tgz", + "integrity": "sha512-eiDBDOmkih5pMbo9OqsqPRGMljLodLcwd5XD5JbtNB0o89xZAwynY9EdCDsJU7LtcVCClu9DvM7/0Ep1hYX3EQ==", + "dev": true + } + } + }, "extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", @@ -349,6 +5604,22 @@ "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" }, + "falafel": { + "version": "2.2.5", + "resolved": "https://registry.npmmirror.com/falafel/-/falafel-2.2.5.tgz", + "integrity": "sha512-HuC1qF9iTnHDnML9YZAdCDQwT0yKl/U55K4XSUXqGAA2GLoafFgWRqdAbhWJxXaYD4pyoVxAJ8wH670jMpI9DQ==", + "requires": { + "acorn": "^7.1.1", + "isarray": "^2.0.1" + }, + "dependencies": { + "isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmmirror.com/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" + } + } + }, "fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -359,6 +5630,18 @@ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmmirror.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "fast-safe-stringify": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", + "dev": true + }, "finalhandler": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", @@ -379,6 +5662,15 @@ "integrity": "sha512-aq6gF1BEKje4a9i9+5jimNFIpq4Q1WiwBToeRK5NvZBd/TRsmW8BsJfOEGkr76TbOyPVD3OVDN910EcUNtRYEA==", "dev": true }, + "for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmmirror.com/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "requires": { + "is-callable": "^1.1.3" + } + }, "forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", @@ -404,12 +5696,79 @@ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" }, - "get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "from2": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/from2/-/from2-2.3.0.tgz", + "integrity": "sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==", + "dev": true, "requires": { - "pump": "^3.0.0" + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "from2-string": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/from2-string/-/from2-string-1.1.0.tgz", + "integrity": "sha512-m8vCh+KnXXXBtfF2VUbiYlQ+nczLcntB0BrtNgpmLkHylhObe9WF1b2LZjBBzrZzA6P4mkEla6ZYQoOUTG8cYA==", + "dev": true, + "requires": { + "from2": "^2.0.3" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "function.prototype.name": { + "version": "1.1.5", + "resolved": "https://registry.npmmirror.com/function.prototype.name/-/function.prototype.name-1.1.5.tgz", + "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0", + "functions-have-names": "^1.2.2" + } + }, + "functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmmirror.com/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true + }, + "get-assigned-identifiers": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/get-assigned-identifiers/-/get-assigned-identifiers-1.2.0.tgz", + "integrity": "sha512-mBBwmeGTrxEMO4pMaaf/uUEFHnYtwr8FTe8Y/mer4rcV/bye0qGm6pw1bGZFGStxC5O76c5ZAVBGnqHmOaJpdQ==", + "dev": true + }, + "get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, + "get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" } }, "getpass": { @@ -420,22 +5779,18 @@ "assert-plus": "^1.0.0" } }, - "got": { - "version": "11.6.1", - "resolved": "https://registry.npmjs.org/got/-/got-11.6.1.tgz", - "integrity": "sha512-6izGvOsrd/4CsIdQMgweFOTCtS4sAwJTuCzIuVoTbCDzt3+wa3eGIHhSIMgEF6gfCDenslGlMUmAdPap5DkirQ==", + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmmirror.com/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, "requires": { - "@sindresorhus/is": "^3.1.1", - "@szmarczak/http-timer": "^4.0.5", - "@types/cacheable-request": "^6.0.1", - "@types/responselike": "^1.0.0", - "cacheable-lookup": "^5.0.3", - "cacheable-request": "^7.0.1", - "decompress-response": "^6.0.0", - "http2-wrapper": "^1.0.0-beta.5.2", - "lowercase-keys": "^2.0.0", - "p-cancelable": "^2.0.0", - "responselike": "^2.0.0" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" } }, "har-schema": { @@ -452,10 +5807,115 @@ "har-schema": "^2.0.0" } }, - "http-cache-semantics": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", - "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==" + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true + }, + "has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.1" + } + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true + }, + "has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "requires": { + "has-symbols": "^1.0.2" + } + }, + "hash-base": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/hash-base/-/hash-base-3.1.0.tgz", + "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", + "dev": true, + "requires": { + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "dependencies": { + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + } + } + }, + "hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmmirror.com/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", + "dev": true, + "requires": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "htmlescape": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/htmlescape/-/htmlescape-1.1.1.tgz", + "integrity": "sha512-eVcrzgbR4tim7c7soKQKtxa/kQM4TzjnlU83rcZ9bHU6t31ehfV7SktN6McWgwPWg+JYMA/O3qpGxBvFq1z2Jg==", + "dev": true }, "http-errors": { "version": "1.7.2", @@ -479,14 +5939,11 @@ "sshpk": "^1.7.0" } }, - "http2-wrapper": { - "version": "1.0.0-beta.5.2", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.0-beta.5.2.tgz", - "integrity": "sha512-xYz9goEyBnC8XwXDTuC/MZ6t+MrKVQZOk4s7+PaDkwIsQd8IwqvM+0M6bA/2lvG8GHXcPdf+MejTUeO2LCPCeQ==", - "requires": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.0.0" - } + "https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==", + "dev": true }, "iconv-lite": { "version": "0.4.24", @@ -496,36 +5953,246 @@ "safer-buffer": ">= 2.1.2 < 3" } }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmmirror.com/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, "inherits": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" }, + "inline-source-map": { + "version": "0.6.2", + "resolved": "https://registry.npmmirror.com/inline-source-map/-/inline-source-map-0.6.2.tgz", + "integrity": "sha512-0mVWSSbNDvedDWIN4wxLsdPM4a7cIPcpyMxj3QZ406QRwQ6ePGB1YIHxVPjqpcUGbWQ5C+nHTwGNWAGvt7ggVA==", + "dev": true, + "requires": { + "source-map": "~0.5.3" + } + }, + "insert-module-globals": { + "version": "7.2.1", + "resolved": "https://registry.npmmirror.com/insert-module-globals/-/insert-module-globals-7.2.1.tgz", + "integrity": "sha512-ufS5Qq9RZN+Bu899eA9QCAYThY+gGW7oRkmb0vC93Vlyu/CFGcH0OYPEjVkDXA5FEbTt1+VWzdoOD3Ny9N+8tg==", + "dev": true, + "requires": { + "acorn-node": "^1.5.2", + "combine-source-map": "^0.8.0", + "concat-stream": "^1.6.1", + "is-buffer": "^1.1.0", + "JSONStream": "^1.0.3", + "path-is-absolute": "^1.0.1", + "process": "~0.11.0", + "through2": "^2.0.0", + "undeclared-identifiers": "^1.1.2", + "xtend": "^4.0.0" + } + }, + "internal-slot": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/internal-slot/-/internal-slot-1.0.3.tgz", + "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + } + }, "ipaddr.js": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" }, + "is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "requires": { + "has-bigints": "^1.0.1" + } + }, + "is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmmirror.com/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-callable": { + "version": "1.2.4", + "resolved": "https://registry.npmmirror.com/is-callable/-/is-callable-1.2.4.tgz", + "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", + "dev": true + }, + "is-core-module": { + "version": "2.9.0", + "resolved": "https://registry.npmmirror.com/is-core-module/-/is-core-module-2.9.0.tgz", + "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmmirror.com/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmmirror.com/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-negative-zero": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "dev": true + }, + "is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmmirror.com/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2" + } + }, + "is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmmirror.com/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "requires": { + "has-symbols": "^1.0.2" + } + }, + "is-typed-array": { + "version": "1.1.9", + "resolved": "https://registry.npmmirror.com/is-typed-array/-/is-typed-array-1.1.9.tgz", + "integrity": "sha512-kfrlnTTn8pZkfpJMUgYD7YZ3qzeJgWUn8XfVYBARc4wnmNOmLbmuuaAs3q5fvB0UJOn6yHAKaGTPM7d6ezoD/A==", + "dev": true, + "requires": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "es-abstract": "^1.20.0", + "for-each": "^0.3.3", + "has-tostringtag": "^1.0.0" + } + }, "is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" }, + "is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, "isstream": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" }, + "js-base64": { + "version": "3.7.2", + "resolved": "https://registry.npmmirror.com/js-base64/-/js-base64-3.7.2.tgz", + "integrity": "sha512-NnRs6dsyqUXejqk/yv2aiXlAvOs56sLkX6nUdeaNezI5LFFLlsZjOThmwnrcwh5ZZRwZlCMnVAY3CvhIhoVEKQ==" + }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmmirror.com/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, "jsbn": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" }, - "json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" - }, "json-schema": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", @@ -541,6 +6208,22 @@ "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" }, + "jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmmirror.com/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", + "dev": true + }, + "JSONStream": { + "version": "1.3.5", + "resolved": "https://registry.npmmirror.com/JSONStream/-/JSONStream-1.3.5.tgz", + "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", + "dev": true, + "requires": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + } + }, "jsprim": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", @@ -552,18 +6235,51 @@ "verror": "1.10.0" } }, - "keyv": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.0.1.tgz", - "integrity": "sha512-xz6Jv6oNkbhrFCvCP7HQa8AaII8y8LRpoSm661NOKLr4uHuBwhX4epXrPQgF3+xdJnN4Esm5X0xwY4bOlALOtw==", + "labeled-stream-splicer": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/labeled-stream-splicer/-/labeled-stream-splicer-2.0.2.tgz", + "integrity": "sha512-Ca4LSXFFZUjPScRaqOcFxneA0VpKZr4MMYCljyQr4LIewTLb3Y0IUTIsnBBsVubIeEfxeSZpSjSsRM8APEQaAw==", + "dev": true, "requires": { - "json-buffer": "3.0.1" + "inherits": "^2.0.1", + "stream-splicer": "^2.0.0" } }, - "lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==" + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmmirror.com/levn/-/levn-0.3.0.tgz", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "lodash.memoize": { + "version": "3.0.4", + "resolved": "https://registry.npmmirror.com/lodash.memoize/-/lodash.memoize-3.0.4.tgz", + "integrity": "sha512-eDn9kqrAmVUC1wmZvlQ6Uhde44n+tXpqPrN8olQJbttgh0oKclk+SF54P47VEGE9CEiMeRwAP8BaM7UHvBkz2A==", + "dev": true + }, + "magic-string": { + "version": "0.23.2", + "resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.23.2.tgz", + "integrity": "sha512-oIUZaAxbcxYIp4AyLafV6OVKoB3YouZs0UTCJ8mOKBHNyJgGDaMJ4TgA+VylJh6fx7EQCC52XkbURxxG9IoJXA==", + "dev": true, + "requires": { + "sourcemap-codec": "^1.4.1" + } + }, + "md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmmirror.com/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } }, "media-typer": { "version": "0.3.0", @@ -575,11 +6291,38 @@ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" }, + "merge-source-map": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/merge-source-map/-/merge-source-map-1.0.4.tgz", + "integrity": "sha512-PGSmS0kfnTnMJCzJ16BLLCEe6oeYCamKFFdQKshi4BmM6FUwipjVOcBFGxqtQtirtAG4iZvHlqST9CpZKqlRjA==", + "dev": true, + "requires": { + "source-map": "^0.5.6" + } + }, "methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" }, + "miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmmirror.com/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmmirror.com/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + } + } + }, "mime": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", @@ -598,31 +6341,218 @@ "mime-db": "1.44.0" } }, - "mimic-response": { + "minify-stream": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/minify-stream/-/minify-stream-2.1.0.tgz", + "integrity": "sha512-P5xE4EQRkn7Td54VGcgfDMFx1jmKPPIXCdcMfrbXS6cNHK4dO1LXwtYFb48hHrSmZfT+jlGImvHgSZEkbpNtCw==", + "dev": true, + "requires": { + "concat-stream": "^2.0.0", + "convert-source-map": "^1.5.0", + "duplexify": "^4.1.1", + "from2-string": "^1.1.0", + "terser": "^4.7.0", + "xtend": "^4.0.1" + }, + "dependencies": { + "concat-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/concat-stream/-/concat-stream-2.0.0.tgz", + "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.0.2", + "typedarray": "^0.0.6" + } + }, + "convert-source-map": { + "version": "1.8.0", + "resolved": "https://registry.npmmirror.com/convert-source-map/-/convert-source-map-1.8.0.tgz", + "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "minimalistic-assert": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==" + "resolved": "https://registry.npmmirror.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==", + "dev": true + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.6", + "resolved": "https://registry.npmmirror.com/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", + "dev": true + }, + "mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmmirror.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", + "dev": true + }, + "module-deps": { + "version": "6.2.3", + "resolved": "https://registry.npmmirror.com/module-deps/-/module-deps-6.2.3.tgz", + "integrity": "sha512-fg7OZaQBcL4/L+AK5f4iVqf9OMbCclXfy/znXRxTVhJSeW5AIlS9AwheYwDaXM3lVW7OBeaeUEY3gbaC6cLlSA==", + "dev": true, + "requires": { + "browser-resolve": "^2.0.0", + "cached-path-relative": "^1.0.2", + "concat-stream": "~1.6.0", + "defined": "^1.0.0", + "detective": "^5.2.0", + "duplexer2": "^0.1.2", + "inherits": "^2.0.1", + "JSONStream": "^1.0.3", + "parents": "^1.0.0", + "readable-stream": "^2.0.2", + "resolve": "^1.4.0", + "stream-combiner2": "^1.1.1", + "subarg": "^1.0.0", + "through2": "^2.0.0", + "xtend": "^4.0.0" + } }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, + "multi-stage-sourcemap": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/multi-stage-sourcemap/-/multi-stage-sourcemap-0.2.1.tgz", + "integrity": "sha512-umaOM+8BZByZIB/ciD3dQLzTv50rEkkGJV78ta/tIVc/J/rfGZY5y1R+fBD3oTaolx41mK8rRcyGtYbDXlzx8Q==", + "dev": true, + "requires": { + "source-map": "^0.1.34" + }, + "dependencies": { + "source-map": { + "version": "0.1.43", + "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.1.43.tgz", + "integrity": "sha512-VtCvB9SIQhk3aF6h+N85EaqIaBFIAfZ9Cu+NJHHVvc8BbEcnvDcFw6sqQ2dQrT6SlOrZq3tIvyD9+EGq/lJryQ==", + "dev": true, + "requires": { + "amdefine": ">=0.0.4" + } + } + } + }, + "multisplice": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/multisplice/-/multisplice-1.0.0.tgz", + "integrity": "sha512-KU5tVjIdTGsMb92JlWwEZCGrvtI1ku9G9GuNbWdQT/Ici1ztFXX0L8lWpbbC3pISVMfBNL56wdqplHvva2XSlA==", + "dev": true + }, + "mutexify": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/mutexify/-/mutexify-1.4.0.tgz", + "integrity": "sha512-pbYSsOrSB/AKN5h/WzzLRMFgZhClWccf2XIB4RSMC8JbquiB0e0/SH5AIfdQMdyHmYtv4seU7yV/TvAwPLJ1Yg==", + "dev": true, + "requires": { + "queue-tick": "^1.0.0" + } + }, + "nanobench": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/nanobench/-/nanobench-2.1.1.tgz", + "integrity": "sha512-z+Vv7zElcjN+OpzAxAquUayFLGK3JI/ubCl0Oh64YQqsTGG09CGqieJVQw4ui8huDnnAgrvTv93qi5UaOoNj8A==", + "dev": true, + "requires": { + "browser-process-hrtime": "^0.1.2", + "chalk": "^1.1.3", + "mutexify": "^1.1.0", + "pretty-hrtime": "^1.0.2" + } + }, "negotiator": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" }, - "normalize-url": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.0.tgz", - "integrity": "sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==" + "next-tick": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/next-tick/-/next-tick-1.1.0.tgz", + "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==", + "dev": true }, "oauth-sign": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmmirror.com/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true + }, + "object-inspect": { + "version": "1.12.1", + "resolved": "https://registry.npmmirror.com/object-inspect/-/object-inspect-1.12.1.tgz", + "integrity": "sha512-Y/jF6vnvEtOPGiKD1+q+X0CiUYRQtEHp89MLLUJ7TUivtH8Ugn2+3A7Rynqk7BRsAoqeOQWnFnjpDrKSxDgIGA==", + "dev": true + }, + "object-is": { + "version": "1.1.5", + "resolved": "https://registry.npmmirror.com/object-is/-/object-is-1.1.5.tgz", + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, + "object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmmirror.com/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + } + }, "on-finished": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", @@ -635,30 +6565,134 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, "requires": { "wrappy": "1" } }, - "p-cancelable": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.0.0.tgz", - "integrity": "sha512-wvPXDmbMmu2ksjkB4Z3nZWTSkJEb9lqVdMaCKpZUGJG9TMiNp9XcbG3fn9fPKjem04fJMJnXoyFPk2FmgiaiNg==" + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmmirror.com/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dev": true, + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + } + }, + "os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmmirror.com/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==", + "dev": true + }, + "pako": { + "version": "1.0.11", + "resolved": "https://registry.npmmirror.com/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "dev": true + }, + "parents": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/parents/-/parents-1.0.1.tgz", + "integrity": "sha512-mXKF3xkoUt5td2DoxpLmtOmZvko9VfFpwRwkKDHSNvgmpLAeBo18YDhcPbBzJq+QLCHMbGOfzia2cX4U+0v9Mg==", + "dev": true, + "requires": { + "path-platform": "~0.11.15" + } + }, + "parse-asn1": { + "version": "5.1.6", + "resolved": "https://registry.npmmirror.com/parse-asn1/-/parse-asn1-5.1.6.tgz", + "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", + "dev": true, + "requires": { + "asn1.js": "^5.2.0", + "browserify-aes": "^1.0.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" + } }, "parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" }, + "path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmmirror.com/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "path-platform": { + "version": "0.11.15", + "resolved": "https://registry.npmmirror.com/path-platform/-/path-platform-0.11.15.tgz", + "integrity": "sha512-Y30dB6rab1A/nfEKsZxmr01nUotHX0c/ZiIAsCTatEe1CmS5Pm5He7fZ195bPT7RdquoaL8lLxFCMQi/bS7IJg==", + "dev": true + }, "path-to-regexp": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" }, + "pbkdf2": { + "version": "3.1.2", + "resolved": "https://registry.npmmirror.com/pbkdf2/-/pbkdf2-3.1.2.tgz", + "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", + "dev": true, + "requires": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, "performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", + "dev": true + }, + "pretty-hrtime": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", + "integrity": "sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A==", + "dev": true + }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmmirror.com/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, "proxy-addr": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", @@ -673,13 +6707,26 @@ "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmmirror.com/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "dev": true, "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmmirror.com/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + } } }, "punycode": { @@ -692,10 +6739,101 @@ "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" }, - "quick-lru": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==" + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmmirror.com/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==", + "dev": true + }, + "querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==", + "dev": true + }, + "queue-tick": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/queue-tick/-/queue-tick-1.0.0.tgz", + "integrity": "sha512-ULWhjjE8BmiICGn3G8+1L9wFpERNxkf8ysxkAer4+TFdRefDaXOCV5m92aMB9FtBVmn/8sETXLXY6BfW7hyaWQ==", + "dev": true + }, + "quote-stream": { + "version": "0.0.0", + "resolved": "https://registry.npmmirror.com/quote-stream/-/quote-stream-0.0.0.tgz", + "integrity": "sha512-m4VtvjAMx00wgAS6eOy50ZDat1EBQeFKBIrtF/oxUt0MenEI33y7runJcRiOihc+JBBIt2aFFJhILIh4e9shJA==", + "requires": { + "minimist": "0.0.8", + "through2": "~0.4.1" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmmirror.com/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmmirror.com/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha512-miQKw5Hv4NS1Psg2517mV4e4dYNaO3++hjAvLOAzKqZ61rH8NS1SK+vbfBWZ5PY/Me/bEWhUwqMghEW5Fb9T7Q==" + }, + "object-keys": { + "version": "0.4.0", + "resolved": "https://registry.npmmirror.com/object-keys/-/object-keys-0.4.0.tgz", + "integrity": "sha512-ncrLw+X55z7bkl5PnUvHwFK9FcGuFYo9gtjws2XtSzL+aZ8tm830P60WJ0dSmFVaSalWieW5MD7kEdnXda9yJw==" + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmmirror.com/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==" + }, + "through2": { + "version": "0.4.2", + "resolved": "https://registry.npmmirror.com/through2/-/through2-0.4.2.tgz", + "integrity": "sha512-45Llu+EwHKtAZYTPPVn3XZHBgakWMN3rokhEv5hu596XP+cNgplMg+Gj+1nmAvj+L0K7+N49zBKx5rah5u0QIQ==", + "requires": { + "readable-stream": "~1.0.17", + "xtend": "~2.1.1" + } + }, + "xtend": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/xtend/-/xtend-2.1.2.tgz", + "integrity": "sha512-vMNKzr2rHP9Dp/e1NQFnLQlwlhp9L/LfvnsVdHxN1f+uggyVI3i08uD14GPvCToPkdsRfyPqIyYGmIk58V98ZQ==", + "requires": { + "object-keys": "~0.4.0" + } + } + } + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "dev": true, + "requires": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } }, "range-parser": { "version": "1.2.1", @@ -713,6 +6851,50 @@ "unpipe": "1.0.0" } }, + "read-only-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/read-only-stream/-/read-only-stream-2.0.0.tgz", + "integrity": "sha512-3ALe0bjBVZtkdWKIcThYpQCLbBMd/+Tbh2CDSrAIDO3UsZ4Xs+tnyjv2MjCOMMgBG+AsUOeuP1cgtY1INISc8w==", + "dev": true, + "requires": { + "readable-stream": "^2.0.2" + } + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + }, + "dependencies": { + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "regexp.prototype.flags": { + "version": "1.4.3", + "resolved": "https://registry.npmmirror.com/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", + "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "functions-have-names": "^1.2.2" + } + }, "request": { "version": "2.88.2", "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", @@ -747,17 +6929,25 @@ } } }, - "resolve-alpn": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.0.0.tgz", - "integrity": "sha512-rTuiIEqFmGxne4IovivKSDzld2lWW9QCjqv80SYjPgf+gS35eaCAjaP54CCwGAwBtnCsvNLYtqxe1Nw+i6JEmA==" - }, - "responselike": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.0.tgz", - "integrity": "sha512-xH48u3FTB9VsZw7R+vvgaKeLKzT6jOogbQhEe/jewwnZgzPcnyWui2Av6JpoYZF/91uueC+lqhWqeURw5/qhCw==", + "resolve": { + "version": "1.22.0", + "resolved": "https://registry.npmmirror.com/resolve/-/resolve-1.22.0.tgz", + "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", + "dev": true, "requires": { - "lowercase-keys": "^2.0.0" + "is-core-module": "^2.8.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" } }, "safe-buffer": { @@ -770,6 +6960,29 @@ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, + "scope-analyzer": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/scope-analyzer/-/scope-analyzer-2.1.2.tgz", + "integrity": "sha512-5cfCmsTYV/wPaRIItNxatw02ua/MThdIUNnUOCYp+3LSEJvnG804ANw2VLaavNILIfWXF1D1G2KNANkBBvInwQ==", + "dev": true, + "requires": { + "array-from": "^2.1.1", + "dash-ast": "^2.0.1", + "es6-map": "^0.1.5", + "es6-set": "^0.1.5", + "es6-symbol": "^3.1.1", + "estree-is-function": "^1.0.0", + "get-assigned-identifiers": "^1.1.0" + }, + "dependencies": { + "dash-ast": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/dash-ast/-/dash-ast-2.0.1.tgz", + "integrity": "sha512-5TXltWJGc+RdnabUGzhRae1TRq6m4gr+3K2wQX0is5/F2yS6MJXJvLyI3ErAnsAXuJoGqvfVD5icRgim07DrxQ==", + "dev": true + } + } + }, "send": { "version": "0.17.1", "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", @@ -813,6 +7026,88 @@ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" }, + "sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmmirror.com/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "shallow-copy": { + "version": "0.0.1", + "resolved": "https://registry.npmmirror.com/shallow-copy/-/shallow-copy-0.0.1.tgz", + "integrity": "sha512-b6i4ZpVuUxB9h5gfCxPiusKYkqTMOjEbBs4wMaFbkfia4yFv92UKZ6Df8WXcKbn08JNL/abvg3FnMAOfakDvUw==" + }, + "shasum-object": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/shasum-object/-/shasum-object-1.0.0.tgz", + "integrity": "sha512-Iqo5rp/3xVi6M4YheapzZhhGPVs0yZwHj7wvwQ1B9z8H6zk+FEnI7y3Teq7qwnekfEhu8WmG2z0z4iWZaxLWVg==", + "dev": true, + "requires": { + "fast-safe-stringify": "^2.0.7" + } + }, + "shell-quote": { + "version": "1.7.3", + "resolved": "https://registry.npmmirror.com/shell-quote/-/shell-quote-1.7.3.tgz", + "integrity": "sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw==", + "dev": true + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "devOptional": true + }, + "source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmmirror.com/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmmirror.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "dev": true + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" + }, "sshpk": { "version": "1.16.1", "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", @@ -829,11 +7124,462 @@ "tweetnacl": "~0.14.0" } }, + "static-eval": { + "version": "0.2.4", + "resolved": "https://registry.npmmirror.com/static-eval/-/static-eval-0.2.4.tgz", + "integrity": "sha512-6dWWPfa/0+1zULdQi7ssT5EQZHsGK8LygBzhE/HdafNCo4e/Ibt7vLPfxBw9VcdVV+t0ARtN4ZAJKtApVc0A5Q==", + "requires": { + "escodegen": "~0.0.24" + }, + "dependencies": { + "escodegen": { + "version": "0.0.28", + "resolved": "https://registry.npmmirror.com/escodegen/-/escodegen-0.0.28.tgz", + "integrity": "sha512-6ioQhg16lFs5c7XJlJFXIDxBjO4yRvXC9yK6dLNNGuhI3a/fJukHanPF6qtpjGDgAFzI8Wuq3PSIarWmaOq/5A==", + "requires": { + "esprima": "~1.0.2", + "estraverse": "~1.3.0", + "source-map": ">= 0.1.2" + } + }, + "esprima": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/esprima/-/esprima-1.0.4.tgz", + "integrity": "sha512-rp5dMKN8zEs9dfi9g0X1ClLmV//WRyk/R15mppFNICIFRG5P92VP7Z04p8pk++gABo9W2tY+kHyu6P1mEHgmTA==" + }, + "estraverse": { + "version": "1.3.2", + "resolved": "https://registry.npmmirror.com/estraverse/-/estraverse-1.3.2.tgz", + "integrity": "sha512-OkbCPVUu8D9tbsLcUR+CKFRBbhZlogmkbWaP3BPERlkqzWL5Q6IdTz6eUk+b5cid2MTaCqJb2nNRGoJ8TpfPrg==" + } + } + }, + "static-js-yaml": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/static-js-yaml/-/static-js-yaml-1.0.0.tgz", + "integrity": "sha512-SHd8UBXpEUeFEhexli7Nn1+fysyhU3LiQFKcwnqM3l5wzvJU6QoXg4cMtjjZjfc4ngRj934188v7FHgDyZ6U9A==", + "requires": { + "js-yaml": "^3.3.0", + "static-module": "^1.1.2", + "through2": "^0.6.5" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmmirror.com/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmmirror.com/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==" + }, + "through2": { + "version": "0.6.5", + "resolved": "https://registry.npmmirror.com/through2/-/through2-0.6.5.tgz", + "integrity": "sha512-RkK/CCESdTKQZHdmKICijdKKsCRVHs5KsLZ6pACAmF/1GPUQhonHSXWNERctxEp7RmvjdNbZTL5z9V7nSCXKcg==", + "requires": { + "readable-stream": ">=1.0.33-1 <1.1.0-0", + "xtend": ">=4.0.0 <4.1.0-0" + } + } + } + }, + "static-module": { + "version": "1.5.0", + "resolved": "https://registry.npmmirror.com/static-module/-/static-module-1.5.0.tgz", + "integrity": "sha512-XTj7pQOHT33l77lK/Pu8UXqzI44C6LYAqwAc9hLTTESHRqJAFudBpReuopFPpoRr5CtOoSmGfFQC6FPlbDnyCw==", + "requires": { + "concat-stream": "~1.6.0", + "duplexer2": "~0.0.2", + "escodegen": "~1.3.2", + "falafel": "^2.1.0", + "has": "^1.0.0", + "object-inspect": "~0.4.0", + "quote-stream": "~0.0.0", + "readable-stream": "~1.0.27-1", + "shallow-copy": "~0.0.1", + "static-eval": "~0.2.0", + "through2": "~0.4.1" + }, + "dependencies": { + "duplexer2": { + "version": "0.0.2", + "resolved": "https://registry.npmmirror.com/duplexer2/-/duplexer2-0.0.2.tgz", + "integrity": "sha512-+AWBwjGadtksxjOQSFDhPNQbed7icNXApT4+2BNpsXzcCBiInq2H9XW0O8sfHFaPmnQRs7cg/P0fAr2IWQSW0g==", + "requires": { + "readable-stream": "~1.1.9" + }, + "dependencies": { + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + } + } + }, + "escodegen": { + "version": "1.3.3", + "resolved": "https://registry.npmmirror.com/escodegen/-/escodegen-1.3.3.tgz", + "integrity": "sha512-z9FWgKc48wjMlpzF5ymKS1AF8OIgnKLp9VyN7KbdtyrP/9lndwUFqCtMm+TAJmJf7KJFFYc4cFJfVTTGkKEwsA==", + "requires": { + "esprima": "~1.1.1", + "estraverse": "~1.5.0", + "esutils": "~1.0.0", + "source-map": "~0.1.33" + } + }, + "esprima": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/esprima/-/esprima-1.1.1.tgz", + "integrity": "sha512-qxxB994/7NtERxgXdFgLHIs9M6bhLXc6qtUmWZ3L8+gTQ9qaoyki2887P2IqAYsoENyr8SUbTutStDniOHSDHg==" + }, + "estraverse": { + "version": "1.5.1", + "resolved": "https://registry.npmmirror.com/estraverse/-/estraverse-1.5.1.tgz", + "integrity": "sha512-FpCjJDfmo3vsc/1zKSeqR5k42tcIhxFIlvq+h9j0fO2q/h2uLKyweq7rYJ+0CoVvrGQOxIS5wyBrW/+vF58BUQ==" + }, + "esutils": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/esutils/-/esutils-1.0.0.tgz", + "integrity": "sha512-x/iYH53X3quDwfHRz4y8rn4XcEwwCJeWsul9pF1zldMbGtgOtMNBEOuYWwB1EQlK2LRa1fev3YAgym/RElp5Cg==" + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmmirror.com/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" + }, + "object-inspect": { + "version": "0.4.0", + "resolved": "https://registry.npmmirror.com/object-inspect/-/object-inspect-0.4.0.tgz", + "integrity": "sha512-8WvkvUZiKAjjsy/63rJjA7jw9uyF0CLVLjBKEfnPHE3Jxvs1LgwqL2OmJN+LliIX1vrzKW+AAu02Cc+xv27ncQ==" + }, + "object-keys": { + "version": "0.4.0", + "resolved": "https://registry.npmmirror.com/object-keys/-/object-keys-0.4.0.tgz", + "integrity": "sha512-ncrLw+X55z7bkl5PnUvHwFK9FcGuFYo9gtjws2XtSzL+aZ8tm830P60WJ0dSmFVaSalWieW5MD7kEdnXda9yJw==" + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "source-map": { + "version": "0.1.43", + "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.1.43.tgz", + "integrity": "sha512-VtCvB9SIQhk3aF6h+N85EaqIaBFIAfZ9Cu+NJHHVvc8BbEcnvDcFw6sqQ2dQrT6SlOrZq3tIvyD9+EGq/lJryQ==", + "optional": true, + "requires": { + "amdefine": ">=0.0.4" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmmirror.com/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==" + }, + "through2": { + "version": "0.4.2", + "resolved": "https://registry.npmmirror.com/through2/-/through2-0.4.2.tgz", + "integrity": "sha512-45Llu+EwHKtAZYTPPVn3XZHBgakWMN3rokhEv5hu596XP+cNgplMg+Gj+1nmAvj+L0K7+N49zBKx5rah5u0QIQ==", + "requires": { + "readable-stream": "~1.0.17", + "xtend": "~2.1.1" + } + }, + "xtend": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/xtend/-/xtend-2.1.2.tgz", + "integrity": "sha512-vMNKzr2rHP9Dp/e1NQFnLQlwlhp9L/LfvnsVdHxN1f+uggyVI3i08uD14GPvCToPkdsRfyPqIyYGmIk58V98ZQ==", + "requires": { + "object-keys": "~0.4.0" + } + } + } + }, "statuses": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" }, + "stream-browserify": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/stream-browserify/-/stream-browserify-3.0.0.tgz", + "integrity": "sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==", + "dev": true, + "requires": { + "inherits": "~2.0.4", + "readable-stream": "^3.5.0" + }, + "dependencies": { + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "stream-combiner": { + "version": "0.2.2", + "resolved": "https://registry.npmmirror.com/stream-combiner/-/stream-combiner-0.2.2.tgz", + "integrity": "sha512-6yHMqgLYDzQDcAkL+tjJDC5nSNuNIx0vZtRZeiPh7Saef7VHX9H5Ijn9l2VIol2zaNYlYEX6KyuT/237A58qEQ==", + "dev": true, + "requires": { + "duplexer": "~0.1.1", + "through": "~2.3.4" + } + }, + "stream-combiner2": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/stream-combiner2/-/stream-combiner2-1.1.1.tgz", + "integrity": "sha512-3PnJbYgS56AeWgtKF5jtJRT6uFJe56Z0Hc5Ngg/6sI6rIt8iiMBTa9cvdyFfpMQjaVHr8dusbNeFGIIonxOvKw==", + "dev": true, + "requires": { + "duplexer2": "~0.1.0", + "readable-stream": "^2.0.2" + } + }, + "stream-http": { + "version": "3.2.0", + "resolved": "https://registry.npmmirror.com/stream-http/-/stream-http-3.2.0.tgz", + "integrity": "sha512-Oq1bLqisTyK3TSCXpPbT4sdeYNdmyZJv1LxpEm2vu1ZhK89kSE5YXwZc3cWk0MagGaKriBh9mCFbVGtO+vY29A==", + "dev": true, + "requires": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "xtend": "^4.0.2" + }, + "dependencies": { + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "stream-shift": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/stream-shift/-/stream-shift-1.0.1.tgz", + "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", + "dev": true + }, + "stream-splicer": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/stream-splicer/-/stream-splicer-2.0.1.tgz", + "integrity": "sha512-Xizh4/NPuYSyAXyT7g8IvdJ9HJpxIGL9PjyhtywCZvvP0OPIdqyrr4dMikeuvY8xahpdKEBlBTySe583totajg==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.2" + } + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "requires": { + "safe-buffer": "~5.2.0" + }, + "dependencies": { + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + } + } + }, + "string.prototype.trimend": { + "version": "1.0.5", + "resolved": "https://registry.npmmirror.com/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz", + "integrity": "sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.19.5" + } + }, + "string.prototype.trimstart": { + "version": "1.0.5", + "resolved": "https://registry.npmmirror.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz", + "integrity": "sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.19.5" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "subarg": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/subarg/-/subarg-1.0.0.tgz", + "integrity": "sha512-RIrIdRY0X1xojthNcVtgT9sjpOGagEUKpZdgBUi054OEPFo282yg+zE+t1Rj3+RqKq2xStL7uUHhY+AjbC4BXg==", + "dev": true, + "requires": { + "minimist": "^1.1.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "dev": true + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true + }, + "syntax-error": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/syntax-error/-/syntax-error-1.4.0.tgz", + "integrity": "sha512-YPPlu67mdnHGTup2A8ff7BC2Pjq0e0Yp/IyTFN03zWO0RcK07uLcbi7C2KpGR2FvWbaB0+bfE27a+sBKebSo7w==", + "dev": true, + "requires": { + "acorn-node": "^1.2.0" + } + }, + "terser": { + "version": "4.8.0", + "resolved": "https://registry.npmmirror.com/terser/-/terser-4.8.0.tgz", + "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==", + "dev": true, + "requires": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmmirror.com/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "dev": true + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmmirror.com/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "timers-browserify": { + "version": "1.4.2", + "resolved": "https://registry.npmmirror.com/timers-browserify/-/timers-browserify-1.4.2.tgz", + "integrity": "sha512-PIxwAupJZiYU4JmVZYwXp9FKsHMXb5h0ZEFyuXTAn8WLHOlcij+FEcbrvDsom1o5dr1YggEtFbECvGCW2sT53Q==", + "dev": true, + "requires": { + "process": "~0.11.0" + } + }, + "tinyify": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/tinyify/-/tinyify-3.0.0.tgz", + "integrity": "sha512-RtjVjC1xwwxt8AMVfxEmo+FzRJB6p5sAOtFaJj8vMrkWShtArsM4dLVRWhx2Vc07Me3NWgmP7pi9UPm/a2XNNA==", + "dev": true, + "requires": { + "@goto-bus-stop/envify": "^5.0.0", + "acorn-node": "^1.8.2", + "browser-pack-flat": "^3.0.9", + "bundle-collapser": "^1.3.0", + "common-shakeify": "^0.6.0", + "dash-ast": "^1.0.0", + "minify-stream": "^2.0.1", + "multisplice": "^1.0.0", + "through2": "^3.0.1", + "uglifyify": "^5.0.0", + "unassertify": "^2.1.1" + }, + "dependencies": { + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "through2": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/through2/-/through2-3.0.2.tgz", + "integrity": "sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ==", + "dev": true, + "requires": { + "inherits": "^2.0.4", + "readable-stream": "2 || 3" + } + } + } + }, "toidentifier": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", @@ -848,6 +7594,44 @@ "punycode": "^2.1.1" } }, + "transform-ast": { + "version": "2.4.4", + "resolved": "https://registry.npmmirror.com/transform-ast/-/transform-ast-2.4.4.tgz", + "integrity": "sha512-AxjeZAcIOUO2lev2GDe3/xZ1Q0cVGjIMk5IsriTy8zbWlsEnjeB025AhkhBJHoy997mXpLd4R+kRbvnnQVuQHQ==", + "dev": true, + "requires": { + "acorn-node": "^1.3.0", + "convert-source-map": "^1.5.1", + "dash-ast": "^1.0.0", + "is-buffer": "^2.0.0", + "magic-string": "^0.23.2", + "merge-source-map": "1.0.4", + "nanobench": "^2.1.1" + }, + "dependencies": { + "convert-source-map": { + "version": "1.8.0", + "resolved": "https://registry.npmmirror.com/convert-source-map/-/convert-source-map-1.8.0.tgz", + "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmmirror.com/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", + "dev": true + } + } + }, + "tty-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmmirror.com/tty-browserify/-/tty-browserify-0.0.1.tgz", + "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==", + "dev": true + }, "tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", @@ -861,6 +7645,21 @@ "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" }, + "type": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==", + "dev": true + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmmirror.com/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2" + } + }, "type-is": { "version": "1.6.18", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", @@ -870,6 +7669,111 @@ "mime-types": "~2.1.24" } }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmmirror.com/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" + }, + "uglifyify": { + "version": "5.0.2", + "resolved": "https://registry.npmmirror.com/uglifyify/-/uglifyify-5.0.2.tgz", + "integrity": "sha512-NcSk6pgoC+IgwZZ2tVLVHq+VNKSvLPlLkF5oUiHPVOJI0s/OlSVYEGXG9PCAH0hcyFZLyvt4KBdPAQBRlVDn1Q==", + "dev": true, + "requires": { + "convert-source-map": "~1.1.0", + "minimatch": "^3.0.2", + "terser": "^3.7.5", + "through": "~2.3.4", + "xtend": "^4.0.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "terser": { + "version": "3.17.0", + "resolved": "https://registry.npmmirror.com/terser/-/terser-3.17.0.tgz", + "integrity": "sha512-/FQzzPJmCpjAH9Xvk2paiWrFq+5M6aVOf+2KRbwhByISDX/EujxsK+BAvrhb6H+2rtrLCHK9N01wO014vrIwVQ==", + "dev": true, + "requires": { + "commander": "^2.19.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.10" + } + } + } + }, + "umd": { + "version": "3.0.3", + "resolved": "https://registry.npmmirror.com/umd/-/umd-3.0.3.tgz", + "integrity": "sha512-4IcGSufhFshvLNcMCV80UnQVlZ5pMOC8mvNPForqwA4+lzYQuetTESLDQkeLmihq8bRcnpbQa48Wb8Lh16/xow==", + "dev": true + }, + "unassert": { + "version": "1.6.0", + "resolved": "https://registry.npmmirror.com/unassert/-/unassert-1.6.0.tgz", + "integrity": "sha512-GoMtWTwGSxSFuRD0NKmbjlx3VJkgvSogzDzMPpJXYmBZv6MIWButsyMqEYhMx3NI4osXACcZA9mXiBteXyJtRw==", + "dev": true, + "requires": { + "acorn": "^7.0.0", + "call-matcher": "^2.0.0", + "deep-equal": "^1.0.0", + "espurify": "^2.0.1", + "estraverse": "^4.1.0", + "esutils": "^2.0.2", + "object-assign": "^4.1.0" + } + }, + "unassertify": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/unassertify/-/unassertify-2.1.1.tgz", + "integrity": "sha512-YIAaIlc6/KC9Oib8cVZLlpDDhK1UTEuaDyx9BwD97xqxDZC0cJOqwFcs/Y6K3m73B5VzHsRTBLXNO0dxS/GkTw==", + "dev": true, + "requires": { + "acorn": "^5.1.0", + "convert-source-map": "^1.1.1", + "escodegen": "^1.6.1", + "multi-stage-sourcemap": "^0.2.1", + "through": "^2.3.7", + "unassert": "^1.3.1" + }, + "dependencies": { + "acorn": { + "version": "5.7.4", + "resolved": "https://registry.npmmirror.com/acorn/-/acorn-5.7.4.tgz", + "integrity": "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==", + "dev": true + } + } + }, + "unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + } + }, + "undeclared-identifiers": { + "version": "1.1.3", + "resolved": "https://registry.npmmirror.com/undeclared-identifiers/-/undeclared-identifiers-1.1.3.tgz", + "integrity": "sha512-pJOW4nxjlmfwKApE4zvxLScM/njmwj/DiUBv7EabwE4O8kRUy+HIwxQtZLBPll/jx1LJyBcqNfB3/cpv9EZwOw==", + "dev": true, + "requires": { + "acorn-node": "^1.3.0", + "dash-ast": "^1.0.0", + "get-assigned-identifiers": "^1.2.0", + "simple-concat": "^1.0.0", + "xtend": "^4.0.1" + } + }, "unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", @@ -883,6 +7787,43 @@ "punycode": "^2.1.0" } }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmmirror.com/url/-/url-0.11.0.tgz", + "integrity": "sha512-kbailJa29QrtXnxgq+DdCEGlbTeYM2eJUxsz6vjZavrCYPMIFHMKQmSKYAIuUK2i7hgPm28a8piX5NTUtM/LKQ==", + "dev": true, + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmmirror.com/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==", + "dev": true + } + } + }, + "util": { + "version": "0.12.4", + "resolved": "https://registry.npmmirror.com/util/-/util-0.12.4.tgz", + "integrity": "sha512-bxZ9qtSlGUWSOy9Qa9Xgk11kSslpuZwaxCg4sNIDj6FLucDab2JxnHwyNTCpHMtK1MjoQiWQ6DiUMZYbSrO+Sw==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "safe-buffer": "^5.1.2", + "which-typed-array": "^1.1.2" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, "utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", @@ -908,10 +7849,61 @@ "extsprintf": "^1.2.0" } }, + "vm-browserify": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/vm-browserify/-/vm-browserify-1.1.2.tgz", + "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", + "dev": true + }, + "which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "requires": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + } + }, + "which-typed-array": { + "version": "1.1.8", + "resolved": "https://registry.npmmirror.com/which-typed-array/-/which-typed-array-1.1.8.tgz", + "integrity": "sha512-Jn4e5PItbcAHyLoRDwvPj1ypu27DJbtdYXUa5zsinrUx77Uvfb0cXwwnGMTn7cjUfhhqgVQnVJCwF+7cgU7tpw==", + "dev": true, + "requires": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "es-abstract": "^1.20.0", + "for-each": "^0.3.3", + "has-tostringtag": "^1.0.0", + "is-typed-array": "^1.1.9" + } + }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmmirror.com/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true + }, + "wrap-comment": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/wrap-comment/-/wrap-comment-1.0.1.tgz", + "integrity": "sha512-APccrMwl/ont0RHFTXNAQfM647duYYEfs6cngrIyTByTI0xbWnDnPSptFZhS68L4WCjt2ZxuhCFwuY6Pe88KZQ==", + "dev": true + }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmmirror.com/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" } } } diff --git a/backend/package.json b/backend/package.json index 23f6e6b..56483af 100644 --- a/backend/package.json +++ b/backend/package.json @@ -1,21 +1,25 @@ { - "name": "sub-store-backend", - "version": "0.0.1", - "description": "Advanced Subscription Manager for QX, Loon, and Surge.", - "main": "sub-store.js", + "name": "sub-store", + "version": "1.5", + "description": "Advanced Subscription Manager for QX, Loon, Surge, Stash and ShadowRocket.", + "main": "src/main.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1", - "serve": "node sub-store.js", - "build": " curl -X POST -s --data-urlencode 'input@sub-store.js' https://javascript-minifier.com/raw > sub-store.min.js && printf \"// UPDATED AT: $(date) \\n\" | cat - sub-store.min.js > temp && mv temp sub-store.min.js" + "serve": "node src/main.js", + "build": "browserify -p tinyify src/main.js > bundle && cat banner bundle > sub-store.min.js && rm bundle" }, - "author": "", + "author": "Peng-YM", "license": "GPL", "dependencies": { "body-parser": "^1.19.0", "express": "^4.17.1", - "request": "^2.88.2" + "js-base64": "^3.7.2", + "request": "^2.88.2", + "static-js-yaml": "^1.0.0" }, "devDependencies": { - "axios": "^0.20.0" + "axios": "^0.20.0", + "browserify": "^17.0.0", + "tinyify": "^3.0.0" } } diff --git a/backend/src/core/app.js b/backend/src/core/app.js new file mode 100644 index 0000000..37be5d9 --- /dev/null +++ b/backend/src/core/app.js @@ -0,0 +1,4 @@ +const { API } = require('../utils/open-api'); +const $ = API('sub-store'); + +module.exports = $; \ No newline at end of file diff --git a/backend/src/core/proxy-utils.js b/backend/src/core/proxy-utils.js new file mode 100644 index 0000000..3380193 --- /dev/null +++ b/backend/src/core/proxy-utils.js @@ -0,0 +1,1766 @@ +const YAML = require('static-js-yaml'); +const { Base64 } = require('js-base64'); + +const { AND, FULL } = require('../utils/logical'); +const { getFlag } = require('../utils/geo'); +const download = require('../utils/download'); + +const $ = require('./app'); + +const PROXY_PREPROCESSORS = (function() { + function HTML() { + const name = 'HTML'; + const test = (raw) => /^/.test(raw); + // simply discard HTML + const parse = (_) => ''; + return { name, test, parse }; + } + + function Base64Encoded() { + const name = 'Base64 Pre-processor'; + + const keys = [ 'dm1lc3M', 'c3NyOi8v', 'dHJvamFu', 'c3M6Ly', 'c3NkOi8v', 'c2hhZG93', 'aHR0c' ]; + + const test = function(raw) { + return keys.some((k) => raw.indexOf(k) !== -1); + }; + const parse = function(raw) { + raw = Base64.decode(raw); + return raw; + }; + return { name, test, parse }; + } + + function Clash() { + const name = 'Clash Pre-processor'; + const test = function(raw) { + return /proxies/.test(raw); + }; + const parse = function(raw) { + // Clash YAML format + const proxies = YAML.safeLoad(raw).proxies; + return proxies.map((p) => JSON.stringify(p)).join('\n'); + }; + return { name, test, parse }; + } + + function SSD() { + const name = 'SSD Pre-processor'; + const test = function(raw) { + return raw.indexOf('ssd://') === 0; + }; + const parse = function(raw) { + // preprocessing for SSD subscription format + const output = []; + let ssdinfo = JSON.parse(Base64.decode(raw.split('ssd://')[1])); + // options (traffic_used, traffic_total, expiry, url) + const traffic_used = ssdinfo.traffic_used; // GB + const traffic_total = ssdinfo.traffic_total; // GB, -1 means unlimited + const expiry = ssdinfo.expiry; // YYYY-MM-DD HH:mm:ss + // default setting + let name = ssdinfo.airport; // name of the airport + let port = ssdinfo.port; + let method = ssdinfo.encryption; + let password = ssdinfo.password; + // servers config + let servers = ssdinfo.servers; + for (let i = 0; i < servers.length; i++) { + let server = servers[i]; + method = server.encryption ? server.encryption : method; + password = server.password ? server.password : password; + let userinfo = Base64.encode(method + ':' + password); + let hostname = server.server; + port = server.port ? server.port : port; + let tag = server.remarks ? server.remarks : i; + let plugin = server.plugin_options + ? '/?plugin=' + encodeURIComponent(server.plugin + ';' + server.plugin_options) + : ''; + output[i] = 'ss://' + userinfo + '@' + hostname + ':' + port + plugin + '#' + tag; + } + return output.join('\n'); + }; + return { name, test, parse }; + } + + return [ HTML(), Base64Encoded(), Clash(), SSD() ]; +})(); +const PROXY_PARSERS = (function() { + // Parse SS URI format (only supports new SIP002, legacy format is depreciated). + // reference: https://shadowsocks.org/en/spec/SIP002-URI-Scheme.html + function URI_SS() { + const name = 'URI SS Parser'; + const test = (line) => { + return /^ss:\/\//.test(line); + }; + const parse = (line) => { + const supported = {}; + // parse url + let content = line.split('ss://')[1]; + + const proxy = { + name: decodeURIComponent(line.split('#')[1]), + type: 'ss', + supported + }; + content = content.split('#')[0]; // strip proxy name + // handle IPV4 and IPV6 + const serverAndPort = content.match(/@([^\/]*)(\/|$)/)[1]; + const portIdx = serverAndPort.lastIndexOf(':'); + proxy.server = serverAndPort.substring(0, portIdx); + proxy.port = serverAndPort.substring(portIdx + 1); + + const userInfo = Base64.decode(content.split('@')[0]).split(':'); + proxy.cipher = userInfo[0]; + proxy.password = userInfo[1]; + + // handle obfs + const idx = content.indexOf('?plugin='); + if (idx !== -1) { + const pluginInfo = ('plugin=' + decodeURIComponent(content.split('?plugin=')[1].split('&')[0])).split( + ';' + ); + const params = {}; + for (const item of pluginInfo) { + const [ key, val ] = item.split('='); + if (key) params[key] = val || true; // some options like "tls" will not have value + } + switch (params.plugin) { + case 'obfs-local': + case 'simple-obfs': + proxy.plugin = 'obfs'; + proxy['plugin-opts'] = { + mode: params.obfs, + host: params['obfs-host'] + }; + break; + case 'v2ray-plugin': + proxy.supported = { + ...supported, + Loon: false, + Surge: false + }; + proxy.obfs = 'v2ray-plugin'; + proxy['plugin-opts'] = { + mode: 'websocket', + host: params['obfs-host'], + path: params.path || '', + tls: params.tls || false + }; + break; + default: + throw new Error(`Unsupported plugin option: ${params.plugin}`); + } + } + return proxy; + }; + return { name, test, parse }; + } + + // Parse URI SSR format, such as ssr://xxx + function URI_SSR() { + const name = 'URI SSR Parser'; + const test = (line) => { + return /^ssr:\/\//.test(line); + }; + const supported = { + Surge: false + }; + + const parse = (line) => { + line = Base64.decode(line.split('ssr://')[1]); + + // handle IPV6 & IPV4 format + let splitIdx = line.indexOf(':origin'); + if (splitIdx === -1) { + splitIdx = line.indexOf(':auth_'); + } + const serverAndPort = line.substring(0, splitIdx); + const server = serverAndPort.substring(0, serverAndPort.lastIndexOf(':')); + const port = serverAndPort.substring(serverAndPort.lastIndexOf(':') + 1); + + let params = line.substring(splitIdx + 1).split('/?')[0].split(':'); + let proxy = { + type: 'ssr', + server, + port, + protocol: params[0], + cipher: params[1], + obfs: params[2], + password: Base64.decode(params[3]), + supported + }; + // get other params + const other_params = {}; + line = line.split('/?')[1].split('&'); + if (line.length > 1) { + for (const item of line) { + const [ key, val ] = item.split('='); + other_params[key] = val.trim(); + } + } + proxy = { + ...proxy, + name: other_params.remarks ? Base64.decode(other_params.remarks) : proxy.server, + 'protocol-param': Base64.decode(other_params.protoparam || '').replace(/\s/g, ''), + 'obfs-param': Base64.decode(other_params.obfsparam || '').replace(/\s/g, '') + }; + return proxy; + }; + + return { name, test, parse }; + } + + // V2rayN URI VMess format + // reference: https://github.com/2dust/v2rayN/wiki/%E5%88%86%E4%BA%AB%E9%93%BE%E6%8E%A5%E6%A0%BC%E5%BC%8F%E8%AF%B4%E6%98%8E(ver-2) + + // Quantumult VMess format + function URI_VMess() { + const name = 'URI VMess Parser'; + const test = (line) => { + return /^vmess:\/\//.test(line); + }; + const parse = (line) => { + const supported = {}; + line = line.split('vmess://')[1]; + const content = Base64.decode(line); + if (/=\s*vmess/.test(content)) { + // Quantumult VMess URI format + const partitions = content.split(',').map((p) => p.trim()); + // get keyword params + const params = {}; + for (const part of partitions) { + if (part.indexOf('=') !== -1) { + const [ key, val ] = part.split('='); + params[key.trim()] = val.trim(); + } + } + + const proxy = { + name: partitions[0].split('=')[0].trim(), + type: 'vmess', + server: partitions[1], + port: partitions[2], + cipher: partitions[3], + uuid: partitions[4].match(/^"(.*)"$/)[1], + tls: params.obfs === 'over-tls' || params.obfs === 'wss' + }; + + if (typeof params['udp-relay'] !== 'undefined') proxy.udp = JSON.parse(params['udp-relay']); + if (typeof params['fast-open'] !== 'undefined') proxy.udp = JSON.parse(params['fast-open']); + + // handle ws headers + if (params.obfs === 'ws' || params.obfs === 'wss') { + proxy.network = 'ws'; + proxy['ws-opts'].path = (params['obfs-path'] || '"/"').match(/^"(.*)"$/)[1]; + let obfs_host = params['obfs-header']; + if (obfs_host && obfs_host.indexOf('Host') !== -1) { + obfs_host = obfs_host.match(/Host:\s*([a-zA-Z0-9-.]*)/)[1]; + } + proxy['ws-opts'].headers = { + Host: obfs_host || proxy.server // if no host provided, use the same as server + }; + } + + // handle scert + if (proxy.tls && params['"tls-verification"'] === 'false') { + proxy['skip-cert-verify'] = true; + } + + // handle sni + if (proxy.tls && params['obfs-host']) { + proxy.sni = params['obfs-host']; + } + + return proxy; + } else { + // V2rayN URI format + const params = JSON.parse(content); + const proxy = { + name: params.ps, + type: 'vmess', + server: params.add, + port: params.port, + cipher: 'auto', // V2rayN has no default cipher! use aes-128-gcm as default. + uuid: params.id, + alterId: params.aid || 0, + tls: params.tls === 'tls' || params.tls === true, + supported + }; + // handle obfs + if (params.net === 'ws') { + proxy.network = 'ws'; + proxy['ws-opts'] = { + path: params.path, + headers: { Host: params.host || params.add } + }; + if (proxy.tls && params.host) { + proxy.sni = params.host; + } + } + // handle scert + if (params.verify_cert === false) { + proxy['skip-cert-verify'] = true; + } + return proxy; + } + }; + return { name, test, parse }; + } + + // Trojan URI format + function URI_Trojan() { + const name = 'URI Trojan Parser'; + const test = (line) => { + return /^trojan:\/\//.test(line); + }; + + const parse = (line) => { + const supported = {}; + line = line.split('trojan://')[1]; + const [ server, port ] = line.split('@')[1].split('?')[0].split(':'); + const name = decodeURIComponent(line.split('#')[1].trim()); + let paramArr = line.split('?'); + let sni = null; + if (paramArr.length > 1) { + paramArr = paramArr[1].split('#')[0].split('&'); + const params = new Map( + paramArr.map((item) => { + return item.split('='); + }) + ); + sni = params.get('sni'); + } + + return { + name: name || `[Trojan] ${server}`, // trojan uri may have no server tag! + type: 'trojan', + server, + port, + password: line.split('@')[0], + sni, + supported + }; + }; + return { name, test, parse }; + } + + function Clash_All() { + const name = 'Clash Parser'; + const test = (line) => { + try { + JSON.parse(line); + } catch (e) { + return false; + } + return true; + }; + const parse = (line) => JSON.parse(line); + return { name, test, parse }; + } + + function QX_SS() { + const name = 'QX SS Parser'; + const test = (line) => { + return /^shadowsocks\s*=/.test(line.split(',')[0].trim()) && line.indexOf('ssr-protocol') === -1; + }; + const parse = (line) => { + const supported = {}; + const params = getQXParams(line); + const proxy = { + name: params.tag, + type: 'ss', + server: params.server, + port: params.port, + cipher: params.method, + password: params.password, + udp: JSON.parse(params['udp-relay'] || 'false'), + tfo: JSON.parse(params['fast-open'] || 'false'), + supported + }; + // handle obfs options + if (params.obfs) { + proxy['plugin-opts'] = { + host: params['obfs-host'] || proxy.server + }; + switch (params.obfs) { + case 'http': + case 'tls': + proxy.plugin = 'obfs'; + proxy['plugin-opts'].mode = params.obfs; + break; + case 'ws': + case 'wss': + proxy['plugin-opts'] = { + ...proxy['plugin-opts'], + mode: 'websocket', + path: params['obfs-uri'] || '/', + tls: params.obfs === 'wss' + }; + if (proxy['plugin-opts'].tls && typeof params['tls-verification'] !== 'undefined') { + proxy['plugin-opts']['skip-cert-verify'] = params['tls-verification']; + } + proxy.plugin = 'v2ray-plugin'; + // Surge and Loon lack support for v2ray-plugin obfs + proxy.supported.Surge = false; + proxy.supported.Loon = false; + break; + } + } + return proxy; + }; + return { name, test, parse }; + } + + function QX_SSR() { + const name = 'QX SSR Parser'; + const test = (line) => { + return /^shadowsocks\s*=/.test(line.split(',')[0].trim()) && line.indexOf('ssr-protocol') !== -1; + }; + + const parse = (line) => { + const supported = { + Surge: false + }; + const params = getQXParams(line); + const proxy = { + name: params.tag, + type: 'ssr', + server: params.server, + port: params.port, + cipher: params.method, + password: params.password, + protocol: params['ssr-protocol'], + obfs: 'plain', // default obfs + 'protocol-param': params['ssr-protocol-param'], + udp: JSON.parse(params['udp-relay'] || 'false'), + tfo: JSON.parse(params['fast-open'] || 'false'), + supported + }; + // handle obfs options + if (params.obfs) { + proxy.obfs = params.obfs; + proxy['obfs-param'] = params['obfs-host']; + } + return proxy; + }; + return { name, test, parse }; + } + + function QX_VMess() { + const name = 'QX VMess Parser'; + const test = (line) => { + return /^vmess\s*=/.test(line.split(',')[0].trim()); + }; + const parse = (line) => { + const params = getQXParams(line); + const proxy = { + type: 'vmess', + name: params.tag, + server: params.server, + port: params.port, + cipher: params.method || 'none', + uuid: params.password, + alterId: 0, + tls: params.obfs === 'over-tls' || params.obfs === 'wss', + udp: JSON.parse(params['udp-relay'] || 'false'), + tfo: JSON.parse(params['fast-open'] || 'false') + }; + if (proxy.tls) { + proxy.sni = params['obfs-host'] || params.server; + proxy['skip-cert-verify'] = !JSON.parse(params['tls-verification'] || 'true'); + } + // handle ws headers + if (params.obfs === 'ws' || params.obfs === 'wss') { + proxy.network = 'ws'; + proxy['ws-opts'] = { + path: params['obfs-uri'], + headers: { + Host: params['obfs-host'] || params.server // if no host provided, use the same as server + } + }; + } + return proxy; + }; + + return { name, test, parse }; + } + + function QX_Trojan() { + const name = 'QX Trojan Parser'; + const test = (line) => { + return /^trojan\s*=/.test(line.split(',')[0].trim()); + }; + const parse = (line) => { + const params = getQXParams(line); + const proxy = { + type: 'trojan', + name: params.tag, + server: params.server, + port: params.port, + password: params.password, + sni: params['tls-host'] || params.server, + udp: JSON.parse(params['udp-relay'] || 'false'), + tfo: JSON.parse(params['fast-open'] || 'false') + }; + proxy['skip-cert-verify'] = !JSON.parse(params['tls-verification'] || 'true'); + return proxy; + }; + return { name, test, parse }; + } + + function QX_Http() { + const name = 'QX HTTP Parser'; + const test = (line) => { + return /^http\s*=/.test(line.split(',')[0].trim()); + }; + const parse = (line) => { + const params = getQXParams(line); + const proxy = { + type: 'http', + name: params.tag, + server: params.server, + port: params.port, + tls: JSON.parse(params['over-tls'] || 'false'), + udp: JSON.parse(params['udp-relay'] || 'false'), + tfo: JSON.parse(params['fast-open'] || 'false') + }; + if (params.username && params.username !== 'none') proxy.username = params.username; + if (params.password && params.password !== 'none') proxy.password = params.password; + if (proxy.tls) { + proxy.sni = params['tls-host'] || proxy.server; + proxy['skip-cert-verify'] = !JSON.parse(params['tls-verification'] || 'true'); + } + return proxy; + }; + + return { name, test, parse }; + } + + function getQXParams(line) { + const groups = line.split(','); + const params = {}; + const protocols = [ 'shadowsocks', 'vmess', 'http', 'trojan' ]; + groups.forEach((g) => { + let [ key, value ] = g.split('='); + key = key.trim(); + value = value.trim(); + if (protocols.indexOf(key) !== -1) { + params.type = key; + const conf = value.split(':'); + params.server = conf[0]; + params.port = conf[1]; + } else { + params[key.trim()] = value.trim(); + } + }); + return params; + } + + function Loon_SS() { + const name = 'Loon SS Parser'; + const test = (line) => { + return line.split(',')[0].split('=')[1].trim().toLowerCase() === 'shadowsocks'; + }; + const parse = (line) => { + const params = line.split('=')[1].split(','); + const proxy = { + name: line.split('=')[0].trim(), + type: 'ss', + server: params[1], + port: params[2], + cipher: params[3], + password: params[4].replace(/"/g, '') + }; + // handle obfs + if (params.length > 5) { + proxy.plugin = 'obfs'; + proxy['plugin-opts'] = { + mode: params[5], + host: params[6] + }; + } + return proxy; + }; + return { name, test, parse }; + } + + function Loon_SSR() { + const name = 'Loon SSR Parser'; + const test = (line) => { + return line.split(',')[0].split('=')[1].trim().toLowerCase() === 'shadowsocksr'; + }; + const parse = (line) => { + const params = line.split('=')[1].split(','); + const supported = { + Surge: false + }; + return { + name: line.split('=')[0].trim(), + type: 'ssr', + server: params[1], + port: params[2], + cipher: params[3], + password: params[4].replace(/"/g, ''), + protocol: params[5], + 'protocol-param': params[6].match(/{(.*)}/)[1], + supported, + obfs: params[7], + 'obfs-param': params[8].match(/{(.*)}/)[1] + }; + }; + return { name, test, parse }; + } + + function Loon_VMess() { + const name = 'Loon VMess Parser'; + const test = (line) => { + // distinguish between surge vmess + return /^.*=\s*vmess/i.test(line.split(',')[0]) && line.indexOf('username') === -1; + }; + const parse = (line) => { + let params = line.split('=')[1].split(','); + const proxy = { + name: line.split('=')[0].trim(), + type: 'vmess', + server: params[1], + port: params[2], + cipher: params[3] || 'none', + uuid: params[4].replace(/"/g, ''), + alterId: 0 + }; + // get transport options + params = params.splice(5); + for (const item of params) { + const [ key, val ] = item.split(':'); + params[key] = val; + } + proxy.tls = JSON.parse(params['over-tls'] || 'false'); + if (proxy.tls) { + proxy.sni = params['tls-name'] || proxy.server; + proxy['skip-cert-verify'] = JSON.parse(params['skip-cert-verify'] || 'false'); + } + switch (params.transport) { + case 'tcp': + break; + case 'ws': + proxy.network = params.transport; + proxy['ws-opts'] = { + path: params.path, + headers: { + Host: params.host + } + }; + } + if (proxy.tls) { + proxy['skip-cert-verify'] = JSON.parse(params['skip-cert-verify'] || 'false'); + } + return proxy; + }; + return { name, test, parse }; + } + + function Loon_Trojan() { + const name = 'Loon Trojan Parser'; + const test = (line) => { + return /^.*=\s*trojan/i.test(line.split(',')[0]) && line.indexOf('password') === -1; + }; + + const parse = (line) => { + const params = line.split('=')[1].split(','); + const proxy = { + name: line.split('=')[0].trim(), + type: 'trojan', + server: params[1], + port: params[2], + password: params[3].replace(/"/g, ''), + sni: params[1], // default sni is the server itself + 'skip-cert-verify': JSON.parse(params['skip-cert-verify'] || 'false') + }; + // trojan sni + if (params.length > 4) { + const [ key, val ] = params[4].split(':'); + if (key === 'tls-name') proxy.sni = val; + else throw new Error(`Unknown option ${key} for line: \n${line}`); + } + return proxy; + }; + + return { name, test, parse }; + } + + function Loon_Http() { + const name = 'Loon HTTP Parser'; + const test = (line) => { + return ( + /^.*=\s*http/i.test(line.split(',')[0]) && + line.split(',').length === 5 && + line.indexOf('username') === -1 && + line.indexOf('password') === -1 + ); + }; + + const parse = (line) => { + const params = line.split('=')[1].split(','); + const proxy = { + name: line.split('=')[0].trim(), + type: 'http', + server: params[1], + port: params[2], + tls: params[2] === '443' // port 443 is considered as https type + }; + if (params[3]) proxy.username = params[3]; + if (params[4]) proxy.password = params[4]; + + if (proxy.tls) { + proxy.sni = params['tls-name'] || proxy.server; + proxy['skip-cert-verify'] = JSON.parse(params['skip-cert-verify'] || 'false'); + } + + return proxy; + }; + return { name, test, parse }; + } + + function Surge_SS() { + const name = 'Surge SS Parser'; + const test = (line) => { + return /^.*=\s*ss/.test(line.split(',')[0]); + }; + const parse = (line) => { + const params = getSurgeParams(line); + const proxy = { + name: params.name, + type: 'ss', + server: params.server, + port: params.port, + cipher: params['encrypt-method'], + password: params.password, + tfo: JSON.parse(params.tfo || 'false'), + udp: JSON.parse(params['udp-relay'] || 'false') + }; + // handle obfs + if (params.obfs) { + proxy.plugin = 'obfs'; + proxy['plugin-opts'] = { + mode: params.obfs, + host: params['obfs-host'] + }; + } + return proxy; + }; + return { name, test, parse }; + } + + function Surge_VMess() { + const name = 'Surge VMess Parser'; + const test = (line) => { + return /^.*=\s*vmess/.test(line.split(',')[0]) && line.indexOf('username') !== -1; + }; + const parse = (line) => { + const params = getSurgeParams(line); + const proxy = { + name: params.name, + type: 'vmess', + server: params.server, + port: params.port, + uuid: params.username, + alterId: 0, // surge does not have this field + cipher: 'none', // surge does not have this field + tls: JSON.parse(params.tls || 'false'), + tfo: JSON.parse(params.tfo || 'false') + }; + if (proxy.tls) { + if (typeof params['skip-cert-verify'] !== 'undefined') { + proxy['skip-cert-verify'] = + params['skip-cert-verify'] === true || params['skip-cert-verify'] === '1'; + } + proxy.sni = params['sni'] || params.server; + } + // use websocket + if (JSON.parse(params.ws || 'false')) { + proxy.network = 'ws'; + proxy['ws-opts'] = { + path: params['ws-path'] + }; + + const res = params['ws-headers'].match(/(,|^|\s)*HOST:\s*(.*?)(,|$)/); + const host = res ? res[2] : proxy.server; + proxy['ws-opts'].headers = { + Host: host || params.server + }; + } + return proxy; + }; + return { name, test, parse }; + } + + function Surge_Trojan() { + const name = 'Surge Trojan Parser'; + const test = (line) => { + return /^.*=\s*trojan/.test(line.split(',')[0]) && line.indexOf('sni') !== -1; + }; + const parse = (line) => { + const params = getSurgeParams(line); + const proxy = { + name: params.name, + type: 'trojan', + server: params.server, + port: params.port, + password: params.password, + sni: params.sni || params.server, + tfo: JSON.parse(params.tfo || 'false') + }; + if (typeof params['skip-cert-verify'] !== 'undefined') { + proxy['skip-cert-verify'] = params['skip-cert-verify'] === true || params['skip-cert-verify'] === '1'; + } + return proxy; + }; + + return { name, test, parse }; + } + + function Surge_Http() { + const name = 'Surge HTTP Parser'; + const test = (line) => { + return /^.*=\s*http/.test(line.split(',')[0]) && !Loon_Http().test(line); + }; + const parse = (line) => { + const params = getSurgeParams(line); + const proxy = { + name: params.name, + type: 'http', + server: params.server, + port: params.port, + tls: JSON.parse(params.tls || 'false'), + tfo: JSON.parse(params.tfo || 'false') + }; + if (proxy.tls) { + if (typeof params['skip-cert-verify'] !== 'undefined') { + proxy['skip-cert-verify'] = + params['skip-cert-verify'] === true || params['skip-cert-verify'] === '1'; + } + proxy.sni = params.sni || params.server; + } + if (params.username && params.username !== 'none') proxy.username = params.username; + if (params.password && params.password !== 'none') proxy.password = params.password; + return proxy; + }; + return { name, test, parse }; + } + + function getSurgeParams(line) { + const params = {}; + params.name = line.split('=')[0].trim(); + const segments = line.split(','); + params.server = segments[1].trim(); + params.port = segments[2].trim(); + for (let i = 3; i < segments.length; i++) { + const item = segments[i]; + if (item.indexOf('=') !== -1) { + const [ key, value ] = item.split('='); + params[key.trim()] = value.trim(); + } + } + return params; + } + + return [ + URI_SS(), + URI_SSR(), + URI_VMess(), + URI_Trojan(), + Clash_All(), + Surge_SS(), + Surge_VMess(), + Surge_Trojan(), + Surge_Http(), + Loon_SS(), + Loon_SSR(), + Loon_VMess(), + Loon_Trojan(), + Loon_Http(), + QX_SS(), + QX_SSR(), + QX_VMess(), + QX_Trojan(), + QX_Http() + ]; +})(); +const PROXY_PROCESSORS = (function() { + // force to set some properties (e.g., skip-cert-verify, udp, tfo, etc.) + function SetPropertyOperator({ key, value }) { + return { + name: 'Set Property Operator', + func: (proxies) => { + return proxies.map((p) => { + p[key] = value; + return p; + }); + } + }; + } + + // add or remove flag for proxies + function FlagOperator(add = true) { + return { + name: 'Flag Operator', + func: (proxies) => { + return proxies.map((proxy) => { + if (!add) { + // no flag + proxy.name = removeFlag(proxy.name); + } else { + // get flag + const newFlag = getFlag(proxy.name); + // remove old flag + proxy.name = removeFlag(proxy.name); + proxy.name = newFlag + ' ' + proxy.name; + proxy.name = proxy.name.replace(/🇹🇼/g, '🇨🇳'); + } + return proxy; + }); + } + }; + } + + // duplicate handler + function HandleDuplicateOperator(arg) { + const { action, template, link, position } = { + ...{ + action: 'rename', + template: '0 1 2 3 4 5 6 7 8 9', + link: '-', + position: 'back' + }, + ...arg + }; + return { + name: 'Handle Duplicate Operator', + func: (proxies) => { + if (action === 'delete') { + const chosen = {}; + return proxies.filter((p) => { + if (chosen[p.name]) { + return false; + } + chosen[p.name] = true; + return true; + }); + } else if (action === 'rename') { + const numbers = template.split(' '); + // count occurrences of each name + const counter = {}; + let maxLen = 0; + proxies.forEach((p) => { + if (typeof counter[p.name] === 'undefined') counter[p.name] = 1; + else counter[p.name]++; + maxLen = Math.max(counter[p.name].toString().length, maxLen); + }); + const increment = {}; + return proxies.map((p) => { + if (counter[p.name] > 1) { + if (typeof increment[p.name] == 'undefined') increment[p.name] = 1; + let num = ''; + let cnt = increment[p.name]++; + let numDigits = 0; + while (cnt > 0) { + num = numbers[cnt % 10] + num; + cnt = parseInt(cnt / 10); + numDigits++; + } + // padding + while (numDigits++ < maxLen) { + num = numbers[0] + num; + } + if (position === 'front') { + p.name = num + link + p.name; + } else if (position === 'back') { + p.name = p.name + link + num; + } + } + return p; + }); + } + } + }; + } + + // sort proxies according to their names + function SortOperator(order = 'asc') { + return { + name: 'Sort Operator', + func: (proxies) => { + switch (order) { + case 'asc': + case 'desc': + return proxies.sort((a, b) => { + let res = a.name > b.name ? 1 : -1; + res *= order === 'desc' ? -1 : 1; + return res; + }); + case 'random': + return shuffle(proxies); + default: + throw new Error('Unknown sort option: ' + order); + } + } + }; + } + + // sort by regex + function RegexSortOperator(expressions) { + return { + name: 'Regex Sort Operator', + func: (proxies) => { + expressions = expressions.map((expr) => buildRegex(expr)); + return proxies.sort((a, b) => { + const oA = getRegexOrder(expressions, a.name); + const oB = getRegexOrder(expressions, b.name); + if (oA && !oB) return -1; + if (oB && !oA) return 1; + if (oA && oB) return oA < oB ? -1 : 1; + if ((!oA && !oB) || (oA && oB && oA === oB)) return a.name < b.name ? -1 : 1; // fallback to normal sort + }); + } + }; + } + + function getRegexOrder(expressions, str) { + let order = null; + for (let i = 0; i < expressions.length; i++) { + if (expressions[i].test(str)) { + order = i + 1; // plus 1 is important! 0 will be treated as false!!! + break; + } + } + return order; + } + + // rename by regex + // keywords: [{expr: "string format regex", now: "now"}] + function RegexRenameOperator(regex) { + return { + name: 'Regex Rename Operator', + func: (proxies) => { + return proxies.map((proxy) => { + for (const { expr, now } of regex) { + proxy.name = proxy.name.replace(buildRegex(expr, 'g'), now).trim(); + } + return proxy; + }); + } + }; + } + + // delete regex operator + // regex: ['a', 'b', 'c'] + function RegexDeleteOperator(regex) { + const regex_ = regex.map((r) => { + return { + expr: r, + now: '' + }; + }); + return { + name: 'Regex Delete Operator', + func: RegexRenameOperator(regex_).func + }; + } + + // use base64 encoded script to rename + /** Example script + function operator(proxies) { + // do something + return proxies; + } + + WARNING: + 1. This function name should be `operator`! + 2. Always declare variables before using them! + */ + function ScriptOperator(script, targetPlatform, $arguments) { + return { + name: 'Script Operator', + func: (proxies) => { + let output = proxies; + (function() { + // interface to get internal operators + const $get = (name, args) => { + const item = PROXY_PROCESSORS[name]; + return item(args); + }; + const $process = ApplyProcessor; + eval(script); + output = operator(proxies, targetPlatform); + })(); + return output; + } + }; + } + + /**************************** Filters ***************************************/ + // filter useless proxies + function UselessFilter() { + const KEYWORDS = [ '网址', '流量', '时间', '应急', '过期', 'Bandwidth', 'expire' ]; + return { + name: 'Useless Filter', + func: RegexFilter({ + regex: KEYWORDS, + keep: false + }).func + }; + } + + // filter by regions + function RegionFilter(regions) { + const REGION_MAP = { + HK: '🇭🇰', + TW: '🇹🇼', + US: '🇺🇸', + SG: '🇸🇬', + JP: '🇯🇵', + UK: '🇬🇧' + }; + return { + name: 'Region Filter', + func: (proxies) => { + // this would be high memory usage + return proxies.map((proxy) => { + const flag = getFlag(proxy.name); + return regions.some((r) => REGION_MAP[r] === flag); + }); + } + }; + } + + // filter by regex + function RegexFilter({ regex = [], keep = true }) { + return { + name: 'Regex Filter', + func: (proxies) => { + return proxies.map((proxy) => { + const selected = regex.some((r) => { + return buildRegex(r).test(proxy.name); + }); + return keep ? selected : !selected; + }); + } + }; + } + + function buildRegex(str, ...options) { + options = options.join(''); + if (str.startsWith('(?i)')) { + str = str.substr(4); + return new RegExp(str, 'i' + options); + } else { + return new RegExp(str, options); + } + } + + // filter by proxy types + function TypeFilter(types) { + return { + name: 'Type Filter', + func: (proxies) => { + return proxies.map((proxy) => types.some((t) => proxy.type === t)); + } + }; + } + + // use base64 encoded script to filter proxies + /** + Script Example + function func(proxies) { + const selected = FULL(proxies.length, true); + // do something + return selected; + } + WARNING: + 1. This function name should be `func`! + 2. Always declare variables before using them! + */ + function ScriptFilter(script, targetPlatform, $arguments) { + return { + name: 'Script Filter', + func: (proxies) => { + let output = FULL(proxies.length, true); + !(function() { + eval(script); + output = filter(proxies, targetPlatform); + })(); + return output; + } + }; + } + + return { + 'Useless Filter': UselessFilter, + 'Region Filter': RegionFilter, + 'Regex Filter': RegexFilter, + 'Type Filter': TypeFilter, + 'Script Filter': ScriptFilter, + + 'Set Property Operator': SetPropertyOperator, + 'Flag Operator': FlagOperator, + 'Sort Operator': SortOperator, + 'Regex Sort Operator': RegexSortOperator, + 'Regex Rename Operator': RegexRenameOperator, + 'Regex Delete Operator': RegexDeleteOperator, + 'Script Operator': ScriptOperator, + 'Handle Duplicate Operator': HandleDuplicateOperator + }; +})(); +const PROXY_PRODUCERS = (function() { + function QX_Producer() { + const targetPlatform = 'QX'; + const produce = (proxy) => { + let obfs_opts; + let tls_opts; + switch (proxy.type) { + case 'ss': + obfs_opts = ''; + if (proxy.plugin === 'obfs') { + const { host, mode } = proxy['plugin-opts']; + obfs_opts = `,obfs=${mode}${host ? ',obfs-host=' + host : ''}`; + } + if (proxy.plugin === 'v2ray-plugin') { + const { tls, host, path } = proxy['plugin-opts']; + obfs_opts = `,obfs=${tls ? 'wss' : 'ws'}${host ? ',obfs-host=' + host : ''}${path + ? ',obfs-uri=' + path + : ''}`; + } + return `shadowsocks=${proxy.server}:${proxy.port},method=${proxy.cipher},password=${proxy.password}${obfs_opts}${proxy.tfo + ? ',fast-open=true' + : ',fast-open=false'}${proxy.udp ? ',udp-relay=true' : ',udp-relay=false'},tag=${proxy.name}`; + case 'ssr': + return `shadowsocks=${proxy.server}:${proxy.port},method=${proxy.cipher},password=${proxy.password},ssr-protocol=${proxy.protocol}${proxy[ + 'protocol-param' + ] + ? ',ssr-protocol-param=' + proxy['protocol-param'] + : ''}${proxy.obfs ? ',obfs=' + proxy.obfs : ''}${proxy['obfs-param'] + ? ',obfs-host=' + proxy['obfs-param'] + : ''},fast-open=${proxy.tfo || false}${proxy.udp + ? ',udp-relay=true' + : ',udp-relay=false'},tag=${proxy.name}`; + case 'vmess': + obfs_opts = ''; + if (proxy.network === 'ws') { + // websocket + if (proxy.tls) { + // ws-tls + obfs_opts = `,obfs=wss${proxy.sni ? ',obfs-host=' + proxy.sni : ''}${proxy['ws-opts'].path + ? ',obfs-uri=' + proxy['ws-opts'].path + : ''},tls-verification=${proxy['skip-cert-verify'] ? 'false' : 'true'}`; + } else { + // ws + obfs_opts = `,obfs=ws${proxy['ws-opts'].headers.Host + ? ',obfs-host=' + proxy['ws-opts'].headers.Host + : ''}${proxy['ws-opts'].path ? ',obfs-uri=' + proxy['ws-opts'].path : ''}`; + } + } else { + // tcp + if (proxy.tls) { + obfs_opts = `,obfs=over-tls${proxy.sni + ? ',obfs-host=' + proxy.sni + : ''},tls-verification=${proxy['skip-cert-verify'] ? 'false' : 'true'}`; + } + } + let result = `vmess=${proxy.server}:${proxy.port},method=${proxy.cipher === 'auto' + ? 'none' + : proxy.cipher},password=${proxy.uuid}${obfs_opts},fast-open=${proxy.tfo || false}${proxy.udp + ? ',udp-relay=true' + : ',udp-relay=false'}`; + if (proxy.alterId === 0) proxy['vmess-aead'] = true; + if (typeof proxy['vmess-aead'] !== 'undefined') { + result += `,aead=${proxy['vmess-aead']}`; + } + result += `,tag=${proxy.name}`; + return result; + case 'trojan': + return `trojan=${proxy.server}:${proxy.port},password=${proxy.password}${proxy.sni + ? ',tls-host=' + proxy.sni + : ''},over-tls=true,tls-verification=${proxy['skip-cert-verify'] + ? 'false' + : 'true'},fast-open=${proxy.tfo || false}${proxy.udp + ? ',udp-relay=true' + : ',udp-relay=false'},tag=${proxy.name}`; + case 'http': + tls_opts = ''; + if (proxy.tls) { + tls_opts = `,over-tls=true,tls-verification=${proxy['skip-cert-verify'] + ? 'false' + : 'true'}${proxy.sni ? ',tls-host=' + proxy.sni : ''}`; + } + return `http=${proxy.server}:${proxy.port},username=${proxy.username},password=${proxy.password}${tls_opts},fast-open=${proxy.tfo || + false},tag=${proxy.name}`; + } + throw new Error(`Platform ${targetPlatform} does not support proxy type: ${proxy.type}`); + }; + return { produce }; + } + + function Loon_Producer() { + const targetPlatform = 'Loon'; + const produce = (proxy) => { + let obfs_opts = '', + tls_opts = '', + udp_opts = '', + tfo_opts = ''; + if (typeof proxy.udp !== 'undefined') { + udp_opts = proxy.udp ? ',udp=true' : ',udp=false'; + } + tfo_opts = `,fast-open=${proxy.tfo || false}`; + + switch (proxy.type) { + case 'ss': + obfs_opts = ',,'; + if (proxy.plugin) { + if (proxy.plugin === 'obfs') { + const { mode, host } = proxy['plugin-opts']; + obfs_opts = `,${mode},${host || ''}`; + } else { + throw new Error(`Platform ${targetPlatform} does not support obfs option: ${proxy.obfs}`); + } + } + return `${proxy.name}=shadowsocks,${proxy.server},${proxy.port},${proxy.cipher},"${proxy.password}"${obfs_opts}${udp_opts}${tfo_opts}`; + case 'ssr': + return `${proxy.name}=shadowsocksr,${proxy.server},${proxy.port},${proxy.cipher},"${proxy.password}",${proxy.protocol},{${proxy[ + 'protocol-param' + ] || ''}},${proxy.obfs},{${proxy['obfs-param'] || ''}}${udp_opts}${tfo_opts}`; + case 'vmess': + obfs_opts = ''; + if (proxy.network === 'ws') { + const host = proxy['ws-opts'].headers.Host || proxy.server; + obfs_opts = `,transport:ws,host:${host},path:${proxy['ws-opts'].path || '/'}`; + } else { + obfs_opts = `,transport:tcp`; + } + if (proxy.tls) { + obfs_opts += `${proxy.sni ? ',tls-name:' + proxy.sni : ''},skip-cert-verify:${proxy[ + 'skip-cert-verify' + ] || 'false'}`; + } + let result = `${proxy.name}=vmess,${proxy.server},${proxy.port},${proxy.cipher === 'auto' + ? 'none' + : proxy.cipher},"${proxy.uuid}",over-tls:${proxy.tls || 'false'}${obfs_opts}`; + if (proxy.alterId === 0) proxy['vmess-aead'] = true; + if (typeof proxy['vmess-aead'] !== 'undefined') { + result += `,vmess-aead=${proxy['vmess-aead']}`; + } + return result; + case 'trojan': + return `${proxy.name}=trojan,${proxy.server},${proxy.port},"${proxy.password}"${proxy.sni + ? ',tls-name:' + proxy.sni + : ''},skip-cert-verify:${proxy['skip-cert-verify'] || 'false'}${udp_opts}`; + case 'http': + tls_opts = ''; + const base = `${proxy.name}=${proxy.tls + ? 'http' + : 'https'},${proxy.server},${proxy.port},${proxy.username || ''},${proxy.password || ''}`; + if (proxy.tls) { + // https + tls_opts = `${proxy.sni ? ',tls-name:' + proxy.sni : ''},skip-cert-verify:${proxy[ + 'skip-cert-verify' + ]}`; + return base + tls_opts; + } else return base; + } + throw new Error(`Platform ${targetPlatform} does not support proxy type: ${proxy.type}`); + }; + return { produce }; + } + + function Surge_Producer() { + const targetPlatform = 'Surge'; + const produce = (proxy) => { + let result = ''; + let obfs_opts, tls_opts; + switch (proxy.type) { + case 'ss': + obfs_opts = ''; + if (proxy.plugin) { + const { host, mode } = proxy['plugin-opts']; + if (proxy.plugin === 'obfs') { + obfs_opts = `,obfs=${mode}${host ? ',obfs-host=' + host : ''}`; + } else { + throw new Error(`Platform ${targetPlatform} does not support obfs option: ${proxy.obfs}`); + } + } + result = `${proxy.name}=ss,${proxy.server}, ${proxy.port},encrypt-method=${proxy.cipher},password=${proxy.password}${obfs_opts},tfo=${proxy.tfo || + 'false'},udp-relay=${proxy.udp || 'false'}`; + break; + case 'vmess': + tls_opts = ''; + result = `${proxy.name}=vmess,${proxy.server},${proxy.port},username=${proxy.uuid},tls=${proxy.tls || + 'false'},tfo=${proxy.tfo || 'false'}`; + + if (proxy.alterId === 0) proxy['vmess-aead'] = true; + if (typeof proxy['vmess-aead'] !== 'undefined') { + result += `,vmess-aead=${proxy['vmess-aead']}`; + } + if (proxy.network === 'ws') { + const path = proxy['ws-opts'].path || '/'; + const wsHeaders = Object.entries(proxy['ws-opts'].headers) + .map(([ key, value ]) => `${key}:"${value}"`) + .join('|'); + result += `,ws=true${path ? ',ws-path=' + path : ''}${wsHeaders + ? ',ws-headers=' + wsHeaders + : ''}`; + } + if (proxy.tls) { + result += `${typeof proxy['skip-cert-verify'] !== 'undefined' + ? ',skip-cert-verify=' + proxy['skip-cert-verify'] + : ''}`; + result += proxy.sni ? `,sni=${proxy.sni}` : ''; + } + break; + case 'trojan': + result = `${proxy.name}=trojan,${proxy.server},${proxy.port},password=${proxy.password}${typeof proxy[ + 'skip-cert-verify' + ] !== 'undefined' + ? ',skip-cert-verify=' + proxy['skip-cert-verify'] + : ''}${proxy.sni ? ',sni=' + proxy.sni : ''},tfo=${proxy.tfo || + 'false'},udp-relay=${proxy.udp || 'false'}`; + break; + case 'http': + tls_opts = ', tls=false'; + if (proxy.tls) { + tls_opts = `,tls=true,skip-cert-verify=${proxy['skip-cert-verify']},sni=${proxy.sni}`; + } + result = `${proxy.name}=http, ${proxy.server}, ${proxy.port}${proxy.username + ? ',username=' + proxy.username + : ''}${proxy.password ? ',password=' + proxy.password : ''}${tls_opts},tfo=${proxy.tfo || + 'false'}`; + break; + default: + throw new Error(`Platform ${targetPlatform} does not support proxy type: ${proxy.type}`); + } + + // handle surge hybrid param + result += proxy['surge-hybrid'] !== undefined ? `,hybrid=${proxy['surge-hybrid']}` : ''; + return result; + }; + return { produce }; + } + + function Clash_Producer() { + const type = 'ALL'; + const produce = (proxies) => { + return ( + 'proxies:\n' + + proxies + .map((proxy) => { + delete proxy.supported; + return ' - ' + JSON.stringify(proxy) + '\n'; + }) + .join('') + ); + }; + return { type, produce }; + } + + function URI_Producer() { + const type = 'SINGLE'; + const produce = (proxy) => { + let result = ''; + switch (proxy.type) { + case 'ss': + const userinfo = `${proxy.cipher}:${proxy.password}`; + result = `ss://${Base64.encode(userinfo)}@${proxy.server}:${proxy.port}/`; + if (proxy.plugin) { + result += '?plugin='; + const opts = proxy['plugin-opts']; + switch (proxy.plugin) { + case 'obfs': + result += encodeURIComponent( + `simple-obfs;obfs=${opts.mode}${opts.host ? ';obfs-host=' + opts.host : ''}` + ); + break; + case 'v2ray-plugin': + result += encodeURIComponent( + `v2ray-plugin;obfs=${opts.mode}${opts.host + ? ';obfs-host' + opts.host + : ''}${opts.tls ? ';tls' : ''}` + ); + break; + default: + throw new Error(`Unsupported plugin option: ${proxy.plugin}`); + } + } + result += `#${encodeURIComponent(proxy.name)}`; + break; + case 'ssr': + result = `${proxy.server}:${proxy.port}:${proxy.protocol}:${proxy.cipher}:${proxy.obfs}:${Base64.encode( + proxy.password + )}/`; + result += `?remarks=${Base64.encode(proxy.name)}${proxy['obfs-param'] + ? '&obfsparam=' + Base64.encode(proxy['obfs-param']) + : ''}${proxy['protocol-param'] + ? '&protocolparam=' + Base64.encode(proxy['protocol-param']) + : ''}`; + result = 'ssr://' + Base64.encode(result); + break; + case 'vmess': + // V2RayN URI format + result = { + ps: proxy.name, + add: proxy.server, + port: proxy.port, + id: proxy.uuid, + type: '', + aid: 0, + net: proxy.network || 'tcp', + tls: proxy.tls ? 'tls' : '' + }; + // obfs + if (proxy.network === 'ws') { + result.path = proxy['ws-opts'].path || '/'; + result.host = proxy['ws-opts'].headers.Host || proxy.server; + } + result = 'vmess://' + Base64.encode(JSON.stringify(result)); + break; + case 'trojan': + result = `trojan://${proxy.password}@${proxy.server}:${proxy.port}#${encodeURIComponent( + proxy.name + )}`; + break; + default: + throw new Error(`Cannot handle proxy type: ${proxy.type}`); + } + return result; + }; + return { type, produce }; + } + + function JSON_Producer() { + const type = 'ALL'; + const produce = (proxies) => JSON.stringify(proxies, null, 2); + return { type, produce }; + } + + return { + QX: QX_Producer(), + Surge: Surge_Producer(), + Loon: Loon_Producer(), + Clash: Clash_Producer(), + URI: URI_Producer(), + JSON: JSON_Producer() + }; +})(); + +const ProxyUtils = (function() { + function preprocess(raw) { + for (const processor of PROXY_PREPROCESSORS) { + try { + if (processor.test(raw)) { + $.info(`Pre-processor [${processor.name}] activated`); + return processor.parse(raw); + } + } catch (e) { + $.error(`Parser [${processor.name}] failed\n Reason: ${e}`); + } + } + return raw; + } + + function safeMatch(p, line) { + let patternMatched; + try { + patternMatched = p.test(line); + } catch (err) { + patternMatched = false; + } + return patternMatched; + } + + function parse(raw) { + raw = preprocess(raw); + // parse + const lines = raw.split('\n'); + const proxies = []; + let lastParser; + + for (let line of lines) { + line = line.trim(); + if (line.length === 0) continue; // skip empty line + let matched = lastParser && safeMatch(lastParser, line); + if (!matched) { + for (const parser of PROXY_PARSERS) { + if (safeMatch(parser, line)) { + lastParser = parser; + matched = true; + $.info(`Proxy parser: ${parser.name} is activated`); + break; + } + } + } + if (!matched) { + $.error(`Failed to find a rule to parse line: \n${line}\n`); + } else { + try { + const proxy = lastParser.parse(line); + if (!proxy) { + $.error(`Parser ${lastParser.name} return nothing for \n${line}\n`); + } + proxies.push(proxy); + } catch (err) { + $.error(`Failed to parse line: \n ${line}\n Reason: ${err.stack}`); + } + } + } + + return proxies; + } + + async function process(proxies, operators = [], targetPlatform) { + for (const item of operators) { + // process script + let script; + const $arguments = {}; + if (item.type.indexOf('Script') !== -1) { + const { mode, content } = item.args; + if (mode === 'link') { + const url = content; + // extract link arguments + const rawArgs = url.split('#'); + if (rawArgs.length > 1) { + for (const pair of rawArgs[1].split('&')) { + const key = pair.split('=')[0]; + const value = pair.split('=')[1] || true; + $arguments[key] = value; + } + } + + // if this is remote script, download it + try { + script = await download(url.split('#')[0]); + $.info(`Script loaded: >>>\n ${script}`); + } catch (err) { + $.error(`Error when downloading remote script: ${item.args.content}.\n Reason: ${err}`); + // skip the script if download failed. + continue; + } + } else { + script = content; + } + } + + if (!PROXY_PROCESSORS[item.type]) { + $.error(`Unknown operator: "${item.type}"`); + continue; + } + + $.info(`Applying "${item.type}" with arguments:\n >>> ${JSON.stringify(item.args, null, 2) || 'None'}`); + let processor; + if (item.type.indexOf('Script') !== -1) { + processor = PROXY_PROCESSORS[item.type](script, targetPlatform, $arguments); + } else { + processor = PROXY_PROCESSORS[item.type](item.args); + } + proxies = ApplyProcessor(processor, proxies); + } + return proxies; + } + + function produce(proxies, targetPlatform) { + const producer = PROXY_PRODUCERS[targetPlatform]; + if (!producer) { + throw new Error(`Target platform: ${targetPlatform} is not supported!`); + } + + // filter unsupported proxies + proxies = proxies.filter((proxy) => !(proxy.supported && proxy.supported[targetPlatform] === false)); + + $.info(`Producing proxies for target: ${targetPlatform}`); + if (typeof producer.type === 'undefined' || producer.type === 'SINGLE') { + return proxies + .map((proxy) => { + try { + return producer.produce(proxy); + } catch (err) { + $.error(`Cannot produce proxy: ${JSON.stringify(proxy, null, 2)}\nReason: ${err}`); + return ''; + } + }) + .filter((line) => line.length > 0) + .join('\n'); + } else if (producer.type === 'ALL') { + return producer.produce(proxies); + } + } + + return { + parse, + process, + produce + }; +})(); + +function ApplyProcessor(processor, objs) { + function ApplyFilter(filter, objs) { + // select proxies + let selected = FULL(objs.length, true); + try { + selected = AND(selected, filter.func(objs)); + } catch (err) { + // print log and skip this filter + console.log(`Cannot apply filter ${filter.name}\n Reason: ${err}`); + } + return objs.filter((_, i) => selected[i]); + } + + function ApplyOperator(operator, objs) { + let output = clone(objs); + try { + const output_ = operator.func(output); + if (output_) output = output_; + } catch (err) { + // print log and skip this operator + console.log(`Cannot apply operator ${operator.name}! Reason: ${err}`); + } + return output; + } + + if (processor.name.indexOf('Filter') !== -1) { + return ApplyFilter(processor, objs); + } else if (processor.name.indexOf('Operator') !== -1) { + return ApplyOperator(processor, objs); + } +} + +// shuffle array +function shuffle(array) { + let currentIndex = array.length, + temporaryValue, + randomIndex; + + // While there remain elements to shuffle... + while (0 !== currentIndex) { + // Pick a remaining element... + randomIndex = Math.floor(Math.random() * currentIndex); + currentIndex -= 1; + + // And swap it with the current element. + temporaryValue = array[currentIndex]; + array[currentIndex] = array[randomIndex]; + array[randomIndex] = temporaryValue; + } + + return array; +} + +// deep clone object +function clone(object) { + return JSON.parse(JSON.stringify(object)); +} + +// remove flag +function removeFlag(str) { + return str.replace(/[\uD83C][\uDDE6-\uDDFF][\uD83C][\uDDE6-\uDDFF]/g, '').trim(); +} + +module.exports = { + ProxyUtils, + ApplyProcessor +}; diff --git a/backend/src/core/rule-utils.js b/backend/src/core/rule-utils.js new file mode 100644 index 0000000..ae1ac2b --- /dev/null +++ b/backend/src/core/rule-utils.js @@ -0,0 +1,293 @@ +const $ = require("./app"); + +const RULE_TYPES_MAPPING = [ + [ /^(DOMAIN|host|HOST)$/, 'DOMAIN' ], + [ /^(DOMAIN-KEYWORD|host-keyword|HOST-KEYWORD)$/, 'DOMAIN-KEYWORD' ], + [ /^(DOMAIN-SUFFIX|host-suffix|HOST-SUFFIX)$/, 'DOMAIN-SUFFIX' ], + [ /^USER-AGENT$/i, 'USER-AGENT' ], + [ /^PROCESS-NAME$/, 'PROCESS-NAME' ], + [ /^(DEST-PORT|DST-PORT)$/, 'DST-PORT' ], + [ /^SRC-IP(-CIDR)?$/, 'SRC-IP' ], + [ /^(IN|SRC)-PORT$/, 'IN-PORT' ], + [ /^PROTOCOL$/, 'PROTOCOL' ], + [ /^IP-CIDR$/i, 'IP-CIDR' ], + [ /^(IP-CIDR6|ip6-cidr|IP6-CIDR)$/ ] +]; + +const RULE_PREPROCESSORS = (function() { + function HTML() { + const name = 'HTML'; + const test = (raw) => /^/.test(raw); + // simply discard HTML + const parse = (_) => ''; + return { name, test, parse }; + } + + function ClashProvider() { + const name = 'Clash Provider'; + const test = (raw) => raw.indexOf('payload:') === 0; + const parse = (raw) => { + return raw.replace('payload:', '').replace(/^\s*-\s*/gm, ''); + }; + return { name, test, parse }; + } + + return [ HTML(), ClashProvider() ]; +})(); +const RULE_PARSERS = (function() { + function AllRuleParser() { + const name = 'Universal Rule Parser'; + const test = () => true; + const parse = (raw) => { + const lines = raw.split('\n'); + const result = []; + for (let line of lines) { + line = line.trim(); + // skip empty line + if (line.length === 0) continue; + // skip comments + if (/\s*#/.test(line)) continue; + try { + const params = line.split(',').map((w) => w.trim()); + let rawType = params[0]; + let matched = false; + for (const item of RULE_TYPES_MAPPING) { + const regex = item[0]; + if (regex.test(rawType)) { + matched = true; + const rule = { + type: item[1], + content: params[1] + }; + if (rule.type === 'IP-CIDR' || rule.type === 'IP-CIDR6') { + rule.options = params.slice(2); + } + result.push(rule); + } + } + if (!matched) throw new Error('Invalid rule type: ' + rawType); + } catch (e) { + console.error(`Failed to parse line: ${line}\n Reason: ${e}`); + } + } + return result; + }; + return { name, test, parse }; + } + + return [ AllRuleParser() ]; +})(); +const RULE_PROCESSORS = (function() { + function RegexFilter({ regex = [], keep = true }) { + return { + name: 'Regex Filter', + func: (rules) => { + return rules.map((rule) => { + const selected = regex.some((r) => { + r = new RegExp(r); + return r.test(rule); + }); + return keep ? selected : !selected; + }); + } + }; + } + + function TypeFilter(types) { + return { + name: 'Type Filter', + func: (rules) => { + return rules.map((rule) => types.some((t) => rule.type === t)); + } + }; + } + + function RemoveDuplicateFilter() { + return { + name: 'Remove Duplicate Filter', + func: (rules) => { + const seen = new Set(); + const result = []; + rules.forEach((rule) => { + const options = rule.options || []; + options.sort(); + const key = `${rule.type},${rule.content},${JSON.stringify(options)}`; + if (!seen.has(key)) { + result.push(rule); + seen.add(key); + } + }); + return result; + } + }; + } + + // regex: [{expr: "string format regex", now: "now"}] + function RegexReplaceOperator(regex) { + return { + name: 'Regex Rename Operator', + func: (rules) => { + return rules.map((rule) => { + for (const { expr, now } of regex) { + rule.content = rule.content.replace(new RegExp(expr, 'g'), now).trim(); + } + return rule; + }); + } + }; + } + + return { + 'Regex Filter': RegexFilter, + 'Remove Duplicate Filter': RemoveDuplicateFilter, + 'Type Filter': TypeFilter, + + 'Regex Replace Operator': RegexReplaceOperator + }; +})(); +const RULE_PRODUCERS = (function() { + function QXFilter() { + const type = 'SINGLE'; + const func = (rule) => { + // skip unsupported rules + const UNSUPPORTED = [ 'URL-REGEX', 'DEST-PORT', 'SRC-IP', 'IN-PORT', 'PROTOCOL' ]; + if (UNSUPPORTED.indexOf(rule.type) !== -1) return null; + + const TRANSFORM = { + 'DOMAIN-KEYWORD': 'HOST-KEYWORD', + 'DOMAIN-SUFFIX': 'HOST-SUFFIX', + DOMAIN: 'HOST', + 'IP-CIDR6': 'IP6-CIDR' + }; + + // QX does not support the no-resolve option + return `${TRANSFORM[rule.type] || rule.type},${rule.content},SUB-STORE`; + }; + return { type, func }; + } + + function SurgeRuleSet() { + const type = 'SINGLE'; + const func = (rule) => { + let output = `${rule.type},${rule.content}`; + if (rule.type === 'IP-CIDR' || rule.type === 'IP-CIDR6') { + output += rule.options ? `,${rule.options[0]}` : ''; + } + return output; + }; + return { type, func }; + } + + function LoonRules() { + const type = 'SINGLE'; + const func = (rule) => { + // skip unsupported rules + const UNSUPPORTED = [ 'DEST-PORT', 'SRC-IP', 'IN-PORT', 'PROTOCOL' ]; + if (UNSUPPORTED.indexOf(rule.type) !== -1) return null; + return SurgeRuleSet().func(rule); + }; + return { type, func }; + } + + function ClashRuleProvider() { + const type = 'ALL'; + const func = (rules) => { + const TRANSFORM = { + 'DEST-PORT': 'DST-PORT', + 'SRC-IP': 'SRC-IP-CIDR', + 'IN-PORT': 'SRC-PORT' + }; + const conf = { + payload: rules.map((rule) => { + let output = `${TRANSFORM[rule.type] || rule.type},${rule.content}`; + if (rule.type === 'IP-CIDR' || rule.type === 'IP-CIDR6') { + output += rule.options ? `,${rule.options[0]}` : ''; + } + return output; + }) + }; + return YAML.stringify(conf); + }; + return { type, func }; + } + + return { + QX: QXFilter(), + Surge: SurgeRuleSet(), + Loon: LoonRules(), + Clash: ClashRuleProvider() + }; +})(); + +const RuleUtils = (function() { + function preprocess(raw) { + for (const processor of RULE_PREPROCESSORS) { + try { + if (processor.test(raw)) { + $.info(`Pre-processor [${processor.name}] activated`); + return processor.parse(raw); + } + } catch (e) { + $.error(`Parser [${processor.name}] failed\n Reason: ${e}`); + } + } + return raw; + } + + function parse(raw) { + raw = preprocess(raw); + for (const parser of RULE_PARSERS) { + let matched; + try { + matched = parser.test(raw); + } catch (err) { + matched = false; + } + if (matched) { + $.info(`Rule parser [${parser.name}] is activated!`); + return parser.parse(raw); + } + } + } + + async function process(rules, operators) { + for (const item of operators) { + if (!RULE_PROCESSORS[item.type]) { + console.error(`Unknown operator: ${item.type}!`); + continue; + } + const processor = RULE_PROCESSORS[item.type](item.args); + $.info(`Applying "${item.type}" with arguments: \n >>> ${JSON.stringify(item.args) || 'None'}`); + rules = ApplyProcessor(processor, rules); + } + return rules; + } + + function produce(rules, targetPlatform) { + const producer = RULE_PRODUCERS[targetPlatform]; + if (!producer) { + throw new Error(`Target platform: ${targetPlatform} is not supported!`); + } + if (typeof producer.type === 'undefined' || producer.type === 'SINGLE') { + return rules + .map((rule) => { + try { + return producer.func(rule); + } catch (err) { + console.log(`ERROR: cannot produce rule: ${JSON.stringify(rule)}\nReason: ${err}`); + return ''; + } + }) + .filter((line) => line.length > 0) + .join('\n'); + } else if (producer.type === 'ALL') { + return producer.func(rules); + } + } + + return { parse, process, produce }; +})(); + +module.exports = { + RuleUtils +}; diff --git a/backend/src/facade/artifacts.js b/backend/src/facade/artifacts.js new file mode 100644 index 0000000..5fb8871 --- /dev/null +++ b/backend/src/facade/artifacts.js @@ -0,0 +1,353 @@ +const $ = require('../core/app'); + +const download = require('../utils/download'); +const Gist = require('../utils/gist'); + +const { ProxyUtils } = require('../core/proxy-utils'); +const { RuleUtils } = require('../core/rule-utils'); +const { SUBS_KEY, ARTIFACTS_KEY, ARTIFACT_REPOSITORY_KEY, COLLECTIONS_KEY, RULES_KEY, SETTINGS_KEY } = require('./constants'); + +function register($app) { + // Initialization + if (!$.read(ARTIFACTS_KEY)) $.write({}, ARTIFACTS_KEY); + + // RESTful APIs + $app.route('/api/artifacts').get(getAllArtifacts).post(createArtifact); + + $app.route('/api/artifact/:name').get(getArtifact).patch(updateArtifact).delete(deleteArtifact); + + // sync all artifacts + $app.get('/api/cron/sync-artifacts', cronSyncArtifacts); +} + +async function getArtifact(req, res) { + const name = req.params.name; + const action = req.query.action; + const allArtifacts = $.read(ARTIFACTS_KEY); + const artifact = allArtifacts[name]; + + if (artifact) { + if (action) { + let item; + switch (artifact.type) { + case 'subscription': + item = $.read(SUBS_KEY)[artifact.source]; + break; + case 'collection': + item = $.read(COLLECTIONS_KEY)[artifact.source]; + break; + case 'rule': + item = $.read(RULES_KEY)[artifact.source]; + break; + } + const output = await produceArtifact({ + type: artifact.type, + item, + platform: artifact.platform + }); + if (action === 'preview') { + res.send(output); + } else if (action === 'sync') { + $.info(`正在上传配置:${artifact.name}\n>>>`); + console.log(JSON.stringify(artifact, null, 2)); + try { + const resp = await syncArtifact({ + [artifact.name]: { content: output } + }); + artifact.updated = new Date().getTime(); + const body = JSON.parse(resp.body); + artifact.url = body.files[artifact.name].raw_url.replace(/\/raw\/[^\/]*\/(.*)/, '/raw/$1'); + $.write(allArtifacts, ARTIFACTS_KEY); + res.json({ + status: 'success' + }); + } catch (err) { + res.status(500).json({ + status: 'failed', + message: err + }); + } + } + } else { + res.json({ + status: 'success', + data: artifact + }); + } + } else { + res.status(404).json({ + status: 'failed', + message: '未找到对应的配置!' + }); + } +} + +function createArtifact(req, res) { + const artifact = req.body; + $.info(`正在创建远程配置:${artifact.name}`); + const allArtifacts = $.read(ARTIFACTS_KEY); + if (allArtifacts[artifact.name]) { + res.status(500).json({ + status: 'failed', + message: `远程配置${artifact.name}已存在!` + }); + } else { + if (/^[\w-_.]*$/.test(artifact.name)) { + allArtifacts[artifact.name] = artifact; + $.write(allArtifacts, ARTIFACTS_KEY); + res.status(201).json({ + status: 'success', + data: artifact + }); + } else { + res.status(500).json({ + status: 'failed', + message: `远程配置名称 ${artifact.name} 中含有非法字符!名称中只能包含英文字母、数字、下划线、横杠。` + }); + } + } +} + +function updateArtifact(req, res) { + const allArtifacts = $.read(ARTIFACTS_KEY); + const oldName = req.params.name; + const artifact = allArtifacts[oldName]; + if (artifact) { + $.info(`正在更新远程配置:${artifact.name}`); + const newArtifact = req.body; + if (typeof newArtifact.name !== 'undefined' && !/^[\w-_.]*$/.test(newArtifact.name)) { + res.status(500).json({ + status: 'failed', + message: `远程配置名称 ${newArtifact.name} 中含有非法字符!名称中只能包含英文字母、数字、下划线、横杠。` + }); + } else { + const merged = { + ...artifact, + ...newArtifact + }; + allArtifacts[merged.name] = merged; + if (merged.name !== oldName) delete allArtifacts[oldName]; + $.write(allArtifacts, ARTIFACTS_KEY); + res.json({ + status: 'success', + data: merged + }); + } + } else { + res.status(404).json({ + status: 'failed', + message: '未找到对应的远程配置!' + }); + } +} + +async function cronSyncArtifacts(_, res) { + $.info('开始同步所有远程配置...'); + const allArtifacts = $.read(ARTIFACTS_KEY); + const files = {}; + + try { + await Promise.all( + Object.values(allArtifacts).map(async (artifact) => { + if (artifact.sync) { + $.info(`正在同步云配置:${artifact.name}...`); + let item; + switch (artifact.type) { + case 'subscription': + item = $.read(SUBS_KEY)[artifact.source]; + break; + case 'collection': + item = $.read(COLLECTIONS_KEY)[artifact.source]; + break; + case 'rule': + item = $.read(RULES_KEY)[artifact.source]; + break; + } + const output = await produceArtifact({ + type: artifact.type, + item, + platform: artifact.platform + }); + + files[artifact.name] = { + content: output + }; + } + }) + ); + + const resp = await syncArtifact(files); + const body = JSON.parse(resp.body); + + for (const artifact of Object.values(allArtifacts)) { + artifact.updated = new Date().getTime(); + // extract real url from gist + artifact.url = body.files[artifact.name].raw_url.replace(/\/raw\/[^\/]*\/(.*)/, '/raw/$1'); + } + + $.write(allArtifacts, ARTIFACTS_KEY); + $.info('全部订阅同步成功!'); + res.status(200).end(); + } catch (err) { + res.status(500).json({ + error: err + }); + $.info(`同步订阅失败,原因:${err}`); + } +} + +async function deleteArtifact(req, res) { + const name = req.params.name; + $.info(`正在删除远程配置:${name}`); + const allArtifacts = $.read(ARTIFACTS_KEY); + try { + const artifact = allArtifacts[name]; + if (!artifact) throw new Error(`远程配置:${name}不存在!`); + if (artifact.updated) { + // delete gist + await syncArtifact({ + filename: name, + content: '' + }); + } + // delete local cache + delete allArtifacts[name]; + $.write(allArtifacts, ARTIFACTS_KEY); + res.json({ + status: 'success' + }); + } catch (err) { + // delete local cache + delete allArtifacts[name]; + $.write(allArtifacts, ARTIFACTS_KEY); + res.status(500).json({ + status: 'failed', + message: `无法删除远程配置:${name}, 原因:${err}` + }); + } +} + +function getAllArtifacts(req, res) { + const allArtifacts = $.read(ARTIFACTS_KEY); + res.json({ + status: 'success', + data: allArtifacts + }); +} + +async function syncArtifact(files) { + const { gistToken } = $.read(SETTINGS_KEY); + if (!gistToken) { + return Promise.reject('未设置Gist Token!'); + } + const manager = new Gist({ + token: gistToken, + key: ARTIFACT_REPOSITORY_KEY + }); + return manager.upload(files); +} + +async function produceArtifact( + { type, item, platform, noProcessor } = { + platform: 'JSON', + noProcessor: false + } +) { + if (type === 'subscription') { + const sub = item; + const raw = await download(sub.url, sub.ua); + // parse proxies + let proxies = ProxyUtils.parse(raw); + if (!noProcessor) { + // apply processors + proxies = await ProxyUtils.process(proxies, sub.process || [], platform); + } + // check duplicate + const exist = {}; + for (const proxy of proxies) { + if (exist[proxy.name]) { + $.notify('🌍 『 𝑺𝒖𝒃-𝑺𝒕𝒐𝒓𝒆 』', '⚠️ 订阅包含重复节点!', '请仔细检测配置!', { + 'media-url': + 'https://cdn3.iconfinder.com/data/icons/seo-outline-1/512/25_code_program_programming_develop_bug_search_developer-512.png' + }); + break; + } + exist[proxy.name] = true; + } + // produce + return ProxyUtils.produce(proxies, platform); + } else if (type === 'collection') { + const allSubs = $.read(SUBS_KEY); + const collection = item; + const subs = collection['subscriptions']; + let proxies = []; + + let processed = 0; + + await Promise.all( + subs.map(async (name) => { + const sub = allSubs[name]; + try { + $.info(`正在处理子订阅:${sub.name}...`); + const raw = await download(sub.url, sub.ua); + // parse proxies + let currentProxies = ProxyUtils.parse(raw); + if (!noProcessor) { + // apply processors + currentProxies = await ProxyUtils.process(currentProxies, sub.process || [], platform); + } + // merge + proxies = proxies.concat(currentProxies); + processed++; + $.info(`✅ 子订阅:${sub.name}加载成功,进度--${100 * (processed / subs.length).toFixed(1)}% `); + } catch (err) { + processed++; + $.error( + `❌ 处理组合订阅中的子订阅: ${sub.name}时出现错误:${err},该订阅已被跳过!进度--${100 * + (processed / subs.length).toFixed(1)}%` + ); + } + }) + ); + if (!noProcessor) { + // apply own processors + proxies = await ProxyUtils.process(proxies, collection.process || [], platform); + } + if (proxies.length === 0) { + throw new Error(`组合订阅中不含有效节点!`); + } + // check duplicate + const exist = {}; + for (const proxy of proxies) { + if (exist[proxy.name]) { + $.notify('🌍 『 𝑺𝒖𝒃-𝑺𝒕𝒐𝒓𝒆 』', '⚠️ 订阅包含重复节点!', '请仔细检测配置!', { + 'media-url': + 'https://cdn3.iconfinder.com/data/icons/seo-outline-1/512/25_code_program_programming_develop_bug_search_developer-512.png' + }); + break; + } + exist[proxy.name] = true; + } + return ProxyUtils.produce(proxies, platform); + } else if (type === 'rule') { + const rule = item; + let rules = []; + for (let i = 0; i < rule.urls.length; i++) { + const url = rule.urls[i]; + $.info(`正在处理URL:${url},进度--${100 * ((i + 1) / rule.urls.length).toFixed(1)}% `); + try { + const { body } = await download(url); + const currentRules = RuleUtils.parse(body); + rules = rules.concat(currentRules); + } catch (err) { + $.error(`处理分流订阅中的URL: ${url}时出现错误:${err}! 该订阅已被跳过。`); + } + } + // remove duplicates + rules = await RuleUtils.process(rules, [ { type: 'Remove Duplicate Filter' } ]); + // produce output + return RuleUtils.produce(rules, platform); + } +} + +module.exports = { register, produceArtifact }; diff --git a/backend/src/facade/collections.js b/backend/src/facade/collections.js new file mode 100644 index 0000000..df841a3 --- /dev/null +++ b/backend/src/facade/collections.js @@ -0,0 +1,155 @@ +const $ = require('../core/app'); +const { SUBS_KEY, COLLECTIONS_KEY } = require('./constants'); +const { getPlatformFromHeaders, getFlowHeaders } = require('./subscriptions'); +const { produceArtifact } = require('./artifacts'); + +function register($app) { + if (!$.read(COLLECTIONS_KEY)) $.write({}, COLLECTIONS_KEY); + + $app.get("/download/collection/:name", downloadCollection); + + $app.route('/api/collection/:name').get(getCollection).patch(updateCollection).delete(deleteCollection); + + $app.route('/api/collections').get(getAllCollections).post(createCollection); +} + +// collection API +async function downloadCollection(req, res) { + const { name } = req.params; + const { raw } = req.query || 'false'; + const platform = req.query.target || getPlatformFromHeaders(req.headers) || 'JSON'; + + const allCollections = $.read(COLLECTIONS_KEY); + const collection = allCollections[name]; + + $.info(`正在下载组合订阅:${name}`); + + // forward flow header from the first subscription in this collection + const allSubs = $.read(SUBS_KEY); + const subs = collection['subscriptions']; + if (subs.length > 0) { + const sub = allSubs[subs[0]]; + const flowInfo = await getFlowHeaders(sub.url); + if (flowInfo) { + res.set('subscription-userinfo', flowInfo); + } + } + + if (collection) { + try { + const output = await produceArtifact({ + type: 'collection', + item: collection, + platform, + noProcessor: raw + }); + if (platform === 'JSON') { + res.set('Content-Type', 'application/json;charset=utf-8').send(output); + } else { + res.send(output); + } + } catch (err) { + $.notify(`🌍 『 𝑺𝒖𝒃-𝑺𝒕𝒐𝒓𝒆 』 下载组合订阅失败`, `❌ 下载组合订阅错误:${name}!`, `🤔 原因:${err}`); + res.status(500).json({ + status: 'failed', + message: err + }); + } + } else { + $.notify(`🌍 『 𝑺𝒖𝒃-𝑺𝒕𝒐𝒓𝒆 』 下载组合订阅失败`, `❌ 未找到组合订阅:${name}!`); + res.status(404).json({ + status: 'failed' + }); + } +} + +function createCollection(req, res) { + const collection = req.body; + $.info(`正在创建组合订阅:${collection.name}`); + const allCol = $.read(COLLECTIONS_KEY); + if (allCol[collection.name]) { + res.status(500).json({ + status: 'failed', + message: `订阅集${collection.name}已存在!` + }); + } + // validate name + if (/^[\w-_]*$/.test(collection.name)) { + allCol[collection.name] = collection; + $.write(allCol, COLLECTIONS_KEY); + res.status(201).json({ + status: 'success', + data: collection + }); + } else { + res.status(500).json({ + status: 'failed', + message: `订阅集名称 ${collection.name} 中含有非法字符!名称中只能包含英文字母、数字、下划线、横杠。` + }); + } +} + +function getCollection(req, res) { + const { name } = req.params; + const collection = $.read(COLLECTIONS_KEY)[name]; + if (collection) { + res.json({ + status: 'success', + data: collection + }); + } else { + res.status(404).json({ + status: 'failed', + message: `未找到订阅集:${name}!` + }); + } +} + +function updateCollection(req, res) { + const { name } = req.params; + let collection = req.body; + const allCol = $.read(COLLECTIONS_KEY); + if (allCol[name]) { + const newCol = { + ...allCol[name], + ...collection + }; + $.info(`正在更新组合订阅:${name}...`); + // allow users to update collection name + delete allCol[name]; + allCol[collection.name || name] = newCol; + $.write(allCol, COLLECTIONS_KEY); + res.json({ + status: 'success', + data: newCol + }); + } else { + res.status(500).json({ + status: 'failed', + message: `订阅集${name}不存在,无法更新!` + }); + } +} + +function deleteCollection(req, res) { + const { name } = req.params; + $.info(`正在删除组合订阅:${name}`); + let allCol = $.read(COLLECTIONS_KEY); + delete allCol[name]; + $.write(allCol, COLLECTIONS_KEY); + res.json({ + status: 'success' + }); +} + +function getAllCollections(req, res) { + const allCols = $.read(COLLECTIONS_KEY); + res.json({ + status: 'success', + data: allCols + }); +} + +module.exports = { + register +}; diff --git a/backend/src/facade/constants.js b/backend/src/facade/constants.js new file mode 100644 index 0000000..b709bfc --- /dev/null +++ b/backend/src/facade/constants.js @@ -0,0 +1,11 @@ +module.exports = { + SETTINGS_KEY: 'settings', + SUBS_KEY: 'subs', + COLLECTIONS_KEY: 'collections', + RULES_KEY: 'rules', + BUILT_IN_KEY: 'builtin', + ARTIFACTS_KEY: 'artifacts', + GIST_BACKUP_KEY: 'Auto Generated Sub-Store Backup', + GIST_BACKUP_FILE_NAME: 'Sub-Store', + ARTIFACT_REPOSITORY_KEY: 'Sub-Store Artifacts Repository' +}; diff --git a/backend/src/facade/index.js b/backend/src/facade/index.js new file mode 100644 index 0000000..0ea5c36 --- /dev/null +++ b/backend/src/facade/index.js @@ -0,0 +1,115 @@ +const $ = require('../core/app'); +const { ENV } = require('../utils/open-api'); +const { IP_API } = require('../utils/geo'); +const Gist = require('../utils/gist'); +const { SETTINGS_KEY, GIST_BACKUP_KEY, GIST_BACKUP_FILE_NAME } = require('./constants'); + +function serve() { + const express = require('../utils/express'); + const $app = express(); + + // register routes + const collections = require('./collections'); + collections.register($app); + + const subscriptions = require('./subscriptions'); + subscriptions.register($app); + + const settings = require('./settings'); + settings.register($app); + + const artifacts = require('./artifacts'); + artifacts.register($app); + + // utils + $app.get('/api/utils/IP_API/:server', IP_API); // IP-API reverse proxy + $app.get('/api/utils/env', getEnv); // get runtime environment + $app.get('/api/utils/backup', gistBackup); // gist backup actions + + // Redirect sub.store to vercel webpage + $app.get('/', async (req, res) => { + // 302 redirect + res.set('location', 'https://sub-store.vercel.app/').status(302).end(); + }); + + // handle preflight request for QX + if (ENV().isQX) { + $app.options('/', async (req, res) => { + res.status(200).end(); + }); + } + + $app.all('/', (_, res) => { + res.send('Hello from sub-store, made with ❤️ by Peng-YM'); + }); + + $app.start(); +} + +function getEnv(req, res) { + const { isNode, isQX, isLoon, isSurge } = ENV(); + let backend = 'Node'; + if (isNode) backend = 'Node'; + if (isQX) backend = 'QX'; + if (isLoon) backend = 'Loon'; + if (isSurge) backend = 'Surge'; + res.json({ + backend + }); +} + +async function gistBackup(req, res) { + const { action } = req.query; + // read token + const { gistToken } = $.read(SETTINGS_KEY); + if (!gistToken) { + res.status(500).json({ + status: 'failed', + message: '未找到Gist备份Token!' + }); + } else { + const gist = new Gist({ + token: gistToken, + key: GIST_BACKUP_KEY + }); + try { + let content; + switch (action) { + case 'upload': + // update syncTime. + const settings = $.read(SETTINGS_KEY); + settings.syncTime = new Date().getTime(); + $.write(settings, SETTINGS_KEY); + content = $.read('#sub-store'); + if ($.env.isNode) content = JSON.stringify($.cache, null, ` `); + $.info(`上传备份中...`); + await gist.upload({ [GIST_BACKUP_FILE_NAME]: { content } }); + break; + case 'download': + $.info(`还原备份中...`); + content = await gist.download(GIST_BACKUP_FILE_NAME); + // restore settings + $.write(content, '#sub-store'); + if ($.env.isNode) { + content = JSON.parse(content); + Object.keys(content).forEach((key) => { + $.write(content[key], key); + }); + } + break; + } + res.json({ + status: 'success' + }); + } catch (err) { + const msg = `${action === 'upload' ? '上传' : '下载'}备份失败!${err}`; + $.error(msg); + res.status(500).json({ + status: 'failed', + message: msg + }); + } + } +} + +module.exports = serve; diff --git a/backend/src/facade/settings.js b/backend/src/facade/settings.js new file mode 100644 index 0000000..48c2669 --- /dev/null +++ b/backend/src/facade/settings.js @@ -0,0 +1,32 @@ +const $ = require('../core/app'); +const { SETTINGS_KEY } = require('./constants'); + +function register($app) { + if (!$.read(SETTINGS_KEY)) $.write({}, SETTINGS_KEY); + + $app.route('/api/settings').get(getSettings).patch(updateSettings); +} + +function getSettings(req, res) { + const settings = $.read(SETTINGS_KEY); + res.json(settings); +} + +function updateSettings(req, res) { + const data = req.body; + const settings = $.read(SETTINGS_KEY); + $.write( + { + ...settings, + ...data + }, + SETTINGS_KEY + ); + res.json({ + status: 'success' + }); +} + +module.exports = { + register +}; diff --git a/backend/src/facade/subscriptions.js b/backend/src/facade/subscriptions.js new file mode 100644 index 0000000..6165887 --- /dev/null +++ b/backend/src/facade/subscriptions.js @@ -0,0 +1,205 @@ +const $ = require("../core/app"); +const { produceArtifact } = require('./artifacts'); +const { SUBS_KEY, COLLECTIONS_KEY } = require('./constants'); + +function register($app) { + if (!$.read(SUBS_KEY)) $.write({}, SUBS_KEY); + + $app.get('/download/:name', downloadSubscription); + + $app.route('/api/sub/:name').get(getSubscription).patch(updateSubscription).delete(deleteSubscription); + + $app.route('/api/subs').get(getAllSubscriptions).post(createSubscription); +} + +// subscriptions API +async function downloadSubscription(req, res) { + const { name } = req.params; + const { raw } = req.query || 'false'; + const platform = req.query.target || getPlatformFromHeaders(req.headers) || 'JSON'; + + $.info(`正在下载订阅:${name}`); + + const allSubs = $.read(SUBS_KEY); + const sub = allSubs[name]; + if (sub) { + try { + const output = await produceArtifact({ + type: 'subscription', + item: sub, + platform, + noProcessor: raw + }); + + // forward flow headers + const flowInfo = await getFlowHeaders(sub.url); + if (flowInfo) { + res.set('subscription-userinfo', flowInfo); + } + + if (platform === 'JSON') { + res.set('Content-Type', 'application/json;charset=utf-8').send(output); + } else { + res.send(output); + } + } catch (err) { + $.notify(`🌍 『 𝑺𝒖𝒃-𝑺𝒕𝒐𝒓𝒆 』 下载订阅失败`, `❌ 无法下载订阅:${name}!`, `🤔 原因:${JSON.stringify(err)}`); + $.error(JSON.stringify(err)); + res.status(500).json({ + status: 'failed', + message: err + }); + } + } else { + $.notify(`🌍 『 𝑺𝒖𝒃-𝑺𝒕𝒐𝒓𝒆 』 下载订阅失败`, `❌ 未找到订阅:${name}!`); + res.status(404).json({ + status: 'failed' + }); + } +} + +function createSubscription(req, res) { + const sub = req.body; + const allSubs = $.read(SUBS_KEY); + $.info(`正在创建订阅: ${sub.name}`); + if (allSubs[sub.name]) { + res.status(500).json({ + status: 'failed', + message: `订阅${sub.name}已存在!` + }); + } + // validate name + if (/^[\w-_]*$/.test(sub.name)) { + allSubs[sub.name] = sub; + $.write(allSubs, SUBS_KEY); + res.status(201).json({ + status: 'success', + data: sub + }); + } else { + res.status(500).json({ + status: 'failed', + message: `订阅名称 ${sub.name} 中含有非法字符!名称中只能包含英文字母、数字、下划线、横杠。` + }); + } +} + +function getSubscription(req, res) { + const { name } = req.params; + const sub = $.read(SUBS_KEY)[name]; + if (sub) { + res.json({ + status: 'success', + data: sub + }); + } else { + res.status(404).json({ + status: 'failed', + message: `未找到订阅:${name}!` + }); + } +} + +function updateSubscription(req, res) { + const { name } = req.params; + let sub = req.body; + const allSubs = $.read(SUBS_KEY); + if (allSubs[name]) { + const newSub = { + ...allSubs[name], + ...sub + }; + $.info(`正在更新订阅: ${name}`); + // allow users to update the subscription name + if (name !== sub.name) { + // we need to find out all collections refer to this name + const allCols = $.read(COLLECTIONS_KEY); + for (const k of Object.keys(allCols)) { + const idx = allCols[k].subscriptions.indexOf(name); + if (idx !== -1) { + allCols[k].subscriptions[idx] = sub.name; + } + } + // update subscriptions + delete allSubs[name]; + allSubs[sub.name] = newSub; + } else { + allSubs[name] = newSub; + } + $.write(allSubs, SUBS_KEY); + res.json({ + status: 'success', + data: newSub + }); + } else { + res.status(500).json({ + status: 'failed', + message: `订阅${name}不存在,无法更新!` + }); + } +} + +function deleteSubscription(req, res) { + const { name } = req.params; + $.info(`删除订阅:${name}...`); + // delete from subscriptions + let allSubs = $.read(SUBS_KEY); + delete allSubs[name]; + $.write(allSubs, SUBS_KEY); + // delete from collections + let allCols = $.read(COLLECTIONS_KEY); + for (const k of Object.keys(allCols)) { + allCols[k].subscriptions = allCols[k].subscriptions.filter((s) => s !== name); + } + $.write(allCols, COLLECTIONS_KEY); + res.json({ + status: 'success' + }); +} + +function getAllSubscriptions(req, res) { + const allSubs = $.read(SUBS_KEY); + res.json({ + status: 'success', + data: allSubs + }); +} + +async function getFlowHeaders(url) { + const { headers } = await $.http.get({ + url, + headers: { + 'User-Agent': 'Quantumult/1.0.13 (iPhone10,3; iOS 14.0)' + } + }); + const subkey = Object.keys(headers).filter((k) => /SUBSCRIPTION-USERINFO/i.test(k))[0]; + return headers[subkey]; +} + +function getPlatformFromHeaders(headers) { + const keys = Object.keys(headers); + let UA = ''; + for (let k of keys) { + if (/USER-AGENT/i.test(k)) { + UA = headers[k]; + break; + } + } + if (UA.indexOf('Quantumult%20X') !== -1) { + return 'QX'; + } else if (UA.indexOf('Surge') !== -1) { + return 'Surge'; + } else if (UA.indexOf('Decar') !== -1 || UA.indexOf('Loon') !== -1) { + return 'Loon'; + } else if (UA.indexOf('Stash') !== -1 || UA.indexOf('Shadowrocket') !== -1) { + return 'Clash'; + } else { + return null; + } +} + +module.exports = { + register, + getPlatformFromHeaders, + getFlowHeaders +}; diff --git a/backend/src/main.js b/backend/src/main.js new file mode 100644 index 0000000..c10f3f6 --- /dev/null +++ b/backend/src/main.js @@ -0,0 +1,23 @@ +/** + * ███████╗██╗ ██╗██████╗ ███████╗████████╗ ██████╗ ██████╗ ███████╗ + * ██╔════╝██║ ██║██╔══██╗ ██╔════╝╚══██╔══╝██╔═══██╗██╔══██╗██╔════╝ + * ███████╗██║ ██║██████╔╝█████╗███████╗ ██║ ██║ ██║██████╔╝█████╗ + * ╚════██║██║ ██║██╔══██╗╚════╝╚════██║ ██║ ██║ ██║██╔══██╗██╔══╝ + * ███████║╚██████╔╝██████╔╝ ███████║ ██║ ╚██████╔╝██║ ██║███████╗ + * ╚══════╝ ╚═════╝ ╚═════╝ ╚══════╝ ╚═╝ ╚═════╝ ╚═╝ ╚═╝╚══════╝ + * Advanced Subscription Manager for QX, Loon, Surge and Clash. + * @author: Peng-YM + * @github: https://github.com/Peng-YM/Sub-Store + * @documentation: https://www.notion.so/Sub-Store-6259586994d34c11a4ced5c406264b46 + */ + +console.log( + ` +┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅ + 𝑺𝒖𝒃-𝑺𝒕𝒐𝒓𝒆 © 𝑷𝒆𝒏𝒈-𝒀𝑴 +┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅ +` +); + +const serve = require('./facade'); +serve(); \ No newline at end of file diff --git a/backend/src/utils/download.js b/backend/src/utils/download.js new file mode 100644 index 0000000..bf6efd8 --- /dev/null +++ b/backend/src/utils/download.js @@ -0,0 +1,29 @@ +const { HTTP } = require('./open-api'); + +const cache = new Map(); + +async function download(url, userAgent = 'Quantumult%20X') { + const id = userAgent + url; + if (cache.has(id)) { + return cache.get(id); + } + + const $http = HTTP({ + headers: { + 'User-Agent': userAgent + } + }); + + const result = new Promise((resolve, reject) => { + $http.get(url).then((resp) => { + const body = resp.body; + if (body.replace(/\s/g, '').length === 0) reject(new Error('订阅内容为空!')); + else resolve(body); + }); + }); + + cache[id] = result; + return result; +} + +module.exports = download; diff --git a/backend/src/utils/express.js b/backend/src/utils/express.js new file mode 100644 index 0000000..a4ff237 --- /dev/null +++ b/backend/src/utils/express.js @@ -0,0 +1,275 @@ +const $ = require('../core/app'); +const { ENV } = require('./open-api'); + +function express({ port } = { port: 3000 }) { + const { isNode } = ENV(); + const DEFAULT_HEADERS = { + 'Content-Type': 'text/plain;charset=UTF-8', + 'Access-Control-Allow-Origin': '*', + 'Access-Control-Allow-Methods': 'POST,GET,OPTIONS,PATCH,PUT,DELETE', + 'Access-Control-Allow-Headers': 'Origin, X-Requested-With, Content-Type, Accept' + }; + + // node support + if (isNode) { + const express_ = eval(`require("express")`); + const bodyParser = eval(`require("body-parser")`); + const app = express_(); + app.use(bodyParser.json({ verify: rawBodySaver })); + app.use(bodyParser.urlencoded({ verify: rawBodySaver, extended: true })); + app.use(bodyParser.raw({ verify: rawBodySaver, type: '*/*' })); + app.use((_, res, next) => { + res.set(DEFAULT_HEADERS); + next(); + }); + + // adapter + app.start = () => { + app.listen(port, () => { + $.log(`Express started on port: ${port}`); + }); + }; + return app; + } + + // route handlers + const handlers = []; + + // http methods + const METHODS_NAMES = [ 'GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'OPTIONS', "HEAD'", 'ALL' ]; + + // dispatch url to route + const dispatch = (request, start = 0) => { + let { method, url, headers, body } = request; + if (/json/i.test(headers['Content-Type'])) { + body = JSON.parse(body); + } + + method = method.toUpperCase(); + const { path, query } = extractURL(url); + + // pattern match + let handler = null; + let i; + let longestMatchedPattern = 0; + for (i = start; i < handlers.length; i++) { + if (handlers[i].method === 'ALL' || method === handlers[i].method) { + const { pattern } = handlers[i]; + if (patternMatched(pattern, path)) { + if (pattern.split('/').length > longestMatchedPattern) { + handler = handlers[i]; + longestMatchedPattern = pattern.split('/').length; + } + } + } + } + if (handler) { + // dispatch to next handler + const next = () => { + dispatch(method, url, i); + }; + const req = { + method, + url, + path, + query, + params: extractPathParams(handler.pattern, path), + headers, + body + }; + const res = Response(); + const cb = handler.callback; + + const errFunc = (err) => { + res.status(500).json({ + status: 'failed', + message: `Internal Server Error: ${err}` + }); + }; + + if (cb.constructor.name === 'AsyncFunction') { + cb(req, res, next).catch(errFunc); + } else { + try { + cb(req, res, next); + } catch (err) { + errFunc(err); + } + } + } else { + // no route, return 404 + const res = Response(); + res.status(404).json({ + status: 'failed', + message: 'ERROR: 404 not found' + }); + } + }; + + const app = {}; + + // attach http methods + METHODS_NAMES.forEach((method) => { + app[method.toLowerCase()] = (pattern, callback) => { + // add handler + handlers.push({ method, pattern, callback }); + }; + }); + + // chainable route + app.route = (pattern) => { + const chainApp = {}; + METHODS_NAMES.forEach((method) => { + chainApp[method.toLowerCase()] = (callback) => { + // add handler + handlers.push({ method, pattern, callback }); + return chainApp; + }; + }); + return chainApp; + }; + + // start service + app.start = () => { + dispatch($request); + }; + + return app; + + /************************************************ + Utility Functions + *************************************************/ + function rawBodySaver(req, res, buf, encoding) { + if (buf && buf.length) { + req.rawBody = buf.toString(encoding || 'utf8'); + } + } + + function Response() { + let statusCode = 200; + const { isQX, isLoon, isSurge } = ENV(); + const headers = DEFAULT_HEADERS; + const STATUS_CODE_MAP = { + 200: 'HTTP/1.1 200 OK', + 201: 'HTTP/1.1 201 Created', + 302: 'HTTP/1.1 302 Found', + 307: 'HTTP/1.1 307 Temporary Redirect', + 308: 'HTTP/1.1 308 Permanent Redirect', + 404: 'HTTP/1.1 404 Not Found', + 500: 'HTTP/1.1 500 Internal Server Error' + }; + return new class { + status(code) { + statusCode = code; + return this; + } + + send(body = '') { + const response = { + status: isQX ? STATUS_CODE_MAP[statusCode] : statusCode, + body, + headers + }; + if (isQX) { + $done(response); + } else if (isLoon || isSurge) { + $done({ + response + }); + } + } + + end() { + this.send(); + } + + html(data) { + this.set('Content-Type', 'text/html;charset=UTF-8'); + this.send(data); + } + + json(data) { + this.set('Content-Type', 'application/json;charset=UTF-8'); + this.send(JSON.stringify(data)); + } + + set(key, val) { + headers[key] = val; + return this; + } + }(); + } + + function patternMatched(pattern, path) { + if (pattern instanceof RegExp && pattern.test(path)) { + return true; + } else { + // root pattern, match all + if (pattern === '/') return true; + // normal string pattern + if (pattern.indexOf(':') === -1) { + const spath = path.split('/'); + const spattern = pattern.split('/'); + for (let i = 0; i < spattern.length; i++) { + if (spath[i] !== spattern[i]) { + return false; + } + } + return true; + } else if (extractPathParams(pattern, path)) { + // string pattern with path parameters + return true; + } + } + return false; + } + + function extractURL(url) { + // extract path + const match = url.match(/https?:\/\/[^\/]+(\/[^?]*)/) || []; + const path = match[1] || '/'; + + // extract query string + const split = url.indexOf('?'); + const query = {}; + if (split !== -1) { + let hashes = url.slice(url.indexOf('?') + 1).split('&'); + for (let i = 0; i < hashes.length; i++) { + hash = hashes[i].split('='); + query[hash[0]] = hash[1]; + } + } + return { + path, + query + }; + } + + function extractPathParams(pattern, path) { + if (pattern.indexOf(':') === -1) { + return null; + } else { + const params = {}; + for (let i = 0, j = 0; i < pattern.length; i++, j++) { + if (pattern[i] === ':') { + let key = []; + let val = []; + while (pattern[++i] !== '/' && i < pattern.length) { + key.push(pattern[i]); + } + while (path[j] !== '/' && j < path.length) { + val.push(path[j++]); + } + params[key.join('')] = val.join(''); + } else { + if (pattern[i] !== path[j]) { + return null; + } + } + } + return params; + } + } +} + +module.exports = express; diff --git a/backend/src/utils/geo.js b/backend/src/utils/geo.js new file mode 100644 index 0000000..8b0f4cd --- /dev/null +++ b/backend/src/utils/geo.js @@ -0,0 +1,209 @@ +const { HTTP } = require('./open-api'); + +// get proxy flag according to its name +function getFlag(name) { + // flags from @KOP-XIAO: https://github.com/KOP-XIAO/QuantumultX/blob/master/Scripts/resource-parser.js + const flags = { + '🇦🇿': [ '阿塞拜疆' ], + '🇦🇹': [ '奥地利', '奧地利', 'Austria', '维也纳' ], + '🇦🇺': [ 'AU', 'Australia', 'Sydney', '澳大利亚', '澳洲', '墨尔本', '悉尼', '土澳', '京澳', '廣澳', '滬澳', '沪澳', '广澳' ], + '🇧🇪': [ 'BE', '比利時', '比利时' ], + '🇧🇬': [ '保加利亚', '保加利亞', 'Bulgaria' ], + '🇧🇭': [ 'BH', '巴林' ], + '🇧🇩': [ 'BD', '孟加拉' ], + '🇵🇰': [ '巴基斯坦' ], + '🇰🇭': [ '柬埔寨' ], + '🇺🇦': [ '烏克蘭', '乌克兰' ], + '🇭🇷': [ '克罗地亚', 'HR', '克羅地亞' ], + '🇨🇦': [ 'Canada', 'CANADA', 'CAN', 'Waterloo', '加拿大', '蒙特利尔', '温哥华', '楓葉', '枫叶', '滑铁卢', '多伦多', 'CA' ], + '🇨🇭': [ '瑞士', '苏黎世', 'Switzerland', 'Zurich' ], + '🇳🇬': [ '尼日利亚', 'NG', '尼日利亞' ], + '🇨🇿': [ 'Czechia', '捷克' ], + '🇸🇰': [ '斯洛伐克', 'SK' ], + '🇷🇸': [ 'RS', '塞尔维亚' ], + '🇲🇩': [ '摩爾多瓦', 'MD', '摩尔多瓦' ], + '🇩🇪': [ 'DE', 'German', 'GERMAN', '德国', '德國', '法兰克福', '京德', '滬德', '廣德', '沪德', '广德', 'Frankfurt' ], + '🇩🇰': [ 'DK', 'DNK', '丹麦', '丹麥' ], + '🇪🇸': [ 'ES', '西班牙', 'Spain' ], + '🇪🇺': [ 'EU', '欧盟', '欧罗巴' ], + '🇫🇮': [ 'Finland', '芬兰', '芬蘭', '赫尔辛基' ], + '🇫🇷': [ 'FR', 'France', '法国', '法國', '巴黎' ], + '🇬🇧': [ 'UK', 'GB', 'England', 'United Kingdom', '英国', '伦敦', '英', 'London' ], + '🇲🇴': [ 'MO', 'Macao', '澳门', '澳門', 'CTM' ], + '🇰🇿': [ '哈萨克斯坦', '哈萨克' ], + '🇭🇺': [ '匈牙利', 'Hungary' ], + '🇭🇰': [ + 'HK', + 'Hongkong', + 'Hong Kong', + 'HongKong', + 'HONG KONG', + '香港', + '深港', + '沪港', + '呼港', + 'HKT', + 'HKBN', + 'HGC', + 'WTT', + 'CMI', + '穗港', + '京港', + '港' + ], + '🇮🇩': [ 'Indonesia', '印尼', '印度尼西亚', '雅加达' ], + '🇮🇪': [ 'Ireland', 'IRELAND', '爱尔兰', '愛爾蘭', '都柏林' ], + '🇮🇱': [ 'Israel', '以色列' ], + '🇮🇳': [ 'India', 'IND', 'INDIA', '印度', '孟买', 'MFumbai' ], + '🇮🇸': [ 'IS', 'ISL', '冰岛', '冰島' ], + '🇰🇵': [ 'KP', '朝鲜' ], + '🇰🇷': [ 'KR', 'Korea', 'KOR', '韩国', '首尔', '韩', '韓', '春川', 'Chuncheon', 'Seoul' ], + '🇱🇺': [ '卢森堡' ], + '🇱🇻': [ 'Latvia', 'Latvija', '拉脱维亚' ], + '🇲🇽': [ 'MEX', 'MX', '墨西哥' ], + '🇲🇾': [ 'MY', 'Malaysia', 'MALAYSIA', '马来西亚', '大馬', '馬來西亞', '吉隆坡' ], + '🇳🇱': [ 'NL', 'Netherlands', '荷兰', '荷蘭', '尼德蘭', '阿姆斯特丹' ], + '🇳🇵': [ '尼泊尔' ], + '🇵🇭': [ 'PH', 'Philippines', '菲律宾', '菲律賓' ], + '🇵🇷': [ 'PR', '波多黎各' ], + '🇷🇴': [ 'RO', '罗马尼亚' ], + '🇷🇺': [ + 'RU', + 'Russia', + '俄罗斯', + '俄国', + '俄羅斯', + '伯力', + '莫斯科', + '圣彼得堡', + '西伯利亚', + '新西伯利亚', + '京俄', + '杭俄', + '廣俄', + '滬俄', + '广俄', + '沪俄', + 'Moscow' + ], + '🇸🇦': [ '沙特' ], + '🇸🇪': [ 'SE', 'Sweden', '瑞典' ], + '🇲🇹': [ '马耳他' ], + '🇲🇦': [ 'MA', '摩洛哥' ], + '🇸🇬': [ 'SG', 'Singapore', 'SINGAPORE', '新加坡', '狮城', '沪新', '京新', '泉新', '穗新', '深新', '杭新', '广新', '廣新', '滬新' ], + '🇹🇭': [ 'TH', 'Thailand', '泰国', '泰國', '曼谷' ], + '🇹🇷': [ 'TR', 'Turkey', '土耳其', '伊斯坦布尔' ], + '🇹🇼': [ 'TW', 'Taiwan', 'TAIWAN', '台湾', '台北', '台中', '新北', '彰化', 'CHT', '台', 'HINET', 'Taipei' ], + '🇺🇸': [ + 'US', + 'USA', + 'America', + 'United States', + '美国', + '美', + '京美', + '波特兰', + '达拉斯', + '俄勒冈', + '凤凰城', + '费利蒙', + '硅谷', + '矽谷', + '拉斯维加斯', + '洛杉矶', + '圣何塞', + '圣克拉拉', + '西雅图', + '芝加哥', + '沪美', + '哥伦布', + '纽约', + 'Los Angeles', + 'San Jose', + 'Sillicon Valley', + 'Michigan' + ], + '🇻🇳': [ 'VN', '越南', '胡志明市' ], + '🇻🇪': [ 'VE', '委内瑞拉' ], + '🇮🇹': [ 'Italy', 'IT', 'Nachash', '意大利', '米兰', '義大利' ], + '🇿🇦': [ 'South Africa', '南非' ], + '🇦🇪': [ 'United Arab Emirates', '阿联酋', '迪拜', 'AE' ], + '🇧🇷': [ 'BR', 'Brazil', '巴西', '圣保罗' ], + '🇯🇵': [ + 'JP', + 'Japan', + 'JAPAN', + '日本', + '东京', + '大阪', + '埼玉', + '沪日', + '穗日', + '川日', + '中日', + '泉日', + '杭日', + '深日', + '辽日', + '广日', + '大坂', + 'Osaka', + 'Tokyo' + ], + '🇦🇷': [ 'AR', '阿根廷' ], + '🇳🇴': [ 'Norway', '挪威', 'NO' ], + '🇨🇳': [ 'CN', 'China', '回国', '中国', '中國', '江苏', '北京', '上海', '广州', '深圳', '杭州', '徐州', '青岛', '宁波', '镇江', 'back' ], + '🇵🇱': [ 'PL', 'POL', '波兰', '波蘭' ], + '🇨🇱': [ '智利' ], + '🇳🇿': [ '新西蘭', '新西兰' ], + '🇬🇷': [ '希腊', '希臘' ], + '🇪🇬': [ '埃及' ], + '🇨🇾': [ 'CY', '塞浦路斯' ], + '🇨🇷': [ 'CR', '哥斯达黎加' ], + '🇸🇮': [ 'SI', '斯洛文尼亚' ], + '🇱🇹': [ 'LT', '立陶宛' ], + '🇵🇦': [ 'PA', '巴拿马' ], + '🇹🇳': [ 'TN', '突尼斯' ], + '🇮🇲': [ '马恩岛', '馬恩島' ], + '🇧🇾': [ 'BY', '白俄', '白俄罗斯' ], + '🇵🇹': [ '葡萄牙' ], + '🇰🇪': [ 'KE', '肯尼亚' ], + '🇰🇬': [ 'KG', '吉尔吉斯坦' ], + '🇯🇴': [ 'JO', '约旦' ], + '🇺🇾': [ 'UY', '乌拉圭' ], + '🇲🇳': [ '蒙古' ], + '🇮🇷': [ 'IR', '伊朗' ], + '🇵🇪': [ '秘鲁', '祕魯' ], + '🇨🇴': [ '哥伦比亚' ], + '🇪🇪': [ '爱沙尼亚' ], + '🇪🇨': [ 'EC', '厄瓜多尔' ], + '🇲🇰': [ '马其顿', '馬其頓' ], + '🇧🇦': [ '波黑共和国', '波黑' ], + '🇬🇪': [ '格魯吉亞', '格鲁吉亚' ], + '🇦🇱': [ '阿爾巴尼亞', '阿尔巴尼亚' ], + '🏳️‍🌈': [ '流量', '时间', '应急', '过期', 'Bandwidth', 'expire' ] + }; + for (let k of Object.keys(flags)) { + if (flags[k].some((item) => name.indexOf(item) !== -1)) { + return k; + } + } + // no flag found + const oldFlag = (name.match(/[\uD83C][\uDDE6-\uDDFF][\uD83C][\uDDE6-\uDDFF]/) || [])[0]; + return oldFlag || '🏴‍☠️'; +} + +// util API +async function IP_API(req, res) { + const server = decodeURIComponent(req.params.server); + const $http = HTTP(); + const result = await $http + .get(`http://ip-api.com/json/${server}?lang=zh-CN`) + .then((resp) => JSON.parse(resp.body)); + res.json(result); +} + +module.exports = { + getFlag, + IP_API +}; diff --git a/backend/src/utils/gist.js b/backend/src/utils/gist.js new file mode 100644 index 0000000..a677c37 --- /dev/null +++ b/backend/src/utils/gist.js @@ -0,0 +1,75 @@ +const { HTTP } = require('./open-api'); + +/** + * Gist backup + */ +function Gist({ token, key }) { + const http = HTTP({ + baseURL: 'https://api.github.com', + headers: { + Authorization: `token ${token}`, + 'User-Agent': + 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.141 Safari/537.36' + }, + events: { + onResponse: (resp) => { + if (/^[45]/.test(String(resp.statusCode))) { + return Promise.reject(`ERROR: ${JSON.parse(resp.body).message}`); + } else { + return resp; + } + } + } + }); + + async function locate() { + return http.get('/gists').then((response) => { + const gists = JSON.parse(response.body); + for (let g of gists) { + if (g.description === key) { + return g.id; + } + } + return -1; + }); + } + + this.upload = async function(files) { + const id = await locate(); + + if (id === -1) { + // create a new gist for backup + return http.post({ + url: '/gists', + body: JSON.stringify({ + description: key, + public: false, + files + }) + }); + } else { + // update an existing gist + return http.patch({ + url: `/gists/${id}`, + body: JSON.stringify({ files }) + }); + } + }; + + this.download = async function(filename) { + const id = await locate(); + if (id === -1) { + return Promise.reject('未找到Gist备份!'); + } else { + try { + const { files } = await http.get(`/gists/${id}`).then((resp) => JSON.parse(resp.body)); + const url = files[filename].raw_url; + return await http.get(url).then((resp) => resp.body); + } catch (err) { + return Promise.reject(err); + } + } + }; +} + +module.exports = Gist; diff --git a/backend/src/utils/logical.js b/backend/src/utils/logical.js new file mode 100644 index 0000000..f392db8 --- /dev/null +++ b/backend/src/utils/logical.js @@ -0,0 +1,22 @@ +function AND(...args) { + return args.reduce((a, b) => a.map((c, i) => b[i] && c)); +} + +function OR(...args) { + return args.reduce((a, b) => a.map((c, i) => b[i] || c)); +} + +function NOT(array) { + return array.map((c) => !c); +} + +function FULL(length, bool) { + return [...Array(length).keys()].map(() => bool); +} + +module.exports = { + AND, + OR, + NOT, + FULL +} \ No newline at end of file diff --git a/backend/src/utils/open-api.js b/backend/src/utils/open-api.js new file mode 100644 index 0000000..e1927d9 --- /dev/null +++ b/backend/src/utils/open-api.js @@ -0,0 +1,271 @@ +function ENV() { + const isQX = typeof $task !== 'undefined'; + const isLoon = typeof $loon !== 'undefined'; + const isSurge = typeof $httpClient !== 'undefined' && !isLoon; + const isNode = eval(`typeof process !== "undefined"`); + return { isQX, isLoon, isSurge, isNode }; +} + +function HTTP(defaultOptions = { baseURL: '' }) { + const { isQX, isLoon, isSurge, isNode } = ENV(); + const methods = [ 'GET', 'POST', 'PUT', 'DELETE', 'HEAD', 'OPTIONS', 'PATCH' ]; + const URL_REGEX = /https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_\+.~#?&//=]*)/; + + function send(method, options) { + options = typeof options === 'string' ? { url: options } : options; + const baseURL = defaultOptions.baseURL; + if (baseURL && !URL_REGEX.test(options.url || '')) { + options.url = baseURL ? baseURL + options.url : options.url; + } + options = { ...defaultOptions, ...options }; + const timeout = options.timeout; + const events = { + ...{ + onRequest: () => {}, + onResponse: (resp) => resp, + onTimeout: () => {} + }, + ...options.events + }; + + events.onRequest(method, options); + + let worker; + if (isQX) { + worker = $task.fetch({ + method, + url: options.url, + headers: options.headers, + body: options.body + }); + } else if (isLoon || isSurge || isNode) { + worker = new Promise((resolve, reject) => { + const request = isNode ? eval("require('request')") : $httpClient; + request[method.toLowerCase()](options, (err, response, body) => { + if (err) reject(err); + else + resolve({ + statusCode: response.status || response.statusCode, + headers: response.headers, + body + }); + }); + }); + } + + let timeoutid; + const timer = timeout + ? new Promise((_, reject) => { + timeoutid = setTimeout(() => { + events.onTimeout(); + return reject(`${method} URL: ${options.url} exceeds the timeout ${timeout} ms`); + }, timeout); + }) + : null; + + return (timer + ? Promise.race([ timer, worker ]).then((res) => { + clearTimeout(timeoutid); + return res; + }) + : worker).then((resp) => events.onResponse(resp)); + } + + const http = {}; + methods.forEach((method) => (http[method.toLowerCase()] = (options) => send(method, options))); + return http; +} + +function API(name = 'untitled', debug = false) { + const { isQX, isLoon, isSurge, isNode } = ENV(); + return new class { + constructor(name, debug) { + this.name = name; + this.debug = debug; + + this.http = HTTP(); + this.env = ENV(); + + this.node = (() => { + if (isNode) { + const fs = eval("require('fs')"); + + return { + fs + }; + } else { + return null; + } + })(); + this.initCache(); + + const delay = (t, v) => + new Promise(function(resolve) { + setTimeout(resolve.bind(null, v), t); + }); + + Promise.prototype.delay = function(t) { + return this.then(function(v) { + return delay(t, v); + }); + }; + } + + // persistence + // initialize cache + initCache() { + if (isQX) this.cache = JSON.parse($prefs.valueForKey(this.name) || '{}'); + if (isLoon || isSurge) this.cache = JSON.parse($persistentStore.read(this.name) || '{}'); + + if (isNode) { + // create a json for root cache + let fpath = 'root.json'; + if (!this.node.fs.existsSync(fpath)) { + this.node.fs.writeFileSync(fpath, JSON.stringify({}), { flag: 'wx' }, (err) => console.log(err)); + } + this.root = {}; + + // create a json file with the given name if not exists + fpath = `${this.name}.json`; + if (!this.node.fs.existsSync(fpath)) { + this.node.fs.writeFileSync(fpath, JSON.stringify({}), { flag: 'wx' }, (err) => console.log(err)); + this.cache = {}; + } else { + this.cache = JSON.parse(this.node.fs.readFileSync(`${this.name}.json`)); + } + } + } + + // store cache + persistCache() { + const data = JSON.stringify(this.cache, null, 2); + if (isQX) $prefs.setValueForKey(data, this.name); + if (isLoon || isSurge) $persistentStore.write(data, this.name); + if (isNode) { + this.node.fs.writeFileSync(`${this.name}.json`, data, { flag: 'w' }, (err) => console.log(err)); + this.node.fs.writeFileSync('root.json', JSON.stringify(this.root, null, 2), { flag: 'w' }, (err) => + console.log(err) + ); + } + } + + write(data, key) { + this.log(`SET ${key}`); + if (key.indexOf('#') !== -1) { + key = key.substr(1); + if (isSurge || isLoon) { + return $persistentStore.write(data, key); + } + if (isQX) { + return $prefs.setValueForKey(data, key); + } + if (isNode) { + this.root[key] = data; + } + } else { + this.cache[key] = data; + } + this.persistCache(); + } + + read(key) { + this.log(`READ ${key}`); + if (key.indexOf('#') !== -1) { + key = key.substr(1); + if (isSurge || isLoon) { + return $persistentStore.read(key); + } + if (isQX) { + return $prefs.valueForKey(key); + } + if (isNode) { + return this.root[key]; + } + } else { + return this.cache[key]; + } + } + + delete(key) { + this.log(`DELETE ${key}`); + if (key.indexOf('#') !== -1) { + key = key.substr(1); + if (isSurge || isLoon) { + return $persistentStore.write(null, key); + } + if (isQX) { + return $prefs.removeValueForKey(key); + } + if (isNode) { + delete this.root[key]; + } + } else { + delete this.cache[key]; + } + this.persistCache(); + } + + // notification + notify(title, subtitle = '', content = '', options = {}) { + const openURL = options['open-url']; + const mediaURL = options['media-url']; + + if (isQX) $notify(title, subtitle, content, options); + if (isSurge) { + $notification.post(title, subtitle, content + `${mediaURL ? '\n多媒体:' + mediaURL : ''}`, { + url: openURL + }); + } + if (isLoon) { + let opts = {}; + if (openURL) opts['openUrl'] = openURL; + if (mediaURL) opts['mediaUrl'] = mediaURL; + if (JSON.stringify(opts) === '{}') { + $notification.post(title, subtitle, content); + } else { + $notification.post(title, subtitle, content, opts); + } + } + if (isNode) { + const content_ = + content + (openURL ? `\n点击跳转: ${openURL}` : '') + (mediaURL ? `\n多媒体: ${mediaURL}` : ''); + console.log(`${title}\n${subtitle}\n${content_}\n\n`); + } + } + + // other helper functions + log(msg) { + if (this.debug) console.log(`[${this.name}] LOG: ${msg}`); + } + + info(msg) { + console.log(`[${this.name}] INFO: ${msg}`); + } + + error(msg) { + console.log(`[${this.name}] ERROR: ${msg}`); + } + + wait(millisec) { + return new Promise((resolve) => setTimeout(resolve, millisec)); + } + + done(value = {}) { + if (isQX || isLoon || isSurge) { + $done(value); + } else if (isNode) { + if (typeof $context !== 'undefined') { + $context.headers = value.headers; + $context.statusCode = value.statusCode; + $context.body = value.body; + } + } + } + }(name, debug); +} + +module.exports = { + HTTP, + ENV, + API +}; diff --git a/backend/sub-store.js b/backend/sub-store.js deleted file mode 100755 index 7c57601..0000000 --- a/backend/sub-store.js +++ /dev/null @@ -1,8292 +0,0 @@ -/** - * ███████╗██╗ ██╗██████╗ ███████╗████████╗ ██████╗ ██████╗ ███████╗ - * ██╔════╝██║ ██║██╔══██╗ ██╔════╝╚══██╔══╝██╔═══██╗██╔══██╗██╔════╝ - * ███████╗██║ ██║██████╔╝█████╗███████╗ ██║ ██║ ██║██████╔╝█████╗ - * ╚════██║██║ ██║██╔══██╗╚════╝╚════██║ ██║ ██║ ██║██╔══██╗██╔══╝ - * ███████║╚██████╔╝██████╔╝ ███████║ ██║ ╚██████╔╝██║ ██║███████╗ - * ╚══════╝ ╚═════╝ ╚═════╝ ╚══════╝ ╚═╝ ╚═════╝ ╚═╝ ╚═╝╚══════╝ - * Advanced Subscription Manager for QX, Loon, Surge and Clash. - * @author: Peng-YM - * @github: https://github.com/Peng-YM/Sub-Store - * @documentation: https://www.notion.so/Sub-Store-6259586994d34c11a4ced5c406264b46 - */ -const $ = API("sub-store"); -const Base64 = new Base64Code(); -const $downloader = new ResourceDownloader(); - -service(); - -/****************************************** Service **********************************************************/ - -function service() { - console.log( - ` -┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅ - 𝑺𝒖𝒃-𝑺𝒕𝒐𝒓𝒆 © 𝑷𝒆𝒏𝒈-𝒀𝑴 -┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅ -` - ); - const $app = express(); - // Constants - const SETTINGS_KEY = "settings"; - const SUBS_KEY = "subs"; - const COLLECTIONS_KEY = "collections"; - const RULES_KEY = "rules"; - const BUILT_IN_KEY = "builtin"; - const ARTIFACTS_KEY = "artifacts"; - - const GIST_BACKUP_KEY = "Auto Generated Sub-Store Backup"; - const GIST_BACKUP_FILE_NAME = "Sub-Store"; - const ARTIFACT_REPOSITORY_KEY = "Sub-Store Artifacts Repository"; - - // Initialization - if (!$.read(SUBS_KEY)) $.write({}, SUBS_KEY); - if (!$.read(COLLECTIONS_KEY)) $.write({}, COLLECTIONS_KEY); - if (!$.read(SETTINGS_KEY)) $.write({}, SETTINGS_KEY); - if (!$.read(RULES_KEY)) $.write({}, RULES_KEY); - if (!$.read(ARTIFACTS_KEY)) $.write({}, ARTIFACTS_KEY); - - $.write( - { - rules: getBuiltInRules(), - }, - BUILT_IN_KEY - ); - - // download - $app.get("/download/collection/:name", downloadCollection); - $app.get("/download/:name", downloadSubscription); - - // subscription API - $app - .route("/api/sub/:name") - .get(getSubscription) - .patch(updateSubscription) - .delete(deleteSubscription); - - $app.route("/api/subs").get(getAllSubscriptions).post(createSubscription); - - $app.get("/api/sub/statistics/:name"); - - // collection API - $app - .route("/api/collection/:name") - .get(getCollection) - .patch(updateCollection) - .delete(deleteCollection); - - $app.route("/api/collections").get(getAllCollections).post(createCollection); - - // rules API - $app.get("/download/rule/:name", downloadRule); - $app.route("/api/rules").post(createRule).get(getAllRules); - $app - .route("/api/rule/:name") - .patch(updateRule) - .delete(deleteRule) - .get(getRule); - - // Storage management - $app - .route("/api/storage") - .get((req, res) => { - res.json($.read("#sub-store")); - }) - .post((req, res) => { - const data = req.body; - $.write(JSON.stringify(data), "#sub-store"); - res.end(); - }); - - // Settings - $app.route("/api/settings").get(getSettings).patch(updateSettings); - - // Artifacts - $app.route("/api/artifacts").get(getAllArtifacts).post(createArtifact); - - $app - .route("/api/artifact/:name") - .get(getArtifact) - .patch(updateArtifact) - .delete(deleteArtifact); - - // utils - $app.get("/api/utils/IP_API/:server", IP_API); // IP-API reverse proxy - $app.get("/api/utils/env", getEnv); // get runtime environment - $app.get("/api/utils/backup", gistBackup); // gist backup actions - - // cron triggered functions - $app.get("/api/cron/sync-artifacts", cronSyncArtifacts); // sync all artifacts - - // Redirect sub.store to vercel webpage - $app.get("/", async (req, res) => { - // 302 redirect - res.set("location", "https://sub-store.vercel.app/").status(302).end(); - }); - - // handle preflight request for QX - if (ENV().isQX) { - $app.options("/", async (req, res) => { - res.status(200).end(); - }); - } - - $app.all("/", (req, res) => { - res.send("Hello from sub-store, made with ❤️ by Peng-YM"); - }); - - $app.start(); - - // subscriptions API - async function downloadSubscription(req, res) { - const {name} = req.params; - const {cache} = req.query; - const {raw} = req.query || "false"; - const platform = - req.query.target || getPlatformFromHeaders(req.headers) || "JSON"; - - $.info(`正在下载订阅:${name}`); - - const allSubs = $.read(SUBS_KEY); - const sub = allSubs[name]; - if (sub) { - try { - const output = await produceArtifact({ - type: "subscription", - item: sub, - platform, - noProcessor: raw, - }); - - // forward flow headers - const flowInfo = await getFlowHeaders(sub.url); - if (flowInfo) { - res.set("subscription-userinfo", flowInfo); - } - - if (platform === "JSON") { - res - .set("Content-Type", "application/json;charset=utf-8") - .send(output); - } else { - res.send(output); - } - } catch (err) { - $.notify( - `🌍 『 𝑺𝒖𝒃-𝑺𝒕𝒐𝒓𝒆 』 下载订阅失败`, - `❌ 无法下载订阅:${name}!`, - `🤔 原因:${JSON.stringify(err)}` - ); - $.error(JSON.stringify(err)); - res.status(500).json({ - status: "failed", - message: err, - }); - } - } else { - $.notify(`🌍 『 𝑺𝒖𝒃-𝑺𝒕𝒐𝒓𝒆 』 下载订阅失败`, `❌ 未找到订阅:${name}!`); - res.status(404).json({ - status: "failed", - }); - } - } - - function createSubscription(req, res) { - const sub = req.body; - const allSubs = $.read(SUBS_KEY); - $.info(`正在创建订阅: ${sub.name}`); - if (allSubs[sub.name]) { - res.status(500).json({ - status: "failed", - message: `订阅${sub.name}已存在!`, - }); - } - // validate name - if (/^[\w-_]*$/.test(sub.name)) { - allSubs[sub.name] = sub; - $.write(allSubs, SUBS_KEY); - res.status(201).json({ - status: "success", - data: sub, - }); - } else { - res.status(500).json({ - status: "failed", - message: `订阅名称 ${sub.name} 中含有非法字符!名称中只能包含英文字母、数字、下划线、横杠。`, - }); - } - } - - function getSubscription(req, res) { - const {name} = req.params; - const sub = $.read(SUBS_KEY)[name]; - if (sub) { - res.json({ - status: "success", - data: sub, - }); - } else { - res.status(404).json({ - status: "failed", - message: `未找到订阅:${name}!`, - }); - } - } - - function updateSubscription(req, res) { - const {name} = req.params; - let sub = req.body; - const allSubs = $.read(SUBS_KEY); - if (allSubs[name]) { - const newSub = { - ...allSubs[name], - ...sub, - }; - $.info(`正在更新订阅: ${name}`); - // allow users to update the subscription name - if (name !== sub.name) { - // we need to find out all collections refer to this name - const allCols = $.read(COLLECTIONS_KEY); - for (const k of Object.keys(allCols)) { - const idx = allCols[k].subscriptions.indexOf(name); - if (idx !== -1) { - allCols[k].subscriptions[idx] = sub.name; - } - } - // update subscriptions - delete allSubs[name]; - allSubs[sub.name] = newSub; - } else { - allSubs[name] = newSub; - } - $.write(allSubs, SUBS_KEY); - res.json({ - status: "success", - data: newSub, - }); - } else { - res.status(500).json({ - status: "failed", - message: `订阅${name}不存在,无法更新!`, - }); - } - } - - function deleteSubscription(req, res) { - const {name} = req.params; - $.info(`删除订阅:${name}...`); - // delete from subscriptions - let allSubs = $.read(SUBS_KEY); - delete allSubs[name]; - $.write(allSubs, SUBS_KEY); - // delete from collections - let allCols = $.read(COLLECTIONS_KEY); - for (const k of Object.keys(allCols)) { - allCols[k].subscriptions = allCols[k].subscriptions.filter( - (s) => s !== name - ); - } - $.write(allCols, COLLECTIONS_KEY); - res.json({ - status: "success", - }); - } - - function getAllSubscriptions(req, res) { - const allSubs = $.read(SUBS_KEY); - res.json({ - status: "success", - data: allSubs, - }); - } - - // collection API - async function downloadCollection(req, res) { - const {name} = req.params; - const {raw} = req.query || "false"; - const platform = - req.query.target || getPlatformFromHeaders(req.headers) || "JSON"; - - const allCollections = $.read(COLLECTIONS_KEY); - const collection = allCollections[name]; - - $.info(`正在下载组合订阅:${name}`); - - // forward flow header from the first subscription in this collection - const allSubs = $.read(SUBS_KEY); - const subs = collection["subscriptions"]; - if (subs.length > 0) { - const sub = allSubs[subs[0]]; - const flowInfo = await getFlowHeaders(sub.url); - if (flowInfo) { - res.set("subscription-userinfo", flowInfo); - } - } - - if (collection) { - try { - const output = await produceArtifact({ - type: "collection", - item: collection, - platform, - noProcessor: raw, - }); - if (platform === "JSON") { - res - .set("Content-Type", "application/json;charset=utf-8") - .send(output); - } else { - res.send(output); - } - } catch (err) { - $.notify( - `🌍 『 𝑺𝒖𝒃-𝑺𝒕𝒐𝒓𝒆 』 下载组合订阅失败`, - `❌ 下载组合订阅错误:${name}!`, - `🤔 原因:${err}` - ); - res.status(500).json({ - status: "failed", - message: err, - }); - } - } else { - $.notify( - `🌍 『 𝑺𝒖𝒃-𝑺𝒕𝒐𝒓𝒆 』 下载组合订阅失败`, - `❌ 未找到组合订阅:${name}!` - ); - res.status(404).json({ - status: "failed", - }); - } - } - - function createCollection(req, res) { - const collection = req.body; - $.info(`正在创建组合订阅:${collection.name}`); - const allCol = $.read(COLLECTIONS_KEY); - if (allCol[collection.name]) { - res.status(500).json({ - status: "failed", - message: `订阅集${collection.name}已存在!`, - }); - } - // validate name - if (/^[\w-_]*$/.test(collection.name)) { - allCol[collection.name] = collection; - $.write(allCol, COLLECTIONS_KEY); - res.status(201).json({ - status: "success", - data: collection, - }); - } else { - res.status(500).json({ - status: "failed", - message: `订阅集名称 ${collection.name} 中含有非法字符!名称中只能包含英文字母、数字、下划线、横杠。`, - }); - } - } - - function getCollection(req, res) { - const {name} = req.params; - const collection = $.read(COLLECTIONS_KEY)[name]; - if (collection) { - res.json({ - status: "success", - data: collection, - }); - } else { - res.status(404).json({ - status: "failed", - message: `未找到订阅集:${name}!`, - }); - } - } - - function updateCollection(req, res) { - const {name} = req.params; - let collection = req.body; - const allCol = $.read(COLLECTIONS_KEY); - if (allCol[name]) { - const newCol = { - ...allCol[name], - ...collection, - }; - $.info(`正在更新组合订阅:${name}...`); - // allow users to update collection name - delete allCol[name]; - allCol[collection.name || name] = newCol; - $.write(allCol, COLLECTIONS_KEY); - res.json({ - status: "success", - data: newCol, - }); - } else { - res.status(500).json({ - status: "failed", - message: `订阅集${name}不存在,无法更新!`, - }); - } - } - - function deleteCollection(req, res) { - const {name} = req.params; - $.info(`正在删除组合订阅:${name}`); - let allCol = $.read(COLLECTIONS_KEY); - delete allCol[name]; - $.write(allCol, COLLECTIONS_KEY); - res.json({ - status: "success", - }); - } - - function getAllCollections(req, res) { - const allCols = $.read(COLLECTIONS_KEY); - res.json({ - status: "success", - data: allCols, - }); - } - - // rules API - async function downloadRule(req, res) { - const {name} = req.params; - const {builtin} = req.query; - const platform = - req.query.target || getPlatformFromHeaders(req.headers) || "Surge"; - - $.info(`正在下载${builtin ? "内置" : ""}分流订阅:${name}...`); - - let rule; - if (builtin) { - rule = $.read(BUILT_IN_KEY)["rules"][name]; - } - if (rule) { - const output = await produceArtifact({ - type: "rule", - item: rule, - platform, - }); - res.send(output); - } else { - // rule not found - $.notify( - `🌍 『 𝑺𝒖𝒃-𝑺𝒕𝒐𝒓𝒆 』 下载分流订阅失败`, - `❌ 未找到分流订阅:${name}!` - ); - res.status(404).json({ - status: "failed", - }); - } - } - - function createRule(req, res) { - } - - function deleteRule(req, res) { - } - - function updateRule(req, res) { - } - - function getAllRules(req, res) { - } - - function getRule(req, res) { - } - - // settings API - function getSettings(req, res) { - const settings = $.read(SETTINGS_KEY); - res.json(settings); - } - - function updateSettings(req, res) { - const data = req.body; - const settings = $.read(SETTINGS_KEY); - $.write( - { - ...settings, - ...data, - }, - SETTINGS_KEY - ); - res.json({ - status: "success", - }); - } - - // artifact API - async function getArtifact(req, res) { - const name = req.params.name; - const action = req.query.action; - const allArtifacts = $.read(ARTIFACTS_KEY); - const artifact = allArtifacts[name]; - - if (artifact) { - if (action) { - let item; - switch (artifact.type) { - case "subscription": - item = $.read(SUBS_KEY)[artifact.source]; - break; - case "collection": - item = $.read(COLLECTIONS_KEY)[artifact.source]; - break; - case "rule": - item = $.read(RULES_KEY)[artifact.source]; - break; - } - const output = await produceArtifact({ - type: artifact.type, - item, - platform: artifact.platform, - }); - if (action === "preview") { - res.send(output); - } else if (action === "sync") { - $.info(`正在上传配置:${artifact.name}\n>>>`); - console.log(JSON.stringify(artifact, null, 2)); - try { - const resp = await syncArtifact({ - [artifact.name]: {content: output}, - }); - artifact.updated = new Date().getTime(); - const body = JSON.parse(resp.body); - artifact.url = body.files[artifact.name].raw_url.replace( - /\/raw\/[^\/]*\/(.*)/, - "/raw/$1" - ); - $.write(allArtifacts, ARTIFACTS_KEY); - res.json({ - status: "success", - }); - } catch (err) { - res.status(500).json({ - status: "failed", - message: err, - }); - } - } - } else { - res.json({ - status: "success", - data: artifact, - }); - } - } else { - res.status(404).json({ - status: "failed", - message: "未找到对应的配置!", - }); - } - } - - function createArtifact(req, res) { - const artifact = req.body; - $.info(`正在创建远程配置:${artifact.name}`); - const allArtifacts = $.read(ARTIFACTS_KEY); - if (allArtifacts[artifact.name]) { - res.status(500).json({ - status: "failed", - message: `远程配置${artifact.name}已存在!`, - }); - } else { - if (/^[\w-_.]*$/.test(artifact.name)) { - allArtifacts[artifact.name] = artifact; - $.write(allArtifacts, ARTIFACTS_KEY); - res.status(201).json({ - status: "success", - data: artifact, - }); - } else { - res.status(500).json({ - status: "failed", - message: `远程配置名称 ${artifact.name} 中含有非法字符!名称中只能包含英文字母、数字、下划线、横杠。`, - }); - } - } - } - - function updateArtifact(req, res) { - const allArtifacts = $.read(ARTIFACTS_KEY); - const oldName = req.params.name; - const artifact = allArtifacts[oldName]; - if (artifact) { - $.info(`正在更新远程配置:${artifact.name}`); - const newArtifact = req.body; - if ( - typeof newArtifact.name !== "undefined" && - !/^[\w-_.]*$/.test(newArtifact.name) - ) { - res.status(500).json({ - status: "failed", - message: `远程配置名称 ${newArtifact.name} 中含有非法字符!名称中只能包含英文字母、数字、下划线、横杠。`, - }); - } else { - const merged = { - ...artifact, - ...newArtifact, - }; - allArtifacts[merged.name] = merged; - if (merged.name !== oldName) delete allArtifacts[oldName]; - $.write(allArtifacts, ARTIFACTS_KEY); - res.json({ - status: "success", - data: merged, - }); - } - } else { - res.status(404).json({ - status: "failed", - message: "未找到对应的远程配置!", - }); - } - } - - async function cronSyncArtifacts(req, res) { - $.info("开始同步所有远程配置..."); - const allArtifacts = $.read(ARTIFACTS_KEY); - const files = {}; - - try { - await Promise.all(Object.values(allArtifacts).map(async artifact => { - if (artifact.sync) { - $.info(`正在同步云配置:${artifact.name}...`); - let item; - switch (artifact.type) { - case "subscription": - item = $.read(SUBS_KEY)[artifact.source]; - break; - case "collection": - item = $.read(COLLECTIONS_KEY)[artifact.source]; - break; - case "rule": - item = $.read(RULES_KEY)[artifact.source]; - break; - } - const output = await produceArtifact({ - type: artifact.type, - item, - platform: artifact.platform - }); - - files[artifact.name] = { - content: output - }; - } - })); - - const resp = await syncArtifact(files); - const body = JSON.parse(resp.body); - - for (const artifact of Object.values(allArtifacts)) { - artifact.updated = new Date().getTime(); - // extract real url from gist - artifact.url = body.files[artifact.name].raw_url.replace( - /\/raw\/[^\/]*\/(.*)/, - "/raw/$1" - ); - } - - $.write(allArtifacts, ARTIFACTS_KEY); - $.info("全部订阅同步成功!") - res.status(200).end(); - } catch (err) { - res.status(500).json({ - error: err - }); - $.info(`同步订阅失败,原因:${err}`); - } - } - - async function deleteArtifact(req, res) { - const name = req.params.name; - $.info(`正在删除远程配置:${name}`); - const allArtifacts = $.read(ARTIFACTS_KEY); - try { - const artifact = allArtifacts[name]; - if (!artifact) throw new Error(`远程配置:${name}不存在!`); - if (artifact.updated) { - // delete gist - await syncArtifact({ - filename: name, - content: "", - }); - } - // delete local cache - delete allArtifacts[name]; - $.write(allArtifacts, ARTIFACTS_KEY); - res.json({ - status: "success", - }); - } catch (err) { - // delete local cache - delete allArtifacts[name]; - $.write(allArtifacts, ARTIFACTS_KEY); - res.status(500).json({ - status: "failed", - message: `无法删除远程配置:${name}, 原因:${err}`, - }); - } - } - - function getAllArtifacts(req, res) { - const allArtifacts = $.read(ARTIFACTS_KEY); - res.json({ - status: "success", - data: allArtifacts, - }); - } - - async function syncArtifact(files) { - const {gistToken} = $.read(SETTINGS_KEY); - if (!gistToken) { - return Promise.reject("未设置Gist Token!"); - } - const manager = new Gist({ - token: gistToken, - key: ARTIFACT_REPOSITORY_KEY, - }); - return manager.upload(files); - } - - // util API - async function IP_API(req, res) { - const server = decodeURIComponent(req.params.server); - const result = await $.http - .get(`http://ip-api.com/json/${server}?lang=zh-CN`) - .then((resp) => JSON.parse(resp.body)); - res.json(result); - } - - async function getFlowHeaders(url) { - const {headers} = await $.http.get({ - url, - headers: { - "User-Agent": "Quantumult/1.0.13 (iPhone10,3; iOS 14.0)", - }, - }); - const subkey = Object.keys(headers).filter((k) => - /SUBSCRIPTION-USERINFO/i.test(k) - )[0]; - return headers[subkey]; - } - - function getEnv(req, res) { - const {isNode, isQX, isLoon, isSurge} = ENV(); - let backend = "Node"; - if (isNode) backend = "Node"; - if (isQX) backend = "QX"; - if (isLoon) backend = "Loon"; - if (isSurge) backend = "Surge"; - res.json({ - backend, - }); - } - - async function gistBackup(req, res) { - const {action} = req.query; - // read token - const {gistToken} = $.read(SETTINGS_KEY); - if (!gistToken) { - res.status(500).json({ - status: "failed", - message: "未找到Gist备份Token!", - }); - } else { - const gist = new Gist({ - token: gistToken, - key: GIST_BACKUP_KEY, - }); - try { - let content; - switch (action) { - case "upload": - // update syncTime. - const settings = $.read(SETTINGS_KEY); - settings.syncTime = new Date().getTime(); - $.write(settings, SETTINGS_KEY); - content = $.read("#sub-store"); - if ($.env.isNode) content = JSON.stringify($.cache, null, ` `) - $.info(`上传备份中...`); - await gist.upload({[GIST_BACKUP_FILE_NAME]: { content }}); - break; - case "download": - $.info(`还原备份中...`); - content = await gist.download(GIST_BACKUP_FILE_NAME); - // restore settings - $.write(content, "#sub-store"); - if ($.env.isNode) { - content = JSON.parse(content) - Object.keys(content).forEach(key => { - $.write(content[key], key) - }) - } - break; - } - res.json({ - status: "success", - }); - } catch (err) { - const msg = `${action === "upload" ? "上传" : "下载"}备份失败!${err}`; - $.error(msg); - res.status(500).json({ - status: "failed", - message: msg, - }); - } - } - } - - // get target platform from user agent - function getPlatformFromHeaders(headers) { - const keys = Object.keys(headers); - let UA = ""; - for (let k of keys) { - if (/USER-AGENT/i.test(k)) { - UA = headers[k]; - break; - } - } - if (UA.indexOf("Quantumult%20X") !== -1) { - return "QX"; - } else if (UA.indexOf("Surge") !== -1) { - return "Surge"; - } else if (UA.indexOf("Decar") !== -1 || UA.indexOf("Loon") !== -1) { - return "Loon"; - } else if (UA.indexOf("Stash") !== -1 || UA.indexOf("Shadowrocket") !== -1) { - return "Clash"; - } else { - return null; - } - } - - async function produceArtifact( - {type, item, platform, noProcessor} = { - platform: "JSON", - noProcessor: false, - } - ) { - if (type === "subscription") { - const sub = item; - const raw = await $downloader.download(sub.url, sub.ua); - // parse proxies - let proxies = ProxyUtils.parse(raw); - if (!noProcessor) { - // apply processors - proxies = await ProxyUtils.process(proxies, sub.process || [], platform); - } - // check duplicate - const count = {}; - proxies.forEach(p => { - if (count[p.name]) { - $.notify("🌍 『 𝑺𝒖𝒃-𝑺𝒕𝒐𝒓𝒆 』", "⚠️ 订阅包含重复节点!", "请仔细检测配置!", { - "media-url": "https://cdn3.iconfinder.com/data/icons/seo-outline-1/512/25_code_program_programming_develop_bug_search_developer-512.png" - }); - } - }); - // produce - return ProxyUtils.produce(proxies, platform); - } else if (type === "collection") { - const allSubs = $.read(SUBS_KEY); - const collection = item; - const subs = collection["subscriptions"]; - let proxies = []; - - let processed = 0; - - await Promise.all(subs.map(async name => { - const sub = allSubs[name]; - try { - $.info(`正在处理子订阅:${sub.name}...`); - const raw = await $downloader.download(sub.url, sub.ua); - // parse proxies - let currentProxies = ProxyUtils.parse(raw); - if (!noProcessor) { - // apply processors - currentProxies = await ProxyUtils.process( - currentProxies, - sub.process || [], - platform - ); - } - // merge - proxies = proxies.concat(currentProxies); - processed++; - $.info( - `✅ 子订阅:${sub.name}加载成功,进度--${100 * (processed / subs.length).toFixed(1)}% ` - ); - } catch (err) { - processed++; - $.error( - `❌ 处理组合订阅中的子订阅: ${sub.name}时出现错误:${err},该订阅已被跳过!进度--${100 * (processed / subs.length).toFixed(1)}%` - ); - } - })); - if (!noProcessor) { - // apply own processors - proxies = await ProxyUtils.process(proxies, collection.process || [], platform); - } - if (proxies.length === 0) { - throw new Error(`组合订阅中不含有效节点!`); - } - // check duplicate - const count = {}; - proxies.forEach(p => { - if (count[p.name]) { - $.notify("🌍 『 𝑺𝒖𝒃-𝑺𝒕𝒐𝒓𝒆 』", "⚠️ 订阅包含重复节点!", "请仔细检测配置!", { - "media-url": "https://cdn3.iconfinder.com/data/icons/seo-outline-1/512/25_code_program_programming_develop_bug_search_developer-512.png" - }); - } - }); - return ProxyUtils.produce(proxies, platform); - } else if (type === "rule") { - const rule = item; - let rules = []; - for (let i = 0; i < rule.urls.length; i++) { - const url = rule.urls[i]; - $.info( - `正在处理URL:${url},进度--${100 * ((i + 1) / rule.urls.length).toFixed(1) - }% ` - ); - try { - const {body} = await $downloader.download(url); - const currentRules = RuleUtils.parse(body); - rules = rules.concat(currentRules); - } catch (err) { - $.error( - `处理分流订阅中的URL: ${url}时出现错误:${err}! 该订阅已被跳过。` - ); - } - } - // remove duplicates - rules = await RuleUtils.process(rules, [ - {type: "Remove Duplicate Filter"}, - ]); - // produce output - return RuleUtils.produce(rules, platform); - } - } -} - -/****************************************** Proxy Utils **********************************************************/ -var ProxyUtils = (function () { - const PROXY_PREPROCESSORS = (function () { - function HTML() { - const name = "HTML"; - const test = (raw) => /^/.test(raw); - // simply discard HTML - const parse = (_) => ""; - return {name, test, parse}; - } - - function Base64Encoded() { - const name = "Base64 Pre-processor"; - - const keys = [ - "dm1lc3M", - "c3NyOi8v", - "dHJvamFu", - "c3M6Ly", - "c3NkOi8v", - "c2hhZG93", - "aHR0c", - ]; - - const test = function (raw) { - return keys.some((k) => raw.indexOf(k) !== -1); - }; - const parse = function (raw) { - raw = Base64.safeDecode(raw); - return raw; - }; - return {name, test, parse}; - } - - function Clash() { - const name = "Clash Pre-processor"; - const test = function (raw) { - return /proxies/.test(raw); - }; - const parse = function (raw) { - // Clash YAML format - const proxies = YAML.load(raw).proxies; - return proxies.map((p) => JSON.stringify(p)).join("\n"); - }; - return {name, test, parse}; - } - - function SSD() { - const name = "SSD Pre-processor"; - const test = function (raw) { - return raw.indexOf("ssd://") === 0; - }; - const parse = function (raw) { - // preprocessing for SSD subscription format - const output = []; - let ssdinfo = JSON.parse(Base64.safeDecode(raw.split("ssd://")[1])); - // options (traffic_used, traffic_total, expiry, url) - const traffic_used = ssdinfo.traffic_used; // GB - const traffic_total = ssdinfo.traffic_total; // GB, -1 means unlimited - const expiry = ssdinfo.expiry; // YYYY-MM-DD HH:mm:ss - // default setting - let name = ssdinfo.airport; // name of the airport - let port = ssdinfo.port; - let method = ssdinfo.encryption; - let password = ssdinfo.password; - // servers config - let servers = ssdinfo.servers; - for (let i = 0; i < servers.length; i++) { - let server = servers[i]; - method = server.encryption ? server.encryption : method; - password = server.password ? server.password : password; - let userinfo = Base64.safeEncode(method + ":" + password); - let hostname = server.server; - port = server.port ? server.port : port; - let tag = server.remarks ? server.remarks : i; - let plugin = server.plugin_options - ? "/?plugin=" + - encodeURIComponent(server.plugin + ";" + server.plugin_options) - : ""; - output[i] = - "ss://" + - userinfo + - "@" + - hostname + - ":" + - port + - plugin + - "#" + - tag; - } - return output.join("\n"); - }; - return {name, test, parse}; - } - - return [HTML(), Base64Encoded(), Clash(), SSD()]; - })(); - const PROXY_PARSERS = (function () { - // Parse SS URI format (only supports new SIP002, legacy format is depreciated). - // reference: https://shadowsocks.org/en/spec/SIP002-URI-Scheme.html - function URI_SS() { - const name = "URI SS Parser"; - const test = (line) => { - return /^ss:\/\//.test(line); - }; - const parse = (line) => { - const supported = {}; - // parse url - let content = line.split("ss://")[1]; - - const proxy = { - name: decodeURIComponent(line.split("#")[1]), - type: "ss", - supported, - }; - content = content.split("#")[0]; // strip proxy name - // handle IPV4 and IPV6 - const serverAndPort = content.match(/@([^\/]*)(\/|$)/)[1]; - const portIdx = serverAndPort.lastIndexOf(":"); - proxy.server = serverAndPort.substring(0, portIdx); - proxy.port = serverAndPort.substring(portIdx + 1); - - const userInfo = Base64.safeDecode(content.split("@")[0]).split(":"); - proxy.cipher = userInfo[0]; - proxy.password = userInfo[1]; - - // handle obfs - const idx = content.indexOf("?plugin="); - if (idx !== -1) { - const pluginInfo = ( - "plugin=" + - decodeURIComponent(content.split("?plugin=")[1].split("&")[0]) - ).split(";"); - const params = {}; - for (const item of pluginInfo) { - const [key, val] = item.split("="); - if (key) params[key] = val || true; // some options like "tls" will not have value - } - switch (params.plugin) { - case "obfs-local": - case "simple-obfs": - proxy.plugin = "obfs"; - proxy["plugin-opts"] = { - mode: params.obfs, - host: params["obfs-host"], - }; - break; - case "v2ray-plugin": - proxy.supported = { - ...supported, - Loon: false, - Surge: false, - }; - proxy.obfs = "v2ray-plugin"; - proxy["plugin-opts"] = { - mode: "websocket", - host: params["obfs-host"], - path: params.path || "", - tls: params.tls || false, - }; - break; - default: - throw new Error(`Unsupported plugin option: ${params.plugin}`); - } - } - return proxy; - }; - return {name, test, parse}; - } - - // Parse URI SSR format, such as ssr://xxx - function URI_SSR() { - const name = "URI SSR Parser"; - const test = (line) => { - return /^ssr:\/\//.test(line); - }; - const supported = { - Surge: false, - }; - - const parse = (line) => { - line = Base64.safeDecode(line.split("ssr://")[1]); - - // handle IPV6 & IPV4 format - let splitIdx = line.indexOf(":origin"); - if (splitIdx === -1) { - splitIdx = line.indexOf(":auth_"); - } - const serverAndPort = line.substring(0, splitIdx); - const server = serverAndPort.substring( - 0, - serverAndPort.lastIndexOf(":") - ); - const port = serverAndPort.substring( - serverAndPort.lastIndexOf(":") + 1 - ); - - let params = line - .substring(splitIdx + 1) - .split("/?")[0] - .split(":"); - let proxy = { - type: "ssr", - server, - port, - protocol: params[0], - cipher: params[1], - obfs: params[2], - password: Base64.safeDecode(params[3]), - supported, - }; - // get other params - const other_params = {}; - line = line.split("/?")[1].split("&"); - if (line.length > 1) { - for (const item of line) { - const [key, val] = item.split("="); - other_params[key] = val.trim(); - } - } - proxy = { - ...proxy, - name: other_params.remarks - ? Base64.safeDecode(other_params.remarks) - : proxy.server, - "protocol-param": Base64.safeDecode( - other_params.protoparam || "" - ).replace(/\s/g, ""), - "obfs-param": Base64.safeDecode(other_params.obfsparam || "").replace( - /\s/g, - "" - ), - }; - return proxy; - }; - - return {name, test, parse}; - } - - // V2rayN URI VMess format - // reference: https://github.com/2dust/v2rayN/wiki/%E5%88%86%E4%BA%AB%E9%93%BE%E6%8E%A5%E6%A0%BC%E5%BC%8F%E8%AF%B4%E6%98%8E(ver-2) - - // Quantumult VMess format - function URI_VMess() { - const name = "URI VMess Parser"; - const test = (line) => { - return /^vmess:\/\//.test(line); - }; - const parse = (line) => { - const supported = {}; - line = line.split("vmess://")[1]; - const content = Base64.safeDecode(line); - if (/=\s*vmess/.test(content)) { - // Quantumult VMess URI format - const partitions = content.split(",").map((p) => p.trim()); - // get keyword params - const params = {}; - for (const part of partitions) { - if (part.indexOf("=") !== -1) { - const [key, val] = part.split("="); - params[key.trim()] = val.trim(); - } - } - - const proxy = { - name: partitions[0].split("=")[0].trim(), - type: "vmess", - server: partitions[1], - port: partitions[2], - cipher: partitions[3], - uuid: partitions[4].match(/^"(.*)"$/)[1], - tls: params.obfs === "over-tls" || params.obfs === "wss", - }; - - if (typeof params["udp-relay"] !== "undefined") - proxy.udp = JSON.parse(params["udp-relay"]); - if (typeof params["fast-open"] !== "undefined") - proxy.udp = JSON.parse(params["fast-open"]); - - // handle ws headers - if (params.obfs === "ws" || params.obfs === "wss") { - proxy.network = "ws"; - proxy["ws-opts"].path = (params["obfs-path"] || '"/"').match( - /^"(.*)"$/ - )[1]; - let obfs_host = params["obfs-header"]; - if (obfs_host && obfs_host.indexOf("Host") !== -1) { - obfs_host = obfs_host.match(/Host:\s*([a-zA-Z0-9-.]*)/)[1]; - } - proxy["ws-opts"].headers = { - Host: obfs_host || proxy.server, // if no host provided, use the same as server - }; - } - - // handle scert - if (proxy.tls && params['"tls-verification"'] === "false") { - proxy["skip-cert-verify"] = true; - } - - // handle sni - if (proxy.tls && params["obfs-host"]) { - proxy.sni = params["obfs-host"]; - } - - return proxy; - } else { - // V2rayN URI format - const params = JSON.parse(content); - const proxy = { - name: params.ps, - type: "vmess", - server: params.add, - port: params.port, - cipher: "auto", // V2rayN has no default cipher! use aes-128-gcm as default. - uuid: params.id, - alterId: params.aid || 0, - tls: params.tls === "tls" || params.tls === true, - supported, - }; - // handle obfs - if (params.net === "ws") { - proxy.network = "ws"; - proxy["ws-opts"] = { - path: params.path, - headers: {Host: params.host || params.add} - } - if (proxy.tls && params.host) { - proxy.sni = params.host; - } - } - // handle scert - if (params.verify_cert === false) { - proxy["skip-cert-verify"] = true; - } - return proxy; - } - }; - return {name, test, parse}; - } - - // Trojan URI format - function URI_Trojan() { - const name = "URI Trojan Parser"; - const test = (line) => { - return /^trojan:\/\//.test(line); - }; - - const parse = (line) => { - const supported = {}; - line = line.split("trojan://")[1]; - const [server, port] = line.split("@")[1].split("?")[0].split(":"); - const name = decodeURIComponent(line.split("#")[1].trim()); - let paramArr = line.split("?") - let sni = null; - if (paramArr.length > 1) { - paramArr = paramArr[1].split("#")[0].split("&") - const params = new Map(paramArr.map((item) => { - return item.split("=") - })) - sni = params.get("sni") - } - - return { - name: name || `[Trojan] ${server}`, // trojan uri may have no server tag! - type: "trojan", - server, - port, - password: line.split("@")[0], - sni, - supported, - }; - }; - return {name, test, parse}; - } - - function Clash_All() { - const name = "Clash Parser"; - const test = (line) => { - try { - JSON.parse(line); - } catch (e) { - return false; - } - return true; - }; - const parse = (line) => JSON.parse(line); - return {name, test, parse}; - } - - function QX_SS() { - const name = "QX SS Parser"; - const test = (line) => { - return ( - /^shadowsocks\s*=/.test(line.split(",")[0].trim()) && - line.indexOf("ssr-protocol") === -1 - ); - }; - const parse = (line) => { - const supported = {}; - const params = getQXParams(line); - const proxy = { - name: params.tag, - type: "ss", - server: params.server, - port: params.port, - cipher: params.method, - password: params.password, - udp: JSON.parse(params["udp-relay"] || "false"), - tfo: JSON.parse(params["fast-open"] || "false"), - supported, - }; - // handle obfs options - if (params.obfs) { - proxy["plugin-opts"] = { - host: params["obfs-host"] || proxy.server, - }; - switch (params.obfs) { - case "http": - case "tls": - proxy.plugin = "obfs"; - proxy["plugin-opts"].mode = params.obfs; - break; - case "ws": - case "wss": - proxy["plugin-opts"] = { - ...proxy["plugin-opts"], - mode: "websocket", - path: params["obfs-uri"] || "/", - tls: params.obfs === "wss", - }; - if ( - proxy["plugin-opts"].tls && - typeof params["tls-verification"] !== "undefined" - ) { - proxy["plugin-opts"]["skip-cert-verify"] = - params["tls-verification"]; - } - proxy.plugin = "v2ray-plugin"; - // Surge and Loon lack support for v2ray-plugin obfs - proxy.supported.Surge = false; - proxy.supported.Loon = false; - break; - } - } - return proxy; - }; - return {name, test, parse}; - } - - function QX_SSR() { - const name = "QX SSR Parser"; - const test = (line) => { - return ( - /^shadowsocks\s*=/.test(line.split(",")[0].trim()) && - line.indexOf("ssr-protocol") !== -1 - ); - }; - - const parse = (line) => { - const supported = { - Surge: false, - }; - const params = getQXParams(line); - const proxy = { - name: params.tag, - type: "ssr", - server: params.server, - port: params.port, - cipher: params.method, - password: params.password, - protocol: params["ssr-protocol"], - obfs: "plain", // default obfs - "protocol-param": params["ssr-protocol-param"], - udp: JSON.parse(params["udp-relay"] || "false"), - tfo: JSON.parse(params["fast-open"] || "false"), - supported, - }; - // handle obfs options - if (params.obfs) { - proxy.obfs = params.obfs; - proxy["obfs-param"] = params["obfs-host"]; - } - return proxy; - }; - return {name, test, parse}; - } - - function QX_VMess() { - const name = "QX VMess Parser"; - const test = (line) => { - return /^vmess\s*=/.test(line.split(",")[0].trim()); - }; - const parse = (line) => { - const params = getQXParams(line); - const proxy = { - type: "vmess", - name: params.tag, - server: params.server, - port: params.port, - cipher: params.method || "none", - uuid: params.password, - alterId: 0, - tls: params.obfs === "over-tls" || params.obfs === "wss", - udp: JSON.parse(params["udp-relay"] || "false"), - tfo: JSON.parse(params["fast-open"] || "false"), - }; - if (proxy.tls) { - proxy.sni = params["obfs-host"] || params.server; - proxy["skip-cert-verify"] = !JSON.parse( - params["tls-verification"] || "true" - ); - } - // handle ws headers - if (params.obfs === "ws" || params.obfs === "wss") { - proxy.network = "ws"; - proxy["ws-opts"] = { - path: params["obfs-uri"], - headers: { - Host: params["obfs-host"] || params.server, // if no host provided, use the same as server - } - }; - } - return proxy; - }; - - return {name, test, parse}; - } - - function QX_Trojan() { - const name = "QX Trojan Parser"; - const test = (line) => { - return /^trojan\s*=/.test(line.split(",")[0].trim()); - }; - const parse = (line) => { - const params = getQXParams(line); - const proxy = { - type: "trojan", - name: params.tag, - server: params.server, - port: params.port, - password: params.password, - sni: params["tls-host"] || params.server, - udp: JSON.parse(params["udp-relay"] || "false"), - tfo: JSON.parse(params["fast-open"] || "false"), - }; - proxy["skip-cert-verify"] = !JSON.parse( - params["tls-verification"] || "true" - ); - return proxy; - }; - return {name, test, parse}; - } - - function QX_Http() { - const name = "QX HTTP Parser"; - const test = (line) => { - return /^http\s*=/.test(line.split(",")[0].trim()); - }; - const parse = (line) => { - const params = getQXParams(line); - const proxy = { - type: "http", - name: params.tag, - server: params.server, - port: params.port, - tls: JSON.parse(params["over-tls"] || "false"), - udp: JSON.parse(params["udp-relay"] || "false"), - tfo: JSON.parse(params["fast-open"] || "false"), - }; - if (params.username && params.username !== "none") - proxy.username = params.username; - if (params.password && params.password !== "none") - proxy.password = params.password; - if (proxy.tls) { - proxy.sni = params["tls-host"] || proxy.server; - proxy["skip-cert-verify"] = !JSON.parse( - params["tls-verification"] || "true" - ); - } - return proxy; - }; - - return {name, test, parse}; - } - - function getQXParams(line) { - const groups = line.split(","); - const params = {}; - const protocols = ["shadowsocks", "vmess", "http", "trojan"]; - groups.forEach((g) => { - let [key, value] = g.split("="); - key = key.trim(); - value = value.trim(); - if (protocols.indexOf(key) !== -1) { - params.type = key; - const conf = value.split(":"); - params.server = conf[0]; - params.port = conf[1]; - } else { - params[key.trim()] = value.trim(); - } - }); - return params; - } - - function Loon_SS() { - const name = "Loon SS Parser"; - const test = (line) => { - return ( - line.split(",")[0].split("=")[1].trim().toLowerCase() === - "shadowsocks" - ); - }; - const parse = (line) => { - const params = line.split("=")[1].split(","); - const proxy = { - name: line.split("=")[0].trim(), - type: "ss", - server: params[1], - port: params[2], - cipher: params[3], - password: params[4].replace(/"/g, ""), - }; - // handle obfs - if (params.length > 5) { - proxy.plugin = "obfs"; - proxy["plugin-opts"] = { - mode: params[5], - host: params[6], - }; - } - return proxy; - }; - return {name, test, parse}; - } - - function Loon_SSR() { - const name = "Loon SSR Parser"; - const test = (line) => { - return ( - line.split(",")[0].split("=")[1].trim().toLowerCase() === - "shadowsocksr" - ); - }; - const parse = (line) => { - const params = line.split("=")[1].split(","); - const supported = { - Surge: false, - }; - return { - name: line.split("=")[0].trim(), - type: "ssr", - server: params[1], - port: params[2], - cipher: params[3], - password: params[4].replace(/"/g, ""), - protocol: params[5], - "protocol-param": params[6].match(/{(.*)}/)[1], - supported, - obfs: params[7], - "obfs-param": params[8].match(/{(.*)}/)[1], - }; - }; - return {name, test, parse}; - } - - function Loon_VMess() { - const name = "Loon VMess Parser"; - const test = (line) => { - // distinguish between surge vmess - return ( - /^.*=\s*vmess/i.test(line.split(",")[0]) && - line.indexOf("username") === -1 - ); - }; - const parse = (line) => { - let params = line.split("=")[1].split(","); - const proxy = { - name: line.split("=")[0].trim(), - type: "vmess", - server: params[1], - port: params[2], - cipher: params[3] || "none", - uuid: params[4].replace(/"/g, ""), - alterId: 0, - }; - // get transport options - params = params.splice(5); - for (const item of params) { - const [key, val] = item.split(":"); - params[key] = val; - } - proxy.tls = JSON.parse(params["over-tls"] || "false"); - if (proxy.tls) { - proxy.sni = params["tls-name"] || proxy.server; - proxy["skip-cert-verify"] = JSON.parse( - params["skip-cert-verify"] || "false" - ); - } - switch (params.transport) { - case "tcp": - break; - case "ws": - proxy.network = params.transport; - proxy["ws-opts"] = { - path: params.path, - headers: { - Host: params.host, - } - }; - } - if (proxy.tls) { - proxy["skip-cert-verify"] = JSON.parse( - params["skip-cert-verify"] || "false" - ); - } - return proxy; - }; - return {name, test, parse}; - } - - function Loon_Trojan() { - const name = "Loon Trojan Parser"; - const test = (line) => { - return ( - /^.*=\s*trojan/i.test(line.split(",")[0]) && - line.indexOf("password") === -1 - ); - }; - - const parse = (line) => { - const params = line.split("=")[1].split(","); - const proxy = { - name: line.split("=")[0].trim(), - type: "trojan", - server: params[1], - port: params[2], - password: params[3].replace(/"/g, ""), - sni: params[1], // default sni is the server itself - "skip-cert-verify": JSON.parse(params["skip-cert-verify"] || "false"), - }; - // trojan sni - if (params.length > 4) { - const [key, val] = params[4].split(":"); - if (key === "tls-name") proxy.sni = val; - else throw new Error(`Unknown option ${key} for line: \n${line}`); - } - return proxy; - }; - - return {name, test, parse}; - } - - function Loon_Http() { - const name = "Loon HTTP Parser"; - const test = (line) => { - return ( - /^.*=\s*http/i.test(line.split(",")[0]) && - line.split(",").length === 5 && - line.indexOf("username") === -1 && - line.indexOf("password") === -1 - ); - }; - - const parse = (line) => { - const params = line.split("=")[1].split(","); - const proxy = { - name: line.split("=")[0].trim(), - type: "http", - server: params[1], - port: params[2], - tls: params[2] === "443", // port 443 is considered as https type - }; - if (params[3]) proxy.username = params[3]; - if (params[4]) proxy.password = params[4]; - - if (proxy.tls) { - proxy.sni = params["tls-name"] || proxy.server; - proxy["skip-cert-verify"] = JSON.parse( - params["skip-cert-verify"] || "false" - ); - } - - return proxy; - }; - return {name, test, parse}; - } - - function Surge_SS() { - const name = "Surge SS Parser"; - const test = (line) => { - return /^.*=\s*ss/.test(line.split(",")[0]); - }; - const parse = (line) => { - const params = getSurgeParams(line); - const proxy = { - name: params.name, - type: "ss", - server: params.server, - port: params.port, - cipher: params["encrypt-method"], - password: params.password, - tfo: JSON.parse(params.tfo || "false"), - udp: JSON.parse(params["udp-relay"] || "false"), - }; - // handle obfs - if (params.obfs) { - proxy.plugin = "obfs"; - proxy["plugin-opts"] = { - mode: params.obfs, - host: params["obfs-host"], - }; - } - return proxy; - }; - return {name, test, parse}; - } - - function Surge_VMess() { - const name = "Surge VMess Parser"; - const test = (line) => { - return ( - /^.*=\s*vmess/.test(line.split(",")[0]) && - line.indexOf("username") !== -1 - ); - }; - const parse = (line) => { - const params = getSurgeParams(line); - const proxy = { - name: params.name, - type: "vmess", - server: params.server, - port: params.port, - uuid: params.username, - alterId: 0, // surge does not have this field - cipher: "none", // surge does not have this field - tls: JSON.parse(params.tls || "false"), - tfo: JSON.parse(params.tfo || "false"), - }; - if (proxy.tls) { - if (typeof params["skip-cert-verify"] !== "undefined") { - proxy["skip-cert-verify"] = - params["skip-cert-verify"] === true || - params["skip-cert-verify"] === "1"; - } - proxy.sni = params["sni"] || params.server; - } - // use websocket - if (JSON.parse(params.ws || "false")) { - proxy.network = "ws"; - proxy["ws-opts"] = { - path: params["ws-path"] - }; - - const res = params["ws-headers"].match(/(,|^|\s)*HOST:\s*(.*?)(,|$)/); - const host = res ? res[2] : proxy.server; - proxy["ws-opts"].headers = { - Host: host || params.server, - }; - } - return proxy; - }; - return {name, test, parse}; - } - - function Surge_Trojan() { - const name = "Surge Trojan Parser"; - const test = (line) => { - return ( - /^.*=\s*trojan/.test(line.split(",")[0]) && line.indexOf("sni") !== -1 - ); - }; - const parse = (line) => { - const params = getSurgeParams(line); - const proxy = { - name: params.name, - type: "trojan", - server: params.server, - port: params.port, - password: params.password, - sni: params.sni || params.server, - tfo: JSON.parse(params.tfo || "false"), - }; - if (typeof params["skip-cert-verify"] !== "undefined") { - proxy["skip-cert-verify"] = - params["skip-cert-verify"] === true || - params["skip-cert-verify"] === "1"; - } - return proxy; - }; - - return {name, test, parse}; - } - - function Surge_Http() { - const name = "Surge HTTP Parser"; - const test = (line) => { - return ( - /^.*=\s*http/.test(line.split(",")[0]) && !Loon_Http().test(line) - ); - }; - const parse = (line) => { - const params = getSurgeParams(line); - const proxy = { - name: params.name, - type: "http", - server: params.server, - port: params.port, - tls: JSON.parse(params.tls || "false"), - tfo: JSON.parse(params.tfo || "false"), - }; - if (proxy.tls) { - if (typeof params["skip-cert-verify"] !== "undefined") { - proxy["skip-cert-verify"] = - params["skip-cert-verify"] === true || - params["skip-cert-verify"] === "1"; - } - proxy.sni = params.sni || params.server; - } - if (params.username && params.username !== "none") - proxy.username = params.username; - if (params.password && params.password !== "none") - proxy.password = params.password; - return proxy; - }; - return {name, test, parse}; - } - - function getSurgeParams(line) { - const params = {}; - params.name = line.split("=")[0].trim(); - const segments = line.split(","); - params.server = segments[1].trim(); - params.port = segments[2].trim(); - for (let i = 3; i < segments.length; i++) { - const item = segments[i]; - if (item.indexOf("=") !== -1) { - const [key, value] = item.split("="); - params[key.trim()] = value.trim(); - } - } - return params; - } - - return [ - URI_SS(), - URI_SSR(), - URI_VMess(), - URI_Trojan(), - Clash_All(), - Surge_SS(), - Surge_VMess(), - Surge_Trojan(), - Surge_Http(), - Loon_SS(), - Loon_SSR(), - Loon_VMess(), - Loon_Trojan(), - Loon_Http(), - QX_SS(), - QX_SSR(), - QX_VMess(), - QX_Trojan(), - QX_Http(), - ]; - })(); - const PROXY_PROCESSORS = (function () { - // force to set some properties (e.g., skip-cert-verify, udp, tfo, etc.) - function SetPropertyOperator({key, value}) { - return { - name: "Set Property Operator", - func: (proxies) => { - return proxies.map((p) => { - p[key] = value; - return p; - }); - }, - }; - } - - // add or remove flag for proxies - function FlagOperator(add = true) { - return { - name: "Flag Operator", - func: (proxies) => { - return proxies.map((proxy) => { - if (!add) { - // no flag - proxy.name = removeFlag(proxy.name); - } else { - // get flag - const newFlag = getFlag(proxy.name); - // remove old flag - proxy.name = removeFlag(proxy.name); - proxy.name = newFlag + " " + proxy.name; - proxy.name = proxy.name.replace(/🇹🇼/g, "🇨🇳"); - } - return proxy; - }); - }, - }; - } - - // duplicate handler - function HandleDuplicateOperator(arg) { - const {action, template, link, position} = { - ...{ - action: "rename", - template: "0 1 2 3 4 5 6 7 8 9", - link: "-", - position: "back", - }, - ...arg, - }; - return { - name: "Handle Duplicate Operator", - func: (proxies) => { - if (action === "delete") { - const chosen = {}; - return proxies.filter((p) => { - if (chosen[p.name]) { - return false; - } - chosen[p.name] = true; - return true; - }); - } else if (action === "rename") { - const numbers = template.split(" "); - // count occurrences of each name - const counter = {}; - let maxLen = 0; - proxies.forEach((p) => { - if (typeof counter[p.name] === "undefined") counter[p.name] = 1; - else counter[p.name]++; - maxLen = Math.max(counter[p.name].toString().length, maxLen); - }); - const increment = {}; - return proxies.map((p) => { - if (counter[p.name] > 1) { - if (typeof increment[p.name] == "undefined") - increment[p.name] = 1; - let num = ""; - let cnt = increment[p.name]++; - let numDigits = 0; - while (cnt > 0) { - num = numbers[cnt % 10] + num; - cnt = parseInt(cnt / 10); - numDigits++; - } - // padding - while (numDigits++ < maxLen) { - num = numbers[0] + num; - } - if (position === "front") { - p.name = num + link + p.name; - } else if (position === "back") { - p.name = p.name + link + num; - } - } - return p; - }); - } - }, - }; - } - - // sort proxies according to their names - function SortOperator(order = "asc") { - return { - name: "Sort Operator", - func: (proxies) => { - switch (order) { - case "asc": - case "desc": - return proxies.sort((a, b) => { - let res = a.name > b.name ? 1 : -1; - res *= order === "desc" ? -1 : 1; - return res; - }); - case "random": - return shuffle(proxies); - default: - throw new Error("Unknown sort option: " + order); - } - }, - }; - } - - // sort by regex - function RegexSortOperator(expressions) { - return { - name: "Regex Sort Operator", - func: (proxies) => { - expressions = expressions.map((expr) => buildRegex(expr)); - return proxies.sort((a, b) => { - const oA = getRegexOrder(expressions, a.name); - const oB = getRegexOrder(expressions, b.name); - if (oA && !oB) return -1; - if (oB && !oA) return 1; - if (oA && oB) return oA < oB ? -1 : 1; - if ((!oA && !oB) || (oA && oB && oA === oB)) - return a.name < b.name ? -1 : 1; // fallback to normal sort - }); - }, - }; - } - - function getRegexOrder(expressions, str) { - let order = null; - for (let i = 0; i < expressions.length; i++) { - if (expressions[i].test(str)) { - order = i + 1; // plus 1 is important! 0 will be treated as false!!! - break; - } - } - return order; - } - - // rename by regex - // keywords: [{expr: "string format regex", now: "now"}] - function RegexRenameOperator(regex) { - return { - name: "Regex Rename Operator", - func: (proxies) => { - return proxies.map((proxy) => { - for (const {expr, now} of regex) { - proxy.name = proxy.name - .replace(buildRegex(expr, "g"), now) - .trim(); - } - return proxy; - }); - }, - }; - } - - // delete regex operator - // regex: ['a', 'b', 'c'] - function RegexDeleteOperator(regex) { - const regex_ = regex.map((r) => { - return { - expr: r, - now: "", - }; - }); - return { - name: "Regex Delete Operator", - func: RegexRenameOperator(regex_).func, - }; - } - - // use base64 encoded script to rename - /** Example script - function operator(proxies) { - // do something - return proxies; - } - - WARNING: - 1. This function name should be `operator`! - 2. Always declare variables before using them! - */ - function ScriptOperator(script, targetPlatform, $arguments) { - return { - name: "Script Operator", - func: (proxies) => { - let output = proxies; - (function () { - // interface to get internal operators - const $get = (name, args) => { - const item = PROXY_PROCESSORS[name]; - return item(args); - }; - const $process = ApplyProcessor; - eval(script); - output = operator(proxies, targetPlatform); - })(); - return output; - }, - }; - } - - /**************************** Filters ***************************************/ - // filter useless proxies - function UselessFilter() { - const KEYWORDS = [ - "网址", - "流量", - "时间", - "应急", - "过期", - "Bandwidth", - "expire", - ]; - return { - name: "Useless Filter", - func: RegexFilter({ - regex: KEYWORDS, - keep: false, - }).func, - }; - } - - // filter by regions - function RegionFilter(regions) { - const REGION_MAP = { - HK: "🇭🇰", - TW: "🇹🇼", - US: "🇺🇸", - SG: "🇸🇬", - JP: "🇯🇵", - UK: "🇬🇧", - }; - return { - name: "Region Filter", - func: (proxies) => { - // this would be high memory usage - return proxies.map((proxy) => { - const flag = getFlag(proxy.name); - return regions.some((r) => REGION_MAP[r] === flag); - }); - }, - }; - } - - // filter by regex - function RegexFilter({regex = [], keep = true}) { - return { - name: "Regex Filter", - func: (proxies) => { - return proxies.map((proxy) => { - const selected = regex.some((r) => { - return buildRegex(r).test(proxy.name); - }); - return keep ? selected : !selected; - }); - }, - }; - } - - // filter by proxy types - function TypeFilter(types) { - return { - name: "Type Filter", - func: (proxies) => { - return proxies.map((proxy) => types.some((t) => proxy.type === t)); - }, - }; - } - - // use base64 encoded script to filter proxies - /** - Script Example - function func(proxies) { - const selected = FULL(proxies.length, true); - // do something - return selected; - } - WARNING: - 1. This function name should be `func`! - 2. Always declare variables before using them! - */ - function ScriptFilter(script, targetPlatform, $arguments) { - return { - name: "Script Filter", - func: (proxies) => { - let output = FULL(proxies.length, true); - !(function () { - eval(script); - output = filter(proxies, targetPlatform); - })(); - return output; - }, - }; - } - - /******************************** Utility Functions *********************************************/ - // get proxy flag according to its name - function getFlag(name) { - // flags from @KOP-XIAO: https://github.com/KOP-XIAO/QuantumultX/blob/master/Scripts/resource-parser.js - const flags = { - "🇦🇿": ["阿塞拜疆"], - "🇦🇹": ["奥地利", "奧地利", "Austria", "维也纳"], - "🇦🇺": ["AU", "Australia", "Sydney", "澳大利亚", "澳洲", "墨尔本", "悉尼", "土澳", "京澳", "廣澳", "滬澳", "沪澳", "广澳"], - "🇧🇪": ["BE", "比利時", "比利时"], - "🇧🇬": ["保加利亚", "保加利亞", "Bulgaria"], - "🇧🇭": ["BH", "巴林"], - "🇧🇩": ["BD", "孟加拉"], - "🇵🇰": ["巴基斯坦"], - "🇰🇭": ["柬埔寨"], - "🇺🇦": ["烏克蘭", "乌克兰"], - "🇭🇷": ["克罗地亚", "HR", "克羅地亞"], - "🇨🇦": ["Canada", "CANADA", "CAN", "Waterloo", "加拿大", "蒙特利尔", "温哥华", "楓葉", "枫叶", "滑铁卢", "多伦多", "CA"], - "🇨🇭": ["瑞士", "苏黎世", "Switzerland", "Zurich"], - "🇳🇬": ["尼日利亚", "NG", "尼日利亞"], - "🇨🇿": ["Czechia", "捷克"], - "🇸🇰": ["斯洛伐克", "SK"], - "🇷🇸": ["RS", "塞尔维亚"], - "🇲🇩": ["摩爾多瓦", "MD", "摩尔多瓦"], - "🇩🇪": ["DE", "German", "GERMAN", "德国", "德國", "法兰克福", "京德", "滬德", "廣德", "沪德", "广德", "Frankfurt"], - "🇩🇰": ["DK", "DNK", "丹麦", "丹麥"], - "🇪🇸": ["ES", "西班牙", "Spain"], - "🇪🇺": ["EU", "欧盟", "欧罗巴"], - "🇫🇮": ["Finland", "芬兰", "芬蘭", "赫尔辛基"], - "🇫🇷": ["FR", "France", "法国", "法國", "巴黎"], - "🇬🇧": ["UK", "GB", "England", "United Kingdom", "英国", "伦敦", "英", "London"], - "🇲🇴": ["MO", "Macao", "澳门", "澳門", "CTM"], - "🇰🇿": ["哈萨克斯坦", "哈萨克"], - "🇭🇺": ["匈牙利", "Hungary"], - "🇭🇰": ["HK", "Hongkong", "Hong Kong", "HongKong", "HONG KONG", "香港", "深港", "沪港", "呼港", "HKT", "HKBN", "HGC", "WTT", "CMI", "穗港", "京港", "港"], - "🇮🇩": ["Indonesia", "印尼", "印度尼西亚", "雅加达"], - "🇮🇪": ["Ireland", "IRELAND", "爱尔兰", "愛爾蘭", "都柏林"], - "🇮🇱": ["Israel", "以色列"], - "🇮🇳": ["India", "IND", "INDIA", "印度", "孟买", "MFumbai"], - "🇮🇸": ["IS", "ISL", "冰岛", "冰島"], - "🇰🇵": ["KP", "朝鲜"], - "🇰🇷": ["KR", "Korea", "KOR", "韩国", "首尔", "韩", "韓", "春川", "Chuncheon", "Seoul"], - "🇱🇺": ["卢森堡"], - "🇱🇻": ["Latvia", "Latvija", "拉脱维亚"], - "🇲🇽": ["MEX", "MX", "墨西哥"], - "🇲🇾": ["MY", "Malaysia", "MALAYSIA", "马来西亚", "大馬", "馬來西亞", "吉隆坡"], - "🇳🇱": ["NL", "Netherlands", "荷兰", "荷蘭", "尼德蘭", "阿姆斯特丹"], - "🇳🇵": ["尼泊尔"], - "🇵🇭": ["PH", "Philippines", "菲律宾", "菲律賓"], - "🇵🇷": ["PR", "波多黎各"], - "🇷🇴": ["RO", "罗马尼亚"], - "🇷🇺": ["RU", "Russia", "俄罗斯", "俄国", "俄羅斯", "伯力", "莫斯科", "圣彼得堡", "西伯利亚", "新西伯利亚", "京俄", "杭俄", "廣俄", "滬俄", "广俄", "沪俄", "Moscow"], - "🇸🇦": ["沙特"], - "🇸🇪": ["SE", "Sweden", "瑞典"], - "🇲🇹": ["马耳他"], - "🇲🇦": ["MA", "摩洛哥"], - "🇸🇬": ["SG", "Singapore", "SINGAPORE", "新加坡", "狮城", "沪新", "京新", "泉新", "穗新", "深新", "杭新", "广新", "廣新", "滬新"], - "🇹🇭": ["TH", "Thailand", "泰国", "泰國", "曼谷"], - "🇹🇷": ["TR", "Turkey", "土耳其", "伊斯坦布尔"], - "🇹🇼": ["TW", "Taiwan", "TAIWAN", "台湾", "台北", "台中", "新北", "彰化", "CHT", "台", "HINET", "Taipei"], - "🇺🇸": ["US", "USA", "America", "United States", "美国", "美", "京美", "波特兰", "达拉斯", "俄勒冈", "凤凰城", "费利蒙", "硅谷", "矽谷", "拉斯维加斯", "洛杉矶", "圣何塞", "圣克拉拉", "西雅图", "芝加哥", "沪美", "哥伦布", "纽约", "Los Angeles", "San Jose", "Sillicon Valley", "Michigan"], - "🇻🇳": ["VN", "越南", "胡志明市"], - "🇻🇪": ["VE", "委内瑞拉"], - "🇮🇹": ["Italy", "IT", "Nachash", "意大利", "米兰", "義大利"], - "🇿🇦": ["South Africa", "南非"], - "🇦🇪": ["United Arab Emirates", "阿联酋", "迪拜", "AE"], - "🇧🇷": ["BR", "Brazil", "巴西", "圣保罗"], - "🇯🇵": ["JP", "Japan", "JAPAN", "日本", "东京", "大阪", "埼玉", "沪日", "穗日", "川日", "中日", "泉日", "杭日", "深日", "辽日", "广日", "大坂", "Osaka", "Tokyo"], - "🇦🇷": ["AR", "阿根廷"], - "🇳🇴": ["Norway", "挪威", "NO"], - "🇨🇳": ["CN", "China", "回国", "中国", "中國", "江苏", "北京", "上海", "广州", "深圳", "杭州", "徐州", "青岛", "宁波", "镇江", "back"], - "🇵🇱": ["PL", "POL", "波兰", "波蘭"], - "🇨🇱": ["智利"], - "🇳🇿": ["新西蘭", "新西兰"], - "🇬🇷": ["希腊", "希臘"], - "🇪🇬": ["埃及"], - "🇨🇾": ["CY", "塞浦路斯"], - "🇨🇷": ["CR", "哥斯达黎加"], - "🇸🇮": ["SI", "斯洛文尼亚"], - "🇱🇹": ["LT", "立陶宛"], - "🇵🇦": ["PA", "巴拿马"], - "🇹🇳": ["TN", "突尼斯"], - "🇮🇲": ["马恩岛", "馬恩島"], - "🇧🇾": ["BY", "白俄", "白俄罗斯"], - "🇵🇹": ["葡萄牙"], - "🇰🇪": ["KE", "肯尼亚"], - "🇰🇬": ["KG", "吉尔吉斯坦"], - "🇯🇴": ["JO", "约旦"], - "🇺🇾": ["UY", "乌拉圭"], - "🇲🇳": ["蒙古"], - "🇮🇷": ["IR", "伊朗"], - "🇵🇪": ["秘鲁", "祕魯"], - "🇨🇴": ["哥伦比亚"], - "🇪🇪": ["爱沙尼亚"], - "🇪🇨": ["EC", "厄瓜多尔"], - "🇲🇰": ["马其顿", "馬其頓"], - "🇧🇦": ["波黑共和国", "波黑"], - "🇬🇪": ["格魯吉亞", "格鲁吉亚"], - "🇦🇱": ["阿爾巴尼亞", "阿尔巴尼亚"], - "🏳️‍🌈": ["流量", "时间", "应急", "过期", "Bandwidth", "expire"], - }; - for (let k of Object.keys(flags)) { - if (flags[k].some((item) => name.indexOf(item) !== -1)) { - return k; - } - } - // no flag found - const oldFlag = (name.match( - /[\uD83C][\uDDE6-\uDDFF][\uD83C][\uDDE6-\uDDFF]/ - ) || [])[0]; - return oldFlag || "🏴‍☠️"; - } - - // remove flag - function removeFlag(str) { - return str - .replace(/[\uD83C][\uDDE6-\uDDFF][\uD83C][\uDDE6-\uDDFF]/g, "") - .trim(); - } - - // shuffle array - function shuffle(array) { - let currentIndex = array.length, - temporaryValue, - randomIndex; - - // While there remain elements to shuffle... - while (0 !== currentIndex) { - // Pick a remaining element... - randomIndex = Math.floor(Math.random() * currentIndex); - currentIndex -= 1; - - // And swap it with the current element. - temporaryValue = array[currentIndex]; - array[currentIndex] = array[randomIndex]; - array[randomIndex] = temporaryValue; - } - - return array; - } - - return { - "Useless Filter": UselessFilter, - "Region Filter": RegionFilter, - "Regex Filter": RegexFilter, - "Type Filter": TypeFilter, - "Script Filter": ScriptFilter, - - "Set Property Operator": SetPropertyOperator, - "Flag Operator": FlagOperator, - "Sort Operator": SortOperator, - "Regex Sort Operator": RegexSortOperator, - "Regex Rename Operator": RegexRenameOperator, - "Regex Delete Operator": RegexDeleteOperator, - "Script Operator": ScriptOperator, - "Handle Duplicate Operator": HandleDuplicateOperator, - }; - })(); - const PROXY_PRODUCERS = (function () { - function QX_Producer() { - const targetPlatform = "QX"; - const produce = (proxy) => { - let obfs_opts; - let tls_opts; - switch (proxy.type) { - case "ss": - obfs_opts = ""; - if (proxy.plugin === "obfs") { - const {host, mode} = proxy["plugin-opts"]; - obfs_opts = `,obfs=${mode}${host ? ",obfs-host=" + host : ""}`; - } - if (proxy.plugin === "v2ray-plugin") { - const {tls, host, path} = proxy["plugin-opts"]; - obfs_opts = `,obfs=${tls ? "wss" : "ws"}${host ? ",obfs-host=" + host : "" - }${path ? ",obfs-uri=" + path : ""}`; - } - return `shadowsocks=${proxy.server}:${proxy.port},method=${proxy.cipher - },password=${proxy.password}${obfs_opts}${proxy.tfo ? ",fast-open=true" : ",fast-open=false" - }${proxy.udp ? ",udp-relay=true" : ",udp-relay=false"},tag=${proxy.name - }`; - case "ssr": - return `shadowsocks=${proxy.server}:${proxy.port},method=${proxy.cipher - },password=${proxy.password},ssr-protocol=${proxy.protocol}${proxy["protocol-param"] - ? ",ssr-protocol-param=" + proxy["protocol-param"] - : "" - }${proxy.obfs ? ",obfs=" + proxy.obfs : ""}${proxy["obfs-param"] ? ",obfs-host=" + proxy["obfs-param"] : "" - },fast-open=${proxy.tfo || false}${proxy.udp ? ",udp-relay=true" : ",udp-relay=false" - },tag=${proxy.name}`; - case "vmess": - obfs_opts = ""; - if (proxy.network === "ws") { - // websocket - if (proxy.tls) { - // ws-tls - obfs_opts = `,obfs=wss${proxy.sni ? ",obfs-host=" + proxy.sni : "" - }${proxy["ws-opts"].path ? ",obfs-uri=" + proxy["ws-opts"].path : "" - },tls-verification=${proxy["skip-cert-verify"] ? "false" : "true" - }`; - } else { - // ws - obfs_opts = `,obfs=ws${proxy["ws-opts"].headers.Host - ? ",obfs-host=" + proxy["ws-opts"].headers.Host - : "" - }${proxy["ws-opts"].path ? ",obfs-uri=" + proxy["ws-opts"].path : ""}`; - } - } else { - // tcp - if (proxy.tls) { - obfs_opts = `,obfs=over-tls${proxy.sni ? ",obfs-host=" + proxy.sni : "" - },tls-verification=${proxy["skip-cert-verify"] ? "false" : "true" - }`; - } - } - let result = `vmess=${proxy.server}:${proxy.port},method=${proxy.cipher === "auto" ? "none" : proxy.cipher - },password=${proxy.uuid}${obfs_opts},fast-open=${proxy.tfo || false}${proxy.udp ? ",udp-relay=true" : ",udp-relay=false"}`; - if (proxy.alterId === 0) proxy['vmess-aead'] = true; - if (typeof proxy['vmess-aead'] !== "undefined") { - result += `,aead=${proxy['vmess-aead']}`; - } - result += `,tag=${proxy.name}`; - return result; - case "trojan": - return `trojan=${proxy.server}:${proxy.port},password=${proxy.password - }${proxy.sni ? ",tls-host=" + proxy.sni : "" - },over-tls=true,tls-verification=${proxy["skip-cert-verify"] ? "false" : "true" - },fast-open=${proxy.tfo || false}${proxy.udp ? ",udp-relay=true" : ",udp-relay=false" - },tag=${proxy.name}`; - case "http": - tls_opts = ""; - if (proxy.tls) { - tls_opts = `,over-tls=true,tls-verification=${proxy["skip-cert-verify"] ? "false" : "true" - }${proxy.sni ? ",tls-host=" + proxy.sni : ""}`; - } - return `http=${proxy.server}:${proxy.port},username=${proxy.username - },password=${proxy.password}${tls_opts},fast-open=${proxy.tfo || false},tag=${proxy.name}`; - } - throw new Error( - `Platform ${targetPlatform} does not support proxy type: ${proxy.type}` - ); - }; - return {produce}; - } - - function Loon_Producer() { - const targetPlatform = "Loon"; - const produce = (proxy) => { - let obfs_opts = "", tls_opts = "", udp_opts = "", tfo_opts = ""; - if (typeof proxy.udp !== "undefined") { - udp_opts = proxy.udp ? ",udp=true" : ",udp=false"; - } - tfo_opts = `,fast-open=${proxy.tfo || false}`; - - switch (proxy.type) { - case "ss": - obfs_opts = ",,"; - if (proxy.plugin) { - if (proxy.plugin === "obfs") { - const {mode, host} = proxy["plugin-opts"]; - obfs_opts = `,${mode},${host || ""}`; - } else { - throw new Error( - `Platform ${targetPlatform} does not support obfs option: ${proxy.obfs}` - ); - } - } - return `${proxy.name}=shadowsocks,${proxy.server},${proxy.port},${proxy.cipher},"${proxy.password}"${obfs_opts}${udp_opts}${tfo_opts}`; - case "ssr": - return `${proxy.name}=shadowsocksr,${proxy.server},${proxy.port},${proxy.cipher - },"${proxy.password}",${proxy.protocol},{${proxy["protocol-param"] || "" - }},${proxy.obfs},{${proxy["obfs-param"] || "" - }}${udp_opts}${tfo_opts}`; - case "vmess": - obfs_opts = ""; - if (proxy.network === "ws") { - const host = proxy["ws-opts"].headers.Host || proxy.server; - obfs_opts = `,transport:ws,host:${host},path:${proxy["ws-opts"].path || "/" - }`; - } else { - obfs_opts = `,transport:tcp`; - } - if (proxy.tls) { - obfs_opts += `${proxy.sni ? ",tls-name:" + proxy.sni : "" - },skip-cert-verify:${proxy["skip-cert-verify"] || "false"}`; - } - let result = `${proxy.name}=vmess,${proxy.server},${proxy.port},${proxy.cipher === "auto" ? "none" : proxy.cipher - },"${proxy.uuid}",over-tls:${proxy.tls || "false"}${obfs_opts}`; - if (proxy.alterId === 0) proxy['vmess-aead'] = true; - if (typeof proxy['vmess-aead'] !== "undefined") { - result += `,vmess-aead=${proxy['vmess-aead']}`; - } - return result; - case "trojan": - return `${proxy.name}=trojan,${proxy.server},${proxy.port},"${proxy.password - }"${proxy.sni ? ",tls-name:" + proxy.sni : ""},skip-cert-verify:${proxy["skip-cert-verify"] || "false" - }${udp_opts}`; - case "http": - tls_opts = ""; - const base = `${proxy.name}=${proxy.tls ? "http" : "https"},${proxy.server - },${proxy.port},${proxy.username || ""},${proxy.password || ""}`; - if (proxy.tls) { - // https - tls_opts = `${proxy.sni ? ",tls-name:" + proxy.sni : "" - },skip-cert-verify:${proxy["skip-cert-verify"]}`; - return base + tls_opts; - } else return base; - } - throw new Error( - `Platform ${targetPlatform} does not support proxy type: ${proxy.type}` - ); - }; - return {produce}; - } - - function Surge_Producer() { - const targetPlatform = "Surge"; - const produce = (proxy) => { - let result = ""; - let obfs_opts, tls_opts; - switch (proxy.type) { - case "ss": - obfs_opts = ""; - if (proxy.plugin) { - const {host, mode} = proxy["plugin-opts"]; - if (proxy.plugin === "obfs") { - obfs_opts = `,obfs=${mode}${host ? ",obfs-host=" + host : ""}`; - } else { - throw new Error( - `Platform ${targetPlatform} does not support obfs option: ${proxy.obfs}` - ); - } - } - result = `${proxy.name}=ss,${proxy.server}, ${proxy.port - },encrypt-method=${proxy.cipher},password=${proxy.password - }${obfs_opts},tfo=${proxy.tfo || "false"},udp-relay=${proxy.udp || "false" - }`; - break; - case "vmess": - tls_opts = ""; - result = `${proxy.name}=vmess,${proxy.server},${proxy.port - },username=${proxy.uuid},tls=${proxy.tls || "false"},tfo=${proxy.tfo || "false"}`; - - if (proxy.alterId === 0) proxy['vmess-aead'] = true; - if (typeof proxy['vmess-aead'] !== "undefined") { - result += `,vmess-aead=${proxy['vmess-aead']}`; - } - if (proxy.network === "ws") { - const path = proxy["ws-opts"].path || "/"; - const wsHeaders = Object.entries(proxy["ws-opts"].headers).map( - ([key, value]) => (`${key}:"${value}"`)) - .join('|'); - result += `,ws=true${path ? ",ws-path=" + path : ""}${wsHeaders ? ",ws-headers=" + wsHeaders : ""}`; - } - if (proxy.tls) { - result += `${typeof proxy["skip-cert-verify"] !== "undefined" - ? ",skip-cert-verify=" + proxy["skip-cert-verify"] - : "" - }`; - result += proxy.sni ? `,sni=${proxy.sni}` : ""; - } - break; - case "trojan": - result = `${proxy.name}=trojan,${proxy.server},${proxy.port - },password=${proxy.password}${typeof proxy["skip-cert-verify"] !== "undefined" - ? ",skip-cert-verify=" + proxy["skip-cert-verify"] - : "" - }${proxy.sni ? ",sni=" + proxy.sni : ""},tfo=${proxy.tfo || "false" - },udp-relay=${proxy.udp || "false"}`; - break; - case "http": - tls_opts = ", tls=false"; - if (proxy.tls) { - tls_opts = `,tls=true,skip-cert-verify=${proxy["skip-cert-verify"]},sni=${proxy.sni}`; - } - result = `${proxy.name}=http, ${proxy.server}, ${proxy.port}${proxy.username ? ",username=" + proxy.username : "" - }${proxy.password ? ",password=" + proxy.password : "" - }${tls_opts},tfo=${proxy.tfo || "false"}`; - break; - default: - throw new Error( - `Platform ${targetPlatform} does not support proxy type: ${proxy.type}` - ); - } - - // handle surge hybrid param - result += proxy["surge-hybrid"] !== undefined ? `,hybrid=${proxy["surge-hybrid"]}` : ""; - return result; - }; - return {produce}; - } - - function Clash_Producer() { - const type = "ALL"; - const produce = (proxies) => { - return ( - "proxies:\n" + - proxies - .map((proxy) => { - delete proxy.supported; - return " - " + JSON.stringify(proxy) + "\n"; - }) - .join("") - ); - }; - return {type, produce}; - } - - function URI_Producer() { - const type = "SINGLE"; - const produce = (proxy) => { - let result = ""; - switch (proxy.type) { - case "ss": - const userinfo = `${proxy.cipher}:${proxy.password}`; - result = `ss://${Base64.safeEncode(userinfo)}@${proxy.server}:${proxy.port - }/`; - if (proxy.plugin) { - result += "?plugin="; - const opts = proxy["plugin-opts"]; - switch (proxy.plugin) { - case "obfs": - result += encodeURIComponent( - `simple-obfs;obfs=${opts.mode}${opts.host ? ";obfs-host=" + opts.host : "" - }` - ); - break; - case "v2ray-plugin": - result += encodeURIComponent( - `v2ray-plugin;obfs=${opts.mode}${opts.host ? ";obfs-host" + opts.host : "" - }${opts.tls ? ";tls" : ""}` - ); - break; - default: - throw new Error(`Unsupported plugin option: ${proxy.plugin}`); - } - } - result += `#${encodeURIComponent(proxy.name)}`; - break; - case "ssr": - result = `${proxy.server}:${proxy.port}:${proxy.protocol}:${proxy.cipher - }:${proxy.obfs}:${Base64.safeEncode(proxy.password)}/`; - result += `?remarks=${Base64.safeEncode(proxy.name)}${proxy["obfs-param"] - ? "&obfsparam=" + Base64.safeEncode(proxy["obfs-param"]) - : "" - }${proxy["protocol-param"] - ? "&protocolparam=" + Base64.safeEncode(proxy["protocol-param"]) - : "" - }`; - result = "ssr://" + Base64.safeEncode(result); - break; - case "vmess": - // V2RayN URI format - result = { - ps: proxy.name, - add: proxy.server, - port: proxy.port, - id: proxy.uuid, - type: "", - aid: 0, - net: proxy.network || "tcp", - tls: proxy.tls ? "tls" : "", - }; - // obfs - if (proxy.network === "ws") { - result.path = proxy["ws-opts"].path || "/"; - result.host = proxy["ws-opts"].headers.Host || proxy.server; - } - result = "vmess://" + Base64.safeEncode(JSON.stringify(result)); - break; - case "trojan": - result = `trojan://${proxy.password}@${proxy.server}:${proxy.port - }#${encodeURIComponent(proxy.name)}`; - break; - default: - throw new Error(`Cannot handle proxy type: ${proxy.type}`); - } - return result; - }; - return {type, produce}; - } - - function JSON_Producer() { - const type = "ALL"; - const produce = (proxies) => JSON.stringify(proxies, null, 2); - return {type, produce}; - } - - return { - QX: QX_Producer(), - Surge: Surge_Producer(), - Loon: Loon_Producer(), - Clash: Clash_Producer(), - URI: URI_Producer(), - JSON: JSON_Producer(), - }; - })(); - - function preprocess(raw) { - for (const processor of PROXY_PREPROCESSORS) { - try { - if (processor.test(raw)) { - $.info(`Pre-processor [${processor.name}] activated`); - return processor.parse(raw); - } - } catch (e) { - $.error(`Parser [${processor.name}] failed\n Reason: ${e}`); - } - } - return raw; - } - - function safeMatch(p, line) { - let patternMatched; - try { - patternMatched = p.test(line); - } catch (err) { - patternMatched = false; - } - return patternMatched; - } - - function parse(raw) { - raw = preprocess(raw); - // parse - const lines = raw.split("\n"); - const proxies = []; - let lastParser; - - for (let line of lines) { - line = line.trim(); - if (line.length === 0) continue; // skip empty line - let matched = lastParser && safeMatch(lastParser, line); - if (!matched) { - for (const parser of PROXY_PARSERS) { - if (safeMatch(parser, line)) { - lastParser = parser; - matched = true; - $.info(`Proxy parser: ${parser.name} is activated`); - break; - } - } - } - if (!matched) { - $.error(`Failed to find a rule to parse line: \n${line}\n`); - } else { - try { - const proxy = lastParser.parse(line); - if (!proxy) { - $.error(`Parser ${lastParser.name} return nothing for \n${line}\n`); - } - proxies.push(proxy); - } catch (err) { - $.error(`Failed to parse line: \n ${line}\n Reason: ${err.stack}`); - } - } - } - - return proxies; - } - - async function process(proxies, operators = [], targetPlatform) { - for (const item of operators) { - // process script - let script; - const $arguments = {}; - if (item.type.indexOf("Script") !== -1) { - const {mode, content} = item.args; - if (mode === "link") { - const url = content; - // extract link arguments - const rawArgs = url.split('#'); - if (rawArgs.length > 1) { - for (const pair of rawArgs[1].split("&")) { - const key = pair.split('=')[0]; - const value = (pair.split('=')[1] || true); - $arguments[key] = value; - } - } - - // if this is remote script, download it - try { - script = await $downloader.download(url.split("#")[0]); - $.info(`Script loaded: >>>\n ${script}`); - } catch (err) { - $.error( - `Error when downloading remote script: ${item.args.content}.\n Reason: ${err}` - ); - // skip the script if download failed. - continue; - } - } else { - script = content; - } - } - - if (!PROXY_PROCESSORS[item.type]) { - $.error(`Unknown operator: "${item.type}"`); - continue; - } - - $.info( - `Applying "${item.type}" with arguments:\n >>> ${JSON.stringify(item.args, null, 2) || "None" - }` - ); - let processor; - if (item.type.indexOf("Script") !== -1) { - processor = PROXY_PROCESSORS[item.type](script, targetPlatform, $arguments); - } else { - processor = PROXY_PROCESSORS[item.type](item.args); - } - proxies = ApplyProcessor(processor, proxies); - } - return proxies; - } - - function produce(proxies, targetPlatform) { - const producer = PROXY_PRODUCERS[targetPlatform]; - if (!producer) { - throw new Error(`Target platform: ${targetPlatform} is not supported!`); - } - - // filter unsupported proxies - proxies = proxies.filter( - (proxy) => !(proxy.supported && proxy.supported[targetPlatform] === false) - ); - - $.info(`Producing proxies for target: ${targetPlatform}`); - if (typeof producer.type === "undefined" || producer.type === "SINGLE") { - return proxies - .map((proxy) => { - try { - return producer.produce(proxy); - } catch (err) { - $.error( - `Cannot produce proxy: ${JSON.stringify( - proxy, - null, - 2 - )}\nReason: ${err}` - ); - return ""; - } - }) - .filter((line) => line.length > 0) - .join("\n"); - } else if (producer.type === "ALL") { - return producer.produce(proxies); - } - } - - return { - parse, - process, - produce, - }; -})(); - -/****************************************** Rule Utils **********************************************************/ -var RuleUtils = (function () { - const RULE_TYPES_MAPPING = [ - [/^(DOMAIN|host|HOST)$/, "DOMAIN"], - [/^(DOMAIN-KEYWORD|host-keyword|HOST-KEYWORD)$/, "DOMAIN-KEYWORD"], - [/^(DOMAIN-SUFFIX|host-suffix|HOST-SUFFIX)$/, "DOMAIN-SUFFIX"], - [/^USER-AGENT$/i, "USER-AGENT"], - [/^PROCESS-NAME$/, "PROCESS-NAME"], - [/^(DEST-PORT|DST-PORT)$/, "DST-PORT"], - [/^SRC-IP(-CIDR)?$/, "SRC-IP"], - [/^(IN|SRC)-PORT$/, "IN-PORT"], - [/^PROTOCOL$/, "PROTOCOL"], - [/^IP-CIDR$/i, "IP-CIDR"], - [/^(IP-CIDR6|ip6-cidr|IP6-CIDR)$/], - ]; - - const RULE_PREPROCESSORS = (function () { - function HTML() { - const name = "HTML"; - const test = (raw) => /^/.test(raw); - // simply discard HTML - const parse = (_) => ""; - return {name, test, parse}; - } - - function ClashProvider() { - const name = "Clash Provider"; - const test = (raw) => raw.indexOf("payload:") === 0; - const parse = (raw) => { - return raw.replace("payload:", "").replace(/^\s*-\s*/gm, ""); - }; - return {name, test, parse}; - } - - return [HTML(), ClashProvider()]; - })(); - const RULE_PARSERS = (function () { - function AllRuleParser() { - const name = "Universal Rule Parser"; - const test = () => true; - const parse = (raw) => { - const lines = raw.split("\n"); - const result = []; - for (let line of lines) { - line = line.trim(); - // skip empty line - if (line.length === 0) continue; - // skip comments - if (/\s*#/.test(line)) continue; - try { - const params = line.split(",").map((w) => w.trim()); - let rawType = params[0]; - let matched = false; - for (const item of RULE_TYPES_MAPPING) { - const regex = item[0]; - if (regex.test(rawType)) { - matched = true; - const rule = { - type: item[1], - content: params[1], - }; - if (rule.type === "IP-CIDR" || rule.type === "IP-CIDR6") { - rule.options = params.slice(2); - } - result.push(rule); - } - } - if (!matched) throw new Error("Invalid rule type: " + rawType); - } catch (e) { - console.error(`Failed to parse line: ${line}\n Reason: ${e}`); - } - } - return result; - }; - return {name, test, parse}; - } - - return [AllRuleParser()]; - })(); - const RULE_PROCESSORS = (function () { - function RegexFilter({regex = [], keep = true}) { - return { - name: "Regex Filter", - func: (rules) => { - return rules.map((rule) => { - const selected = regex.some((r) => { - r = new RegExp(r); - return r.test(rule); - }); - return keep ? selected : !selected; - }); - }, - }; - } - - function TypeFilter(types) { - return { - name: "Type Filter", - func: (rules) => { - return rules.map((rule) => types.some((t) => rule.type === t)); - }, - }; - } - - function RemoveDuplicateFilter() { - return { - name: "Remove Duplicate Filter", - func: (rules) => { - const seen = new Set(); - const result = []; - rules.forEach((rule) => { - const options = rule.options || []; - options.sort(); - const key = `${rule.type},${rule.content},${JSON.stringify( - options - )}`; - if (!seen.has(key)) { - result.push(rule); - seen.add(key); - } - }); - return result; - }, - }; - } - - // regex: [{expr: "string format regex", now: "now"}] - function RegexReplaceOperator(regex) { - return { - name: "Regex Rename Operator", - func: (rules) => { - return rules.map((rule) => { - for (const {expr, now} of regex) { - rule.content = rule.content - .replace(new RegExp(expr, "g"), now) - .trim(); - } - return rule; - }); - }, - }; - } - - return { - "Regex Filter": RegexFilter, - "Remove Duplicate Filter": RemoveDuplicateFilter, - "Type Filter": TypeFilter, - - "Regex Replace Operator": RegexReplaceOperator, - }; - })(); - const RULE_PRODUCERS = (function () { - function QXFilter() { - const type = "SINGLE"; - const func = (rule) => { - // skip unsupported rules - const UNSUPPORTED = [ - "URL-REGEX", - "DEST-PORT", - "SRC-IP", - "IN-PORT", - "PROTOCOL", - ]; - if (UNSUPPORTED.indexOf(rule.type) !== -1) return null; - - const TRANSFORM = { - "DOMAIN-KEYWORD": "HOST-KEYWORD", - "DOMAIN-SUFFIX": "HOST-SUFFIX", - DOMAIN: "HOST", - "IP-CIDR6": "IP6-CIDR", - }; - - // QX does not support the no-resolve option - return `${TRANSFORM[rule.type] || rule.type},${rule.content},SUB-STORE`; - }; - return {type, func}; - } - - function SurgeRuleSet() { - const type = "SINGLE"; - const func = (rule) => { - let output = `${rule.type},${rule.content}`; - if (rule.type === "IP-CIDR" || rule.type === "IP-CIDR6") { - output += rule.options ? `,${rule.options[0]}` : ""; - } - return output; - }; - return {type, func}; - } - - function LoonRules() { - const type = "SINGLE"; - const func = (rule) => { - // skip unsupported rules - const UNSUPPORTED = ["DEST-PORT", "SRC-IP", "IN-PORT", "PROTOCOL"]; - if (UNSUPPORTED.indexOf(rule.type) !== -1) return null; - return SurgeRuleSet().func(rule); - }; - return {type, func}; - } - - function ClashRuleProvider() { - const type = "ALL"; - const func = (rules) => { - const TRANSFORM = { - "DEST-PORT": "DST-PORT", - "SRC-IP": "SRC-IP-CIDR", - "IN-PORT": "SRC-PORT", - }; - const conf = { - payload: rules.map((rule) => { - let output = `${TRANSFORM[rule.type] || rule.type},${rule.content}`; - if (rule.type === "IP-CIDR" || rule.type === "IP-CIDR6") { - output += rule.options ? `,${rule.options[0]}` : ""; - } - return output; - }), - }; - return YAML.stringify(conf); - }; - return {type, func}; - } - - return { - QX: QXFilter(), - Surge: SurgeRuleSet(), - Loon: LoonRules(), - Clash: ClashRuleProvider(), - }; - })(); - - function preprocess(raw) { - for (const processor of RULE_PREPROCESSORS) { - try { - if (processor.test(raw)) { - $.info(`Pre-processor [${processor.name}] activated`); - return processor.parse(raw); - } - } catch (e) { - $.error(`Parser [${processor.name}] failed\n Reason: ${e}`); - } - } - return raw; - } - - function parse(raw) { - raw = preprocess(raw); - for (const parser of RULE_PARSERS) { - let matched; - try { - matched = parser.test(raw); - } catch (err) { - matched = false; - } - if (matched) { - $.info(`Rule parser [${parser.name}] is activated!`); - return parser.parse(raw); - } - } - } - - async function process(rules, operators) { - for (const item of operators) { - if (!RULE_PROCESSORS[item.type]) { - console.error(`Unknown operator: ${item.type}!`); - continue; - } - const processor = RULE_PROCESSORS[item.type](item.args); - $.info( - `Applying "${item.type}" with arguments: \n >>> ${JSON.stringify(item.args) || "None" - }` - ); - rules = ApplyProcessor(processor, rules); - } - return rules; - } - - function produce(rules, targetPlatform) { - const producer = RULE_PRODUCERS[targetPlatform]; - if (!producer) { - throw new Error(`Target platform: ${targetPlatform} is not supported!`); - } - if (typeof producer.type === "undefined" || producer.type === "SINGLE") { - return rules - .map((rule) => { - try { - return producer.func(rule); - } catch (err) { - console.log( - `ERROR: cannot produce rule: ${JSON.stringify( - rule - )}\nReason: ${err}` - ); - return ""; - } - }) - .filter((line) => line.length > 0) - .join("\n"); - } else if (producer.type === "ALL") { - return producer.func(rules); - } - } - - return {parse, process, produce}; -})(); - -function getBuiltInRules() { - return { - AD: { - name: "AD", - description: "", - urls: [ - "https://raw.githubusercontent.com/privacy-protection-tools/anti-AD/master/anti-ad-surge.txt", - "https://raw.githubusercontent.com/ACL4SSR/ACL4SSR/master/Clash/Providers/BanAD.yaml", - ], - }, - Global: { - name: "Global", - description: "", - urls: [ - "https://raw.githubusercontent.com/ACL4SSR/ACL4SSR/master/Clash/Providers/ProxyGFWlist.yaml", - "https://raw.githubusercontent.com/DivineEngine/Profiles/master/Quantumult/Filter/Global.list", - ], - }, - CN: { - name: "CN", - description: "", - urls: [ - "https://raw.githubusercontent.com/ACL4SSR/ACL4SSR/master/Clash/Providers/ChinaDomain.yaml", - "https://raw.githubusercontent.com/DivineEngine/Profiles/master/Quantumult/Filter/China.list", - ], - }, - }; -} - -/****************************************** Supporting Functions ********************************************** */ -function ApplyProcessor(process, objs) { - function ApplyFilter(filter, objs) { - // select proxies - let selected = FULL(objs.length, true); - try { - selected = AND(selected, filter.func(objs)); - } catch (err) { - // print log and skip this filter - console.log(`Cannot apply filter ${filter.name}\n Reason: ${err}`); - } - return objs.filter((_, i) => selected[i]); - } - - function ApplyOperator(operator, objs) { - let output = clone(objs); - try { - const output_ = operator.func(output); - if (output_) output = output_; - } catch (err) { - // print log and skip this operator - console.log(`Cannot apply operator ${operator.name}! Reason: ${err}`); - } - return output; - } - - if (process.name.indexOf("Filter") !== -1) { - return ApplyFilter(process, objs); - } else if (process.name.indexOf("Operator") !== -1) { - return ApplyOperator(process, objs); - } -} - -// some logical functions -function AND(...args) { - return args.reduce((a, b) => a.map((c, i) => b[i] && c)); -} - -function OR(...args) { - return args.reduce((a, b) => a.map((c, i) => b[i] || c)); -} - -function NOT(array) { - return array.map((c) => !c); -} - -function FULL(length, bool) { - return [...Array(length).keys()].map(() => bool); -} - -// utils functions -function clone(object) { - return JSON.parse(JSON.stringify(object)); -} - -function buildRegex(str, ...options) { - options = options.join(""); - if (str.startsWith("(?i)")) { - str = str.substr(4); - return new RegExp(str, "i" + options); - } else { - return new RegExp(str, options); - } -} - -/****************************************** Own Libraries *******************************************************/ - -/** - * OpenAPI - * https://github.com/Peng-YM/QuanX/blob/master/Tools/OpenAPI/README.md - */ -function ENV() { - const isQX = typeof $task !== "undefined"; - const isLoon = typeof $loon !== "undefined"; - const isSurge = typeof $httpClient !== "undefined" && !isLoon; - const isJSBox = typeof require == "function" && typeof $jsbox != "undefined"; - const isNode = typeof require == "function" && !isJSBox; - const isRequest = typeof $request !== "undefined"; - const isScriptable = typeof importModule !== "undefined"; - return {isQX, isLoon, isSurge, isNode, isJSBox, isRequest, isScriptable}; -} - -function HTTP(defaultOptions = {baseURL: ""}) { - const {isQX, isLoon, isSurge, isScriptable, isNode} = ENV(); - const methods = ["GET", "POST", "PUT", "DELETE", "HEAD", "OPTIONS", "PATCH"]; - const URL_REGEX = /https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_\+.~#?&//=]*)/; - - function send(method, options) { - options = typeof options === "string" ? {url: options} : options; - const baseURL = defaultOptions.baseURL; - if (baseURL && !URL_REGEX.test(options.url || "")) { - options.url = baseURL ? baseURL + options.url : options.url; - } - options = {...defaultOptions, ...options}; - const timeout = options.timeout; - const events = { - ...{ - onRequest: () => { - }, - onResponse: (resp) => resp, - onTimeout: () => { - }, - }, - ...options.events, - }; - - events.onRequest(method, options); - - let worker; - if (isQX) { - worker = $task.fetch({ - method, - url: options.url, - headers: options.headers, - body: options.body, - }); - } else if (isLoon || isSurge || isNode) { - worker = new Promise((resolve, reject) => { - const request = isNode ? require("request") : $httpClient; - request[method.toLowerCase()](options, (err, response, body) => { - if (err) reject(err); - else - resolve({ - statusCode: response.status || response.statusCode, - headers: response.headers, - body, - }); - }); - }); - } else if (isScriptable) { - const request = new Request(options.url); - request.method = method; - request.headers = options.headers; - request.body = options.body; - worker = new Promise((resolve, reject) => { - request - .loadString() - .then((body) => { - resolve({ - statusCode: request.response.statusCode, - headers: request.response.headers, - body, - }); - }) - .catch((err) => reject(err)); - }); - } - - let timeoutid; - const timer = timeout - ? new Promise((_, reject) => { - timeoutid = setTimeout(() => { - events.onTimeout(); - return reject( - `${method} URL: ${options.url} exceeds the timeout ${timeout} ms` - ); - }, timeout); - }) - : null; - - return (timer - ? Promise.race([timer, worker]).then((res) => { - clearTimeout(timeoutid); - return res; - }) - : worker - ).then((resp) => events.onResponse(resp)); - } - - const http = {}; - methods.forEach( - (method) => - (http[method.toLowerCase()] = (options) => send(method, options)) - ); - return http; -} - -function API(name = "untitled", debug = false) { - const {isQX, isLoon, isSurge, isNode, isJSBox, isScriptable} = ENV(); - return new (class { - constructor(name, debug) { - this.name = name; - this.debug = debug; - - this.http = HTTP(); - this.env = ENV(); - - this.node = (() => { - if (isNode) { - const fs = require("fs"); - - return { - fs, - }; - } else { - return null; - } - })(); - this.initCache(); - - const delay = (t, v) => - new Promise(function (resolve) { - setTimeout(resolve.bind(null, v), t); - }); - - Promise.prototype.delay = function (t) { - return this.then(function (v) { - return delay(t, v); - }); - }; - } - - // persistence - // initialize cache - initCache() { - if (isQX) this.cache = JSON.parse($prefs.valueForKey(this.name) || "{}"); - if (isLoon || isSurge) - this.cache = JSON.parse($persistentStore.read(this.name) || "{}"); - - if (isNode) { - // create a json for root cache - let fpath = "root.json"; - if (!this.node.fs.existsSync(fpath)) { - this.node.fs.writeFileSync( - fpath, - JSON.stringify({}), - {flag: "wx"}, - (err) => console.log(err) - ); - } - this.root = {}; - - // create a json file with the given name if not exists - fpath = `${this.name}.json`; - if (!this.node.fs.existsSync(fpath)) { - this.node.fs.writeFileSync( - fpath, - JSON.stringify({}), - {flag: "wx"}, - (err) => console.log(err) - ); - this.cache = {}; - } else { - this.cache = JSON.parse( - this.node.fs.readFileSync(`${this.name}.json`) - ); - } - } - } - - // store cache - persistCache() { - const data = JSON.stringify(this.cache, null, 2); - if (isQX) $prefs.setValueForKey(data, this.name); - if (isLoon || isSurge) $persistentStore.write(data, this.name); - if (isNode) { - this.node.fs.writeFileSync( - `${this.name}.json`, - data, - {flag: "w"}, - (err) => console.log(err) - ); - this.node.fs.writeFileSync( - "root.json", - JSON.stringify(this.root, null, 2), - {flag: "w"}, - (err) => console.log(err) - ); - } - } - - write(data, key) { - this.log(`SET ${key}`); - if (key.indexOf("#") !== -1) { - key = key.substr(1); - if (isSurge || isLoon) { - return $persistentStore.write(data, key); - } - if (isQX) { - return $prefs.setValueForKey(data, key); - } - if (isNode) { - this.root[key] = data; - } - } else { - this.cache[key] = data; - } - this.persistCache(); - } - - read(key) { - this.log(`READ ${key}`); - if (key.indexOf("#") !== -1) { - key = key.substr(1); - if (isSurge || isLoon) { - return $persistentStore.read(key); - } - if (isQX) { - return $prefs.valueForKey(key); - } - if (isNode) { - return this.root[key]; - } - } else { - return this.cache[key]; - } - } - - delete(key) { - this.log(`DELETE ${key}`); - if (key.indexOf("#") !== -1) { - key = key.substr(1); - if (isSurge || isLoon) { - return $persistentStore.write(null, key); - } - if (isQX) { - return $prefs.removeValueForKey(key); - } - if (isNode) { - delete this.root[key]; - } - } else { - delete this.cache[key]; - } - this.persistCache(); - } - - // notification - notify(title, subtitle = "", content = "", options = {}) { - const openURL = options["open-url"]; - const mediaURL = options["media-url"]; - - if (isQX) $notify(title, subtitle, content, options); - if (isSurge) { - $notification.post( - title, - subtitle, - content + `${mediaURL ? "\n多媒体:" + mediaURL : ""}`, - { - url: openURL, - } - ); - } - if (isLoon) { - let opts = {}; - if (openURL) opts["openUrl"] = openURL; - if (mediaURL) opts["mediaUrl"] = mediaURL; - if (JSON.stringify(opts) === "{}") { - $notification.post(title, subtitle, content); - } else { - $notification.post(title, subtitle, content, opts); - } - } - if (isNode || isScriptable) { - const content_ = - content + - (openURL ? `\n点击跳转: ${openURL}` : "") + - (mediaURL ? `\n多媒体: ${mediaURL}` : ""); - if (isJSBox) { - const push = require("push"); - push.schedule({ - title: title, - body: (subtitle ? subtitle + "\n" : "") + content_, - }); - } else { - console.log(`${title}\n${subtitle}\n${content_}\n\n`); - } - } - } - - // other helper functions - log(msg) { - if (this.debug) console.log(`[${this.name}] LOG: ${msg}`); - } - - info(msg) { - console.log(`[${this.name}] INFO: ${msg}`); - } - - error(msg) { - console.log(`[${this.name}] ERROR: ${msg}`); - } - - wait(millisec) { - return new Promise((resolve) => setTimeout(resolve, millisec)); - } - - done(value = {}) { - if (isQX || isLoon || isSurge) { - $done(value); - } else if (isNode && !isJSBox) { - if (typeof $context !== "undefined") { - $context.headers = value.headers; - $context.statusCode = value.statusCode; - $context.body = value.body; - } - } - } - })(name, debug); -} - -/** - * Gist backup - */ -function Gist({token, key}) { - const http = HTTP({ - baseURL: "https://api.github.com", - headers: { - Authorization: `token ${token}`, - "User-Agent": - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.141 Safari/537.36", - }, - events: { - onResponse: (resp) => { - if (/^[45]/.test(String(resp.statusCode))) { - return Promise.reject(`ERROR: ${JSON.parse(resp.body).message}`); - } else { - return resp; - } - }, - }, - }); - - async function locate() { - return http.get("/gists").then((response) => { - const gists = JSON.parse(response.body); - for (let g of gists) { - if (g.description === key) { - return g.id; - } - } - return -1; - }); - } - - this.upload = async function (files) { - const id = await locate(); - - if (id === -1) { - // create a new gist for backup - return http.post({ - url: "/gists", - body: JSON.stringify({ - description: key, - public: false, - files, - }), - }); - } else { - // update an existing gist - return http.patch({ - url: `/gists/${id}`, - body: JSON.stringify({files}), - }); - } - }; - - this.download = async function (filename) { - const id = await locate(); - if (id === -1) { - return Promise.reject("未找到Gist备份!"); - } else { - try { - const {files} = await http - .get(`/gists/${id}`) - .then((resp) => JSON.parse(resp.body)); - const url = files[filename].raw_url; - return await http.get(url).then((resp) => resp.body); - } catch (err) { - return Promise.reject(err); - } - } - }; -} - -/** - * Mini Express Framework - * https://github.com/Peng-YM/QuanX/blob/master/Tools/OpenAPI/Express.js - */ -function express({port} = {port: 3000}) { - const {isNode} = ENV(); - const DEFAULT_HEADERS = { - "Content-Type": "text/plain;charset=UTF-8", - "Access-Control-Allow-Origin": "*", - "Access-Control-Allow-Methods": "POST,GET,OPTIONS,PATCH,PUT,DELETE", - "Access-Control-Allow-Headers": - "Origin, X-Requested-With, Content-Type, Accept", - }; - - // node support - if (isNode) { - const express_ = require("express"); - const bodyParser = require("body-parser"); - const app = express_(); - app.use(bodyParser.json({verify: rawBodySaver})); - app.use(bodyParser.urlencoded({verify: rawBodySaver, extended: true})); - app.use(bodyParser.raw({verify: rawBodySaver, type: "*/*"})); - app.use((req, res, next) => { - res.set(DEFAULT_HEADERS); - next(); - }); - - // adapter - app.start = () => { - app.listen(port, () => { - $.log(`Express started on port: ${port}`); - }); - }; - return app; - } - - // route handlers - const handlers = []; - - // http methods - const METHODS_NAMES = [ - "GET", - "POST", - "PUT", - "DELETE", - "PATCH", - "OPTIONS", - "HEAD'", - "ALL", - ]; - - // dispatch url to route - const dispatch = (request, start = 0) => { - let {method, url, headers, body} = request; - if (/json/i.test(headers["Content-Type"])) { - body = JSON.parse(body); - } - - method = method.toUpperCase(); - const {path, query} = extractURL(url); - - // pattern match - let handler = null; - let i; - let longestMatchedPattern = 0; - for (i = start; i < handlers.length; i++) { - if (handlers[i].method === "ALL" || method === handlers[i].method) { - const {pattern} = handlers[i]; - if (patternMatched(pattern, path)) { - if (pattern.split("/").length > longestMatchedPattern) { - handler = handlers[i]; - longestMatchedPattern = pattern.split("/").length; - } - } - } - } - if (handler) { - // dispatch to next handler - const next = () => { - dispatch(method, url, i); - }; - const req = { - method, - url, - path, - query, - params: extractPathParams(handler.pattern, path), - headers, - body, - }; - const res = Response(); - const cb = handler.callback; - - const errFunc = (err) => { - res.status(500).json({ - status: "failed", - message: `Internal Server Error: ${err}`, - }); - }; - - if (cb.constructor.name === "AsyncFunction") { - cb(req, res, next).catch(errFunc); - } else { - try { - cb(req, res, next); - } catch (err) { - errFunc(err); - } - } - } else { - // no route, return 404 - const res = Response(); - res.status(404).json({ - status: "failed", - message: "ERROR: 404 not found", - }); - } - }; - - const app = {}; - - // attach http methods - METHODS_NAMES.forEach((method) => { - app[method.toLowerCase()] = (pattern, callback) => { - // add handler - handlers.push({method, pattern, callback}); - }; - }); - - // chainable route - app.route = (pattern) => { - const chainApp = {}; - METHODS_NAMES.forEach((method) => { - chainApp[method.toLowerCase()] = (callback) => { - // add handler - handlers.push({method, pattern, callback}); - return chainApp; - }; - }); - return chainApp; - }; - - // start service - app.start = () => { - dispatch($request); - }; - - return app; - - /************************************************ - Utility Functions - *************************************************/ - function rawBodySaver(req, res, buf, encoding) { - if (buf && buf.length) { - req.rawBody = buf.toString(encoding || "utf8"); - } - } - - function Response() { - let statusCode = 200; - const {isQX, isLoon, isSurge} = ENV(); - const headers = DEFAULT_HEADERS; - const STATUS_CODE_MAP = { - 200: "HTTP/1.1 200 OK", - 201: "HTTP/1.1 201 Created", - 302: "HTTP/1.1 302 Found", - 307: "HTTP/1.1 307 Temporary Redirect", - 308: "HTTP/1.1 308 Permanent Redirect", - 404: "HTTP/1.1 404 Not Found", - 500: "HTTP/1.1 500 Internal Server Error", - }; - return new (class { - status(code) { - statusCode = code; - return this; - } - - send(body = "") { - const response = { - status: isQX ? STATUS_CODE_MAP[statusCode] : statusCode, - body, - headers, - }; - if (isQX) { - $done(response); - } else if (isLoon || isSurge) { - $done({ - response, - }); - } - } - - end() { - this.send(); - } - - html(data) { - this.set("Content-Type", "text/html;charset=UTF-8"); - this.send(data); - } - - json(data) { - this.set("Content-Type", "application/json;charset=UTF-8"); - this.send(JSON.stringify(data)); - } - - set(key, val) { - headers[key] = val; - return this; - } - })(); - } - - function patternMatched(pattern, path) { - if (pattern instanceof RegExp && pattern.test(path)) { - return true; - } else { - // root pattern, match all - if (pattern === "/") return true; - // normal string pattern - if (pattern.indexOf(":") === -1) { - const spath = path.split("/"); - const spattern = pattern.split("/"); - for (let i = 0; i < spattern.length; i++) { - if (spath[i] !== spattern[i]) { - return false; - } - } - return true; - } - // string pattern with path parameters - else if (extractPathParams(pattern, path)) { - return true; - } - } - return false; - } - - function extractURL(url) { - // extract path - const match = url.match(/https?:\/\/[^\/]+(\/[^?]*)/) || []; - const path = match[1] || "/"; - - // extract query string - const split = url.indexOf("?"); - const query = {}; - if (split !== -1) { - let hashes = url.slice(url.indexOf("?") + 1).split("&"); - for (let i = 0; i < hashes.length; i++) { - hash = hashes[i].split("="); - query[hash[0]] = hash[1]; - } - } - return { - path, - query, - }; - } - - function extractPathParams(pattern, path) { - if (pattern.indexOf(":") === -1) { - return null; - } else { - const params = {}; - for (let i = 0, j = 0; i < pattern.length; i++, j++) { - if (pattern[i] === ":") { - let key = []; - let val = []; - while (pattern[++i] !== "/" && i < pattern.length) { - key.push(pattern[i]); - } - while (path[j] !== "/" && j < path.length) { - val.push(path[j++]); - } - params[key.join("")] = val.join(""); - } else { - if (pattern[i] !== path[j]) { - return null; - } - } - } - return params; - } - } -} - -/****************************************** Third Party Libraries **********************************************/ - -/** - * Base64 Coding Library - * https://github.com/dankogai/js-base64#readme - */ -function Base64Code() { - // constants - const b64chars = - "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; - const b64tab = (function (bin) { - const t = {}; - let i = 0; - const l = bin.length; - for (; i < l; i++) t[bin.charAt(i)] = i; - return t; - })(b64chars); - const fromCharCode = String.fromCharCode; - // encoder stuff - const cb_utob = function (c) { - let cc; - if (c.length < 2) { - cc = c.charCodeAt(0); - return cc < 0x80 - ? c - : cc < 0x800 - ? fromCharCode(0xc0 | (cc >>> 6)) + fromCharCode(0x80 | (cc & 0x3f)) - : fromCharCode(0xe0 | ((cc >>> 12) & 0x0f)) + - fromCharCode(0x80 | ((cc >>> 6) & 0x3f)) + - fromCharCode(0x80 | (cc & 0x3f)); - } else { - cc = - 0x10000 + - (c.charCodeAt(0) - 0xd800) * 0x400 + - (c.charCodeAt(1) - 0xdc00); - return ( - fromCharCode(0xf0 | ((cc >>> 18) & 0x07)) + - fromCharCode(0x80 | ((cc >>> 12) & 0x3f)) + - fromCharCode(0x80 | ((cc >>> 6) & 0x3f)) + - fromCharCode(0x80 | (cc & 0x3f)) - ); - } - }; - const re_utob = /[\uD800-\uDBFF][\uDC00-\uDFFFF]|[^\x00-\x7F]/g; - const utob = function (u) { - return u.replace(re_utob, cb_utob); - }; - const cb_encode = function (ccc) { - const padlen = [0, 2, 1][ccc.length % 3], - ord = - (ccc.charCodeAt(0) << 16) | - ((ccc.length > 1 ? ccc.charCodeAt(1) : 0) << 8) | - (ccc.length > 2 ? ccc.charCodeAt(2) : 0), - chars = [ - b64chars.charAt(ord >>> 18), - b64chars.charAt((ord >>> 12) & 63), - padlen >= 2 ? "=" : b64chars.charAt((ord >>> 6) & 63), - padlen >= 1 ? "=" : b64chars.charAt(ord & 63), - ]; - return chars.join(""); - }; - const btoa = function (b) { - return b.replace(/[\s\S]{1,3}/g, cb_encode); - }; - this.encode = function (u) { - const isUint8Array = - Object.prototype.toString.call(u) === "[object Uint8Array]"; - return isUint8Array ? u.toString("base64") : btoa(utob(String(u))); - }; - const uriencode = function (u, urisafe) { - return !urisafe - ? _encode(u) - : _encode(String(u)) - .replace(/[+\/]/g, function (m0) { - return m0 === "+" ? "-" : "_"; - }) - .replace(/=/g, ""); - }; - const encodeURI = function (u) { - return uriencode(u, true); - }; - // decoder stuff - const re_btou = /[\xC0-\xDF][\x80-\xBF]|[\xE0-\xEF][\x80-\xBF]{2}|[\xF0-\xF7][\x80-\xBF]{3}/g; - const cb_btou = function (cccc) { - switch (cccc.length) { - case 4: - const cp = - ((0x07 & cccc.charCodeAt(0)) << 18) | - ((0x3f & cccc.charCodeAt(1)) << 12) | - ((0x3f & cccc.charCodeAt(2)) << 6) | - (0x3f & cccc.charCodeAt(3)), - offset = cp - 0x10000; - return ( - fromCharCode((offset >>> 10) + 0xd800) + - fromCharCode((offset & 0x3ff) + 0xdc00) - ); - case 3: - return fromCharCode( - ((0x0f & cccc.charCodeAt(0)) << 12) | - ((0x3f & cccc.charCodeAt(1)) << 6) | - (0x3f & cccc.charCodeAt(2)) - ); - default: - return fromCharCode( - ((0x1f & cccc.charCodeAt(0)) << 6) | (0x3f & cccc.charCodeAt(1)) - ); - } - }; - const btou = function (b) { - return b.replace(re_btou, cb_btou); - }; - const cb_decode = function (cccc) { - const len = cccc.length, - padlen = len % 4, - n = - (len > 0 ? b64tab[cccc.charAt(0)] << 18 : 0) | - (len > 1 ? b64tab[cccc.charAt(1)] << 12 : 0) | - (len > 2 ? b64tab[cccc.charAt(2)] << 6 : 0) | - (len > 3 ? b64tab[cccc.charAt(3)] : 0), - chars = [ - fromCharCode(n >>> 16), - fromCharCode((n >>> 8) & 0xff), - fromCharCode(n & 0xff), - ]; - chars.length -= [0, 0, 2, 1][padlen]; - return chars.join(""); - }; - const _atob = function (a) { - return a.replace(/\S{1,4}/g, cb_decode); - }; - const atob = function (a) { - return _atob(String(a).replace(/[^A-Za-z0-9\+\/]/g, "")); - }; - const _decode = function (u) { - return btou(_atob(u)); - }; - this.decode = function (a) { - return _decode( - String(a) - .replace(/[-_]/g, function (m0) { - return m0 === "-" ? "+" : "/"; - }) - .replace(/[^A-Za-z0-9\+\/]/g, "") - ) - .replace(/>/g, ">") - .replace(/</g, "<"); - }; - this.safeEncode = function (a) { - return this.encode(a.replace(/\+/g, "-").replace(/\//g, "_")); - }; - this.safeDecode = function (a) { - return this.decode(a.replace(/-/g, "+").replace(/_/g, "/")); - }; -} - -/** - * YAML parser for Javascript - * https://github.com/nodeca/js-yaml - */ -var YAML = function () { - function isNothing(subject) { - return (typeof subject === 'undefined') || (subject === null); - } - - - function isObject(subject) { - return (typeof subject === 'object') && (subject !== null); - } - - - function toArray(sequence) { - if (Array.isArray(sequence)) return sequence; - else if (isNothing(sequence)) return []; - - return [sequence]; - } - - - function extend(target, source) { - var index, length, key, sourceKeys; - - if (source) { - sourceKeys = Object.keys(source); - - for (index = 0, length = sourceKeys.length; index < length; index += 1) { - key = sourceKeys[index]; - target[key] = source[key]; - } - } - - return target; - } - - - function repeat(string, count) { - var result = '', cycle; - - for (cycle = 0; cycle < count; cycle += 1) { - result += string; - } - - return result; - } - - - function isNegativeZero(number) { - return (number === 0) && (Number.NEGATIVE_INFINITY === 1 / number); - } - - - var isNothing_1 = isNothing; - var isObject_1 = isObject; - var toArray_1 = toArray; - var repeat_1 = repeat; - var isNegativeZero_1 = isNegativeZero; - var extend_1 = extend; - - var common = { - isNothing: isNothing_1, - isObject: isObject_1, - toArray: toArray_1, - repeat: repeat_1, - isNegativeZero: isNegativeZero_1, - extend: extend_1 - }; - -// YAML error class. http://stackoverflow.com/questions/8458984 - - - function formatError(exception, compact) { - var where = '', message = exception.reason || '(unknown reason)'; - - if (!exception.mark) return message; - - if (exception.mark.name) { - where += 'in "' + exception.mark.name + '" '; - } - - where += '(' + (exception.mark.line + 1) + ':' + (exception.mark.column + 1) + ')'; - - if (!compact && exception.mark.snippet) { - where += '\n\n' + exception.mark.snippet; - } - - return message + ' ' + where; - } - - - function YAMLException$1(reason, mark) { - // Super constructor - Error.call(this); - - this.name = 'YAMLException'; - this.reason = reason; - this.mark = mark; - this.message = formatError(this, false); - - // Include stack trace in error object - if (Error.captureStackTrace) { - // Chrome and NodeJS - Error.captureStackTrace(this, this.constructor); - } else { - // FF, IE 10+ and Safari 6+. Fallback for others - this.stack = (new Error()).stack || ''; - } - } - - -// Inherit from Error - YAMLException$1.prototype = Object.create(Error.prototype); - YAMLException$1.prototype.constructor = YAMLException$1; - - - YAMLException$1.prototype.toString = function toString(compact) { - return this.name + ': ' + formatError(this, compact); - }; - - - var exception = YAMLException$1; - -// get snippet for a single line, respecting maxLength - function getLine(buffer, lineStart, lineEnd, position, maxLineLength) { - var head = ''; - var tail = ''; - var maxHalfLength = Math.floor(maxLineLength / 2) - 1; - - if (position - lineStart > maxHalfLength) { - head = ' ... '; - lineStart = position - maxHalfLength + head.length; - } - - if (lineEnd - position > maxHalfLength) { - tail = ' ...'; - lineEnd = position + maxHalfLength - tail.length; - } - - return { - str: head + buffer.slice(lineStart, lineEnd).replace(/\t/g, '→') + tail, - pos: position - lineStart + head.length // relative position - }; - } - - - function padStart(string, max) { - return common.repeat(' ', max - string.length) + string; - } - - - function makeSnippet(mark, options) { - options = Object.create(options || null); - - if (!mark.buffer) return null; - - if (!options.maxLength) options.maxLength = 79; - if (typeof options.indent !== 'number') options.indent = 1; - if (typeof options.linesBefore !== 'number') options.linesBefore = 3; - if (typeof options.linesAfter !== 'number') options.linesAfter = 2; - - var re = /\r?\n|\r|\0/g; - var lineStarts = [0]; - var lineEnds = []; - var match; - var foundLineNo = -1; - - while ((match = re.exec(mark.buffer))) { - lineEnds.push(match.index); - lineStarts.push(match.index + match[0].length); - - if (mark.position <= match.index && foundLineNo < 0) { - foundLineNo = lineStarts.length - 2; - } - } - - if (foundLineNo < 0) foundLineNo = lineStarts.length - 1; - - var result = '', i, line; - var lineNoLength = Math.min(mark.line + options.linesAfter, lineEnds.length).toString().length; - var maxLineLength = options.maxLength - (options.indent + lineNoLength + 3); - - for (i = 1; i <= options.linesBefore; i++) { - if (foundLineNo - i < 0) break; - line = getLine( - mark.buffer, - lineStarts[foundLineNo - i], - lineEnds[foundLineNo - i], - mark.position - (lineStarts[foundLineNo] - lineStarts[foundLineNo - i]), - maxLineLength - ); - result = common.repeat(' ', options.indent) + padStart((mark.line - i + 1).toString(), lineNoLength) + - ' | ' + line.str + '\n' + result; - } - - line = getLine(mark.buffer, lineStarts[foundLineNo], lineEnds[foundLineNo], mark.position, maxLineLength); - result += common.repeat(' ', options.indent) + padStart((mark.line + 1).toString(), lineNoLength) + - ' | ' + line.str + '\n'; - result += common.repeat('-', options.indent + lineNoLength + 3 + line.pos) + '^' + '\n'; - - for (i = 1; i <= options.linesAfter; i++) { - if (foundLineNo + i >= lineEnds.length) break; - line = getLine( - mark.buffer, - lineStarts[foundLineNo + i], - lineEnds[foundLineNo + i], - mark.position - (lineStarts[foundLineNo] - lineStarts[foundLineNo + i]), - maxLineLength - ); - result += common.repeat(' ', options.indent) + padStart((mark.line + i + 1).toString(), lineNoLength) + - ' | ' + line.str + '\n'; - } - - return result.replace(/\n$/, ''); - } - - - var snippet = makeSnippet; - - var TYPE_CONSTRUCTOR_OPTIONS = [ - 'kind', - 'multi', - 'resolve', - 'construct', - 'instanceOf', - 'predicate', - 'represent', - 'representName', - 'defaultStyle', - 'styleAliases' - ]; - - var YAML_NODE_KINDS = [ - 'scalar', - 'sequence', - 'mapping' - ]; - - function compileStyleAliases(map) { - var result = {}; - - if (map !== null) { - Object.keys(map).forEach(function (style) { - map[style].forEach(function (alias) { - result[String(alias)] = style; - }); - }); - } - - return result; - } - - function Type$1(tag, options) { - options = options || {}; - - Object.keys(options).forEach(function (name) { - if (TYPE_CONSTRUCTOR_OPTIONS.indexOf(name) === -1) { - throw new exception('Unknown option "' + name + '" is met in definition of "' + tag + '" YAML type.'); - } - }); - - // TODO: Add tag format check. - this.options = options; // keep original options in case user wants to extend this type later - this.tag = tag; - this.kind = options['kind'] || null; - this.resolve = options['resolve'] || function () { - return true; - }; - this.construct = options['construct'] || function (data) { - return data; - }; - this.instanceOf = options['instanceOf'] || null; - this.predicate = options['predicate'] || null; - this.represent = options['represent'] || null; - this.representName = options['representName'] || null; - this.defaultStyle = options['defaultStyle'] || null; - this.multi = options['multi'] || false; - this.styleAliases = compileStyleAliases(options['styleAliases'] || null); - - if (YAML_NODE_KINDS.indexOf(this.kind) === -1) { - throw new exception('Unknown kind "' + this.kind + '" is specified for "' + tag + '" YAML type.'); - } - } - - var type = Type$1; - - /*eslint-disable max-len*/ - - - function compileList(schema, name) { - var result = []; - - schema[name].forEach(function (currentType) { - var newIndex = result.length; - - result.forEach(function (previousType, previousIndex) { - if (previousType.tag === currentType.tag && - previousType.kind === currentType.kind && - previousType.multi === currentType.multi) { - - newIndex = previousIndex; - } - }); - - result[newIndex] = currentType; - }); - - return result; - } - - - function compileMap(/* lists... */) { - var result = { - scalar: {}, - sequence: {}, - mapping: {}, - fallback: {}, - multi: { - scalar: [], - sequence: [], - mapping: [], - fallback: [] - } - }, index, length; - - function collectType(type) { - if (type.multi) { - result.multi[type.kind].push(type); - result.multi['fallback'].push(type); - } else { - result[type.kind][type.tag] = result['fallback'][type.tag] = type; - } - } - - for (index = 0, length = arguments.length; index < length; index += 1) { - arguments[index].forEach(collectType); - } - return result; - } - - - function Schema$1(definition) { - return this.extend(definition); - } - - - Schema$1.prototype.extend = function extend(definition) { - var implicit = []; - var explicit = []; - - if (definition instanceof type) { - // Schema.extend(type) - explicit.push(definition); - - } else if (Array.isArray(definition)) { - // Schema.extend([ type1, type2, ... ]) - explicit = explicit.concat(definition); - - } else if (definition && (Array.isArray(definition.implicit) || Array.isArray(definition.explicit))) { - // Schema.extend({ explicit: [ type1, type2, ... ], implicit: [ type1, type2, ... ] }) - if (definition.implicit) implicit = implicit.concat(definition.implicit); - if (definition.explicit) explicit = explicit.concat(definition.explicit); - - } else { - throw new exception('Schema.extend argument should be a Type, [ Type ], ' + - 'or a schema definition ({ implicit: [...], explicit: [...] })'); - } - - implicit.forEach(function (type$1) { - if (!(type$1 instanceof type)) { - throw new exception('Specified list of YAML types (or a single Type object) contains a non-Type object.'); - } - - if (type$1.loadKind && type$1.loadKind !== 'scalar') { - throw new exception('There is a non-scalar type in the implicit list of a schema. Implicit resolving of such types is not supported.'); - } - - if (type$1.multi) { - throw new exception('There is a multi type in the implicit list of a schema. Multi tags can only be listed as explicit.'); - } - }); - - explicit.forEach(function (type$1) { - if (!(type$1 instanceof type)) { - throw new exception('Specified list of YAML types (or a single Type object) contains a non-Type object.'); - } - }); - - var result = Object.create(Schema$1.prototype); - - result.implicit = (this.implicit || []).concat(implicit); - result.explicit = (this.explicit || []).concat(explicit); - - result.compiledImplicit = compileList(result, 'implicit'); - result.compiledExplicit = compileList(result, 'explicit'); - result.compiledTypeMap = compileMap(result.compiledImplicit, result.compiledExplicit); - - return result; - }; - - - var schema = Schema$1; - - var str = new type('tag:yaml.org,2002:str', { - kind: 'scalar', - construct: function (data) { - return data !== null ? data : ''; - } - }); - - var seq = new type('tag:yaml.org,2002:seq', { - kind: 'sequence', - construct: function (data) { - return data !== null ? data : []; - } - }); - - var map = new type('tag:yaml.org,2002:map', { - kind: 'mapping', - construct: function (data) { - return data !== null ? data : {}; - } - }); - - var failsafe = new schema({ - explicit: [ - str, - seq, - map - ] - }); - - function resolveYamlNull(data) { - if (data === null) return true; - - var max = data.length; - - return (max === 1 && data === '~') || - (max === 4 && (data === 'null' || data === 'Null' || data === 'NULL')); - } - - function constructYamlNull() { - return null; - } - - function isNull(object) { - return object === null; - } - - var _null = new type('tag:yaml.org,2002:null', { - kind: 'scalar', - resolve: resolveYamlNull, - construct: constructYamlNull, - predicate: isNull, - represent: { - canonical: function () { - return '~'; - }, - lowercase: function () { - return 'null'; - }, - uppercase: function () { - return 'NULL'; - }, - camelcase: function () { - return 'Null'; - }, - empty: function () { - return ''; - } - }, - defaultStyle: 'lowercase' - }); - - function resolveYamlBoolean(data) { - if (data === null) return false; - - var max = data.length; - - return (max === 4 && (data === 'true' || data === 'True' || data === 'TRUE')) || - (max === 5 && (data === 'false' || data === 'False' || data === 'FALSE')); - } - - function constructYamlBoolean(data) { - return data === 'true' || - data === 'True' || - data === 'TRUE'; - } - - function isBoolean(object) { - return Object.prototype.toString.call(object) === '[object Boolean]'; - } - - var bool = new type('tag:yaml.org,2002:bool', { - kind: 'scalar', - resolve: resolveYamlBoolean, - construct: constructYamlBoolean, - predicate: isBoolean, - represent: { - lowercase: function (object) { - return object ? 'true' : 'false'; - }, - uppercase: function (object) { - return object ? 'TRUE' : 'FALSE'; - }, - camelcase: function (object) { - return object ? 'True' : 'False'; - } - }, - defaultStyle: 'lowercase' - }); - - function isHexCode(c) { - return ((0x30/* 0 */ <= c) && (c <= 0x39/* 9 */)) || - ((0x41/* A */ <= c) && (c <= 0x46/* F */)) || - ((0x61/* a */ <= c) && (c <= 0x66/* f */)); - } - - function isOctCode(c) { - return ((0x30/* 0 */ <= c) && (c <= 0x37/* 7 */)); - } - - function isDecCode(c) { - return ((0x30/* 0 */ <= c) && (c <= 0x39/* 9 */)); - } - - function resolveYamlInteger(data) { - if (data === null) return false; - - var max = data.length, - index = 0, - hasDigits = false, - ch; - - if (!max) return false; - - ch = data[index]; - - // sign - if (ch === '-' || ch === '+') { - ch = data[++index]; - } - - if (ch === '0') { - // 0 - if (index + 1 === max) return true; - ch = data[++index]; - - // base 2, base 8, base 16 - - if (ch === 'b') { - // base 2 - index++; - - for (; index < max; index++) { - ch = data[index]; - if (ch === '_') continue; - if (ch !== '0' && ch !== '1') return false; - hasDigits = true; - } - return hasDigits && ch !== '_'; - } - - - if (ch === 'x') { - // base 16 - index++; - - for (; index < max; index++) { - ch = data[index]; - if (ch === '_') continue; - if (!isHexCode(data.charCodeAt(index))) return false; - hasDigits = true; - } - return hasDigits && ch !== '_'; - } - - - if (ch === 'o') { - // base 8 - index++; - - for (; index < max; index++) { - ch = data[index]; - if (ch === '_') continue; - if (!isOctCode(data.charCodeAt(index))) return false; - hasDigits = true; - } - return hasDigits && ch !== '_'; - } - } - - // base 10 (except 0) - - // value should not start with `_`; - if (ch === '_') return false; - - for (; index < max; index++) { - ch = data[index]; - if (ch === '_') continue; - if (!isDecCode(data.charCodeAt(index))) { - return false; - } - hasDigits = true; - } - - // Should have digits and should not end with `_` - if (!hasDigits || ch === '_') return false; - - return true; - } - - function constructYamlInteger(data) { - var value = data, sign = 1, ch; - - if (value.indexOf('_') !== -1) { - value = value.replace(/_/g, ''); - } - - ch = value[0]; - - if (ch === '-' || ch === '+') { - if (ch === '-') sign = -1; - value = value.slice(1); - ch = value[0]; - } - - if (value === '0') return 0; - - if (ch === '0') { - if (value[1] === 'b') return sign * parseInt(value.slice(2), 2); - if (value[1] === 'x') return sign * parseInt(value.slice(2), 16); - if (value[1] === 'o') return sign * parseInt(value.slice(2), 8); - } - - return sign * parseInt(value, 10); - } - - function isInteger(object) { - return (Object.prototype.toString.call(object)) === '[object Number]' && - (object % 1 === 0 && !common.isNegativeZero(object)); - } - - var int = new type('tag:yaml.org,2002:int', { - kind: 'scalar', - resolve: resolveYamlInteger, - construct: constructYamlInteger, - predicate: isInteger, - represent: { - binary: function (obj) { - return obj >= 0 ? '0b' + obj.toString(2) : '-0b' + obj.toString(2).slice(1); - }, - octal: function (obj) { - return obj >= 0 ? '0o' + obj.toString(8) : '-0o' + obj.toString(8).slice(1); - }, - decimal: function (obj) { - return obj.toString(10); - }, - /* eslint-disable max-len */ - hexadecimal: function (obj) { - return obj >= 0 ? '0x' + obj.toString(16).toUpperCase() : '-0x' + obj.toString(16).toUpperCase().slice(1); - } - }, - defaultStyle: 'decimal', - styleAliases: { - binary: [2, 'bin'], - octal: [8, 'oct'], - decimal: [10, 'dec'], - hexadecimal: [16, 'hex'] - } - }); - - var YAML_FLOAT_PATTERN = new RegExp( - // 2.5e4, 2.5 and integers - '^(?:[-+]?(?:[0-9][0-9_]*)(?:\\.[0-9_]*)?(?:[eE][-+]?[0-9]+)?' + - // .2e4, .2 - // special case, seems not from spec - '|\\.[0-9_]+(?:[eE][-+]?[0-9]+)?' + - // .inf - '|[-+]?\\.(?:inf|Inf|INF)' + - // .nan - '|\\.(?:nan|NaN|NAN))$'); - - function resolveYamlFloat(data) { - if (data === null) return false; - - if (!YAML_FLOAT_PATTERN.test(data) || - // Quick hack to not allow integers end with `_` - // Probably should update regexp & check speed - data[data.length - 1] === '_') { - return false; - } - - return true; - } - - function constructYamlFloat(data) { - var value, sign; - - value = data.replace(/_/g, '').toLowerCase(); - sign = value[0] === '-' ? -1 : 1; - - if ('+-'.indexOf(value[0]) >= 0) { - value = value.slice(1); - } - - if (value === '.inf') { - return (sign === 1) ? Number.POSITIVE_INFINITY : Number.NEGATIVE_INFINITY; - - } else if (value === '.nan') { - return NaN; - } - return sign * parseFloat(value, 10); - } - - - var SCIENTIFIC_WITHOUT_DOT = /^[-+]?[0-9]+e/; - - function representYamlFloat(object, style) { - var res; - - if (isNaN(object)) { - switch (style) { - case 'lowercase': - return '.nan'; - case 'uppercase': - return '.NAN'; - case 'camelcase': - return '.NaN'; - } - } else if (Number.POSITIVE_INFINITY === object) { - switch (style) { - case 'lowercase': - return '.inf'; - case 'uppercase': - return '.INF'; - case 'camelcase': - return '.Inf'; - } - } else if (Number.NEGATIVE_INFINITY === object) { - switch (style) { - case 'lowercase': - return '-.inf'; - case 'uppercase': - return '-.INF'; - case 'camelcase': - return '-.Inf'; - } - } else if (common.isNegativeZero(object)) { - return '-0.0'; - } - - res = object.toString(10); - - // JS stringifier can build scientific format without dots: 5e-100, - // while YAML requres dot: 5.e-100. Fix it with simple hack - - return SCIENTIFIC_WITHOUT_DOT.test(res) ? res.replace('e', '.e') : res; - } - - function isFloat(object) { - return (Object.prototype.toString.call(object) === '[object Number]') && - (object % 1 !== 0 || common.isNegativeZero(object)); - } - - var float = new type('tag:yaml.org,2002:float', { - kind: 'scalar', - resolve: resolveYamlFloat, - construct: constructYamlFloat, - predicate: isFloat, - represent: representYamlFloat, - defaultStyle: 'lowercase' - }); - - var json = failsafe.extend({ - implicit: [ - _null, - bool, - int, - float - ] - }); - - var core = json; - - var YAML_DATE_REGEXP = new RegExp( - '^([0-9][0-9][0-9][0-9])' + // [1] year - '-([0-9][0-9])' + // [2] month - '-([0-9][0-9])$'); // [3] day - - var YAML_TIMESTAMP_REGEXP = new RegExp( - '^([0-9][0-9][0-9][0-9])' + // [1] year - '-([0-9][0-9]?)' + // [2] month - '-([0-9][0-9]?)' + // [3] day - '(?:[Tt]|[ \\t]+)' + // ... - '([0-9][0-9]?)' + // [4] hour - ':([0-9][0-9])' + // [5] minute - ':([0-9][0-9])' + // [6] second - '(?:\\.([0-9]*))?' + // [7] fraction - '(?:[ \\t]*(Z|([-+])([0-9][0-9]?)' + // [8] tz [9] tz_sign [10] tz_hour - '(?::([0-9][0-9]))?))?$'); // [11] tz_minute - - function resolveYamlTimestamp(data) { - if (data === null) return false; - if (YAML_DATE_REGEXP.exec(data) !== null) return true; - if (YAML_TIMESTAMP_REGEXP.exec(data) !== null) return true; - return false; - } - - function constructYamlTimestamp(data) { - var match, year, month, day, hour, minute, second, fraction = 0, - delta = null, tz_hour, tz_minute, date; - - match = YAML_DATE_REGEXP.exec(data); - if (match === null) match = YAML_TIMESTAMP_REGEXP.exec(data); - - if (match === null) throw new Error('Date resolve error'); - - // match: [1] year [2] month [3] day - - year = +(match[1]); - month = +(match[2]) - 1; // JS month starts with 0 - day = +(match[3]); - - if (!match[4]) { // no hour - return new Date(Date.UTC(year, month, day)); - } - - // match: [4] hour [5] minute [6] second [7] fraction - - hour = +(match[4]); - minute = +(match[5]); - second = +(match[6]); - - if (match[7]) { - fraction = match[7].slice(0, 3); - while (fraction.length < 3) { // milli-seconds - fraction += '0'; - } - fraction = +fraction; - } - - // match: [8] tz [9] tz_sign [10] tz_hour [11] tz_minute - - if (match[9]) { - tz_hour = +(match[10]); - tz_minute = +(match[11] || 0); - delta = (tz_hour * 60 + tz_minute) * 60000; // delta in mili-seconds - if (match[9] === '-') delta = -delta; - } - - date = new Date(Date.UTC(year, month, day, hour, minute, second, fraction)); - - if (delta) date.setTime(date.getTime() - delta); - - return date; - } - - function representYamlTimestamp(object /*, style*/) { - return object.toISOString(); - } - - var timestamp = new type('tag:yaml.org,2002:timestamp', { - kind: 'scalar', - resolve: resolveYamlTimestamp, - construct: constructYamlTimestamp, - instanceOf: Date, - represent: representYamlTimestamp - }); - - function resolveYamlMerge(data) { - return data === '<<' || data === null; - } - - var merge = new type('tag:yaml.org,2002:merge', { - kind: 'scalar', - resolve: resolveYamlMerge - }); - - /*eslint-disable no-bitwise*/ - - -// [ 64, 65, 66 ] -> [ padding, CR, LF ] - var BASE64_MAP = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\n\r'; - - - function resolveYamlBinary(data) { - if (data === null) return false; - - var code, idx, bitlen = 0, max = data.length, map = BASE64_MAP; - - // Convert one by one. - for (idx = 0; idx < max; idx++) { - code = map.indexOf(data.charAt(idx)); - - // Skip CR/LF - if (code > 64) continue; - - // Fail on illegal characters - if (code < 0) return false; - - bitlen += 6; - } - - // If there are any bits left, source was corrupted - return (bitlen % 8) === 0; - } - - function constructYamlBinary(data) { - var idx, tailbits, - input = data.replace(/[\r\n=]/g, ''), // remove CR/LF & padding to simplify scan - max = input.length, - map = BASE64_MAP, - bits = 0, - result = []; - - // Collect by 6*4 bits (3 bytes) - - for (idx = 0; idx < max; idx++) { - if ((idx % 4 === 0) && idx) { - result.push((bits >> 16) & 0xFF); - result.push((bits >> 8) & 0xFF); - result.push(bits & 0xFF); - } - - bits = (bits << 6) | map.indexOf(input.charAt(idx)); - } - - // Dump tail - - tailbits = (max % 4) * 6; - - if (tailbits === 0) { - result.push((bits >> 16) & 0xFF); - result.push((bits >> 8) & 0xFF); - result.push(bits & 0xFF); - } else if (tailbits === 18) { - result.push((bits >> 10) & 0xFF); - result.push((bits >> 2) & 0xFF); - } else if (tailbits === 12) { - result.push((bits >> 4) & 0xFF); - } - - return new Uint8Array(result); - } - - function representYamlBinary(object /*, style*/) { - var result = '', bits = 0, idx, tail, - max = object.length, - map = BASE64_MAP; - - // Convert every three bytes to 4 ASCII characters. - - for (idx = 0; idx < max; idx++) { - if ((idx % 3 === 0) && idx) { - result += map[(bits >> 18) & 0x3F]; - result += map[(bits >> 12) & 0x3F]; - result += map[(bits >> 6) & 0x3F]; - result += map[bits & 0x3F]; - } - - bits = (bits << 8) + object[idx]; - } - - // Dump tail - - tail = max % 3; - - if (tail === 0) { - result += map[(bits >> 18) & 0x3F]; - result += map[(bits >> 12) & 0x3F]; - result += map[(bits >> 6) & 0x3F]; - result += map[bits & 0x3F]; - } else if (tail === 2) { - result += map[(bits >> 10) & 0x3F]; - result += map[(bits >> 4) & 0x3F]; - result += map[(bits << 2) & 0x3F]; - result += map[64]; - } else if (tail === 1) { - result += map[(bits >> 2) & 0x3F]; - result += map[(bits << 4) & 0x3F]; - result += map[64]; - result += map[64]; - } - - return result; - } - - function isBinary(obj) { - return Object.prototype.toString.call(obj) === '[object Uint8Array]'; - } - - var binary = new type('tag:yaml.org,2002:binary', { - kind: 'scalar', - resolve: resolveYamlBinary, - construct: constructYamlBinary, - predicate: isBinary, - represent: representYamlBinary - }); - - var _hasOwnProperty$3 = Object.prototype.hasOwnProperty; - var _toString$2 = Object.prototype.toString; - - function resolveYamlOmap(data) { - if (data === null) return true; - - var objectKeys = [], index, length, pair, pairKey, pairHasKey, - object = data; - - for (index = 0, length = object.length; index < length; index += 1) { - pair = object[index]; - pairHasKey = false; - - if (_toString$2.call(pair) !== '[object Object]') return false; - - for (pairKey in pair) { - if (_hasOwnProperty$3.call(pair, pairKey)) { - if (!pairHasKey) pairHasKey = true; - else return false; - } - } - - if (!pairHasKey) return false; - - if (objectKeys.indexOf(pairKey) === -1) objectKeys.push(pairKey); - else return false; - } - - return true; - } - - function constructYamlOmap(data) { - return data !== null ? data : []; - } - - var omap = new type('tag:yaml.org,2002:omap', { - kind: 'sequence', - resolve: resolveYamlOmap, - construct: constructYamlOmap - }); - - var _toString$1 = Object.prototype.toString; - - function resolveYamlPairs(data) { - if (data === null) return true; - - var index, length, pair, keys, result, - object = data; - - result = new Array(object.length); - - for (index = 0, length = object.length; index < length; index += 1) { - pair = object[index]; - - if (_toString$1.call(pair) !== '[object Object]') return false; - - keys = Object.keys(pair); - - if (keys.length !== 1) return false; - - result[index] = [keys[0], pair[keys[0]]]; - } - - return true; - } - - function constructYamlPairs(data) { - if (data === null) return []; - - var index, length, pair, keys, result, - object = data; - - result = new Array(object.length); - - for (index = 0, length = object.length; index < length; index += 1) { - pair = object[index]; - - keys = Object.keys(pair); - - result[index] = [keys[0], pair[keys[0]]]; - } - - return result; - } - - var pairs = new type('tag:yaml.org,2002:pairs', { - kind: 'sequence', - resolve: resolveYamlPairs, - construct: constructYamlPairs - }); - - var _hasOwnProperty$2 = Object.prototype.hasOwnProperty; - - function resolveYamlSet(data) { - if (data === null) return true; - - var key, object = data; - - for (key in object) { - if (_hasOwnProperty$2.call(object, key)) { - if (object[key] !== null) return false; - } - } - - return true; - } - - function constructYamlSet(data) { - return data !== null ? data : {}; - } - - var set = new type('tag:yaml.org,2002:set', { - kind: 'mapping', - resolve: resolveYamlSet, - construct: constructYamlSet - }); - - var _default = core.extend({ - implicit: [ - timestamp, - merge - ], - explicit: [ - binary, - omap, - pairs, - set - ] - }); - - /*eslint-disable max-len,no-use-before-define*/ - - - var _hasOwnProperty$1 = Object.prototype.hasOwnProperty; - - - var CONTEXT_FLOW_IN = 1; - var CONTEXT_FLOW_OUT = 2; - var CONTEXT_BLOCK_IN = 3; - var CONTEXT_BLOCK_OUT = 4; - - - var CHOMPING_CLIP = 1; - var CHOMPING_STRIP = 2; - var CHOMPING_KEEP = 3; - - - var PATTERN_NON_PRINTABLE = /[\x00-\x08\x0B\x0C\x0E-\x1F\x7F-\x84\x86-\x9F\uFFFE\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/; - var PATTERN_NON_ASCII_LINE_BREAKS = /[\x85\u2028\u2029]/; - var PATTERN_FLOW_INDICATORS = /[,\[\]\{\}]/; - var PATTERN_TAG_HANDLE = /^(?:!|!!|![a-z\-]+!)$/i; - var PATTERN_TAG_URI = /^(?:!|[^,\[\]\{\}])(?:%[0-9a-f]{2}|[0-9a-z\-#;\/\?:@&=\+\$,_\.!~\*'\(\)\[\]])*$/i; - - - function _class(obj) { - return Object.prototype.toString.call(obj); - } - - function is_EOL(c) { - return (c === 0x0A/* LF */) || (c === 0x0D/* CR */); - } - - function is_WHITE_SPACE(c) { - return (c === 0x09/* Tab */) || (c === 0x20/* Space */); - } - - function is_WS_OR_EOL(c) { - return (c === 0x09/* Tab */) || - (c === 0x20/* Space */) || - (c === 0x0A/* LF */) || - (c === 0x0D/* CR */); - } - - function is_FLOW_INDICATOR(c) { - return c === 0x2C/* , */ || - c === 0x5B/* [ */ || - c === 0x5D/* ] */ || - c === 0x7B/* { */ || - c === 0x7D/* } */; - } - - function fromHexCode(c) { - var lc; - - if ((0x30/* 0 */ <= c) && (c <= 0x39/* 9 */)) { - return c - 0x30; - } - - /*eslint-disable no-bitwise*/ - lc = c | 0x20; - - if ((0x61/* a */ <= lc) && (lc <= 0x66/* f */)) { - return lc - 0x61 + 10; - } - - return -1; - } - - function escapedHexLen(c) { - if (c === 0x78/* x */) { - return 2; - } - if (c === 0x75/* u */) { - return 4; - } - if (c === 0x55/* U */) { - return 8; - } - return 0; - } - - function fromDecimalCode(c) { - if ((0x30/* 0 */ <= c) && (c <= 0x39/* 9 */)) { - return c - 0x30; - } - - return -1; - } - - function simpleEscapeSequence(c) { - /* eslint-disable indent */ - return (c === 0x30/* 0 */) ? '\x00' : - (c === 0x61/* a */) ? '\x07' : - (c === 0x62/* b */) ? '\x08' : - (c === 0x74/* t */) ? '\x09' : - (c === 0x09/* Tab */) ? '\x09' : - (c === 0x6E/* n */) ? '\x0A' : - (c === 0x76/* v */) ? '\x0B' : - (c === 0x66/* f */) ? '\x0C' : - (c === 0x72/* r */) ? '\x0D' : - (c === 0x65/* e */) ? '\x1B' : - (c === 0x20/* Space */) ? ' ' : - (c === 0x22/* " */) ? '\x22' : - (c === 0x2F/* / */) ? '/' : - (c === 0x5C/* \ */) ? '\x5C' : - (c === 0x4E/* N */) ? '\x85' : - (c === 0x5F/* _ */) ? '\xA0' : - (c === 0x4C/* L */) ? '\u2028' : - (c === 0x50/* P */) ? '\u2029' : ''; - } - - function charFromCodepoint(c) { - if (c <= 0xFFFF) { - return String.fromCharCode(c); - } - // Encode UTF-16 surrogate pair - // https://en.wikipedia.org/wiki/UTF-16#Code_points_U.2B010000_to_U.2B10FFFF - return String.fromCharCode( - ((c - 0x010000) >> 10) + 0xD800, - ((c - 0x010000) & 0x03FF) + 0xDC00 - ); - } - - var simpleEscapeCheck = new Array(256); // integer, for fast access - var simpleEscapeMap = new Array(256); - for (var i = 0; i < 256; i++) { - simpleEscapeCheck[i] = simpleEscapeSequence(i) ? 1 : 0; - simpleEscapeMap[i] = simpleEscapeSequence(i); - } - - - function State$1(input, options) { - this.input = input; - - this.filename = options['filename'] || null; - this.schema = options['schema'] || _default; - this.onWarning = options['onWarning'] || null; - // (Hidden) Remove? makes the loader to expect YAML 1.1 documents - // if such documents have no explicit %YAML directive - this.legacy = options['legacy'] || false; - - this.json = options['json'] || false; - this.listener = options['listener'] || null; - - this.implicitTypes = this.schema.compiledImplicit; - this.typeMap = this.schema.compiledTypeMap; - - this.length = input.length; - this.position = 0; - this.line = 0; - this.lineStart = 0; - this.lineIndent = 0; - - // position of first leading tab in the current line, - // used to make sure there are no tabs in the indentation - this.firstTabInLine = -1; - - this.documents = []; - - /* - this.version; - this.checkLineBreaks; - this.tagMap; - this.anchorMap; - this.tag; - this.anchor; - this.kind; - this.result;*/ - - } - - - function generateError(state, message) { - var mark = { - name: state.filename, - buffer: state.input.slice(0, -1), // omit trailing \0 - position: state.position, - line: state.line, - column: state.position - state.lineStart - }; - - mark.snippet = snippet(mark); - - return new exception(message, mark); - } - - function throwError(state, message) { - throw generateError(state, message); - } - - function throwWarning(state, message) { - if (state.onWarning) { - state.onWarning.call(null, generateError(state, message)); - } - } - - - var directiveHandlers = { - - YAML: function handleYamlDirective(state, name, args) { - - var match, major, minor; - - if (state.version !== null) { - throwError(state, 'duplication of %YAML directive'); - } - - if (args.length !== 1) { - throwError(state, 'YAML directive accepts exactly one argument'); - } - - match = /^([0-9]+)\.([0-9]+)$/.exec(args[0]); - - if (match === null) { - throwError(state, 'ill-formed argument of the YAML directive'); - } - - major = parseInt(match[1], 10); - minor = parseInt(match[2], 10); - - if (major !== 1) { - throwError(state, 'unacceptable YAML version of the document'); - } - - state.version = args[0]; - state.checkLineBreaks = (minor < 2); - - if (minor !== 1 && minor !== 2) { - throwWarning(state, 'unsupported YAML version of the document'); - } - }, - - TAG: function handleTagDirective(state, name, args) { - - var handle, prefix; - - if (args.length !== 2) { - throwError(state, 'TAG directive accepts exactly two arguments'); - } - - handle = args[0]; - prefix = args[1]; - - if (!PATTERN_TAG_HANDLE.test(handle)) { - throwError(state, 'ill-formed tag handle (first argument) of the TAG directive'); - } - - if (_hasOwnProperty$1.call(state.tagMap, handle)) { - throwError(state, 'there is a previously declared suffix for "' + handle + '" tag handle'); - } - - if (!PATTERN_TAG_URI.test(prefix)) { - throwError(state, 'ill-formed tag prefix (second argument) of the TAG directive'); - } - - try { - prefix = decodeURIComponent(prefix); - } catch (err) { - throwError(state, 'tag prefix is malformed: ' + prefix); - } - - state.tagMap[handle] = prefix; - } - }; - - - function captureSegment(state, start, end, checkJson) { - var _position, _length, _character, _result; - - if (start < end) { - _result = state.input.slice(start, end); - - if (checkJson) { - for (_position = 0, _length = _result.length; _position < _length; _position += 1) { - _character = _result.charCodeAt(_position); - if (!(_character === 0x09 || - (0x20 <= _character && _character <= 0x10FFFF))) { - throwError(state, 'expected valid JSON character'); - } - } - } else if (PATTERN_NON_PRINTABLE.test(_result)) { - throwError(state, 'the stream contains non-printable characters'); - } - - state.result += _result; - } - } - - function mergeMappings(state, destination, source, overridableKeys) { - var sourceKeys, key, index, quantity; - - if (!common.isObject(source)) { - throwError(state, 'cannot merge mappings; the provided source object is unacceptable'); - } - - sourceKeys = Object.keys(source); - - for (index = 0, quantity = sourceKeys.length; index < quantity; index += 1) { - key = sourceKeys[index]; - - if (!_hasOwnProperty$1.call(destination, key)) { - destination[key] = source[key]; - overridableKeys[key] = true; - } - } - } - - function storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, valueNode, - startLine, startLineStart, startPos) { - - var index, quantity; - - // The output is a plain object here, so keys can only be strings. - // We need to convert keyNode to a string, but doing so can hang the process - // (deeply nested arrays that explode exponentially using aliases). - if (Array.isArray(keyNode)) { - keyNode = Array.prototype.slice.call(keyNode); - - for (index = 0, quantity = keyNode.length; index < quantity; index += 1) { - if (Array.isArray(keyNode[index])) { - throwError(state, 'nested arrays are not supported inside keys'); - } - - if (typeof keyNode === 'object' && _class(keyNode[index]) === '[object Object]') { - keyNode[index] = '[object Object]'; - } - } - } - - // Avoid code execution in load() via toString property - // (still use its own toString for arrays, timestamps, - // and whatever user schema extensions happen to have @@toStringTag) - if (typeof keyNode === 'object' && _class(keyNode) === '[object Object]') { - keyNode = '[object Object]'; - } - - - keyNode = String(keyNode); - - if (_result === null) { - _result = {}; - } - - if (keyTag === 'tag:yaml.org,2002:merge') { - if (Array.isArray(valueNode)) { - for (index = 0, quantity = valueNode.length; index < quantity; index += 1) { - mergeMappings(state, _result, valueNode[index], overridableKeys); - } - } else { - mergeMappings(state, _result, valueNode, overridableKeys); - } - } else { - if (!state.json && - !_hasOwnProperty$1.call(overridableKeys, keyNode) && - _hasOwnProperty$1.call(_result, keyNode)) { - state.line = startLine || state.line; - state.lineStart = startLineStart || state.lineStart; - state.position = startPos || state.position; - throwError(state, 'duplicated mapping key'); - } - - // used for this specific key only because Object.defineProperty is slow - if (keyNode === '__proto__') { - Object.defineProperty(_result, keyNode, { - configurable: true, - enumerable: true, - writable: true, - value: valueNode - }); - } else { - _result[keyNode] = valueNode; - } - delete overridableKeys[keyNode]; - } - - return _result; - } - - function readLineBreak(state) { - var ch; - - ch = state.input.charCodeAt(state.position); - - if (ch === 0x0A/* LF */) { - state.position++; - } else if (ch === 0x0D/* CR */) { - state.position++; - if (state.input.charCodeAt(state.position) === 0x0A/* LF */) { - state.position++; - } - } else { - throwError(state, 'a line break is expected'); - } - - state.line += 1; - state.lineStart = state.position; - state.firstTabInLine = -1; - } - - function skipSeparationSpace(state, allowComments, checkIndent) { - var lineBreaks = 0, - ch = state.input.charCodeAt(state.position); - - while (ch !== 0) { - while (is_WHITE_SPACE(ch)) { - if (ch === 0x09/* Tab */ && state.firstTabInLine === -1) { - state.firstTabInLine = state.position; - } - ch = state.input.charCodeAt(++state.position); - } - - if (allowComments && ch === 0x23/* # */) { - do { - ch = state.input.charCodeAt(++state.position); - } while (ch !== 0x0A/* LF */ && ch !== 0x0D/* CR */ && ch !== 0); - } - - if (is_EOL(ch)) { - readLineBreak(state); - - ch = state.input.charCodeAt(state.position); - lineBreaks++; - state.lineIndent = 0; - - while (ch === 0x20/* Space */) { - state.lineIndent++; - ch = state.input.charCodeAt(++state.position); - } - } else { - break; - } - } - - if (checkIndent !== -1 && lineBreaks !== 0 && state.lineIndent < checkIndent) { - throwWarning(state, 'deficient indentation'); - } - - return lineBreaks; - } - - function testDocumentSeparator(state) { - var _position = state.position, - ch; - - ch = state.input.charCodeAt(_position); - - // Condition state.position === state.lineStart is tested - // in parent on each call, for efficiency. No needs to test here again. - if ((ch === 0x2D/* - */ || ch === 0x2E/* . */) && - ch === state.input.charCodeAt(_position + 1) && - ch === state.input.charCodeAt(_position + 2)) { - - _position += 3; - - ch = state.input.charCodeAt(_position); - - if (ch === 0 || is_WS_OR_EOL(ch)) { - return true; - } - } - - return false; - } - - function writeFoldedLines(state, count) { - if (count === 1) { - state.result += ' '; - } else if (count > 1) { - state.result += common.repeat('\n', count - 1); - } - } - - - function readPlainScalar(state, nodeIndent, withinFlowCollection) { - var preceding, - following, - captureStart, - captureEnd, - hasPendingContent, - _line, - _lineStart, - _lineIndent, - _kind = state.kind, - _result = state.result, - ch; - - ch = state.input.charCodeAt(state.position); - - if (is_WS_OR_EOL(ch) || - is_FLOW_INDICATOR(ch) || - ch === 0x23/* # */ || - ch === 0x26/* & */ || - ch === 0x2A/* * */ || - ch === 0x21/* ! */ || - ch === 0x7C/* | */ || - ch === 0x3E/* > */ || - ch === 0x27/* ' */ || - ch === 0x22/* " */ || - ch === 0x25/* % */ || - ch === 0x40/* @ */ || - ch === 0x60/* ` */) { - return false; - } - - if (ch === 0x3F/* ? */ || ch === 0x2D/* - */) { - following = state.input.charCodeAt(state.position + 1); - - if (is_WS_OR_EOL(following) || - withinFlowCollection && is_FLOW_INDICATOR(following)) { - return false; - } - } - - state.kind = 'scalar'; - state.result = ''; - captureStart = captureEnd = state.position; - hasPendingContent = false; - - while (ch !== 0) { - if (ch === 0x3A/* : */) { - following = state.input.charCodeAt(state.position + 1); - - if (is_WS_OR_EOL(following) || - withinFlowCollection && is_FLOW_INDICATOR(following)) { - break; - } - - } else if (ch === 0x23/* # */) { - preceding = state.input.charCodeAt(state.position - 1); - - if (is_WS_OR_EOL(preceding)) { - break; - } - - } else if ((state.position === state.lineStart && testDocumentSeparator(state)) || - withinFlowCollection && is_FLOW_INDICATOR(ch)) { - break; - - } else if (is_EOL(ch)) { - _line = state.line; - _lineStart = state.lineStart; - _lineIndent = state.lineIndent; - skipSeparationSpace(state, false, -1); - - if (state.lineIndent >= nodeIndent) { - hasPendingContent = true; - ch = state.input.charCodeAt(state.position); - continue; - } else { - state.position = captureEnd; - state.line = _line; - state.lineStart = _lineStart; - state.lineIndent = _lineIndent; - break; - } - } - - if (hasPendingContent) { - captureSegment(state, captureStart, captureEnd, false); - writeFoldedLines(state, state.line - _line); - captureStart = captureEnd = state.position; - hasPendingContent = false; - } - - if (!is_WHITE_SPACE(ch)) { - captureEnd = state.position + 1; - } - - ch = state.input.charCodeAt(++state.position); - } - - captureSegment(state, captureStart, captureEnd, false); - - if (state.result) { - return true; - } - - state.kind = _kind; - state.result = _result; - return false; - } - - function readSingleQuotedScalar(state, nodeIndent) { - var ch, - captureStart, captureEnd; - - ch = state.input.charCodeAt(state.position); - - if (ch !== 0x27/* ' */) { - return false; - } - - state.kind = 'scalar'; - state.result = ''; - state.position++; - captureStart = captureEnd = state.position; - - while ((ch = state.input.charCodeAt(state.position)) !== 0) { - if (ch === 0x27/* ' */) { - captureSegment(state, captureStart, state.position, true); - ch = state.input.charCodeAt(++state.position); - - if (ch === 0x27/* ' */) { - captureStart = state.position; - state.position++; - captureEnd = state.position; - } else { - return true; - } - - } else if (is_EOL(ch)) { - captureSegment(state, captureStart, captureEnd, true); - writeFoldedLines(state, skipSeparationSpace(state, false, nodeIndent)); - captureStart = captureEnd = state.position; - - } else if (state.position === state.lineStart && testDocumentSeparator(state)) { - throwError(state, 'unexpected end of the document within a single quoted scalar'); - - } else { - state.position++; - captureEnd = state.position; - } - } - - throwError(state, 'unexpected end of the stream within a single quoted scalar'); - } - - function readDoubleQuotedScalar(state, nodeIndent) { - var captureStart, - captureEnd, - hexLength, - hexResult, - tmp, - ch; - - ch = state.input.charCodeAt(state.position); - - if (ch !== 0x22/* " */) { - return false; - } - - state.kind = 'scalar'; - state.result = ''; - state.position++; - captureStart = captureEnd = state.position; - - while ((ch = state.input.charCodeAt(state.position)) !== 0) { - if (ch === 0x22/* " */) { - captureSegment(state, captureStart, state.position, true); - state.position++; - return true; - - } else if (ch === 0x5C/* \ */) { - captureSegment(state, captureStart, state.position, true); - ch = state.input.charCodeAt(++state.position); - - if (is_EOL(ch)) { - skipSeparationSpace(state, false, nodeIndent); - - // TODO: rework to inline fn with no type cast? - } else if (ch < 256 && simpleEscapeCheck[ch]) { - state.result += simpleEscapeMap[ch]; - state.position++; - - } else if ((tmp = escapedHexLen(ch)) > 0) { - hexLength = tmp; - hexResult = 0; - - for (; hexLength > 0; hexLength--) { - ch = state.input.charCodeAt(++state.position); - - if ((tmp = fromHexCode(ch)) >= 0) { - hexResult = (hexResult << 4) + tmp; - - } else { - throwError(state, 'expected hexadecimal character'); - } - } - - state.result += charFromCodepoint(hexResult); - - state.position++; - - } else { - throwError(state, 'unknown escape sequence'); - } - - captureStart = captureEnd = state.position; - - } else if (is_EOL(ch)) { - captureSegment(state, captureStart, captureEnd, true); - writeFoldedLines(state, skipSeparationSpace(state, false, nodeIndent)); - captureStart = captureEnd = state.position; - - } else if (state.position === state.lineStart && testDocumentSeparator(state)) { - throwError(state, 'unexpected end of the document within a double quoted scalar'); - - } else { - state.position++; - captureEnd = state.position; - } - } - - throwError(state, 'unexpected end of the stream within a double quoted scalar'); - } - - function readFlowCollection(state, nodeIndent) { - var readNext = true, - _line, - _lineStart, - _pos, - _tag = state.tag, - _result, - _anchor = state.anchor, - following, - terminator, - isPair, - isExplicitPair, - isMapping, - overridableKeys = Object.create(null), - keyNode, - keyTag, - valueNode, - ch; - - ch = state.input.charCodeAt(state.position); - - if (ch === 0x5B/* [ */) { - terminator = 0x5D;/* ] */ - isMapping = false; - _result = []; - } else if (ch === 0x7B/* { */) { - terminator = 0x7D;/* } */ - isMapping = true; - _result = {}; - } else { - return false; - } - - if (state.anchor !== null) { - state.anchorMap[state.anchor] = _result; - } - - ch = state.input.charCodeAt(++state.position); - - while (ch !== 0) { - skipSeparationSpace(state, true, nodeIndent); - - ch = state.input.charCodeAt(state.position); - - if (ch === terminator) { - state.position++; - state.tag = _tag; - state.anchor = _anchor; - state.kind = isMapping ? 'mapping' : 'sequence'; - state.result = _result; - return true; - } else if (!readNext) { - throwError(state, 'missed comma between flow collection entries'); - } else if (ch === 0x2C/* , */) { - // "flow collection entries can never be completely empty", as per YAML 1.2, section 7.4 - throwError(state, "expected the node content, but found ','"); - } - - keyTag = keyNode = valueNode = null; - isPair = isExplicitPair = false; - - if (ch === 0x3F/* ? */) { - following = state.input.charCodeAt(state.position + 1); - - if (is_WS_OR_EOL(following)) { - isPair = isExplicitPair = true; - state.position++; - skipSeparationSpace(state, true, nodeIndent); - } - } - - _line = state.line; // Save the current line. - _lineStart = state.lineStart; - _pos = state.position; - composeNode(state, nodeIndent, CONTEXT_FLOW_IN, false, true); - keyTag = state.tag; - keyNode = state.result; - skipSeparationSpace(state, true, nodeIndent); - - ch = state.input.charCodeAt(state.position); - - if ((isExplicitPair || state.line === _line) && ch === 0x3A/* : */) { - isPair = true; - ch = state.input.charCodeAt(++state.position); - skipSeparationSpace(state, true, nodeIndent); - composeNode(state, nodeIndent, CONTEXT_FLOW_IN, false, true); - valueNode = state.result; - } - - if (isMapping) { - storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, valueNode, _line, _lineStart, _pos); - } else if (isPair) { - _result.push(storeMappingPair(state, null, overridableKeys, keyTag, keyNode, valueNode, _line, _lineStart, _pos)); - } else { - _result.push(keyNode); - } - - skipSeparationSpace(state, true, nodeIndent); - - ch = state.input.charCodeAt(state.position); - - if (ch === 0x2C/* , */) { - readNext = true; - ch = state.input.charCodeAt(++state.position); - } else { - readNext = false; - } - } - - throwError(state, 'unexpected end of the stream within a flow collection'); - } - - function readBlockScalar(state, nodeIndent) { - var captureStart, - folding, - chomping = CHOMPING_CLIP, - didReadContent = false, - detectedIndent = false, - textIndent = nodeIndent, - emptyLines = 0, - atMoreIndented = false, - tmp, - ch; - - ch = state.input.charCodeAt(state.position); - - if (ch === 0x7C/* | */) { - folding = false; - } else if (ch === 0x3E/* > */) { - folding = true; - } else { - return false; - } - - state.kind = 'scalar'; - state.result = ''; - - while (ch !== 0) { - ch = state.input.charCodeAt(++state.position); - - if (ch === 0x2B/* + */ || ch === 0x2D/* - */) { - if (CHOMPING_CLIP === chomping) { - chomping = (ch === 0x2B/* + */) ? CHOMPING_KEEP : CHOMPING_STRIP; - } else { - throwError(state, 'repeat of a chomping mode identifier'); - } - - } else if ((tmp = fromDecimalCode(ch)) >= 0) { - if (tmp === 0) { - throwError(state, 'bad explicit indentation width of a block scalar; it cannot be less than one'); - } else if (!detectedIndent) { - textIndent = nodeIndent + tmp - 1; - detectedIndent = true; - } else { - throwError(state, 'repeat of an indentation width identifier'); - } - - } else { - break; - } - } - - if (is_WHITE_SPACE(ch)) { - do { - ch = state.input.charCodeAt(++state.position); - } - while (is_WHITE_SPACE(ch)); - - if (ch === 0x23/* # */) { - do { - ch = state.input.charCodeAt(++state.position); - } - while (!is_EOL(ch) && (ch !== 0)); - } - } - - while (ch !== 0) { - readLineBreak(state); - state.lineIndent = 0; - - ch = state.input.charCodeAt(state.position); - - while ((!detectedIndent || state.lineIndent < textIndent) && - (ch === 0x20/* Space */)) { - state.lineIndent++; - ch = state.input.charCodeAt(++state.position); - } - - if (!detectedIndent && state.lineIndent > textIndent) { - textIndent = state.lineIndent; - } - - if (is_EOL(ch)) { - emptyLines++; - continue; - } - - // End of the scalar. - if (state.lineIndent < textIndent) { - - // Perform the chomping. - if (chomping === CHOMPING_KEEP) { - state.result += common.repeat('\n', didReadContent ? 1 + emptyLines : emptyLines); - } else if (chomping === CHOMPING_CLIP) { - if (didReadContent) { // i.e. only if the scalar is not empty. - state.result += '\n'; - } - } - - // Break this `while` cycle and go to the funciton's epilogue. - break; - } - - // Folded style: use fancy rules to handle line breaks. - if (folding) { - - // Lines starting with white space characters (more-indented lines) are not folded. - if (is_WHITE_SPACE(ch)) { - atMoreIndented = true; - // except for the first content line (cf. Example 8.1) - state.result += common.repeat('\n', didReadContent ? 1 + emptyLines : emptyLines); - - // End of more-indented block. - } else if (atMoreIndented) { - atMoreIndented = false; - state.result += common.repeat('\n', emptyLines + 1); - - // Just one line break - perceive as the same line. - } else if (emptyLines === 0) { - if (didReadContent) { // i.e. only if we have already read some scalar content. - state.result += ' '; - } - - // Several line breaks - perceive as different lines. - } else { - state.result += common.repeat('\n', emptyLines); - } - - // Literal style: just add exact number of line breaks between content lines. - } else { - // Keep all line breaks except the header line break. - state.result += common.repeat('\n', didReadContent ? 1 + emptyLines : emptyLines); - } - - didReadContent = true; - detectedIndent = true; - emptyLines = 0; - captureStart = state.position; - - while (!is_EOL(ch) && (ch !== 0)) { - ch = state.input.charCodeAt(++state.position); - } - - captureSegment(state, captureStart, state.position, false); - } - - return true; - } - - function readBlockSequence(state, nodeIndent) { - var _line, - _tag = state.tag, - _anchor = state.anchor, - _result = [], - following, - detected = false, - ch; - - // there is a leading tab before this token, so it can't be a block sequence/mapping; - // it can still be flow sequence/mapping or a scalar - if (state.firstTabInLine !== -1) return false; - - if (state.anchor !== null) { - state.anchorMap[state.anchor] = _result; - } - - ch = state.input.charCodeAt(state.position); - - while (ch !== 0) { - if (state.firstTabInLine !== -1) { - state.position = state.firstTabInLine; - throwError(state, 'tab characters must not be used in indentation'); - } - - if (ch !== 0x2D/* - */) { - break; - } - - following = state.input.charCodeAt(state.position + 1); - - if (!is_WS_OR_EOL(following)) { - break; - } - - detected = true; - state.position++; - - if (skipSeparationSpace(state, true, -1)) { - if (state.lineIndent <= nodeIndent) { - _result.push(null); - ch = state.input.charCodeAt(state.position); - continue; - } - } - - _line = state.line; - composeNode(state, nodeIndent, CONTEXT_BLOCK_IN, false, true); - _result.push(state.result); - skipSeparationSpace(state, true, -1); - - ch = state.input.charCodeAt(state.position); - - if ((state.line === _line || state.lineIndent > nodeIndent) && (ch !== 0)) { - throwError(state, 'bad indentation of a sequence entry'); - } else if (state.lineIndent < nodeIndent) { - break; - } - } - - if (detected) { - state.tag = _tag; - state.anchor = _anchor; - state.kind = 'sequence'; - state.result = _result; - return true; - } - return false; - } - - function readBlockMapping(state, nodeIndent, flowIndent) { - var following, - allowCompact, - _line, - _keyLine, - _keyLineStart, - _keyPos, - _tag = state.tag, - _anchor = state.anchor, - _result = {}, - overridableKeys = Object.create(null), - keyTag = null, - keyNode = null, - valueNode = null, - atExplicitKey = false, - detected = false, - ch; - - // there is a leading tab before this token, so it can't be a block sequence/mapping; - // it can still be flow sequence/mapping or a scalar - if (state.firstTabInLine !== -1) return false; - - if (state.anchor !== null) { - state.anchorMap[state.anchor] = _result; - } - - ch = state.input.charCodeAt(state.position); - - while (ch !== 0) { - if (!atExplicitKey && state.firstTabInLine !== -1) { - state.position = state.firstTabInLine; - throwError(state, 'tab characters must not be used in indentation'); - } - - following = state.input.charCodeAt(state.position + 1); - _line = state.line; // Save the current line. - - // - // Explicit notation case. There are two separate blocks: - // first for the key (denoted by "?") and second for the value (denoted by ":") - // - if ((ch === 0x3F/* ? */ || ch === 0x3A/* : */) && is_WS_OR_EOL(following)) { - - if (ch === 0x3F/* ? */) { - if (atExplicitKey) { - storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, null, _keyLine, _keyLineStart, _keyPos); - keyTag = keyNode = valueNode = null; - } - - detected = true; - atExplicitKey = true; - allowCompact = true; - - } else if (atExplicitKey) { - // i.e. 0x3A/* : */ === character after the explicit key. - atExplicitKey = false; - allowCompact = true; - - } else { - throwError(state, 'incomplete explicit mapping pair; a key node is missed; or followed by a non-tabulated empty line'); - } - - state.position += 1; - ch = following; - - // - // Implicit notation case. Flow-style node as the key first, then ":", and the value. - // - } else { - _keyLine = state.line; - _keyLineStart = state.lineStart; - _keyPos = state.position; - - if (!composeNode(state, flowIndent, CONTEXT_FLOW_OUT, false, true)) { - // Neither implicit nor explicit notation. - // Reading is done. Go to the epilogue. - break; - } - - if (state.line === _line) { - ch = state.input.charCodeAt(state.position); - - while (is_WHITE_SPACE(ch)) { - ch = state.input.charCodeAt(++state.position); - } - - if (ch === 0x3A/* : */) { - ch = state.input.charCodeAt(++state.position); - - if (!is_WS_OR_EOL(ch)) { - throwError(state, 'a whitespace character is expected after the key-value separator within a block mapping'); - } - - if (atExplicitKey) { - storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, null, _keyLine, _keyLineStart, _keyPos); - keyTag = keyNode = valueNode = null; - } - - detected = true; - atExplicitKey = false; - allowCompact = false; - keyTag = state.tag; - keyNode = state.result; - - } else if (detected) { - throwError(state, 'can not read an implicit mapping pair; a colon is missed'); - - } else { - state.tag = _tag; - state.anchor = _anchor; - return true; // Keep the result of `composeNode`. - } - - } else if (detected) { - throwError(state, 'can not read a block mapping entry; a multiline key may not be an implicit key'); - - } else { - state.tag = _tag; - state.anchor = _anchor; - return true; // Keep the result of `composeNode`. - } - } - - // - // Common reading code for both explicit and implicit notations. - // - if (state.line === _line || state.lineIndent > nodeIndent) { - if (atExplicitKey) { - _keyLine = state.line; - _keyLineStart = state.lineStart; - _keyPos = state.position; - } - - if (composeNode(state, nodeIndent, CONTEXT_BLOCK_OUT, true, allowCompact)) { - if (atExplicitKey) { - keyNode = state.result; - } else { - valueNode = state.result; - } - } - - if (!atExplicitKey) { - storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, valueNode, _keyLine, _keyLineStart, _keyPos); - keyTag = keyNode = valueNode = null; - } - - skipSeparationSpace(state, true, -1); - ch = state.input.charCodeAt(state.position); - } - - if ((state.line === _line || state.lineIndent > nodeIndent) && (ch !== 0)) { - throwError(state, 'bad indentation of a mapping entry'); - } else if (state.lineIndent < nodeIndent) { - break; - } - } - - // - // Epilogue. - // - - // Special case: last mapping's node contains only the key in explicit notation. - if (atExplicitKey) { - storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, null, _keyLine, _keyLineStart, _keyPos); - } - - // Expose the resulting mapping. - if (detected) { - state.tag = _tag; - state.anchor = _anchor; - state.kind = 'mapping'; - state.result = _result; - } - - return detected; - } - - function readTagProperty(state) { - var _position, - isVerbatim = false, - isNamed = false, - tagHandle, - tagName, - ch; - - ch = state.input.charCodeAt(state.position); - - if (ch !== 0x21/* ! */) return false; - - if (state.tag !== null) { - throwError(state, 'duplication of a tag property'); - } - - ch = state.input.charCodeAt(++state.position); - - if (ch === 0x3C/* < */) { - isVerbatim = true; - ch = state.input.charCodeAt(++state.position); - - } else if (ch === 0x21/* ! */) { - isNamed = true; - tagHandle = '!!'; - ch = state.input.charCodeAt(++state.position); - - } else { - tagHandle = '!'; - } - - _position = state.position; - - if (isVerbatim) { - do { - ch = state.input.charCodeAt(++state.position); - } - while (ch !== 0 && ch !== 0x3E/* > */); - - if (state.position < state.length) { - tagName = state.input.slice(_position, state.position); - ch = state.input.charCodeAt(++state.position); - } else { - throwError(state, 'unexpected end of the stream within a verbatim tag'); - } - } else { - while (ch !== 0 && !is_WS_OR_EOL(ch)) { - - if (ch === 0x21/* ! */) { - if (!isNamed) { - tagHandle = state.input.slice(_position - 1, state.position + 1); - - if (!PATTERN_TAG_HANDLE.test(tagHandle)) { - throwError(state, 'named tag handle cannot contain such characters'); - } - - isNamed = true; - _position = state.position + 1; - } else { - throwError(state, 'tag suffix cannot contain exclamation marks'); - } - } - - ch = state.input.charCodeAt(++state.position); - } - - tagName = state.input.slice(_position, state.position); - - if (PATTERN_FLOW_INDICATORS.test(tagName)) { - throwError(state, 'tag suffix cannot contain flow indicator characters'); - } - } - - if (tagName && !PATTERN_TAG_URI.test(tagName)) { - throwError(state, 'tag name cannot contain such characters: ' + tagName); - } - - try { - tagName = decodeURIComponent(tagName); - } catch (err) { - throwError(state, 'tag name is malformed: ' + tagName); - } - - if (isVerbatim) { - state.tag = tagName; - - } else if (_hasOwnProperty$1.call(state.tagMap, tagHandle)) { - state.tag = state.tagMap[tagHandle] + tagName; - - } else if (tagHandle === '!') { - state.tag = '!' + tagName; - - } else if (tagHandle === '!!') { - state.tag = 'tag:yaml.org,2002:' + tagName; - - } else { - throwError(state, 'undeclared tag handle "' + tagHandle + '"'); - } - - return true; - } - - function readAnchorProperty(state) { - var _position, - ch; - - ch = state.input.charCodeAt(state.position); - - if (ch !== 0x26/* & */) return false; - - if (state.anchor !== null) { - throwError(state, 'duplication of an anchor property'); - } - - ch = state.input.charCodeAt(++state.position); - _position = state.position; - - while (ch !== 0 && !is_WS_OR_EOL(ch) && !is_FLOW_INDICATOR(ch)) { - ch = state.input.charCodeAt(++state.position); - } - - if (state.position === _position) { - throwError(state, 'name of an anchor node must contain at least one character'); - } - - state.anchor = state.input.slice(_position, state.position); - return true; - } - - function readAlias(state) { - var _position, alias, - ch; - - ch = state.input.charCodeAt(state.position); - - if (ch !== 0x2A/* * */) return false; - - ch = state.input.charCodeAt(++state.position); - _position = state.position; - - while (ch !== 0 && !is_WS_OR_EOL(ch) && !is_FLOW_INDICATOR(ch)) { - ch = state.input.charCodeAt(++state.position); - } - - if (state.position === _position) { - throwError(state, 'name of an alias node must contain at least one character'); - } - - alias = state.input.slice(_position, state.position); - - if (!_hasOwnProperty$1.call(state.anchorMap, alias)) { - throwError(state, 'unidentified alias "' + alias + '"'); - } - - state.result = state.anchorMap[alias]; - skipSeparationSpace(state, true, -1); - return true; - } - - function composeNode(state, parentIndent, nodeContext, allowToSeek, allowCompact) { - var allowBlockStyles, - allowBlockScalars, - allowBlockCollections, - indentStatus = 1, // 1: this>parent, 0: this=parent, -1: this parentIndent) { - indentStatus = 1; - } else if (state.lineIndent === parentIndent) { - indentStatus = 0; - } else if (state.lineIndent < parentIndent) { - indentStatus = -1; - } - } - } - - if (indentStatus === 1) { - while (readTagProperty(state) || readAnchorProperty(state)) { - if (skipSeparationSpace(state, true, -1)) { - atNewLine = true; - allowBlockCollections = allowBlockStyles; - - if (state.lineIndent > parentIndent) { - indentStatus = 1; - } else if (state.lineIndent === parentIndent) { - indentStatus = 0; - } else if (state.lineIndent < parentIndent) { - indentStatus = -1; - } - } else { - allowBlockCollections = false; - } - } - } - - if (allowBlockCollections) { - allowBlockCollections = atNewLine || allowCompact; - } - - if (indentStatus === 1 || CONTEXT_BLOCK_OUT === nodeContext) { - if (CONTEXT_FLOW_IN === nodeContext || CONTEXT_FLOW_OUT === nodeContext) { - flowIndent = parentIndent; - } else { - flowIndent = parentIndent + 1; - } - - blockIndent = state.position - state.lineStart; - - if (indentStatus === 1) { - if (allowBlockCollections && - (readBlockSequence(state, blockIndent) || - readBlockMapping(state, blockIndent, flowIndent)) || - readFlowCollection(state, flowIndent)) { - hasContent = true; - } else { - if ((allowBlockScalars && readBlockScalar(state, flowIndent)) || - readSingleQuotedScalar(state, flowIndent) || - readDoubleQuotedScalar(state, flowIndent)) { - hasContent = true; - - } else if (readAlias(state)) { - hasContent = true; - - if (state.tag !== null || state.anchor !== null) { - throwError(state, 'alias node should not have any properties'); - } - - } else if (readPlainScalar(state, flowIndent, CONTEXT_FLOW_IN === nodeContext)) { - hasContent = true; - - if (state.tag === null) { - state.tag = '?'; - } - } - - if (state.anchor !== null) { - state.anchorMap[state.anchor] = state.result; - } - } - } else if (indentStatus === 0) { - // Special case: block sequences are allowed to have same indentation level as the parent. - // http://www.yaml.org/spec/1.2/spec.html#id2799784 - hasContent = allowBlockCollections && readBlockSequence(state, blockIndent); - } - } - - if (state.tag === null) { - if (state.anchor !== null) { - state.anchorMap[state.anchor] = state.result; - } - - } else if (state.tag === '?') { - // Implicit resolving is not allowed for non-scalar types, and '?' - // non-specific tag is only automatically assigned to plain scalars. - // - // We only need to check kind conformity in case user explicitly assigns '?' - // tag, for example like this: "! [0]" - // - if (state.result !== null && state.kind !== 'scalar') { - throwError(state, 'unacceptable node kind for ! tag; it should be "scalar", not "' + state.kind + '"'); - } - - for (typeIndex = 0, typeQuantity = state.implicitTypes.length; typeIndex < typeQuantity; typeIndex += 1) { - type = state.implicitTypes[typeIndex]; - - if (type.resolve(state.result)) { // `state.result` updated in resolver if matched - state.result = type.construct(state.result); - state.tag = type.tag; - if (state.anchor !== null) { - state.anchorMap[state.anchor] = state.result; - } - break; - } - } - } else if (state.tag !== '!') { - if (_hasOwnProperty$1.call(state.typeMap[state.kind || 'fallback'], state.tag)) { - type = state.typeMap[state.kind || 'fallback'][state.tag]; - } else { - // looking for multi type - type = null; - typeList = state.typeMap.multi[state.kind || 'fallback']; - - for (typeIndex = 0, typeQuantity = typeList.length; typeIndex < typeQuantity; typeIndex += 1) { - if (state.tag.slice(0, typeList[typeIndex].tag.length) === typeList[typeIndex].tag) { - type = typeList[typeIndex]; - break; - } - } - } - - if (!type) { - throwError(state, 'unknown tag !<' + state.tag + '>'); - } - - if (state.result !== null && type.kind !== state.kind) { - throwError(state, 'unacceptable node kind for !<' + state.tag + '> tag; it should be "' + type.kind + '", not "' + state.kind + '"'); - } - - if (!type.resolve(state.result, state.tag)) { // `state.result` updated in resolver if matched - throwError(state, 'cannot resolve a node with !<' + state.tag + '> explicit tag'); - } else { - state.result = type.construct(state.result, state.tag); - if (state.anchor !== null) { - state.anchorMap[state.anchor] = state.result; - } - } - } - - if (state.listener !== null) { - state.listener('close', state); - } - return state.tag !== null || state.anchor !== null || hasContent; - } - - function readDocument(state) { - var documentStart = state.position, - _position, - directiveName, - directiveArgs, - hasDirectives = false, - ch; - - state.version = null; - state.checkLineBreaks = state.legacy; - state.tagMap = Object.create(null); - state.anchorMap = Object.create(null); - - while ((ch = state.input.charCodeAt(state.position)) !== 0) { - skipSeparationSpace(state, true, -1); - - ch = state.input.charCodeAt(state.position); - - if (state.lineIndent > 0 || ch !== 0x25/* % */) { - break; - } - - hasDirectives = true; - ch = state.input.charCodeAt(++state.position); - _position = state.position; - - while (ch !== 0 && !is_WS_OR_EOL(ch)) { - ch = state.input.charCodeAt(++state.position); - } - - directiveName = state.input.slice(_position, state.position); - directiveArgs = []; - - if (directiveName.length < 1) { - throwError(state, 'directive name must not be less than one character in length'); - } - - while (ch !== 0) { - while (is_WHITE_SPACE(ch)) { - ch = state.input.charCodeAt(++state.position); - } - - if (ch === 0x23/* # */) { - do { - ch = state.input.charCodeAt(++state.position); - } - while (ch !== 0 && !is_EOL(ch)); - break; - } - - if (is_EOL(ch)) break; - - _position = state.position; - - while (ch !== 0 && !is_WS_OR_EOL(ch)) { - ch = state.input.charCodeAt(++state.position); - } - - directiveArgs.push(state.input.slice(_position, state.position)); - } - - if (ch !== 0) readLineBreak(state); - - if (_hasOwnProperty$1.call(directiveHandlers, directiveName)) { - directiveHandlers[directiveName](state, directiveName, directiveArgs); - } else { - throwWarning(state, 'unknown document directive "' + directiveName + '"'); - } - } - - skipSeparationSpace(state, true, -1); - - if (state.lineIndent === 0 && - state.input.charCodeAt(state.position) === 0x2D/* - */ && - state.input.charCodeAt(state.position + 1) === 0x2D/* - */ && - state.input.charCodeAt(state.position + 2) === 0x2D/* - */) { - state.position += 3; - skipSeparationSpace(state, true, -1); - - } else if (hasDirectives) { - throwError(state, 'directives end mark is expected'); - } - - composeNode(state, state.lineIndent - 1, CONTEXT_BLOCK_OUT, false, true); - skipSeparationSpace(state, true, -1); - - if (state.checkLineBreaks && - PATTERN_NON_ASCII_LINE_BREAKS.test(state.input.slice(documentStart, state.position))) { - throwWarning(state, 'non-ASCII line breaks are interpreted as content'); - } - - state.documents.push(state.result); - - if (state.position === state.lineStart && testDocumentSeparator(state)) { - - if (state.input.charCodeAt(state.position) === 0x2E/* . */) { - state.position += 3; - skipSeparationSpace(state, true, -1); - } - return; - } - - if (state.position < (state.length - 1)) { - throwError(state, 'end of the stream or a document separator is expected'); - } else { - - } - } - - - function loadDocuments(input, options) { - input = String(input); - options = options || {}; - - if (input.length !== 0) { - - // Add tailing `\n` if not exists - if (input.charCodeAt(input.length - 1) !== 0x0A/* LF */ && - input.charCodeAt(input.length - 1) !== 0x0D/* CR */) { - input += '\n'; - } - - // Strip BOM - if (input.charCodeAt(0) === 0xFEFF) { - input = input.slice(1); - } - } - - var state = new State$1(input, options); - - var nullpos = input.indexOf('\0'); - - if (nullpos !== -1) { - state.position = nullpos; - throwError(state, 'null byte is not allowed in input'); - } - - // Use 0 as string terminator. That significantly simplifies bounds check. - state.input += '\0'; - - while (state.input.charCodeAt(state.position) === 0x20/* Space */) { - state.lineIndent += 1; - state.position += 1; - } - - while (state.position < (state.length - 1)) { - readDocument(state); - } - - return state.documents; - } - - - function loadAll$1(input, iterator, options) { - if (iterator !== null && typeof iterator === 'object' && typeof options === 'undefined') { - options = iterator; - iterator = null; - } - - var documents = loadDocuments(input, options); - - if (typeof iterator !== 'function') { - return documents; - } - - for (var index = 0, length = documents.length; index < length; index += 1) { - iterator(documents[index]); - } - } - - - function load$1(input, options) { - var documents = loadDocuments(input, options); - - if (documents.length === 0) { - /*eslint-disable no-undefined*/ - return undefined; - } else if (documents.length === 1) { - return documents[0]; - } - throw new exception('expected a single document in the stream, but found more'); - } - - - var loadAll_1 = loadAll$1; - var load_1 = load$1; - - var loader = { - loadAll: loadAll_1, - load: load_1 - }; - - /*eslint-disable no-use-before-define*/ - - - var _toString = Object.prototype.toString; - var _hasOwnProperty = Object.prototype.hasOwnProperty; - - var CHAR_BOM = 0xFEFF; - var CHAR_TAB = 0x09; /* Tab */ - var CHAR_LINE_FEED = 0x0A; /* LF */ - var CHAR_CARRIAGE_RETURN = 0x0D; /* CR */ - var CHAR_SPACE = 0x20; /* Space */ - var CHAR_EXCLAMATION = 0x21; /* ! */ - var CHAR_DOUBLE_QUOTE = 0x22; /* " */ - var CHAR_SHARP = 0x23; /* # */ - var CHAR_PERCENT = 0x25; /* % */ - var CHAR_AMPERSAND = 0x26; /* & */ - var CHAR_SINGLE_QUOTE = 0x27; /* ' */ - var CHAR_ASTERISK = 0x2A; /* * */ - var CHAR_COMMA = 0x2C; /* , */ - var CHAR_MINUS = 0x2D; /* - */ - var CHAR_COLON = 0x3A; /* : */ - var CHAR_EQUALS = 0x3D; /* = */ - var CHAR_GREATER_THAN = 0x3E; /* > */ - var CHAR_QUESTION = 0x3F; /* ? */ - var CHAR_COMMERCIAL_AT = 0x40; /* @ */ - var CHAR_LEFT_SQUARE_BRACKET = 0x5B; /* [ */ - var CHAR_RIGHT_SQUARE_BRACKET = 0x5D; /* ] */ - var CHAR_GRAVE_ACCENT = 0x60; /* ` */ - var CHAR_LEFT_CURLY_BRACKET = 0x7B; /* { */ - var CHAR_VERTICAL_LINE = 0x7C; /* | */ - var CHAR_RIGHT_CURLY_BRACKET = 0x7D; /* } */ - - var ESCAPE_SEQUENCES = {}; - - ESCAPE_SEQUENCES[0x00] = '\\0'; - ESCAPE_SEQUENCES[0x07] = '\\a'; - ESCAPE_SEQUENCES[0x08] = '\\b'; - ESCAPE_SEQUENCES[0x09] = '\\t'; - ESCAPE_SEQUENCES[0x0A] = '\\n'; - ESCAPE_SEQUENCES[0x0B] = '\\v'; - ESCAPE_SEQUENCES[0x0C] = '\\f'; - ESCAPE_SEQUENCES[0x0D] = '\\r'; - ESCAPE_SEQUENCES[0x1B] = '\\e'; - ESCAPE_SEQUENCES[0x22] = '\\"'; - ESCAPE_SEQUENCES[0x5C] = '\\\\'; - ESCAPE_SEQUENCES[0x85] = '\\N'; - ESCAPE_SEQUENCES[0xA0] = '\\_'; - ESCAPE_SEQUENCES[0x2028] = '\\L'; - ESCAPE_SEQUENCES[0x2029] = '\\P'; - - var DEPRECATED_BOOLEANS_SYNTAX = [ - 'y', 'Y', 'yes', 'Yes', 'YES', 'on', 'On', 'ON', - 'n', 'N', 'no', 'No', 'NO', 'off', 'Off', 'OFF' - ]; - - var DEPRECATED_BASE60_SYNTAX = /^[-+]?[0-9_]+(?::[0-9_]+)+(?:\.[0-9_]*)?$/; - - function compileStyleMap(schema, map) { - var result, keys, index, length, tag, style, type; - - if (map === null) return {}; - - result = {}; - keys = Object.keys(map); - - for (index = 0, length = keys.length; index < length; index += 1) { - tag = keys[index]; - style = String(map[tag]); - - if (tag.slice(0, 2) === '!!') { - tag = 'tag:yaml.org,2002:' + tag.slice(2); - } - type = schema.compiledTypeMap['fallback'][tag]; - - if (type && _hasOwnProperty.call(type.styleAliases, style)) { - style = type.styleAliases[style]; - } - - result[tag] = style; - } - - return result; - } - - function encodeHex(character) { - var string, handle, length; - - string = character.toString(16).toUpperCase(); - - if (character <= 0xFF) { - handle = 'x'; - length = 2; - } else if (character <= 0xFFFF) { - handle = 'u'; - length = 4; - } else if (character <= 0xFFFFFFFF) { - handle = 'U'; - length = 8; - } else { - throw new exception('code point within a string may not be greater than 0xFFFFFFFF'); - } - - return '\\' + handle + common.repeat('0', length - string.length) + string; - } - - - var QUOTING_TYPE_SINGLE = 1, - QUOTING_TYPE_DOUBLE = 2; - - function State(options) { - this.schema = options['schema'] || _default; - this.indent = Math.max(1, (options['indent'] || 2)); - this.noArrayIndent = options['noArrayIndent'] || false; - this.skipInvalid = options['skipInvalid'] || false; - this.flowLevel = (common.isNothing(options['flowLevel']) ? -1 : options['flowLevel']); - this.styleMap = compileStyleMap(this.schema, options['styles'] || null); - this.sortKeys = options['sortKeys'] || false; - this.lineWidth = options['lineWidth'] || 80; - this.noRefs = options['noRefs'] || false; - this.noCompatMode = options['noCompatMode'] || false; - this.condenseFlow = options['condenseFlow'] || false; - this.quotingType = options['quotingType'] === '"' ? QUOTING_TYPE_DOUBLE : QUOTING_TYPE_SINGLE; - this.forceQuotes = options['forceQuotes'] || false; - this.replacer = typeof options['replacer'] === 'function' ? options['replacer'] : null; - - this.implicitTypes = this.schema.compiledImplicit; - this.explicitTypes = this.schema.compiledExplicit; - - this.tag = null; - this.result = ''; - - this.duplicates = []; - this.usedDuplicates = null; - } - -// Indents every line in a string. Empty lines (\n only) are not indented. - function indentString(string, spaces) { - var ind = common.repeat(' ', spaces), - position = 0, - next = -1, - result = '', - line, - length = string.length; - - while (position < length) { - next = string.indexOf('\n', position); - if (next === -1) { - line = string.slice(position); - position = length; - } else { - line = string.slice(position, next + 1); - position = next + 1; - } - - if (line.length && line !== '\n') result += ind; - - result += line; - } - - return result; - } - - function generateNextLine(state, level) { - return '\n' + common.repeat(' ', state.indent * level); - } - - function testImplicitResolving(state, str) { - var index, length, type; - - for (index = 0, length = state.implicitTypes.length; index < length; index += 1) { - type = state.implicitTypes[index]; - - if (type.resolve(str)) { - return true; - } - } - - return false; - } - -// [33] s-white ::= s-space | s-tab - function isWhitespace(c) { - return c === CHAR_SPACE || c === CHAR_TAB; - } - -// Returns true if the character can be printed without escaping. -// From YAML 1.2: "any allowed characters known to be non-printable -// should also be escaped. [However,] This isn’t mandatory" -// Derived from nb-char - \t - #x85 - #xA0 - #x2028 - #x2029. - function isPrintable(c) { - return (0x00020 <= c && c <= 0x00007E) - || ((0x000A1 <= c && c <= 0x00D7FF) && c !== 0x2028 && c !== 0x2029) - || ((0x0E000 <= c && c <= 0x00FFFD) && c !== CHAR_BOM) - || (0x10000 <= c && c <= 0x10FFFF); - } - -// [34] ns-char ::= nb-char - s-white -// [27] nb-char ::= c-printable - b-char - c-byte-order-mark -// [26] b-char ::= b-line-feed | b-carriage-return -// Including s-white (for some reason, examples doesn't match specs in this aspect) -// ns-char ::= c-printable - b-line-feed - b-carriage-return - c-byte-order-mark - function isNsCharOrWhitespace(c) { - return isPrintable(c) - && c !== CHAR_BOM - // - b-char - && c !== CHAR_CARRIAGE_RETURN - && c !== CHAR_LINE_FEED; - } - -// [127] ns-plain-safe(c) ::= c = flow-out ⇒ ns-plain-safe-out -// c = flow-in ⇒ ns-plain-safe-in -// c = block-key ⇒ ns-plain-safe-out -// c = flow-key ⇒ ns-plain-safe-in -// [128] ns-plain-safe-out ::= ns-char -// [129] ns-plain-safe-in ::= ns-char - c-flow-indicator -// [130] ns-plain-char(c) ::= ( ns-plain-safe(c) - “:” - “#” ) -// | ( /* An ns-char preceding */ “#” ) -// | ( “:” /* Followed by an ns-plain-safe(c) */ ) - function isPlainSafe(c, prev, inblock) { - var cIsNsCharOrWhitespace = isNsCharOrWhitespace(c); - var cIsNsChar = cIsNsCharOrWhitespace && !isWhitespace(c); - return ( - // ns-plain-safe - inblock ? // c = flow-in - cIsNsCharOrWhitespace - : cIsNsCharOrWhitespace - // - c-flow-indicator - && c !== CHAR_COMMA - && c !== CHAR_LEFT_SQUARE_BRACKET - && c !== CHAR_RIGHT_SQUARE_BRACKET - && c !== CHAR_LEFT_CURLY_BRACKET - && c !== CHAR_RIGHT_CURLY_BRACKET - ) - // ns-plain-char - && c !== CHAR_SHARP // false on '#' - && !(prev === CHAR_COLON && !cIsNsChar) // false on ': ' - || (isNsCharOrWhitespace(prev) && !isWhitespace(prev) && c === CHAR_SHARP) // change to true on '[^ ]#' - || (prev === CHAR_COLON && cIsNsChar); // change to true on ':[^ ]' - } - -// Simplified test for values allowed as the first character in plain style. - function isPlainSafeFirst(c) { - // Uses a subset of ns-char - c-indicator - // where ns-char = nb-char - s-white. - // No support of ( ( “?” | “:” | “-” ) /* Followed by an ns-plain-safe(c)) */ ) part - return isPrintable(c) && c !== CHAR_BOM - && !isWhitespace(c) // - s-white - // - (c-indicator ::= - // “-” | “?” | “:” | “,” | “[” | “]” | “{” | “}” - && c !== CHAR_MINUS - && c !== CHAR_QUESTION - && c !== CHAR_COLON - && c !== CHAR_COMMA - && c !== CHAR_LEFT_SQUARE_BRACKET - && c !== CHAR_RIGHT_SQUARE_BRACKET - && c !== CHAR_LEFT_CURLY_BRACKET - && c !== CHAR_RIGHT_CURLY_BRACKET - // | “#” | “&” | “*” | “!” | “|” | “=” | “>” | “'” | “"” - && c !== CHAR_SHARP - && c !== CHAR_AMPERSAND - && c !== CHAR_ASTERISK - && c !== CHAR_EXCLAMATION - && c !== CHAR_VERTICAL_LINE - && c !== CHAR_EQUALS - && c !== CHAR_GREATER_THAN - && c !== CHAR_SINGLE_QUOTE - && c !== CHAR_DOUBLE_QUOTE - // | “%” | “@” | “`”) - && c !== CHAR_PERCENT - && c !== CHAR_COMMERCIAL_AT - && c !== CHAR_GRAVE_ACCENT; - } - -// Simplified test for values allowed as the last character in plain style. - function isPlainSafeLast(c) { - // just not whitespace or colon, it will be checked to be plain character later - return !isWhitespace(c) && c !== CHAR_COLON; - } - -// Same as 'string'.codePointAt(pos), but works in older browsers. - function codePointAt(string, pos) { - var first = string.charCodeAt(pos), second; - if (first >= 0xD800 && first <= 0xDBFF && pos + 1 < string.length) { - second = string.charCodeAt(pos + 1); - if (second >= 0xDC00 && second <= 0xDFFF) { - // https://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae - return (first - 0xD800) * 0x400 + second - 0xDC00 + 0x10000; - } - } - return first; - } - -// Determines whether block indentation indicator is required. - function needIndentIndicator(string) { - var leadingSpaceRe = /^\n* /; - return leadingSpaceRe.test(string); - } - - var STYLE_PLAIN = 1, - STYLE_SINGLE = 2, - STYLE_LITERAL = 3, - STYLE_FOLDED = 4, - STYLE_DOUBLE = 5; - -// Determines which scalar styles are possible and returns the preferred style. -// lineWidth = -1 => no limit. -// Pre-conditions: str.length > 0. -// Post-conditions: -// STYLE_PLAIN or STYLE_SINGLE => no \n are in the string. -// STYLE_LITERAL => no lines are suitable for folding (or lineWidth is -1). -// STYLE_FOLDED => a line > lineWidth and can be folded (and lineWidth != -1). - function chooseScalarStyle(string, singleLineOnly, indentPerLevel, lineWidth, - testAmbiguousType, quotingType, forceQuotes, inblock) { - - var i; - var char = 0; - var prevChar = null; - var hasLineBreak = false; - var hasFoldableLine = false; // only checked if shouldTrackWidth - var shouldTrackWidth = lineWidth !== -1; - var previousLineBreak = -1; // count the first line correctly - var plain = isPlainSafeFirst(codePointAt(string, 0)) - && isPlainSafeLast(codePointAt(string, string.length - 1)); - - if (singleLineOnly || forceQuotes) { - // Case: no block styles. - // Check for disallowed characters to rule out plain and single. - for (i = 0; i < string.length; char >= 0x10000 ? i += 2 : i++) { - char = codePointAt(string, i); - if (!isPrintable(char)) { - return STYLE_DOUBLE; - } - plain = plain && isPlainSafe(char, prevChar, inblock); - prevChar = char; - } - } else { - // Case: block styles permitted. - for (i = 0; i < string.length; char >= 0x10000 ? i += 2 : i++) { - char = codePointAt(string, i); - if (char === CHAR_LINE_FEED) { - hasLineBreak = true; - // Check if any line can be folded. - if (shouldTrackWidth) { - hasFoldableLine = hasFoldableLine || - // Foldable line = too long, and not more-indented. - (i - previousLineBreak - 1 > lineWidth && - string[previousLineBreak + 1] !== ' '); - previousLineBreak = i; - } - } else if (!isPrintable(char)) { - return STYLE_DOUBLE; - } - plain = plain && isPlainSafe(char, prevChar, inblock); - prevChar = char; - } - // in case the end is missing a \n - hasFoldableLine = hasFoldableLine || (shouldTrackWidth && - (i - previousLineBreak - 1 > lineWidth && - string[previousLineBreak + 1] !== ' ')); - } - // Although every style can represent \n without escaping, prefer block styles - // for multiline, since they're more readable and they don't add empty lines. - // Also prefer folding a super-long line. - if (!hasLineBreak && !hasFoldableLine) { - // Strings interpretable as another type have to be quoted; - // e.g. the string 'true' vs. the boolean true. - if (plain && !forceQuotes && !testAmbiguousType(string)) { - return STYLE_PLAIN; - } - return quotingType === QUOTING_TYPE_DOUBLE ? STYLE_DOUBLE : STYLE_SINGLE; - } - // Edge case: block indentation indicator can only have one digit. - if (indentPerLevel > 9 && needIndentIndicator(string)) { - return STYLE_DOUBLE; - } - // At this point we know block styles are valid. - // Prefer literal style unless we want to fold. - if (!forceQuotes) { - return hasFoldableLine ? STYLE_FOLDED : STYLE_LITERAL; - } - return quotingType === QUOTING_TYPE_DOUBLE ? STYLE_DOUBLE : STYLE_SINGLE; - } - -// Note: line breaking/folding is implemented for only the folded style. -// NB. We drop the last trailing newline (if any) of a returned block scalar -// since the dumper adds its own newline. This always works: -// • No ending newline => unaffected; already using strip "-" chomping. -// • Ending newline => removed then restored. -// Importantly, this keeps the "+" chomp indicator from gaining an extra line. - function writeScalar(state, string, level, iskey, inblock) { - state.dump = (function () { - if (string.length === 0) { - return state.quotingType === QUOTING_TYPE_DOUBLE ? '""' : "''"; - } - if (!state.noCompatMode) { - if (DEPRECATED_BOOLEANS_SYNTAX.indexOf(string) !== -1 || DEPRECATED_BASE60_SYNTAX.test(string)) { - return state.quotingType === QUOTING_TYPE_DOUBLE ? ('"' + string + '"') : ("'" + string + "'"); - } - } - - var indent = state.indent * Math.max(1, level); // no 0-indent scalars - // As indentation gets deeper, let the width decrease monotonically - // to the lower bound min(state.lineWidth, 40). - // Note that this implies - // state.lineWidth ≤ 40 + state.indent: width is fixed at the lower bound. - // state.lineWidth > 40 + state.indent: width decreases until the lower bound. - // This behaves better than a constant minimum width which disallows narrower options, - // or an indent threshold which causes the width to suddenly increase. - var lineWidth = state.lineWidth === -1 - ? -1 : Math.max(Math.min(state.lineWidth, 40), state.lineWidth - indent); - - // Without knowing if keys are implicit/explicit, assume implicit for safety. - var singleLineOnly = iskey - // No block styles in flow mode. - || (state.flowLevel > -1 && level >= state.flowLevel); - - function testAmbiguity(string) { - return testImplicitResolving(state, string); - } - - switch (chooseScalarStyle(string, singleLineOnly, state.indent, lineWidth, - testAmbiguity, state.quotingType, state.forceQuotes && !iskey, inblock)) { - - case STYLE_PLAIN: - return string; - case STYLE_SINGLE: - return "'" + string.replace(/'/g, "''") + "'"; - case STYLE_LITERAL: - return '|' + blockHeader(string, state.indent) - + dropEndingNewline(indentString(string, indent)); - case STYLE_FOLDED: - return '>' + blockHeader(string, state.indent) - + dropEndingNewline(indentString(foldString(string, lineWidth), indent)); - case STYLE_DOUBLE: - return '"' + escapeString(string) + '"'; - default: - throw new exception('impossible error: invalid scalar style'); - } - }()); - } - -// Pre-conditions: string is valid for a block scalar, 1 <= indentPerLevel <= 9. - function blockHeader(string, indentPerLevel) { - var indentIndicator = needIndentIndicator(string) ? String(indentPerLevel) : ''; - - // note the special case: the string '\n' counts as a "trailing" empty line. - var clip = string[string.length - 1] === '\n'; - var keep = clip && (string[string.length - 2] === '\n' || string === '\n'); - var chomp = keep ? '+' : (clip ? '' : '-'); - - return indentIndicator + chomp + '\n'; - } - -// (See the note for writeScalar.) - function dropEndingNewline(string) { - return string[string.length - 1] === '\n' ? string.slice(0, -1) : string; - } - -// Note: a long line without a suitable break point will exceed the width limit. -// Pre-conditions: every char in str isPrintable, str.length > 0, width > 0. - function foldString(string, width) { - // In folded style, $k$ consecutive newlines output as $k+1$ newlines— - // unless they're before or after a more-indented line, or at the very - // beginning or end, in which case $k$ maps to $k$. - // Therefore, parse each chunk as newline(s) followed by a content line. - var lineRe = /(\n+)([^\n]*)/g; - - // first line (possibly an empty line) - var result = (function () { - var nextLF = string.indexOf('\n'); - nextLF = nextLF !== -1 ? nextLF : string.length; - lineRe.lastIndex = nextLF; - return foldLine(string.slice(0, nextLF), width); - }()); - // If we haven't reached the first content line yet, don't add an extra \n. - var prevMoreIndented = string[0] === '\n' || string[0] === ' '; - var moreIndented; - - // rest of the lines - var match; - while ((match = lineRe.exec(string))) { - var prefix = match[1], line = match[2]; - moreIndented = (line[0] === ' '); - result += prefix - + (!prevMoreIndented && !moreIndented && line !== '' - ? '\n' : '') - + foldLine(line, width); - prevMoreIndented = moreIndented; - } - - return result; - } - -// Greedy line breaking. -// Picks the longest line under the limit each time, -// otherwise settles for the shortest line over the limit. -// NB. More-indented lines *cannot* be folded, as that would add an extra \n. - function foldLine(line, width) { - if (line === '' || line[0] === ' ') return line; - - // Since a more-indented line adds a \n, breaks can't be followed by a space. - var breakRe = / [^ ]/g; // note: the match index will always be <= length-2. - var match; - // start is an inclusive index. end, curr, and next are exclusive. - var start = 0, end, curr = 0, next = 0; - var result = ''; - - // Invariants: 0 <= start <= length-1. - // 0 <= curr <= next <= max(0, length-2). curr - start <= width. - // Inside the loop: - // A match implies length >= 2, so curr and next are <= length-2. - while ((match = breakRe.exec(line))) { - next = match.index; - // maintain invariant: curr - start <= width - if (next - start > width) { - end = (curr > start) ? curr : next; // derive end <= length-2 - result += '\n' + line.slice(start, end); - // skip the space that was output as \n - start = end + 1; // derive start <= length-1 - } - curr = next; - } - - // By the invariants, start <= length-1, so there is something left over. - // It is either the whole string or a part starting from non-whitespace. - result += '\n'; - // Insert a break if the remainder is too long and there is a break available. - if (line.length - start > width && curr > start) { - result += line.slice(start, curr) + '\n' + line.slice(curr + 1); - } else { - result += line.slice(start); - } - - return result.slice(1); // drop extra \n joiner - } - -// Escapes a double-quoted string. - function escapeString(string) { - var result = ''; - var char = 0; - var escapeSeq; - - for (var i = 0; i < string.length; char >= 0x10000 ? i += 2 : i++) { - char = codePointAt(string, i); - escapeSeq = ESCAPE_SEQUENCES[char]; - - if (!escapeSeq && isPrintable(char)) { - result += string[i]; - if (char >= 0x10000) result += string[i + 1]; - } else { - result += escapeSeq || encodeHex(char); - } - } - - return result; - } - - function writeFlowSequence(state, level, object) { - var _result = '', - _tag = state.tag, - index, - length, - value; - - for (index = 0, length = object.length; index < length; index += 1) { - value = object[index]; - - if (state.replacer) { - value = state.replacer.call(object, String(index), value); - } - - // Write only valid elements, put null instead of invalid elements. - if (writeNode(state, level, value, false, false) || - (typeof value === 'undefined' && - writeNode(state, level, null, false, false))) { - - if (_result !== '') _result += ',' + (!state.condenseFlow ? ' ' : ''); - _result += state.dump; - } - } - - state.tag = _tag; - state.dump = '[' + _result + ']'; - } - - function writeBlockSequence(state, level, object, compact) { - var _result = '', - _tag = state.tag, - index, - length, - value; - - for (index = 0, length = object.length; index < length; index += 1) { - value = object[index]; - - if (state.replacer) { - value = state.replacer.call(object, String(index), value); - } - - // Write only valid elements, put null instead of invalid elements. - if (writeNode(state, level + 1, value, true, true, false, true) || - (typeof value === 'undefined' && - writeNode(state, level + 1, null, true, true, false, true))) { - - if (!compact || _result !== '') { - _result += generateNextLine(state, level); - } - - if (state.dump && CHAR_LINE_FEED === state.dump.charCodeAt(0)) { - _result += '-'; - } else { - _result += '- '; - } - - _result += state.dump; - } - } - - state.tag = _tag; - state.dump = _result || '[]'; // Empty sequence if no valid values. - } - - function writeFlowMapping(state, level, object) { - var _result = '', - _tag = state.tag, - objectKeyList = Object.keys(object), - index, - length, - objectKey, - objectValue, - pairBuffer; - - for (index = 0, length = objectKeyList.length; index < length; index += 1) { - - pairBuffer = ''; - if (_result !== '') pairBuffer += ', '; - - if (state.condenseFlow) pairBuffer += '"'; - - objectKey = objectKeyList[index]; - objectValue = object[objectKey]; - - if (state.replacer) { - objectValue = state.replacer.call(object, objectKey, objectValue); - } - - if (!writeNode(state, level, objectKey, false, false)) { - continue; // Skip this pair because of invalid key; - } - - if (state.dump.length > 1024) pairBuffer += '? '; - - pairBuffer += state.dump + (state.condenseFlow ? '"' : '') + ':' + (state.condenseFlow ? '' : ' '); - - if (!writeNode(state, level, objectValue, false, false)) { - continue; // Skip this pair because of invalid value. - } - - pairBuffer += state.dump; - - // Both key and value are valid. - _result += pairBuffer; - } - - state.tag = _tag; - state.dump = '{' + _result + '}'; - } - - function writeBlockMapping(state, level, object, compact) { - var _result = '', - _tag = state.tag, - objectKeyList = Object.keys(object), - index, - length, - objectKey, - objectValue, - explicitPair, - pairBuffer; - - // Allow sorting keys so that the output file is deterministic - if (state.sortKeys === true) { - // Default sorting - objectKeyList.sort(); - } else if (typeof state.sortKeys === 'function') { - // Custom sort function - objectKeyList.sort(state.sortKeys); - } else if (state.sortKeys) { - // Something is wrong - throw new exception('sortKeys must be a boolean or a function'); - } - - for (index = 0, length = objectKeyList.length; index < length; index += 1) { - pairBuffer = ''; - - if (!compact || _result !== '') { - pairBuffer += generateNextLine(state, level); - } - - objectKey = objectKeyList[index]; - objectValue = object[objectKey]; - - if (state.replacer) { - objectValue = state.replacer.call(object, objectKey, objectValue); - } - - if (!writeNode(state, level + 1, objectKey, true, true, true)) { - continue; // Skip this pair because of invalid key. - } - - explicitPair = (state.tag !== null && state.tag !== '?') || - (state.dump && state.dump.length > 1024); - - if (explicitPair) { - if (state.dump && CHAR_LINE_FEED === state.dump.charCodeAt(0)) { - pairBuffer += '?'; - } else { - pairBuffer += '? '; - } - } - - pairBuffer += state.dump; - - if (explicitPair) { - pairBuffer += generateNextLine(state, level); - } - - if (!writeNode(state, level + 1, objectValue, true, explicitPair)) { - continue; // Skip this pair because of invalid value. - } - - if (state.dump && CHAR_LINE_FEED === state.dump.charCodeAt(0)) { - pairBuffer += ':'; - } else { - pairBuffer += ': '; - } - - pairBuffer += state.dump; - - // Both key and value are valid. - _result += pairBuffer; - } - - state.tag = _tag; - state.dump = _result || '{}'; // Empty mapping if no valid pairs. - } - - function detectType(state, object, explicit) { - var _result, typeList, index, length, type, style; - - typeList = explicit ? state.explicitTypes : state.implicitTypes; - - for (index = 0, length = typeList.length; index < length; index += 1) { - type = typeList[index]; - - if ((type.instanceOf || type.predicate) && - (!type.instanceOf || ((typeof object === 'object') && (object instanceof type.instanceOf))) && - (!type.predicate || type.predicate(object))) { - - if (explicit) { - if (type.multi && type.representName) { - state.tag = type.representName(object); - } else { - state.tag = type.tag; - } - } else { - state.tag = '?'; - } - - if (type.represent) { - style = state.styleMap[type.tag] || type.defaultStyle; - - if (_toString.call(type.represent) === '[object Function]') { - _result = type.represent(object, style); - } else if (_hasOwnProperty.call(type.represent, style)) { - _result = type.represent[style](object, style); - } else { - throw new exception('!<' + type.tag + '> tag resolver accepts not "' + style + '" style'); - } - - state.dump = _result; - } - - return true; - } - } - - return false; - } - -// Serializes `object` and writes it to global `result`. -// Returns true on success, or false on invalid object. -// - function writeNode(state, level, object, block, compact, iskey, isblockseq) { - state.tag = null; - state.dump = object; - - if (!detectType(state, object, false)) { - detectType(state, object, true); - } - - var type = _toString.call(state.dump); - var inblock = block; - var tagStr; - - if (block) { - block = (state.flowLevel < 0 || state.flowLevel > level); - } - - var objectOrArray = type === '[object Object]' || type === '[object Array]', - duplicateIndex, - duplicate; - - if (objectOrArray) { - duplicateIndex = state.duplicates.indexOf(object); - duplicate = duplicateIndex !== -1; - } - - if ((state.tag !== null && state.tag !== '?') || duplicate || (state.indent !== 2 && level > 0)) { - compact = false; - } - - if (duplicate && state.usedDuplicates[duplicateIndex]) { - state.dump = '*ref_' + duplicateIndex; - } else { - if (objectOrArray && duplicate && !state.usedDuplicates[duplicateIndex]) { - state.usedDuplicates[duplicateIndex] = true; - } - if (type === '[object Object]') { - if (block && (Object.keys(state.dump).length !== 0)) { - writeBlockMapping(state, level, state.dump, compact); - if (duplicate) { - state.dump = '&ref_' + duplicateIndex + state.dump; - } - } else { - writeFlowMapping(state, level, state.dump); - if (duplicate) { - state.dump = '&ref_' + duplicateIndex + ' ' + state.dump; - } - } - } else if (type === '[object Array]') { - if (block && (state.dump.length !== 0)) { - if (state.noArrayIndent && !isblockseq && level > 0) { - writeBlockSequence(state, level - 1, state.dump, compact); - } else { - writeBlockSequence(state, level, state.dump, compact); - } - if (duplicate) { - state.dump = '&ref_' + duplicateIndex + state.dump; - } - } else { - writeFlowSequence(state, level, state.dump); - if (duplicate) { - state.dump = '&ref_' + duplicateIndex + ' ' + state.dump; - } - } - } else if (type === '[object String]') { - if (state.tag !== '?') { - writeScalar(state, state.dump, level, iskey, inblock); - } - } else if (type === '[object Undefined]') { - return false; - } else { - if (state.skipInvalid) return false; - throw new exception('unacceptable kind of an object to dump ' + type); - } - - if (state.tag !== null && state.tag !== '?') { - // Need to encode all characters except those allowed by the spec: - // - // [35] ns-dec-digit ::= [#x30-#x39] /* 0-9 */ - // [36] ns-hex-digit ::= ns-dec-digit - // | [#x41-#x46] /* A-F */ | [#x61-#x66] /* a-f */ - // [37] ns-ascii-letter ::= [#x41-#x5A] /* A-Z */ | [#x61-#x7A] /* a-z */ - // [38] ns-word-char ::= ns-dec-digit | ns-ascii-letter | “-” - // [39] ns-uri-char ::= “%” ns-hex-digit ns-hex-digit | ns-word-char | “#” - // | “;” | “/” | “?” | “:” | “@” | “&” | “=” | “+” | “$” | “,” - // | “_” | “.” | “!” | “~” | “*” | “'” | “(” | “)” | “[” | “]” - // - // Also need to encode '!' because it has special meaning (end of tag prefix). - // - tagStr = encodeURI( - state.tag[0] === '!' ? state.tag.slice(1) : state.tag - ).replace(/!/g, '%21'); - - if (state.tag[0] === '!') { - tagStr = '!' + tagStr; - } else if (tagStr.slice(0, 18) === 'tag:yaml.org,2002:') { - tagStr = '!!' + tagStr.slice(18); - } else { - tagStr = '!<' + tagStr + '>'; - } - - state.dump = tagStr + ' ' + state.dump; - } - } - - return true; - } - - function getDuplicateReferences(object, state) { - var objects = [], - duplicatesIndexes = [], - index, - length; - - inspectNode(object, objects, duplicatesIndexes); - - for (index = 0, length = duplicatesIndexes.length; index < length; index += 1) { - state.duplicates.push(objects[duplicatesIndexes[index]]); - } - state.usedDuplicates = new Array(length); - } - - function inspectNode(object, objects, duplicatesIndexes) { - var objectKeyList, - index, - length; - - if (object !== null && typeof object === 'object') { - index = objects.indexOf(object); - if (index !== -1) { - if (duplicatesIndexes.indexOf(index) === -1) { - duplicatesIndexes.push(index); - } - } else { - objects.push(object); - - if (Array.isArray(object)) { - for (index = 0, length = object.length; index < length; index += 1) { - inspectNode(object[index], objects, duplicatesIndexes); - } - } else { - objectKeyList = Object.keys(object); - - for (index = 0, length = objectKeyList.length; index < length; index += 1) { - inspectNode(object[objectKeyList[index]], objects, duplicatesIndexes); - } - } - } - } - } - - function dump$1(input, options) { - options = options || {}; - - var state = new State(options); - - if (!state.noRefs) getDuplicateReferences(input, state); - - var value = input; - - if (state.replacer) { - value = state.replacer.call({'': value}, '', value); - } - - if (writeNode(state, 0, value, true, true)) return state.dump + '\n'; - - return ''; - } - - var dump_1 = dump$1; - - var dumper = { - dump: dump_1 - }; - - function renamed(from, to) { - return function () { - throw new Error('Function yaml.' + from + ' is removed in js-yaml 4. ' + - 'Use yaml.' + to + ' instead, which is now safe by default.'); - }; - } - - - var Type = type; - var Schema = schema; - var FAILSAFE_SCHEMA = failsafe; - var JSON_SCHEMA = json; - var CORE_SCHEMA = core; - var DEFAULT_SCHEMA = _default; - var load = loader.load; - var loadAll = loader.loadAll; - var dump = dumper.dump; - var YAMLException = exception; - -// Re-export all types in case user wants to create custom schema - var types = { - binary: binary, - float: float, - map: map, - null: _null, - pairs: pairs, - set: set, - timestamp: timestamp, - bool: bool, - int: int, - merge: merge, - omap: omap, - seq: seq, - str: str - }; - -// Removed functions from JS-YAML 3.0.x - var safeLoad = renamed('safeLoad', 'load'); - var safeLoadAll = renamed('safeLoadAll', 'loadAll'); - var safeDump = renamed('safeDump', 'dump'); - - return { - Type: Type, - Schema: Schema, - FAILSAFE_SCHEMA: FAILSAFE_SCHEMA, - JSON_SCHEMA: JSON_SCHEMA, - CORE_SCHEMA: CORE_SCHEMA, - DEFAULT_SCHEMA: DEFAULT_SCHEMA, - load: load, - loadAll: loadAll, - dump: dump, - YAMLException: YAMLException, - types: types, - safeLoad: safeLoad, - safeLoadAll: safeLoadAll, - safeDump: safeDump - }; -}(); - -/**** MD5 (Message-Digest Algorithm)* http://www.webtoolkit.info/***/ -function MD5(string) { - function RotateLeft(lValue, iShiftBits) { - return (lValue << iShiftBits) | (lValue >>> (32 - iShiftBits)); - } - - function AddUnsigned(lX, lY) { - var lX4, lY4, lX8, lY8, lResult; - lX8 = (lX & 0x80000000); - lY8 = (lY & 0x80000000); - lX4 = (lX & 0x40000000); - lY4 = (lY & 0x40000000); - lResult = (lX & 0x3FFFFFFF) + (lY & 0x3FFFFFFF); - if (lX4 & lY4) { - return (lResult ^ 0x80000000 ^ lX8 ^ lY8); - } - if (lX4 | lY4) { - if (lResult & 0x40000000) { - return (lResult ^ 0xC0000000 ^ lX8 ^ lY8); - } else { - return (lResult ^ 0x40000000 ^ lX8 ^ lY8); - } - } else { - return (lResult ^ lX8 ^ lY8); - } - } - - function F(x, y, z) { - return (x & y) | ((~x) & z); - } - - function G(x, y, z) { - return (x & z) | (y & (~z)); - } - - function H(x, y, z) { - return (x ^ y ^ z); - } - - function I(x, y, z) { - return (y ^ (x | (~z))); - } - - function FF(a, b, c, d, x, s, ac) { - a = AddUnsigned(a, AddUnsigned(AddUnsigned(F(b, c, d), x), ac)); - return AddUnsigned(RotateLeft(a, s), b); - } - - function GG(a, b, c, d, x, s, ac) { - a = AddUnsigned(a, AddUnsigned(AddUnsigned(G(b, c, d), x), ac)); - return AddUnsigned(RotateLeft(a, s), b); - } - - function HH(a, b, c, d, x, s, ac) { - a = AddUnsigned(a, AddUnsigned(AddUnsigned(H(b, c, d), x), ac)); - return AddUnsigned(RotateLeft(a, s), b); - } - - function II(a, b, c, d, x, s, ac) { - a = AddUnsigned(a, AddUnsigned(AddUnsigned(I(b, c, d), x), ac)); - return AddUnsigned(RotateLeft(a, s), b); - } - - function ConvertToWordArray(string) { - var lWordCount; - var lMessageLength = string.length; - var lNumberOfWords_temp1 = lMessageLength + 8; - var lNumberOfWords_temp2 = (lNumberOfWords_temp1 - (lNumberOfWords_temp1 % 64)) / 64; - var lNumberOfWords = (lNumberOfWords_temp2 + 1) * 16; - var lWordArray = Array(lNumberOfWords - 1); - var lBytePosition = 0; - var lByteCount = 0; - while (lByteCount < lMessageLength) { - lWordCount = (lByteCount - (lByteCount % 4)) / 4; - lBytePosition = (lByteCount % 4) * 8; - lWordArray[lWordCount] = (lWordArray[lWordCount] | (string.charCodeAt(lByteCount) << lBytePosition)); - lByteCount++; - } - lWordCount = (lByteCount - (lByteCount % 4)) / 4; - lBytePosition = (lByteCount % 4) * 8; - lWordArray[lWordCount] = lWordArray[lWordCount] | (0x80 << lBytePosition); - lWordArray[lNumberOfWords - 2] = lMessageLength << 3; - lWordArray[lNumberOfWords - 1] = lMessageLength >>> 29; - return lWordArray; - } - - function WordToHex(lValue) { - var WordToHexValue = "", WordToHexValue_temp = "", lByte, lCount; - for (lCount = 0; lCount <= 3; lCount++) { - lByte = (lValue >>> (lCount * 8)) & 255; - WordToHexValue_temp = "0" + lByte.toString(16); - WordToHexValue = WordToHexValue + WordToHexValue_temp.substr(WordToHexValue_temp.length - 2, 2); - } - return WordToHexValue; - } - - function Utf8Encode(string) { - string = string.replace(/\r\n/g, "\n"); - var utftext = ""; - for (var n = 0; n < string.length; n++) { - var c = string.charCodeAt(n); - if (c < 128) { - utftext += String.fromCharCode(c); - } else if ((c > 127) && (c < 2048)) { - utftext += String.fromCharCode((c >> 6) | 192); - utftext += String.fromCharCode((c & 63) | 128); - } else { - utftext += String.fromCharCode((c >> 12) | 224); - utftext += String.fromCharCode(((c >> 6) & 63) | 128); - utftext += String.fromCharCode((c & 63) | 128); - } - } - return utftext; - } - - var x = Array(); - var k, AA, BB, CC, DD, a, b, c, d; - var S11 = 7, S12 = 12, S13 = 17, S14 = 22; - var S21 = 5, S22 = 9, S23 = 14, S24 = 20; - var S31 = 4, S32 = 11, S33 = 16, S34 = 23; - var S41 = 6, S42 = 10, S43 = 15, S44 = 21; - string = Utf8Encode(string); - x = ConvertToWordArray(string); - a = 0x67452301; - b = 0xEFCDAB89; - c = 0x98BADCFE; - d = 0x10325476; - for (k = 0; k < x.length; k += 16) { - AA = a; - BB = b; - CC = c; - DD = d; - a = FF(a, b, c, d, x[k + 0], S11, 0xD76AA478); - d = FF(d, a, b, c, x[k + 1], S12, 0xE8C7B756); - c = FF(c, d, a, b, x[k + 2], S13, 0x242070DB); - b = FF(b, c, d, a, x[k + 3], S14, 0xC1BDCEEE); - a = FF(a, b, c, d, x[k + 4], S11, 0xF57C0FAF); - d = FF(d, a, b, c, x[k + 5], S12, 0x4787C62A); - c = FF(c, d, a, b, x[k + 6], S13, 0xA8304613); - b = FF(b, c, d, a, x[k + 7], S14, 0xFD469501); - a = FF(a, b, c, d, x[k + 8], S11, 0x698098D8); - d = FF(d, a, b, c, x[k + 9], S12, 0x8B44F7AF); - c = FF(c, d, a, b, x[k + 10], S13, 0xFFFF5BB1); - b = FF(b, c, d, a, x[k + 11], S14, 0x895CD7BE); - a = FF(a, b, c, d, x[k + 12], S11, 0x6B901122); - d = FF(d, a, b, c, x[k + 13], S12, 0xFD987193); - c = FF(c, d, a, b, x[k + 14], S13, 0xA679438E); - b = FF(b, c, d, a, x[k + 15], S14, 0x49B40821); - a = GG(a, b, c, d, x[k + 1], S21, 0xF61E2562); - d = GG(d, a, b, c, x[k + 6], S22, 0xC040B340); - c = GG(c, d, a, b, x[k + 11], S23, 0x265E5A51); - b = GG(b, c, d, a, x[k + 0], S24, 0xE9B6C7AA); - a = GG(a, b, c, d, x[k + 5], S21, 0xD62F105D); - d = GG(d, a, b, c, x[k + 10], S22, 0x2441453); - c = GG(c, d, a, b, x[k + 15], S23, 0xD8A1E681); - b = GG(b, c, d, a, x[k + 4], S24, 0xE7D3FBC8); - a = GG(a, b, c, d, x[k + 9], S21, 0x21E1CDE6); - d = GG(d, a, b, c, x[k + 14], S22, 0xC33707D6); - c = GG(c, d, a, b, x[k + 3], S23, 0xF4D50D87); - b = GG(b, c, d, a, x[k + 8], S24, 0x455A14ED); - a = GG(a, b, c, d, x[k + 13], S21, 0xA9E3E905); - d = GG(d, a, b, c, x[k + 2], S22, 0xFCEFA3F8); - c = GG(c, d, a, b, x[k + 7], S23, 0x676F02D9); - b = GG(b, c, d, a, x[k + 12], S24, 0x8D2A4C8A); - a = HH(a, b, c, d, x[k + 5], S31, 0xFFFA3942); - d = HH(d, a, b, c, x[k + 8], S32, 0x8771F681); - c = HH(c, d, a, b, x[k + 11], S33, 0x6D9D6122); - b = HH(b, c, d, a, x[k + 14], S34, 0xFDE5380C); - a = HH(a, b, c, d, x[k + 1], S31, 0xA4BEEA44); - d = HH(d, a, b, c, x[k + 4], S32, 0x4BDECFA9); - c = HH(c, d, a, b, x[k + 7], S33, 0xF6BB4B60); - b = HH(b, c, d, a, x[k + 10], S34, 0xBEBFBC70); - a = HH(a, b, c, d, x[k + 13], S31, 0x289B7EC6); - d = HH(d, a, b, c, x[k + 0], S32, 0xEAA127FA); - c = HH(c, d, a, b, x[k + 3], S33, 0xD4EF3085); - b = HH(b, c, d, a, x[k + 6], S34, 0x4881D05); - a = HH(a, b, c, d, x[k + 9], S31, 0xD9D4D039); - d = HH(d, a, b, c, x[k + 12], S32, 0xE6DB99E5); - c = HH(c, d, a, b, x[k + 15], S33, 0x1FA27CF8); - b = HH(b, c, d, a, x[k + 2], S34, 0xC4AC5665); - a = II(a, b, c, d, x[k + 0], S41, 0xF4292244); - d = II(d, a, b, c, x[k + 7], S42, 0x432AFF97); - c = II(c, d, a, b, x[k + 14], S43, 0xAB9423A7); - b = II(b, c, d, a, x[k + 5], S44, 0xFC93A039); - a = II(a, b, c, d, x[k + 12], S41, 0x655B59C3); - d = II(d, a, b, c, x[k + 3], S42, 0x8F0CCC92); - c = II(c, d, a, b, x[k + 10], S43, 0xFFEFF47D); - b = II(b, c, d, a, x[k + 1], S44, 0x85845DD1); - a = II(a, b, c, d, x[k + 8], S41, 0x6FA87E4F); - d = II(d, a, b, c, x[k + 15], S42, 0xFE2CE6E0); - c = II(c, d, a, b, x[k + 6], S43, 0xA3014314); - b = II(b, c, d, a, x[k + 13], S44, 0x4E0811A1); - a = II(a, b, c, d, x[k + 4], S41, 0xF7537E82); - d = II(d, a, b, c, x[k + 11], S42, 0xBD3AF235); - c = II(c, d, a, b, x[k + 2], S43, 0x2AD7D2BB); - b = II(b, c, d, a, x[k + 9], S44, 0xEB86D391); - a = AddUnsigned(a, AA); - b = AddUnsigned(b, BB); - c = AddUnsigned(c, CC); - d = AddUnsigned(d, DD); - } - var temp = WordToHex(a) + WordToHex(b) + WordToHex(c) + WordToHex(d); - return temp.toLowerCase(); -} - -function ResourceDownloader() { - const cache = {}; - - async function download(url, userAgent = "Quantumult%20X") { - const id = userAgent + url; - - if (cache[id]) { - $.log("Cache hit for: " + url); - return cache[id]; - } - - const $http = HTTP({ - headers: { - "User-Agent": userAgent, - }, - }); - - const result = new Promise((resolve, reject) => { - $http.get(url).then(resp => { - const body = resp.body; - if (body.replace(/\s/g, "").length === 0) - reject(new Error("订阅内容为空!")); - else - resolve(body); - }); - }); - - cache[id] = result; - return result; - } - - return { - download - } -} diff --git a/backend/sub-store.min.js b/backend/sub-store.min.js index e1711ef..1c7979a 100644 --- a/backend/sub-store.min.js +++ b/backend/sub-store.min.js @@ -1,2 +1,15 @@ -// UPDATED AT: Fri 20 May 2022 03:20:55 PM CST -const $=API("sub-store"),Base64=new Base64Code,$downloader=new ResourceDownloader;function service(){console.log("\n┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅\n 𝑺𝒖𝒃-𝑺𝒕𝒐𝒓𝒆 © 𝑷𝒆𝒏𝒈-𝒀𝑴\n┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅\n");const e=express(),t="settings",n="subs",r="collections",s="rules",o="builtin",i="artifacts",a="Auto Generated Sub-Store Backup",c="Sub-Store",l="Sub-Store Artifacts Repository";async function p(e){const{gistToken:n}=$.read(t);return n?new Gist({token:n,key:l}).upload(e):Promise.reject("未设置Gist Token!")}async function u(e){const{headers:t}=await $.http.get({url:e,headers:{"User-Agent":"Quantumult/1.0.13 (iPhone10,3; iOS 14.0)"}});return t[Object.keys(t).filter(e=>/SUBSCRIPTION-USERINFO/i.test(e))[0]]}function f(e){const t=Object.keys(e);let n="";for(let r of t)if(/USER-AGENT/i.test(r)){n=e[r];break}return-1!==n.indexOf("Quantumult%20X")?"QX":-1!==n.indexOf("Surge")?"Surge":-1!==n.indexOf("Decar")||-1!==n.indexOf("Loon")?"Loon":-1!==n.indexOf("Stash")||-1!==n.indexOf("Shadowrocket")?"Clash":null}async function d({type:e,item:t,platform:r,noProcessor:s}={platform:"JSON",noProcessor:!1}){if("subscription"===e){const e=t,n=await $downloader.download(e.url,e.ua);let o=ProxyUtils.parse(n);s||(o=await ProxyUtils.process(o,e.process||[],r));const i={};return o.forEach(e=>{i[e.name]&&$.notify("🌍 『 𝑺𝒖𝒃-𝑺𝒕𝒐𝒓𝒆 』","⚠️ 订阅包含重复节点!","请仔细检测配置!",{"media-url":"https://cdn3.iconfinder.com/data/icons/seo-outline-1/512/25_code_program_programming_develop_bug_search_developer-512.png"})}),ProxyUtils.produce(o,r)}if("collection"===e){const e=$.read(n),o=t,i=o.subscriptions;let a=[],c=0;if(await Promise.all(i.map(async t=>{const n=e[t];try{$.info(`正在处理子订阅:${n.name}...`);const e=await $downloader.download(n.url,n.ua);let t=ProxyUtils.parse(e);s||(t=await ProxyUtils.process(t,n.process||[],r)),a=a.concat(t),c++,$.info(`✅ 子订阅:${n.name}加载成功,进度--${100*(c/i.length).toFixed(1)}% `)}catch(e){c++,$.error(`❌ 处理组合订阅中的子订阅: ${n.name}时出现错误:${e},该订阅已被跳过!进度--${100*(c/i.length).toFixed(1)}%`)}})),s||(a=await ProxyUtils.process(a,o.process||[],r)),0===a.length)throw new Error("组合订阅中不含有效节点!");const l={};return a.forEach(e=>{l[e.name]&&$.notify("🌍 『 𝑺𝒖𝒃-𝑺𝒕𝒐𝒓𝒆 』","⚠️ 订阅包含重复节点!","请仔细检测配置!",{"media-url":"https://cdn3.iconfinder.com/data/icons/seo-outline-1/512/25_code_program_programming_develop_bug_search_developer-512.png"})}),ProxyUtils.produce(a,r)}if("rule"===e){const e=t;let n=[];for(let t=0;t0){const e=c[l[0]],n=await u(e.url);n&&t.set("subscription-userinfo",n)}if(a)try{const e=await d({type:"collection",item:a,platform:i,noProcessor:o});"JSON"===i?t.set("Content-Type","application/json;charset=utf-8").send(e):t.send(e)}catch(e){$.notify("🌍 『 𝑺𝒖𝒃-𝑺𝒕𝒐𝒓𝒆 』 下载组合订阅失败",`❌ 下载组合订阅错误:${s}!`,`🤔 原因:${e}`),t.status(500).json({status:"failed",message:e})}else $.notify("🌍 『 𝑺𝒖𝒃-𝑺𝒕𝒐𝒓𝒆 』 下载组合订阅失败",`❌ 未找到组合订阅:${s}!`),t.status(404).json({status:"failed"})}),e.get("/download/:name",async function(e,t){const{name:r}=e.params,{cache:s}=e.query,{raw:o}=e.query||"false",i=e.query.target||f(e.headers)||"JSON";$.info(`正在下载订阅:${r}`);const a=$.read(n)[r];if(a)try{const e=await d({type:"subscription",item:a,platform:i,noProcessor:o}),n=await u(a.url);n&&t.set("subscription-userinfo",n),"JSON"===i?t.set("Content-Type","application/json;charset=utf-8").send(e):t.send(e)}catch(e){$.notify("🌍 『 𝑺𝒖𝒃-𝑺𝒕𝒐𝒓𝒆 』 下载订阅失败",`❌ 无法下载订阅:${r}!`,`🤔 原因:${JSON.stringify(e)}`),$.error(JSON.stringify(e)),t.status(500).json({status:"failed",message:e})}else $.notify("🌍 『 𝑺𝒖𝒃-𝑺𝒕𝒐𝒓𝒆 』 下载订阅失败",`❌ 未找到订阅:${r}!`),t.status(404).json({status:"failed"})}),e.route("/api/sub/:name").get(function(e,t){const{name:r}=e.params,s=$.read(n)[r];s?t.json({status:"success",data:s}):t.status(404).json({status:"failed",message:`未找到订阅:${r}!`})}).patch(function(e,t){const{name:s}=e.params;let o=e.body;const i=$.read(n);if(i[s]){const e={...i[s],...o};if($.info(`正在更新订阅: ${s}`),s!==o.name){const t=$.read(r);for(const e of Object.keys(t)){const n=t[e].subscriptions.indexOf(s);-1!==n&&(t[e].subscriptions[n]=o.name)}delete i[s],i[o.name]=e}else i[s]=e;$.write(i,n),t.json({status:"success",data:e})}else t.status(500).json({status:"failed",message:`订阅${s}不存在,无法更新!`})}).delete(function(e,t){const{name:s}=e.params;$.info(`删除订阅:${s}...`);let o=$.read(n);delete o[s],$.write(o,n);let i=$.read(r);for(const e of Object.keys(i))i[e].subscriptions=i[e].subscriptions.filter(e=>e!==s);$.write(i,r),t.json({status:"success"})}),e.route("/api/subs").get(function(e,t){const r=$.read(n);t.json({status:"success",data:r})}).post(function(e,t){const r=e.body,s=$.read(n);$.info(`正在创建订阅: ${r.name}`),s[r.name]&&t.status(500).json({status:"failed",message:`订阅${r.name}已存在!`});/^[\w-_]*$/.test(r.name)?(s[r.name]=r,$.write(s,n),t.status(201).json({status:"success",data:r})):t.status(500).json({status:"failed",message:`订阅名称 ${r.name} 中含有非法字符!名称中只能包含英文字母、数字、下划线、横杠。`})}),e.get("/api/sub/statistics/:name"),e.route("/api/collection/:name").get(function(e,t){const{name:n}=e.params,s=$.read(r)[n];s?t.json({status:"success",data:s}):t.status(404).json({status:"failed",message:`未找到订阅集:${n}!`})}).patch(function(e,t){const{name:n}=e.params;let s=e.body;const o=$.read(r);if(o[n]){const e={...o[n],...s};$.info(`正在更新组合订阅:${n}...`),delete o[n],o[s.name||n]=e,$.write(o,r),t.json({status:"success",data:e})}else t.status(500).json({status:"failed",message:`订阅集${n}不存在,无法更新!`})}).delete(function(e,t){const{name:n}=e.params;$.info(`正在删除组合订阅:${n}`);let s=$.read(r);delete s[n],$.write(s,r),t.json({status:"success"})}),e.route("/api/collections").get(function(e,t){const n=$.read(r);t.json({status:"success",data:n})}).post(function(e,t){const n=e.body;$.info(`正在创建组合订阅:${n.name}`);const s=$.read(r);s[n.name]&&t.status(500).json({status:"failed",message:`订阅集${n.name}已存在!`});/^[\w-_]*$/.test(n.name)?(s[n.name]=n,$.write(s,r),t.status(201).json({status:"success",data:n})):t.status(500).json({status:"failed",message:`订阅集名称 ${n.name} 中含有非法字符!名称中只能包含英文字母、数字、下划线、横杠。`})}),e.get("/download/rule/:name",async function(e,t){const{name:n}=e.params,{builtin:r}=e.query,s=e.query.target||f(e.headers)||"Surge";let i;$.info(`正在下载${r?"内置":""}分流订阅:${n}...`),r&&(i=$.read(o).rules[n]);if(i){const e=await d({type:"rule",item:i,platform:s});t.send(e)}else $.notify("🌍 『 𝑺𝒖𝒃-𝑺𝒕𝒐𝒓𝒆 』 下载分流订阅失败",`❌ 未找到分流订阅:${n}!`),t.status(404).json({status:"failed"})}),e.route("/api/rules").post(function(e,t){}).get(function(e,t){}),e.route("/api/rule/:name").patch(function(e,t){}).delete(function(e,t){}).get(function(e,t){}),e.route("/api/storage").get((e,t)=>{t.json($.read("#sub-store"))}).post((e,t)=>{const n=e.body;$.write(JSON.stringify(n),"#sub-store"),t.end()}),e.route("/api/settings").get(function(e,n){const r=$.read(t);n.json(r)}).patch(function(e,n){const r=e.body,s=$.read(t);$.write({...s,...r},t),n.json({status:"success"})}),e.route("/api/artifacts").get(function(e,t){const n=$.read(i);t.json({status:"success",data:n})}).post(function(e,t){const n=e.body;$.info(`正在创建远程配置:${n.name}`);const r=$.read(i);r[n.name]?t.status(500).json({status:"failed",message:`远程配置${n.name}已存在!`}):/^[\w-_.]*$/.test(n.name)?(r[n.name]=n,$.write(r,i),t.status(201).json({status:"success",data:n})):t.status(500).json({status:"failed",message:`远程配置名称 ${n.name} 中含有非法字符!名称中只能包含英文字母、数字、下划线、横杠。`})}),e.route("/api/artifact/:name").get(async function(e,t){const o=e.params.name,a=e.query.action,c=$.read(i),l=c[o];if(l)if(a){let e;switch(l.type){case"subscription":e=$.read(n)[l.source];break;case"collection":e=$.read(r)[l.source];break;case"rule":e=$.read(s)[l.source]}const o=await d({type:l.type,item:e,platform:l.platform});if("preview"===a)t.send(o);else if("sync"===a){$.info(`正在上传配置:${l.name}\n>>>`),console.log(JSON.stringify(l,null,2));try{const e=await p({[l.name]:{content:o}});l.updated=(new Date).getTime();const n=JSON.parse(e.body);l.url=n.files[l.name].raw_url.replace(/\/raw\/[^\/]*\/(.*)/,"/raw/$1"),$.write(c,i),t.json({status:"success"})}catch(e){t.status(500).json({status:"failed",message:e})}}}else t.json({status:"success",data:l});else t.status(404).json({status:"failed",message:"未找到对应的配置!"})}).patch(function(e,t){const n=$.read(i),r=e.params.name,s=n[r];if(s){$.info(`正在更新远程配置:${s.name}`);const o=e.body;if(void 0===o.name||/^[\w-_.]*$/.test(o.name)){const e={...s,...o};n[e.name]=e,e.name!==r&&delete n[r],$.write(n,i),t.json({status:"success",data:e})}else t.status(500).json({status:"failed",message:`远程配置名称 ${o.name} 中含有非法字符!名称中只能包含英文字母、数字、下划线、横杠。`})}else t.status(404).json({status:"failed",message:"未找到对应的远程配置!"})}).delete(async function(e,t){const n=e.params.name;$.info(`正在删除远程配置:${n}`);const r=$.read(i);try{const e=r[n];if(!e)throw new Error(`远程配置:${n}不存在!`);e.updated&&await p({filename:n,content:""}),delete r[n],$.write(r,i),t.json({status:"success"})}catch(e){delete r[n],$.write(r,i),t.status(500).json({status:"failed",message:`无法删除远程配置:${n}, 原因:${e}`})}}),e.get("/api/utils/IP_API/:server",async function(e,t){const n=decodeURIComponent(e.params.server),r=await $.http.get(`http://ip-api.com/json/${n}?lang=zh-CN`).then(e=>JSON.parse(e.body));t.json(r)}),e.get("/api/utils/env",function(e,t){const{isNode:n,isQX:r,isLoon:s,isSurge:o}=ENV();let i="Node";n&&(i="Node");r&&(i="QX");s&&(i="Loon");o&&(i="Surge");t.json({backend:i})}),e.get("/api/utils/backup",async function(e,n){const{action:r}=e.query,{gistToken:s}=$.read(t);if(s){const e=new Gist({token:s,key:a});try{let s;switch(r){case"upload":const n=$.read(t);n.syncTime=(new Date).getTime(),$.write(n,t),s=$.read("#sub-store"),$.env.isNode&&(s=JSON.stringify($.cache,null," ")),$.info("上传备份中..."),await e.upload({[c]:{content:s}});break;case"download":$.info("还原备份中..."),s=await e.download(c),$.write(s,"#sub-store"),$.env.isNode&&(s=JSON.parse(s),Object.keys(s).forEach(e=>{$.write(s[e],e)}))}n.json({status:"success"})}catch(e){const t=`${"upload"===r?"上传":"下载"}备份失败!${e}`;$.error(t),n.status(500).json({status:"failed",message:t})}}else n.status(500).json({status:"failed",message:"未找到Gist备份Token!"})}),e.get("/api/cron/sync-artifacts",async function(e,t){$.info("开始同步所有远程配置...");const o=$.read(i),a={};try{await Promise.all(Object.values(o).map(async e=>{if(e.sync){let t;switch($.info(`正在同步云配置:${e.name}...`),e.type){case"subscription":t=$.read(n)[e.source];break;case"collection":t=$.read(r)[e.source];break;case"rule":t=$.read(s)[e.source]}const o=await d({type:e.type,item:t,platform:e.platform});a[e.name]={content:o}}}));const e=await p(a),c=JSON.parse(e.body);for(const e of Object.values(o))e.updated=(new Date).getTime(),e.url=c.files[e.name].raw_url.replace(/\/raw\/[^\/]*\/(.*)/,"/raw/$1");$.write(o,i),$.info("全部订阅同步成功!"),t.status(200).end()}catch(e){t.status(500).json({error:e}),$.info(`同步订阅失败,原因:${e}`)}}),e.get("/",async(e,t)=>{t.set("location","https://sub-store.vercel.app/").status(302).end()}),ENV().isQX&&e.options("/",async(e,t)=>{t.status(200).end()}),e.all("/",(e,t)=>{t.send("Hello from sub-store, made with ❤️ by Peng-YM")}),e.start()}service();var ProxyUtils=function(){const PROXY_PREPROCESSORS=function(){return[{name:"HTML",test:e=>/^/.test(e),parse:e=>""},function(){const e=["dm1lc3M","c3NyOi8v","dHJvamFu","c3M6Ly","c3NkOi8v","c2hhZG93","aHR0c"];return{name:"Base64 Pre-processor",test:function(t){return e.some(e=>-1!==t.indexOf(e))},parse:function(e){return e=Base64.safeDecode(e)}}}(),{name:"Clash Pre-processor",test:function(e){return/proxies/.test(e)},parse:function(e){return YAML.load(e).proxies.map(e=>JSON.stringify(e)).join("\n")}},{name:"SSD Pre-processor",test:function(e){return 0===e.indexOf("ssd://")},parse:function(e){const t=[];let n=JSON.parse(Base64.safeDecode(e.split("ssd://")[1]));n.traffic_used,n.traffic_total,n.expiry,n.airport;let r=n.port,s=n.encryption,o=n.password,i=n.servers;for(let e=0;e{let[t,s]=e.split("=");if(t=t.trim(),s=s.trim(),-1!==r.indexOf(t)){n.type=t;const e=s.split(":");n.server=e[0],n.port=e[1]}else n[t.trim()]=s.trim()}),n}function t(){return{name:"Loon HTTP Parser",test:e=>/^.*=\s*http/i.test(e.split(",")[0])&&5===e.split(",").length&&-1===e.indexOf("username")&&-1===e.indexOf("password"),parse:e=>{const t=e.split("=")[1].split(","),n={name:e.split("=")[0].trim(),type:"http",server:t[1],port:t[2],tls:"443"===t[2]};return t[3]&&(n.username=t[3]),t[4]&&(n.password=t[4]),n.tls&&(n.sni=t["tls-name"]||n.server,n["skip-cert-verify"]=JSON.parse(t["skip-cert-verify"]||"false")),n}}}function n(e){const t={};t.name=e.split("=")[0].trim();const n=e.split(",");t.server=n[1].trim(),t.port=n[2].trim();for(let e=3;e/^ss:\/\//.test(e),parse:e=>{const t={};let n=e.split("ss://")[1];const r={name:decodeURIComponent(e.split("#")[1]),type:"ss",supported:t},s=(n=n.split("#")[0]).match(/@([^\/]*)(\/|$)/)[1],o=s.lastIndexOf(":");r.server=s.substring(0,o),r.port=s.substring(o+1);const i=Base64.safeDecode(n.split("@")[0]).split(":");if(r.cipher=i[0],r.password=i[1],-1!==n.indexOf("?plugin=")){const e=("plugin="+decodeURIComponent(n.split("?plugin=")[1].split("&")[0])).split(";"),s={};for(const t of e){const[e,n]=t.split("=");e&&(s[e]=n||!0)}switch(s.plugin){case"obfs-local":case"simple-obfs":r.plugin="obfs",r["plugin-opts"]={mode:s.obfs,host:s["obfs-host"]};break;case"v2ray-plugin":r.supported={...t,Loon:!1,Surge:!1},r.obfs="v2ray-plugin",r["plugin-opts"]={mode:"websocket",host:s["obfs-host"],path:s.path||"",tls:s.tls||!1};break;default:throw new Error(`Unsupported plugin option: ${s.plugin}`)}}return r}},function(){const e={Surge:!1};return{name:"URI SSR Parser",test:e=>/^ssr:\/\//.test(e),parse:t=>{let n=(t=Base64.safeDecode(t.split("ssr://")[1])).indexOf(":origin");-1===n&&(n=t.indexOf(":auth_"));const r=t.substring(0,n),s=r.substring(0,r.lastIndexOf(":")),o=r.substring(r.lastIndexOf(":")+1);let i=t.substring(n+1).split("/?")[0].split(":"),a={type:"ssr",server:s,port:o,protocol:i[0],cipher:i[1],obfs:i[2],password:Base64.safeDecode(i[3]),supported:e};const c={};if((t=t.split("/?")[1].split("&")).length>1)for(const e of t){const[t,n]=e.split("=");c[t]=n.trim()}return a={...a,name:c.remarks?Base64.safeDecode(c.remarks):a.server,"protocol-param":Base64.safeDecode(c.protoparam||"").replace(/\s/g,""),"obfs-param":Base64.safeDecode(c.obfsparam||"").replace(/\s/g,"")}}}}(),{name:"URI VMess Parser",test:e=>/^vmess:\/\//.test(e),parse:e=>{const t={};e=e.split("vmess://")[1];const n=Base64.safeDecode(e);if(/=\s*vmess/.test(n)){const e=n.split(",").map(e=>e.trim()),t={};for(const n of e)if(-1!==n.indexOf("=")){const[e,r]=n.split("=");t[e.trim()]=r.trim()}const r={name:e[0].split("=")[0].trim(),type:"vmess",server:e[1],port:e[2],cipher:e[3],uuid:e[4].match(/^"(.*)"$/)[1],tls:"over-tls"===t.obfs||"wss"===t.obfs};if(void 0!==t["udp-relay"]&&(r.udp=JSON.parse(t["udp-relay"])),void 0!==t["fast-open"]&&(r.udp=JSON.parse(t["fast-open"])),"ws"===t.obfs||"wss"===t.obfs){r.network="ws",r["ws-opts"].path=(t["obfs-path"]||'"/"').match(/^"(.*)"$/)[1];let e=t["obfs-header"];e&&-1!==e.indexOf("Host")&&(e=e.match(/Host:\s*([a-zA-Z0-9-.]*)/)[1]),r["ws-opts"].headers={Host:e||r.server}}return r.tls&&"false"===t['"tls-verification"']&&(r["skip-cert-verify"]=!0),r.tls&&t["obfs-host"]&&(r.sni=t["obfs-host"]),r}{const e=JSON.parse(n),r={name:e.ps,type:"vmess",server:e.add,port:e.port,cipher:"auto",uuid:e.id,alterId:e.aid||0,tls:"tls"===e.tls||!0===e.tls,supported:t};return"ws"===e.net&&(r.network="ws",r["ws-opts"]={path:e.path,headers:{Host:e.host||e.add}},r.tls&&e.host&&(r.sni=e.host)),!1===e.verify_cert&&(r["skip-cert-verify"]=!0),r}}},{name:"URI Trojan Parser",test:e=>/^trojan:\/\//.test(e),parse:e=>{e=e.split("trojan://")[1];const[t,n]=e.split("@")[1].split("?")[0].split(":"),r=decodeURIComponent(e.split("#")[1].trim());let s=e.split("?"),o=null;return s.length>1&&(s=s[1].split("#")[0].split("&"),o=new Map(s.map(e=>e.split("="))).get("sni")),{name:r||`[Trojan] ${t}`,type:"trojan",server:t,port:n,password:e.split("@")[0],sni:o,supported:{}}}},{name:"Clash Parser",test:e=>{try{JSON.parse(e)}catch(e){return!1}return!0},parse:e=>JSON.parse(e)},{name:"Surge SS Parser",test:e=>/^.*=\s*ss/.test(e.split(",")[0]),parse:e=>{const t=n(e),r={name:t.name,type:"ss",server:t.server,port:t.port,cipher:t["encrypt-method"],password:t.password,tfo:JSON.parse(t.tfo||"false"),udp:JSON.parse(t["udp-relay"]||"false")};return t.obfs&&(r.plugin="obfs",r["plugin-opts"]={mode:t.obfs,host:t["obfs-host"]}),r}},{name:"Surge VMess Parser",test:e=>/^.*=\s*vmess/.test(e.split(",")[0])&&-1!==e.indexOf("username"),parse:e=>{const t=n(e),r={name:t.name,type:"vmess",server:t.server,port:t.port,uuid:t.username,alterId:0,cipher:"none",tls:JSON.parse(t.tls||"false"),tfo:JSON.parse(t.tfo||"false")};if(r.tls&&(void 0!==t["skip-cert-verify"]&&(r["skip-cert-verify"]=!0===t["skip-cert-verify"]||"1"===t["skip-cert-verify"]),r.sni=t.sni||t.server),JSON.parse(t.ws||"false")){r.network="ws",r["ws-opts"]={path:t["ws-path"]};const e=t["ws-headers"].match(/(,|^|\s)*HOST:\s*(.*?)(,|$)/),n=e?e[2]:r.server;r["ws-opts"].headers={Host:n||t.server}}return r}},{name:"Surge Trojan Parser",test:e=>/^.*=\s*trojan/.test(e.split(",")[0])&&-1!==e.indexOf("sni"),parse:e=>{const t=n(e),r={name:t.name,type:"trojan",server:t.server,port:t.port,password:t.password,sni:t.sni||t.server,tfo:JSON.parse(t.tfo||"false")};return void 0!==t["skip-cert-verify"]&&(r["skip-cert-verify"]=!0===t["skip-cert-verify"]||"1"===t["skip-cert-verify"]),r}},{name:"Surge HTTP Parser",test:e=>/^.*=\s*http/.test(e.split(",")[0])&&!t().test(e),parse:e=>{const t=n(e),r={name:t.name,type:"http",server:t.server,port:t.port,tls:JSON.parse(t.tls||"false"),tfo:JSON.parse(t.tfo||"false")};return r.tls&&(void 0!==t["skip-cert-verify"]&&(r["skip-cert-verify"]=!0===t["skip-cert-verify"]||"1"===t["skip-cert-verify"]),r.sni=t.sni||t.server),t.username&&"none"!==t.username&&(r.username=t.username),t.password&&"none"!==t.password&&(r.password=t.password),r}},{name:"Loon SS Parser",test:e=>"shadowsocks"===e.split(",")[0].split("=")[1].trim().toLowerCase(),parse:e=>{const t=e.split("=")[1].split(","),n={name:e.split("=")[0].trim(),type:"ss",server:t[1],port:t[2],cipher:t[3],password:t[4].replace(/"/g,"")};return t.length>5&&(n.plugin="obfs",n["plugin-opts"]={mode:t[5],host:t[6]}),n}},{name:"Loon SSR Parser",test:e=>"shadowsocksr"===e.split(",")[0].split("=")[1].trim().toLowerCase(),parse:e=>{const t=e.split("=")[1].split(",");return{name:e.split("=")[0].trim(),type:"ssr",server:t[1],port:t[2],cipher:t[3],password:t[4].replace(/"/g,""),protocol:t[5],"protocol-param":t[6].match(/{(.*)}/)[1],supported:{Surge:!1},obfs:t[7],"obfs-param":t[8].match(/{(.*)}/)[1]}}},{name:"Loon VMess Parser",test:e=>/^.*=\s*vmess/i.test(e.split(",")[0])&&-1===e.indexOf("username"),parse:e=>{let t=e.split("=")[1].split(",");const n={name:e.split("=")[0].trim(),type:"vmess",server:t[1],port:t[2],cipher:t[3]||"none",uuid:t[4].replace(/"/g,""),alterId:0};t=t.splice(5);for(const e of t){const[n,r]=e.split(":");t[n]=r}switch(n.tls=JSON.parse(t["over-tls"]||"false"),n.tls&&(n.sni=t["tls-name"]||n.server,n["skip-cert-verify"]=JSON.parse(t["skip-cert-verify"]||"false")),t.transport){case"tcp":break;case"ws":n.network=t.transport,n["ws-opts"]={path:t.path,headers:{Host:t.host}}}return n.tls&&(n["skip-cert-verify"]=JSON.parse(t["skip-cert-verify"]||"false")),n}},{name:"Loon Trojan Parser",test:e=>/^.*=\s*trojan/i.test(e.split(",")[0])&&-1===e.indexOf("password"),parse:e=>{const t=e.split("=")[1].split(","),n={name:e.split("=")[0].trim(),type:"trojan",server:t[1],port:t[2],password:t[3].replace(/"/g,""),sni:t[1],"skip-cert-verify":JSON.parse(t["skip-cert-verify"]||"false")};if(t.length>4){const[r,s]=t[4].split(":");if("tls-name"!==r)throw new Error(`Unknown option ${r} for line: \n${e}`);n.sni=s}return n}},t(),{name:"QX SS Parser",test:e=>/^shadowsocks\s*=/.test(e.split(",")[0].trim())&&-1===e.indexOf("ssr-protocol"),parse:t=>{const n=e(t),r={name:n.tag,type:"ss",server:n.server,port:n.port,cipher:n.method,password:n.password,udp:JSON.parse(n["udp-relay"]||"false"),tfo:JSON.parse(n["fast-open"]||"false"),supported:{}};if(n.obfs)switch(r["plugin-opts"]={host:n["obfs-host"]||r.server},n.obfs){case"http":case"tls":r.plugin="obfs",r["plugin-opts"].mode=n.obfs;break;case"ws":case"wss":r["plugin-opts"]={...r["plugin-opts"],mode:"websocket",path:n["obfs-uri"]||"/",tls:"wss"===n.obfs},r["plugin-opts"].tls&&void 0!==n["tls-verification"]&&(r["plugin-opts"]["skip-cert-verify"]=n["tls-verification"]),r.plugin="v2ray-plugin",r.supported.Surge=!1,r.supported.Loon=!1}return r}},{name:"QX SSR Parser",test:e=>/^shadowsocks\s*=/.test(e.split(",")[0].trim())&&-1!==e.indexOf("ssr-protocol"),parse:t=>{const n=e(t),r={name:n.tag,type:"ssr",server:n.server,port:n.port,cipher:n.method,password:n.password,protocol:n["ssr-protocol"],obfs:"plain","protocol-param":n["ssr-protocol-param"],udp:JSON.parse(n["udp-relay"]||"false"),tfo:JSON.parse(n["fast-open"]||"false"),supported:{Surge:!1}};return n.obfs&&(r.obfs=n.obfs,r["obfs-param"]=n["obfs-host"]),r}},{name:"QX VMess Parser",test:e=>/^vmess\s*=/.test(e.split(",")[0].trim()),parse:t=>{const n=e(t),r={type:"vmess",name:n.tag,server:n.server,port:n.port,cipher:n.method||"none",uuid:n.password,alterId:0,tls:"over-tls"===n.obfs||"wss"===n.obfs,udp:JSON.parse(n["udp-relay"]||"false"),tfo:JSON.parse(n["fast-open"]||"false")};return r.tls&&(r.sni=n["obfs-host"]||n.server,r["skip-cert-verify"]=!JSON.parse(n["tls-verification"]||"true")),"ws"!==n.obfs&&"wss"!==n.obfs||(r.network="ws",r["ws-opts"]={path:n["obfs-uri"],headers:{Host:n["obfs-host"]||n.server}}),r}},{name:"QX Trojan Parser",test:e=>/^trojan\s*=/.test(e.split(",")[0].trim()),parse:t=>{const n=e(t),r={type:"trojan",name:n.tag,server:n.server,port:n.port,password:n.password,sni:n["tls-host"]||n.server,udp:JSON.parse(n["udp-relay"]||"false"),tfo:JSON.parse(n["fast-open"]||"false")};return r["skip-cert-verify"]=!JSON.parse(n["tls-verification"]||"true"),r}},{name:"QX HTTP Parser",test:e=>/^http\s*=/.test(e.split(",")[0].trim()),parse:t=>{const n=e(t),r={type:"http",name:n.tag,server:n.server,port:n.port,tls:JSON.parse(n["over-tls"]||"false"),udp:JSON.parse(n["udp-relay"]||"false"),tfo:JSON.parse(n["fast-open"]||"false")};return n.username&&"none"!==n.username&&(r.username=n.username),n.password&&"none"!==n.password&&(r.password=n.password),r.tls&&(r.sni=n["tls-host"]||r.server,r["skip-cert-verify"]=!JSON.parse(n["tls-verification"]||"true")),r}}]}(),PROXY_PROCESSORS=function(){function SetPropertyOperator({key:e,value:t}){return{name:"Set Property Operator",func:n=>n.map(n=>(n[e]=t,n))}}function FlagOperator(e=!0){return{name:"Flag Operator",func:t=>t.map(t=>{if(e){const e=getFlag(t.name);t.name=removeFlag(t.name),t.name=e+" "+t.name,t.name=t.name.replace(/🇹🇼/g,"🇨🇳")}else t.name=removeFlag(t.name);return t})}}function HandleDuplicateOperator(e){const{action:t,template:n,link:r,position:s}={action:"rename",template:"0 1 2 3 4 5 6 7 8 9",link:"-",position:"back",...e};return{name:"Handle Duplicate Operator",func:e=>{if("delete"===t){const t={};return e.filter(e=>!t[e.name]&&(t[e.name]=!0,!0))}if("rename"===t){const t=n.split(" "),o={};let i=0;e.forEach(e=>{void 0===o[e.name]?o[e.name]=1:o[e.name]++,i=Math.max(o[e.name].toString().length,i)});const a={};return e.map(e=>{if(o[e.name]>1){void 0===a[e.name]&&(a[e.name]=1);let n="",o=a[e.name]++,c=0;for(;o>0;)n=t[o%10]+n,o=parseInt(o/10),c++;for(;c++{switch(e){case"asc":case"desc":return t.sort((t,n)=>{let r=t.name>n.name?1:-1;return r*="desc"===e?-1:1});case"random":return shuffle(t);default:throw new Error("Unknown sort option: "+e)}}}}function RegexSortOperator(e){return{name:"Regex Sort Operator",func:t=>(e=e.map(e=>buildRegex(e)),t.sort((t,n)=>{const r=getRegexOrder(e,t.name),s=getRegexOrder(e,n.name);return r&&!s?-1:s&&!r?1:r&&s?rt.map(t=>{for(const{expr:n,now:r}of e)t.name=t.name.replace(buildRegex(n,"g"),r).trim();return t})}}function RegexDeleteOperator(e){return{name:"Regex Delete Operator",func:RegexRenameOperator(e.map(e=>({expr:e,now:""}))).func}}function ScriptOperator(script,targetPlatform,$arguments){return{name:"Script Operator",func:proxies=>{let output=proxies;return function(){const $get=(e,t)=>{return(0,PROXY_PROCESSORS[e])(t)},$process=ApplyProcessor;eval(script),output=operator(proxies,targetPlatform)}(),output}}}function UselessFilter(){return{name:"Useless Filter",func:RegexFilter({regex:["网址","流量","时间","应急","过期","Bandwidth","expire"],keep:!1}).func}}function RegionFilter(e){const t={HK:"🇭🇰",TW:"🇹🇼",US:"🇺🇸",SG:"🇸🇬",JP:"🇯🇵",UK:"🇬🇧"};return{name:"Region Filter",func:n=>n.map(n=>{const r=getFlag(n.name);return e.some(e=>t[e]===r)})}}function RegexFilter({regex:e=[],keep:t=!0}){return{name:"Regex Filter",func:n=>n.map(n=>{const r=e.some(e=>buildRegex(e).test(n.name));return t?r:!r})}}function TypeFilter(e){return{name:"Type Filter",func:t=>t.map(t=>e.some(e=>t.type===e))}}function ScriptFilter(script,targetPlatform,$arguments){return{name:"Script Filter",func:proxies=>{let output=FULL(proxies.length,!0);return function(){eval(script),output=filter(proxies,targetPlatform)}(),output}}}function getFlag(e){const t={"🇦🇿":["阿塞拜疆"],"🇦🇹":["奥地利","奧地利","Austria","维也纳"],"🇦🇺":["AU","Australia","Sydney","澳大利亚","澳洲","墨尔本","悉尼","土澳","京澳","廣澳","滬澳","沪澳","广澳"],"🇧🇪":["BE","比利時","比利时"],"🇧🇬":["保加利亚","保加利亞","Bulgaria"],"🇧🇭":["BH","巴林"],"🇧🇩":["BD","孟加拉"],"🇵🇰":["巴基斯坦"],"🇰🇭":["柬埔寨"],"🇺🇦":["烏克蘭","乌克兰"],"🇭🇷":["克罗地亚","HR","克羅地亞"],"🇨🇦":["Canada","CANADA","CAN","Waterloo","加拿大","蒙特利尔","温哥华","楓葉","枫叶","滑铁卢","多伦多","CA"],"🇨🇭":["瑞士","苏黎世","Switzerland","Zurich"],"🇳🇬":["尼日利亚","NG","尼日利亞"],"🇨🇿":["Czechia","捷克"],"🇸🇰":["斯洛伐克","SK"],"🇷🇸":["RS","塞尔维亚"],"🇲🇩":["摩爾多瓦","MD","摩尔多瓦"],"🇩🇪":["DE","German","GERMAN","德国","德國","法兰克福","京德","滬德","廣德","沪德","广德","Frankfurt"],"🇩🇰":["DK","DNK","丹麦","丹麥"],"🇪🇸":["ES","西班牙","Spain"],"🇪🇺":["EU","欧盟","欧罗巴"],"🇫🇮":["Finland","芬兰","芬蘭","赫尔辛基"],"🇫🇷":["FR","France","法国","法國","巴黎"],"🇬🇧":["UK","GB","England","United Kingdom","英国","伦敦","英","London"],"🇲🇴":["MO","Macao","澳门","澳門","CTM"],"🇰🇿":["哈萨克斯坦","哈萨克"],"🇭🇺":["匈牙利","Hungary"],"🇭🇰":["HK","Hongkong","Hong Kong","HongKong","HONG KONG","香港","深港","沪港","呼港","HKT","HKBN","HGC","WTT","CMI","穗港","京港","港"],"🇮🇩":["Indonesia","印尼","印度尼西亚","雅加达"],"🇮🇪":["Ireland","IRELAND","爱尔兰","愛爾蘭","都柏林"],"🇮🇱":["Israel","以色列"],"🇮🇳":["India","IND","INDIA","印度","孟买","MFumbai"],"🇮🇸":["IS","ISL","冰岛","冰島"],"🇰🇵":["KP","朝鲜"],"🇰🇷":["KR","Korea","KOR","韩国","首尔","韩","韓","春川","Chuncheon","Seoul"],"🇱🇺":["卢森堡"],"🇱🇻":["Latvia","Latvija","拉脱维亚"],"🇲🇽":["MEX","MX","墨西哥"],"🇲🇾":["MY","Malaysia","MALAYSIA","马来西亚","大馬","馬來西亞","吉隆坡"],"🇳🇱":["NL","Netherlands","荷兰","荷蘭","尼德蘭","阿姆斯特丹"],"🇳🇵":["尼泊尔"],"🇵🇭":["PH","Philippines","菲律宾","菲律賓"],"🇵🇷":["PR","波多黎各"],"🇷🇴":["RO","罗马尼亚"],"🇷🇺":["RU","Russia","俄罗斯","俄国","俄羅斯","伯力","莫斯科","圣彼得堡","西伯利亚","新西伯利亚","京俄","杭俄","廣俄","滬俄","广俄","沪俄","Moscow"],"🇸🇦":["沙特"],"🇸🇪":["SE","Sweden","瑞典"],"🇲🇹":["马耳他"],"🇲🇦":["MA","摩洛哥"],"🇸🇬":["SG","Singapore","SINGAPORE","新加坡","狮城","沪新","京新","泉新","穗新","深新","杭新","广新","廣新","滬新"],"🇹🇭":["TH","Thailand","泰国","泰國","曼谷"],"🇹🇷":["TR","Turkey","土耳其","伊斯坦布尔"],"🇹🇼":["TW","Taiwan","TAIWAN","台湾","台北","台中","新北","彰化","CHT","台","HINET","Taipei"],"🇺🇸":["US","USA","America","United States","美国","美","京美","波特兰","达拉斯","俄勒冈","凤凰城","费利蒙","硅谷","矽谷","拉斯维加斯","洛杉矶","圣何塞","圣克拉拉","西雅图","芝加哥","沪美","哥伦布","纽约","Los Angeles","San Jose","Sillicon Valley","Michigan"],"🇻🇳":["VN","越南","胡志明市"],"🇻🇪":["VE","委内瑞拉"],"🇮🇹":["Italy","IT","Nachash","意大利","米兰","義大利"],"🇿🇦":["South Africa","南非"],"🇦🇪":["United Arab Emirates","阿联酋","迪拜","AE"],"🇧🇷":["BR","Brazil","巴西","圣保罗"],"🇯🇵":["JP","Japan","JAPAN","日本","东京","大阪","埼玉","沪日","穗日","川日","中日","泉日","杭日","深日","辽日","广日","大坂","Osaka","Tokyo"],"🇦🇷":["AR","阿根廷"],"🇳🇴":["Norway","挪威","NO"],"🇨🇳":["CN","China","回国","中国","中國","江苏","北京","上海","广州","深圳","杭州","徐州","青岛","宁波","镇江","back"],"🇵🇱":["PL","POL","波兰","波蘭"],"🇨🇱":["智利"],"🇳🇿":["新西蘭","新西兰"],"🇬🇷":["希腊","希臘"],"🇪🇬":["埃及"],"🇨🇾":["CY","塞浦路斯"],"🇨🇷":["CR","哥斯达黎加"],"🇸🇮":["SI","斯洛文尼亚"],"🇱🇹":["LT","立陶宛"],"🇵🇦":["PA","巴拿马"],"🇹🇳":["TN","突尼斯"],"🇮🇲":["马恩岛","馬恩島"],"🇧🇾":["BY","白俄","白俄罗斯"],"🇵🇹":["葡萄牙"],"🇰🇪":["KE","肯尼亚"],"🇰🇬":["KG","吉尔吉斯坦"],"🇯🇴":["JO","约旦"],"🇺🇾":["UY","乌拉圭"],"🇲🇳":["蒙古"],"🇮🇷":["IR","伊朗"],"🇵🇪":["秘鲁","祕魯"],"🇨🇴":["哥伦比亚"],"🇪🇪":["爱沙尼亚"],"🇪🇨":["EC","厄瓜多尔"],"🇲🇰":["马其顿","馬其頓"],"🇧🇦":["波黑共和国","波黑"],"🇬🇪":["格魯吉亞","格鲁吉亚"],"🇦🇱":["阿爾巴尼亞","阿尔巴尼亚"],"🏳️‍🌈":["流量","时间","应急","过期","Bandwidth","expire"]};for(let n of Object.keys(t))if(t[n].some(t=>-1!==e.indexOf(t)))return n;return(e.match(/[\uD83C][\uDDE6-\uDDFF][\uD83C][\uDDE6-\uDDFF]/)||[])[0]||"🏴‍☠️"}function removeFlag(e){return e.replace(/[\uD83C][\uDDE6-\uDDFF][\uD83C][\uDDE6-\uDDFF]/g,"").trim()}function shuffle(e){let t,n,r=e.length;for(;0!==r;)n=Math.floor(Math.random()*r),t=e[r-=1],e[r]=e[n],e[n]=t;return e}return{"Useless Filter":UselessFilter,"Region Filter":RegionFilter,"Regex Filter":RegexFilter,"Type Filter":TypeFilter,"Script Filter":ScriptFilter,"Set Property Operator":SetPropertyOperator,"Flag Operator":FlagOperator,"Sort Operator":SortOperator,"Regex Sort Operator":RegexSortOperator,"Regex Rename Operator":RegexRenameOperator,"Regex Delete Operator":RegexDeleteOperator,"Script Operator":ScriptOperator,"Handle Duplicate Operator":HandleDuplicateOperator}}(),PROXY_PRODUCERS=function(){return{QX:{produce:e=>{let t,n;switch(e.type){case"ss":if(t="","obfs"===e.plugin){const{host:n,mode:r}=e["plugin-opts"];t=`,obfs=${r}${n?",obfs-host="+n:""}`}if("v2ray-plugin"===e.plugin){const{tls:n,host:r,path:s}=e["plugin-opts"];t=`,obfs=${n?"wss":"ws"}${r?",obfs-host="+r:""}${s?",obfs-uri="+s:""}`}return`shadowsocks=${e.server}:${e.port},method=${e.cipher},password=${e.password}${t}${e.tfo?",fast-open=true":",fast-open=false"}${e.udp?",udp-relay=true":",udp-relay=false"},tag=${e.name}`;case"ssr":return`shadowsocks=${e.server}:${e.port},method=${e.cipher},password=${e.password},ssr-protocol=${e.protocol}${e["protocol-param"]?",ssr-protocol-param="+e["protocol-param"]:""}${e.obfs?",obfs="+e.obfs:""}${e["obfs-param"]?",obfs-host="+e["obfs-param"]:""},fast-open=${e.tfo||!1}${e.udp?",udp-relay=true":",udp-relay=false"},tag=${e.name}`;case"vmess":t="","ws"===e.network?t=e.tls?`,obfs=wss${e.sni?",obfs-host="+e.sni:""}${e["ws-opts"].path?",obfs-uri="+e["ws-opts"].path:""},tls-verification=${e["skip-cert-verify"]?"false":"true"}`:`,obfs=ws${e["ws-opts"].headers.Host?",obfs-host="+e["ws-opts"].headers.Host:""}${e["ws-opts"].path?",obfs-uri="+e["ws-opts"].path:""}`:e.tls&&(t=`,obfs=over-tls${e.sni?",obfs-host="+e.sni:""},tls-verification=${e["skip-cert-verify"]?"false":"true"}`);let r=`vmess=${e.server}:${e.port},method=${"auto"===e.cipher?"none":e.cipher},password=${e.uuid}${t},fast-open=${e.tfo||!1}${e.udp?",udp-relay=true":",udp-relay=false"}`;return 0===e.alterId&&(e["vmess-aead"]=!0),void 0!==e["vmess-aead"]&&(r+=`,aead=${e["vmess-aead"]}`),r+=`,tag=${e.name}`;case"trojan":return`trojan=${e.server}:${e.port},password=${e.password}${e.sni?",tls-host="+e.sni:""},over-tls=true,tls-verification=${e["skip-cert-verify"]?"false":"true"},fast-open=${e.tfo||!1}${e.udp?",udp-relay=true":",udp-relay=false"},tag=${e.name}`;case"http":return n="",e.tls&&(n=`,over-tls=true,tls-verification=${e["skip-cert-verify"]?"false":"true"}${e.sni?",tls-host="+e.sni:""}`),`http=${e.server}:${e.port},username=${e.username},password=${e.password}${n},fast-open=${e.tfo||!1},tag=${e.name}`}throw new Error(`Platform QX does not support proxy type: ${e.type}`)}},Surge:{produce:e=>{let t,n,r="";switch(e.type){case"ss":if(t="",e.plugin){const{host:n,mode:r}=e["plugin-opts"];if("obfs"!==e.plugin)throw new Error(`Platform Surge does not support obfs option: ${e.obfs}`);t=`,obfs=${r}${n?",obfs-host="+n:""}`}r=`${e.name}=ss,${e.server}, ${e.port},encrypt-method=${e.cipher},password=${e.password}${t},tfo=${e.tfo||"false"},udp-relay=${e.udp||"false"}`;break;case"vmess":if(n="",r=`${e.name}=vmess,${e.server},${e.port},username=${e.uuid},tls=${e.tls||"false"},tfo=${e.tfo||"false"}`,0===e.alterId&&(e["vmess-aead"]=!0),void 0!==e["vmess-aead"]&&(r+=`,vmess-aead=${e["vmess-aead"]}`),"ws"===e.network){const t=e["ws-opts"].path||"/",n=Object.entries(e["ws-opts"].headers).map(([e,t])=>`${e}:"${t}"`).join("|");r+=`,ws=true${t?",ws-path="+t:""}${n?",ws-headers="+n:""}`}e.tls&&(r+=`${void 0!==e["skip-cert-verify"]?",skip-cert-verify="+e["skip-cert-verify"]:""}`,r+=e.sni?`,sni=${e.sni}`:"");break;case"trojan":r=`${e.name}=trojan,${e.server},${e.port},password=${e.password}${void 0!==e["skip-cert-verify"]?",skip-cert-verify="+e["skip-cert-verify"]:""}${e.sni?",sni="+e.sni:""},tfo=${e.tfo||"false"},udp-relay=${e.udp||"false"}`;break;case"http":n=", tls=false",e.tls&&(n=`,tls=true,skip-cert-verify=${e["skip-cert-verify"]},sni=${e.sni}`),r=`${e.name}=http, ${e.server}, ${e.port}${e.username?",username="+e.username:""}${e.password?",password="+e.password:""}${n},tfo=${e.tfo||"false"}`;break;default:throw new Error(`Platform Surge does not support proxy type: ${e.type}`)}return r+=void 0!==e["surge-hybrid"]?`,hybrid=${e["surge-hybrid"]}`:""}},Loon:{produce:e=>{let t="",n="",r="",s="";switch(void 0!==e.udp&&(r=e.udp?",udp=true":",udp=false"),s=`,fast-open=${e.tfo||!1}`,e.type){case"ss":if(t=",,",e.plugin){if("obfs"!==e.plugin)throw new Error(`Platform Loon does not support obfs option: ${e.obfs}`);{const{mode:n,host:r}=e["plugin-opts"];t=`,${n},${r||""}`}}return`${e.name}=shadowsocks,${e.server},${e.port},${e.cipher},"${e.password}"${t}${r}${s}`;case"ssr":return`${e.name}=shadowsocksr,${e.server},${e.port},${e.cipher},"${e.password}",${e.protocol},{${e["protocol-param"]||""}},${e.obfs},{${e["obfs-param"]||""}}${r}${s}`;case"vmess":t="",t="ws"===e.network?`,transport:ws,host:${e["ws-opts"].headers.Host||e.server},path:${e["ws-opts"].path||"/"}`:",transport:tcp",e.tls&&(t+=`${e.sni?",tls-name:"+e.sni:""},skip-cert-verify:${e["skip-cert-verify"]||"false"}`);let o=`${e.name}=vmess,${e.server},${e.port},${"auto"===e.cipher?"none":e.cipher},"${e.uuid}",over-tls:${e.tls||"false"}${t}`;return 0===e.alterId&&(e["vmess-aead"]=!0),void 0!==e["vmess-aead"]&&(o+=`,vmess-aead=${e["vmess-aead"]}`),o;case"trojan":return`${e.name}=trojan,${e.server},${e.port},"${e.password}"${e.sni?",tls-name:"+e.sni:""},skip-cert-verify:${e["skip-cert-verify"]||"false"}${r}`;case"http":n="";const i=`${e.name}=${e.tls?"http":"https"},${e.server},${e.port},${e.username||""},${e.password||""}`;return e.tls?i+(n=`${e.sni?",tls-name:"+e.sni:""},skip-cert-verify:${e["skip-cert-verify"]}`):i}throw new Error(`Platform Loon does not support proxy type: ${e.type}`)}},Clash:{type:"ALL",produce:e=>"proxies:\n"+e.map(e=>(delete e.supported," - "+JSON.stringify(e)+"\n")).join("")},URI:{type:"SINGLE",produce:e=>{let t="";switch(e.type){case"ss":const n=`${e.cipher}:${e.password}`;if(t=`ss://${Base64.safeEncode(n)}@${e.server}:${e.port}/`,e.plugin){t+="?plugin=";const n=e["plugin-opts"];switch(e.plugin){case"obfs":t+=encodeURIComponent(`simple-obfs;obfs=${n.mode}${n.host?";obfs-host="+n.host:""}`);break;case"v2ray-plugin":t+=encodeURIComponent(`v2ray-plugin;obfs=${n.mode}${n.host?";obfs-host"+n.host:""}${n.tls?";tls":""}`);break;default:throw new Error(`Unsupported plugin option: ${e.plugin}`)}}t+=`#${encodeURIComponent(e.name)}`;break;case"ssr":t=`${e.server}:${e.port}:${e.protocol}:${e.cipher}:${e.obfs}:${Base64.safeEncode(e.password)}/`,t+=`?remarks=${Base64.safeEncode(e.name)}${e["obfs-param"]?"&obfsparam="+Base64.safeEncode(e["obfs-param"]):""}${e["protocol-param"]?"&protocolparam="+Base64.safeEncode(e["protocol-param"]):""}`,t="ssr://"+Base64.safeEncode(t);break;case"vmess":t={ps:e.name,add:e.server,port:e.port,id:e.uuid,type:"",aid:0,net:e.network||"tcp",tls:e.tls?"tls":""},"ws"===e.network&&(t.path=e["ws-opts"].path||"/",t.host=e["ws-opts"].headers.Host||e.server),t="vmess://"+Base64.safeEncode(JSON.stringify(t));break;case"trojan":t=`trojan://${e.password}@${e.server}:${e.port}#${encodeURIComponent(e.name)}`;break;default:throw new Error(`Cannot handle proxy type: ${e.type}`)}return t}},JSON:{type:"ALL",produce:e=>JSON.stringify(e,null,2)}}}();function preprocess(e){for(const t of PROXY_PREPROCESSORS)try{if(t.test(e))return $.info(`Pre-processor [${t.name}] activated`),t.parse(e)}catch(e){$.error(`Parser [${t.name}] failed\n Reason: ${e}`)}return e}function safeMatch(e,t){let n;try{n=e.test(t)}catch(e){n=!1}return n}function parse(e){const t=(e=preprocess(e)).split("\n"),n=[];let r;for(let e of t){if(0===(e=e.trim()).length)continue;let t=r&&safeMatch(r,e);if(!t)for(const n of PROXY_PARSERS)if(safeMatch(n,e)){r=n,t=!0,$.info(`Proxy parser: ${n.name} is activated`);break}if(t)try{const t=r.parse(e);t||$.error(`Parser ${r.name} return nothing for \n${e}\n`),n.push(t)}catch(t){$.error(`Failed to parse line: \n ${e}\n Reason: ${t.stack}`)}else $.error(`Failed to find a rule to parse line: \n${e}\n`)}return n}async function process(e,t=[],n){for(const r of t){let t;const s={};if(-1!==r.type.indexOf("Script")){const{mode:e,content:n}=r.args;if("link"===e){const e=n,o=e.split("#");if(o.length>1)for(const e of o[1].split("&")){const t=e.split("=")[0],n=e.split("=")[1]||!0;s[t]=n}try{t=await $downloader.download(e.split("#")[0]),$.info(`Script loaded: >>>\n ${t}`)}catch(e){$.error(`Error when downloading remote script: ${r.args.content}.\n Reason: ${e}`);continue}}else t=n}if(!PROXY_PROCESSORS[r.type]){$.error(`Unknown operator: "${r.type}"`);continue}let o;$.info(`Applying "${r.type}" with arguments:\n >>> ${JSON.stringify(r.args,null,2)||"None"}`),e=ApplyProcessor(o=-1!==r.type.indexOf("Script")?PROXY_PROCESSORS[r.type](t,n,s):PROXY_PROCESSORS[r.type](r.args),e)}return e}function produce(e,t){const n=PROXY_PRODUCERS[t];if(!n)throw new Error(`Target platform: ${t} is not supported!`);return e=e.filter(e=>!(e.supported&&!1===e.supported[t])),$.info(`Producing proxies for target: ${t}`),void 0===n.type||"SINGLE"===n.type?e.map(e=>{try{return n.produce(e)}catch(t){return $.error(`Cannot produce proxy: ${JSON.stringify(e,null,2)}\nReason: ${t}`),""}}).filter(e=>e.length>0).join("\n"):"ALL"===n.type?n.produce(e):void 0}return{parse:parse,process:process,produce:produce}}(),RuleUtils=function(){const e=[[/^(DOMAIN|host|HOST)$/,"DOMAIN"],[/^(DOMAIN-KEYWORD|host-keyword|HOST-KEYWORD)$/,"DOMAIN-KEYWORD"],[/^(DOMAIN-SUFFIX|host-suffix|HOST-SUFFIX)$/,"DOMAIN-SUFFIX"],[/^USER-AGENT$/i,"USER-AGENT"],[/^PROCESS-NAME$/,"PROCESS-NAME"],[/^(DEST-PORT|DST-PORT)$/,"DST-PORT"],[/^SRC-IP(-CIDR)?$/,"SRC-IP"],[/^(IN|SRC)-PORT$/,"IN-PORT"],[/^PROTOCOL$/,"PROTOCOL"],[/^IP-CIDR$/i,"IP-CIDR"],[/^(IP-CIDR6|ip6-cidr|IP6-CIDR)$/]],t=function(){return[{name:"HTML",test:e=>/^/.test(e),parse:e=>""},{name:"Clash Provider",test:e=>0===e.indexOf("payload:"),parse:e=>e.replace("payload:","").replace(/^\s*-\s*/gm,"")}]}(),n=function(){return[{name:"Universal Rule Parser",test:()=>!0,parse:t=>{const n=t.split("\n"),r=[];for(let t of n)if(0!==(t=t.trim()).length&&!/\s*#/.test(t))try{const n=t.split(",").map(e=>e.trim());let s=n[0],o=!1;for(const t of e)if(t[0].test(s)){o=!0;const e={type:t[1],content:n[1]};"IP-CIDR"!==e.type&&"IP-CIDR6"!==e.type||(e.options=n.slice(2)),r.push(e)}if(!o)throw new Error("Invalid rule type: "+s)}catch(e){console.error(`Failed to parse line: ${t}\n Reason: ${e}`)}return r}}]}(),r=function(){return{"Regex Filter":function({regex:e=[],keep:t=!0}){return{name:"Regex Filter",func:n=>n.map(n=>{const r=e.some(e=>(e=new RegExp(e)).test(n));return t?r:!r})}},"Remove Duplicate Filter":function(){return{name:"Remove Duplicate Filter",func:e=>{const t=new Set,n=[];return e.forEach(e=>{const r=e.options||[];r.sort();const s=`${e.type},${e.content},${JSON.stringify(r)}`;t.has(s)||(n.push(e),t.add(s))}),n}}},"Type Filter":function(e){return{name:"Type Filter",func:t=>t.map(t=>e.some(e=>t.type===e))}},"Regex Replace Operator":function(e){return{name:"Regex Rename Operator",func:t=>t.map(t=>{for(const{expr:n,now:r}of e)t.content=t.content.replace(new RegExp(n,"g"),r).trim();return t})}}}}(),s=function(){return{QX:{type:"SINGLE",func:e=>-1!==["URL-REGEX","DEST-PORT","SRC-IP","IN-PORT","PROTOCOL"].indexOf(e.type)?null:`${{"DOMAIN-KEYWORD":"HOST-KEYWORD","DOMAIN-SUFFIX":"HOST-SUFFIX",DOMAIN:"HOST","IP-CIDR6":"IP6-CIDR"}[e.type]||e.type},${e.content},SUB-STORE`},Surge:{type:"SINGLE",func:e=>{let t=`${e.type},${e.content}`;return"IP-CIDR"!==e.type&&"IP-CIDR6"!==e.type||(t+=e.options?`,${e.options[0]}`:""),t}},Loon:{type:"SINGLE",func:e=>-1!==["DEST-PORT","SRC-IP","IN-PORT","PROTOCOL"].indexOf(e.type)?null:(e=>{let t=`${e.type},${e.content}`;return"IP-CIDR"!==e.type&&"IP-CIDR6"!==e.type||(t+=e.options?`,${e.options[0]}`:""),t})(e)},Clash:{type:"ALL",func:e=>{const t={"DEST-PORT":"DST-PORT","SRC-IP":"SRC-IP-CIDR","IN-PORT":"SRC-PORT"},n={payload:e.map(e=>{let n=`${t[e.type]||e.type},${e.content}`;return"IP-CIDR"!==e.type&&"IP-CIDR6"!==e.type||(n+=e.options?`,${e.options[0]}`:""),n})};return YAML.stringify(n)}}}}();return{parse:function(e){e=function(e){for(const n of t)try{if(n.test(e))return $.info(`Pre-processor [${n.name}] activated`),n.parse(e)}catch(e){$.error(`Parser [${n.name}] failed\n Reason: ${e}`)}return e}(e);for(const t of n){let n;try{n=t.test(e)}catch(e){n=!1}if(n)return $.info(`Rule parser [${t.name}] is activated!`),t.parse(e)}},process:async function(e,t){for(const n of t){if(!r[n.type]){console.error(`Unknown operator: ${n.type}!`);continue}const t=r[n.type](n.args);$.info(`Applying "${n.type}" with arguments: \n >>> ${JSON.stringify(n.args)||"None"}`),e=ApplyProcessor(t,e)}return e},produce:function(e,t){const n=s[t];if(!n)throw new Error(`Target platform: ${t} is not supported!`);return void 0===n.type||"SINGLE"===n.type?e.map(e=>{try{return n.func(e)}catch(t){return console.log(`ERROR: cannot produce rule: ${JSON.stringify(e)}\nReason: ${t}`),""}}).filter(e=>e.length>0).join("\n"):"ALL"===n.type?n.func(e):void 0}}}();function getBuiltInRules(){return{AD:{name:"AD",description:"",urls:["https://raw.githubusercontent.com/privacy-protection-tools/anti-AD/master/anti-ad-surge.txt","https://raw.githubusercontent.com/ACL4SSR/ACL4SSR/master/Clash/Providers/BanAD.yaml"]},Global:{name:"Global",description:"",urls:["https://raw.githubusercontent.com/ACL4SSR/ACL4SSR/master/Clash/Providers/ProxyGFWlist.yaml","https://raw.githubusercontent.com/DivineEngine/Profiles/master/Quantumult/Filter/Global.list"]},CN:{name:"CN",description:"",urls:["https://raw.githubusercontent.com/ACL4SSR/ACL4SSR/master/Clash/Providers/ChinaDomain.yaml","https://raw.githubusercontent.com/DivineEngine/Profiles/master/Quantumult/Filter/China.list"]}}}function ApplyProcessor(e,t){return-1!==e.name.indexOf("Filter")?function(e,t){let n=FULL(t.length,!0);try{n=AND(n,e.func(t))}catch(t){console.log(`Cannot apply filter ${e.name}\n Reason: ${t}`)}return t.filter((e,t)=>n[t])}(e,t):-1!==e.name.indexOf("Operator")?function(e,t){let n=clone(t);try{const t=e.func(n);t&&(n=t)}catch(t){console.log(`Cannot apply operator ${e.name}! Reason: ${t}`)}return n}(e,t):void 0}function AND(...e){return e.reduce((e,t)=>e.map((e,n)=>t[n]&&e))}function OR(...e){return e.reduce((e,t)=>e.map((e,n)=>t[n]||e))}function NOT(e){return e.map(e=>!e)}function FULL(e,t){return[...Array(e).keys()].map(()=>t)}function clone(e){return JSON.parse(JSON.stringify(e))}function buildRegex(e,...t){return t=t.join(""),e.startsWith("(?i)")?(e=e.substr(4),new RegExp(e,"i"+t)):new RegExp(e,t)}function ENV(){const e="undefined"!=typeof $task,t="undefined"!=typeof $loon,n="undefined"!=typeof $httpClient&&!t,r="function"==typeof require&&"undefined"!=typeof $jsbox;return{isQX:e,isLoon:t,isSurge:n,isNode:"function"==typeof require&&!r,isJSBox:r,isRequest:"undefined"!=typeof $request,isScriptable:"undefined"!=typeof importModule}}function HTTP(e={baseURL:""}){const{isQX:t,isLoon:n,isSurge:r,isScriptable:s,isNode:o}=ENV(),i=/https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_\+.~#?&//=]*)/;const a={};return["GET","POST","PUT","DELETE","HEAD","OPTIONS","PATCH"].forEach(c=>a[c.toLowerCase()]=(a=>(function(a,c){c="string"==typeof c?{url:c}:c;const l=e.baseURL;l&&!i.test(c.url||"")&&(c.url=l?l+c.url:c.url);const p=(c={...e,...c}).timeout,u={onRequest:()=>{},onResponse:e=>e,onTimeout:()=>{},...c.events};let f,d;if(u.onRequest(a,c),t)f=$task.fetch({method:a,url:c.url,headers:c.headers,body:c.body});else if(n||r||o)f=new Promise((e,t)=>{(o?require("request"):$httpClient)[a.toLowerCase()](c,(n,r,s)=>{n?t(n):e({statusCode:r.status||r.statusCode,headers:r.headers,body:s})})});else if(s){const e=new Request(c.url);e.method=a,e.headers=c.headers,e.body=c.body,f=new Promise((t,n)=>{e.loadString().then(n=>{t({statusCode:e.response.statusCode,headers:e.response.headers,body:n})}).catch(e=>n(e))})}const h=p?new Promise((e,t)=>{d=setTimeout(()=>(u.onTimeout(),t(`${a} URL: ${c.url} exceeds the timeout ${p} ms`)),p)}):null;return(h?Promise.race([h,f]).then(e=>(clearTimeout(d),e)):f).then(e=>u.onResponse(e))})(c,a))),a}function API(e="untitled",t=!1){const{isQX:n,isLoon:r,isSurge:s,isNode:o,isJSBox:i,isScriptable:a}=ENV();return new class{constructor(e,t){this.name=e,this.debug=t,this.http=HTTP(),this.env=ENV(),this.node=(()=>{if(o){return{fs:require("fs")}}return null})(),this.initCache();Promise.prototype.delay=function(e){return this.then(function(t){return((e,t)=>new Promise(function(n){setTimeout(n.bind(null,t),e)}))(e,t)})}}initCache(){if(n&&(this.cache=JSON.parse($prefs.valueForKey(this.name)||"{}")),(r||s)&&(this.cache=JSON.parse($persistentStore.read(this.name)||"{}")),o){let e="root.json";this.node.fs.existsSync(e)||this.node.fs.writeFileSync(e,JSON.stringify({}),{flag:"wx"},e=>console.log(e)),this.root={},e=`${this.name}.json`,this.node.fs.existsSync(e)?this.cache=JSON.parse(this.node.fs.readFileSync(`${this.name}.json`)):(this.node.fs.writeFileSync(e,JSON.stringify({}),{flag:"wx"},e=>console.log(e)),this.cache={})}}persistCache(){const e=JSON.stringify(this.cache,null,2);n&&$prefs.setValueForKey(e,this.name),(r||s)&&$persistentStore.write(e,this.name),o&&(this.node.fs.writeFileSync(`${this.name}.json`,e,{flag:"w"},e=>console.log(e)),this.node.fs.writeFileSync("root.json",JSON.stringify(this.root,null,2),{flag:"w"},e=>console.log(e)))}write(e,t){if(this.log(`SET ${t}`),-1!==t.indexOf("#")){if(t=t.substr(1),s||r)return $persistentStore.write(e,t);if(n)return $prefs.setValueForKey(e,t);o&&(this.root[t]=e)}else this.cache[t]=e;this.persistCache()}read(e){return this.log(`READ ${e}`),-1===e.indexOf("#")?this.cache[e]:(e=e.substr(1),s||r?$persistentStore.read(e):n?$prefs.valueForKey(e):o?this.root[e]:void 0)}delete(e){if(this.log(`DELETE ${e}`),-1!==e.indexOf("#")){if(e=e.substr(1),s||r)return $persistentStore.write(null,e);if(n)return $prefs.removeValueForKey(e);o&&delete this.root[e]}else delete this.cache[e];this.persistCache()}notify(e,t="",c="",l={}){const p=l["open-url"],u=l["media-url"];if(n&&$notify(e,t,c,l),s&&$notification.post(e,t,c+`${u?"\n多媒体:"+u:""}`,{url:p}),r){let n={};p&&(n.openUrl=p),u&&(n.mediaUrl=u),"{}"===JSON.stringify(n)?$notification.post(e,t,c):$notification.post(e,t,c,n)}if(o||a){const n=c+(p?`\n点击跳转: ${p}`:"")+(u?`\n多媒体: ${u}`:"");if(i){require("push").schedule({title:e,body:(t?t+"\n":"")+n})}else console.log(`${e}\n${t}\n${n}\n\n`)}}log(e){this.debug&&console.log(`[${this.name}] LOG: ${e}`)}info(e){console.log(`[${this.name}] INFO: ${e}`)}error(e){console.log(`[${this.name}] ERROR: ${e}`)}wait(e){return new Promise(t=>setTimeout(t,e))}done(e={}){n||r||s?$done(e):o&&!i&&"undefined"!=typeof $context&&($context.headers=e.headers,$context.statusCode=e.statusCode,$context.body=e.body)}}(e,t)}function Gist({token:e,key:t}){const n=HTTP({baseURL:"https://api.github.com",headers:{Authorization:`token ${e}`,"User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.141 Safari/537.36"},events:{onResponse:e=>/^[45]/.test(String(e.statusCode))?Promise.reject(`ERROR: ${JSON.parse(e.body).message}`):e}});async function r(){return n.get("/gists").then(e=>{const n=JSON.parse(e.body);for(let e of n)if(e.description===t)return e.id;return-1})}this.upload=async function(e){const s=await r();return-1===s?n.post({url:"/gists",body:JSON.stringify({description:t,public:!1,files:e})}):n.patch({url:`/gists/${s}`,body:JSON.stringify({files:e})})},this.download=async function(e){const t=await r();if(-1===t)return Promise.reject("未找到Gist备份!");try{const{files:r}=await n.get(`/gists/${t}`).then(e=>JSON.parse(e.body)),s=r[e].raw_url;return await n.get(s).then(e=>e.body)}catch(e){return Promise.reject(e)}}}function express({port:e}={port:3e3}){const{isNode:t}=ENV(),n={"Content-Type":"text/plain;charset=UTF-8","Access-Control-Allow-Origin":"*","Access-Control-Allow-Methods":"POST,GET,OPTIONS,PATCH,PUT,DELETE","Access-Control-Allow-Headers":"Origin, X-Requested-With, Content-Type, Accept"};if(t){const t=require("express"),r=require("body-parser"),s=t();return s.use(r.json({verify:a})),s.use(r.urlencoded({verify:a,extended:!0})),s.use(r.raw({verify:a,type:"*/*"})),s.use((e,t,r)=>{t.set(n),r()}),s.start=(()=>{s.listen(e,()=>{$.log(`Express started on port: ${e}`)})}),s}const r=[],s=["GET","POST","PUT","DELETE","PATCH","OPTIONS","HEAD'","ALL"],o=(e,t=0)=>{let{method:n,url:s,headers:i,body:a}=e;/json/i.test(i["Content-Type"])&&(a=JSON.parse(a)),n=n.toUpperCase();const{path:u,query:f}=function(e){const t=(e.match(/https?:\/\/[^\/]+(\/[^?]*)/)||[])[1]||"/",n=e.indexOf("?"),r={};if(-1!==n){let t=e.slice(e.indexOf("?")+1).split("&");for(let e=0;em&&(h=r[d],m=e.split("/").length)}if(h){const e=()=>{o(n,s,d)},t={method:n,url:s,path:u,query:f,params:p(h.pattern,u),headers:i,body:a},r=c(),l=h.callback,m=e=>{r.status(500).json({status:"failed",message:`Internal Server Error: ${e}`})};if("AsyncFunction"===l.constructor.name)l(t,r,e).catch(m);else try{l(t,r,e)}catch(e){m(e)}}else{c().status(404).json({status:"failed",message:"ERROR: 404 not found"})}},i={};return s.forEach(e=>{i[e.toLowerCase()]=((t,n)=>{r.push({method:e,pattern:t,callback:n})})}),i.route=(e=>{const t={};return s.forEach(n=>{t[n.toLowerCase()]=(s=>(r.push({method:n,pattern:e,callback:s}),t))}),t}),i.start=(()=>{o($request)}),i;function a(e,t,n,r){n&&n.length&&(e.rawBody=n.toString(r||"utf8"))}function c(){let e=200;const{isQX:t,isLoon:r,isSurge:s}=ENV(),o=n,i={200:"HTTP/1.1 200 OK",201:"HTTP/1.1 201 Created",302:"HTTP/1.1 302 Found",307:"HTTP/1.1 307 Temporary Redirect",308:"HTTP/1.1 308 Permanent Redirect",404:"HTTP/1.1 404 Not Found",500:"HTTP/1.1 500 Internal Server Error"};return new class{status(t){return e=t,this}send(n=""){const a={status:t?i[e]:e,body:n,headers:o};t?$done(a):(r||s)&&$done({response:a})}end(){this.send()}html(e){this.set("Content-Type","text/html;charset=UTF-8"),this.send(e)}json(e){this.set("Content-Type","application/json;charset=UTF-8"),this.send(JSON.stringify(e))}set(e,t){return o[e]=t,this}}}function l(e,t){if(e instanceof RegExp&&e.test(t))return!0;if("/"===e)return!0;if(-1===e.indexOf(":")){const n=t.split("/"),r=e.split("/");for(let e=0;e>>6)+n(128|63&t):n(224|t>>>12&15)+n(128|t>>>6&63)+n(128|63&t):(t=65536+1024*(e.charCodeAt(0)-55296)+(e.charCodeAt(1)-56320),n(240|t>>>18&7)+n(128|t>>>12&63)+n(128|t>>>6&63)+n(128|63&t))},s=/[\uD800-\uDBFF][\uDC00-\uDFFFF]|[^\x00-\x7F]/g,o=function(t){const n=[0,2,1][t.length%3],r=t.charCodeAt(0)<<16|(t.length>1?t.charCodeAt(1):0)<<8|(t.length>2?t.charCodeAt(2):0);return[e.charAt(r>>>18),e.charAt(r>>>12&63),n>=2?"=":e.charAt(r>>>6&63),n>=1?"=":e.charAt(63&r)].join("")};this.encode=function(e){return"[object Uint8Array]"===Object.prototype.toString.call(e)?e.toString("base64"):function(e){return e.replace(s,r)}(String(e)).replace(/[\s\S]{1,3}/g,o)};const i=/[\xC0-\xDF][\x80-\xBF]|[\xE0-\xEF][\x80-\xBF]{2}|[\xF0-\xF7][\x80-\xBF]{3}/g,a=function(e){switch(e.length){case 4:const t=((7&e.charCodeAt(0))<<18|(63&e.charCodeAt(1))<<12|(63&e.charCodeAt(2))<<6|63&e.charCodeAt(3))-65536;return n(55296+(t>>>10))+n(56320+(1023&t));case 3:return n((15&e.charCodeAt(0))<<12|(63&e.charCodeAt(1))<<6|63&e.charCodeAt(2));default:return n((31&e.charCodeAt(0))<<6|63&e.charCodeAt(1))}},c=function(e){const r=e.length,s=r%4,o=(r>0?t[e.charAt(0)]<<18:0)|(r>1?t[e.charAt(1)]<<12:0)|(r>2?t[e.charAt(2)]<<6:0)|(r>3?t[e.charAt(3)]:0),i=[n(o>>>16),n(o>>>8&255),n(255&o)];return i.length-=[0,0,2,1][s],i.join("")},l=function(e){return e.replace(/\S{1,4}/g,c)},p=function(e){return l(e).replace(i,a)};this.decode=function(e){return p(String(e).replace(/[-_]/g,function(e){return"-"===e?"+":"/"}).replace(/[^A-Za-z0-9\+\/]/g,"")).replace(/>/g,">").replace(/</g,"<")},this.safeEncode=function(e){return this.encode(e.replace(/\+/g,"-").replace(/\//g,"_"))},this.safeDecode=function(e){return this.decode(e.replace(/-/g,"+").replace(/_/g,"/"))}}var YAML=function(){function e(e){return null==e}var t={isNothing:e,isObject:function(e){return"object"==typeof e&&null!==e},toArray:function(t){return Array.isArray(t)?t:e(t)?[]:[t]},repeat:function(e,t){var n,r="";for(n=0;na&&(t=r-a+(o=" ... ").length),n-r>a&&(n=r+a-(i=" ...").length),{str:o+e.slice(t,n).replace(/\t/g,"→")+i,pos:r-t+o.length}}function i(e,n){return t.repeat(" ",n-e.length)+e}var a=function(e,n){if(n=Object.create(n||null),!e.buffer)return null;n.maxLength||(n.maxLength=79),"number"!=typeof n.indent&&(n.indent=1),"number"!=typeof n.linesBefore&&(n.linesBefore=3),"number"!=typeof n.linesAfter&&(n.linesAfter=2);for(var r,s=/\r?\n|\r|\0/g,a=[0],c=[],l=-1;r=s.exec(e.buffer);)c.push(r.index),a.push(r.index+r[0].length),e.position<=r.index&&l<0&&(l=a.length-2);l<0&&(l=a.length-1);var p,u,f="",d=Math.min(e.line+n.linesAfter,c.length).toString().length,h=n.maxLength-(n.indent+d+3);for(p=1;p<=n.linesBefore&&!(l-p<0);p++)u=o(e.buffer,a[l-p],c[l-p],e.position-(a[l]-a[l-p]),h),f=t.repeat(" ",n.indent)+i((e.line-p+1).toString(),d)+" | "+u.str+"\n"+f;for(u=o(e.buffer,a[l],c[l],e.position,h),f+=t.repeat(" ",n.indent)+i((e.line+1).toString(),d)+" | "+u.str+"\n",f+=t.repeat("-",n.indent+d+3+u.pos)+"^\n",p=1;p<=n.linesAfter&&!(l+p>=c.length);p++)u=o(e.buffer,a[l+p],c[l+p],e.position-(a[l]-a[l+p]),h),f+=t.repeat(" ",n.indent)+i((e.line+p+1).toString(),d)+" | "+u.str+"\n";return f.replace(/\n$/,"")},c=["kind","multi","resolve","construct","instanceOf","predicate","represent","representName","defaultStyle","styleAliases"],l=["scalar","sequence","mapping"];var p=function(e,t){var n,r;if(t=t||{},Object.keys(t).forEach(function(t){if(-1===c.indexOf(t))throw new s('Unknown option "'+t+'" is met in definition of "'+e+'" YAML type.')}),this.options=t,this.tag=e,this.kind=t.kind||null,this.resolve=t.resolve||function(){return!0},this.construct=t.construct||function(e){return e},this.instanceOf=t.instanceOf||null,this.predicate=t.predicate||null,this.represent=t.represent||null,this.representName=t.representName||null,this.defaultStyle=t.defaultStyle||null,this.multi=t.multi||!1,this.styleAliases=(n=t.styleAliases||null,r={},null!==n&&Object.keys(n).forEach(function(e){n[e].forEach(function(t){r[String(t)]=e})}),r),-1===l.indexOf(this.kind))throw new s('Unknown kind "'+this.kind+'" is specified for "'+e+'" YAML type.')};function u(e,t){var n=[];return e[t].forEach(function(e){var t=n.length;n.forEach(function(n,r){n.tag===e.tag&&n.kind===e.kind&&n.multi===e.multi&&(t=r)}),n[t]=e}),n}function f(e){return this.extend(e)}f.prototype.extend=function(e){var t=[],n=[];if(e instanceof p)n.push(e);else if(Array.isArray(e))n=n.concat(e);else{if(!e||!Array.isArray(e.implicit)&&!Array.isArray(e.explicit))throw new s("Schema.extend argument should be a Type, [ Type ], or a schema definition ({ implicit: [...], explicit: [...] })");e.implicit&&(t=t.concat(e.implicit)),e.explicit&&(n=n.concat(e.explicit))}t.forEach(function(e){if(!(e instanceof p))throw new s("Specified list of YAML types (or a single Type object) contains a non-Type object.");if(e.loadKind&&"scalar"!==e.loadKind)throw new s("There is a non-scalar type in the implicit list of a schema. Implicit resolving of such types is not supported.");if(e.multi)throw new s("There is a multi type in the implicit list of a schema. Multi tags can only be listed as explicit.")}),n.forEach(function(e){if(!(e instanceof p))throw new s("Specified list of YAML types (or a single Type object) contains a non-Type object.")});var r=Object.create(f.prototype);return r.implicit=(this.implicit||[]).concat(t),r.explicit=(this.explicit||[]).concat(n),r.compiledImplicit=u(r,"implicit"),r.compiledExplicit=u(r,"explicit"),r.compiledTypeMap=function(){var e,t,n={scalar:{},sequence:{},mapping:{},fallback:{},multi:{scalar:[],sequence:[],mapping:[],fallback:[]}};function r(e){e.multi?(n.multi[e.kind].push(e),n.multi.fallback.push(e)):n[e.kind][e.tag]=n.fallback[e.tag]=e}for(e=0,t=arguments.length;e=0?"0b"+e.toString(2):"-0b"+e.toString(2).slice(1)},octal:function(e){return e>=0?"0o"+e.toString(8):"-0o"+e.toString(8).slice(1)},decimal:function(e){return e.toString(10)},hexadecimal:function(e){return e>=0?"0x"+e.toString(16).toUpperCase():"-0x"+e.toString(16).toUpperCase().slice(1)}},defaultStyle:"decimal",styleAliases:{binary:[2,"bin"],octal:[8,"oct"],decimal:[10,"dec"],hexadecimal:[16,"hex"]}}),O=new RegExp("^(?:[-+]?(?:[0-9][0-9_]*)(?:\\.[0-9_]*)?(?:[eE][-+]?[0-9]+)?|\\.[0-9_]+(?:[eE][-+]?[0-9]+)?|[-+]?\\.(?:inf|Inf|INF)|\\.(?:nan|NaN|NAN))$");var A=/^[-+]?[0-9]+e/;var C=new p("tag:yaml.org,2002:float",{kind:"scalar",resolve:function(e){return null!==e&&!(!O.test(e)||"_"===e[e.length-1])},construct:function(e){var t,n;return n="-"===(t=e.replace(/_/g,"").toLowerCase())[0]?-1:1,"+-".indexOf(t[0])>=0&&(t=t.slice(1)),".inf"===t?1===n?Number.POSITIVE_INFINITY:Number.NEGATIVE_INFINITY:".nan"===t?NaN:n*parseFloat(t,10)},predicate:function(e){return"[object Number]"===Object.prototype.toString.call(e)&&(e%1!=0||t.isNegativeZero(e))},represent:function(e,n){var r;if(isNaN(e))switch(n){case"lowercase":return".nan";case"uppercase":return".NAN";case"camelcase":return".NaN"}else if(Number.POSITIVE_INFINITY===e)switch(n){case"lowercase":return".inf";case"uppercase":return".INF";case"camelcase":return".Inf"}else if(Number.NEGATIVE_INFINITY===e)switch(n){case"lowercase":return"-.inf";case"uppercase":return"-.INF";case"camelcase":return"-.Inf"}else if(t.isNegativeZero(e))return"-0.0";return r=e.toString(10),A.test(r)?r.replace("e",".e"):r},defaultStyle:"lowercase"}),k=y.extend({implicit:[$,w,S,C]}),x=k,R=new RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9])-([0-9][0-9])$"),I=new RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9]?)-([0-9][0-9]?)(?:[Tt]|[ \\t]+)([0-9][0-9]?):([0-9][0-9]):([0-9][0-9])(?:\\.([0-9]*))?(?:[ \\t]*(Z|([-+])([0-9][0-9]?)(?::([0-9][0-9]))?))?$");var N=new p("tag:yaml.org,2002:timestamp",{kind:"scalar",resolve:function(e){return null!==e&&(null!==R.exec(e)||null!==I.exec(e))},construct:function(e){var t,n,r,s,o,i,a,c,l=0,p=null;if(null===(t=R.exec(e))&&(t=I.exec(e)),null===t)throw new Error("Date resolve error");if(n=+t[1],r=+t[2]-1,s=+t[3],!t[4])return new Date(Date.UTC(n,r,s));if(o=+t[4],i=+t[5],a=+t[6],t[7]){for(l=t[7].slice(0,3);l.length<3;)l+="0";l=+l}return t[9]&&(p=6e4*(60*+t[10]+ +(t[11]||0)),"-"===t[9]&&(p=-p)),c=new Date(Date.UTC(n,r,s,o,i,a,l)),p&&c.setTime(c.getTime()-p),c},instanceOf:Date,represent:function(e){return e.toISOString()}});var T=new p("tag:yaml.org,2002:merge",{kind:"scalar",resolve:function(e){return"<<"===e||null===e}}),P="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\n\r";var E=new p("tag:yaml.org,2002:binary",{kind:"scalar",resolve:function(e){if(null===e)return!1;var t,n,r=0,s=e.length,o=P;for(n=0;n64)){if(t<0)return!1;r+=6}return r%8==0},construct:function(e){var t,n,r=e.replace(/[\r\n=]/g,""),s=r.length,o=P,i=0,a=[];for(t=0;t>16&255),a.push(i>>8&255),a.push(255&i)),i=i<<6|o.indexOf(r.charAt(t));return 0==(n=s%4*6)?(a.push(i>>16&255),a.push(i>>8&255),a.push(255&i)):18===n?(a.push(i>>10&255),a.push(i>>2&255)):12===n&&a.push(i>>4&255),new Uint8Array(a)},predicate:function(e){return"[object Uint8Array]"===Object.prototype.toString.call(e)},represent:function(e){var t,n,r="",s=0,o=e.length,i=P;for(t=0;t>18&63],r+=i[s>>12&63],r+=i[s>>6&63],r+=i[63&s]),s=(s<<8)+e[t];return 0==(n=o%3)?(r+=i[s>>18&63],r+=i[s>>12&63],r+=i[s>>6&63],r+=i[63&s]):2===n?(r+=i[s>>10&63],r+=i[s>>4&63],r+=i[s<<2&63],r+=i[64]):1===n&&(r+=i[s>>2&63],r+=i[s<<4&63],r+=i[64],r+=i[64]),r}}),j=Object.prototype.hasOwnProperty,F=Object.prototype.toString;var D=new p("tag:yaml.org,2002:omap",{kind:"sequence",resolve:function(e){if(null===e)return!0;var t,n,r,s,o,i=[],a=e;for(t=0,n=a.length;t>10),56320+(e-65536&1023))}for(var le=new Array(256),pe=new Array(256),ue=0;ue<256;ue++)le[ue]=ae(ue)?1:0,pe[ue]=ae(ue);function fe(e,t){this.input=e,this.filename=t.filename||null,this.schema=t.schema||_,this.onWarning=t.onWarning||null,this.legacy=t.legacy||!1,this.json=t.json||!1,this.listener=t.listener||null,this.implicitTypes=this.schema.compiledImplicit,this.typeMap=this.schema.compiledTypeMap,this.length=e.length,this.position=0,this.line=0,this.lineStart=0,this.lineIndent=0,this.firstTabInLine=-1,this.documents=[]}function de(e,t){var n={name:e.filename,buffer:e.input.slice(0,-1),position:e.position,line:e.line,column:e.position-e.lineStart};return n.snippet=a(n),new s(t,n)}function he(e,t){throw de(e,t)}function me(e,t){e.onWarning&&e.onWarning.call(null,de(e,t))}var ge={YAML:function(e,t,n){var r,s,o;null!==e.version&&he(e,"duplication of %YAML directive"),1!==n.length&&he(e,"YAML directive accepts exactly one argument"),null===(r=/^([0-9]+)\.([0-9]+)$/.exec(n[0]))&&he(e,"ill-formed argument of the YAML directive"),s=parseInt(r[1],10),o=parseInt(r[2],10),1!==s&&he(e,"unacceptable YAML version of the document"),e.version=n[0],e.checkLineBreaks=o<2,1!==o&&2!==o&&me(e,"unsupported YAML version of the document")},TAG:function(e,t,n){var r,s;2!==n.length&&he(e,"TAG directive accepts exactly two arguments"),r=n[0],s=n[1],Z.test(r)||he(e,"ill-formed tag handle (first argument) of the TAG directive"),H.call(e.tagMap,r)&&he(e,'there is a previously declared suffix for "'+r+'" tag handle'),ee.test(s)||he(e,"ill-formed tag prefix (second argument) of the TAG directive");try{s=decodeURIComponent(s)}catch(t){he(e,"tag prefix is malformed: "+s)}e.tagMap[r]=s}};function ye(e,t,n,r){var s,o,i,a;if(t1&&(e.result+=t.repeat("\n",n-1))}function Ae(e,t){var n,r,s=e.tag,o=e.anchor,i=[],a=!1;if(-1!==e.firstTabInLine)return!1;for(null!==e.anchor&&(e.anchorMap[e.anchor]=i),r=e.input.charCodeAt(e.position);0!==r&&(-1!==e.firstTabInLine&&(e.position=e.firstTabInLine,he(e,"tab characters must not be used in indentation")),45===r)&&se(e.input.charCodeAt(e.position+1));)if(a=!0,e.position++,be(e,!0,-1)&&e.lineIndent<=t)i.push(null),r=e.input.charCodeAt(e.position);else if(n=e.line,xe(e,t,Y,!1,!0),i.push(e.result),be(e,!0,-1),r=e.input.charCodeAt(e.position),(e.line===n||e.lineIndent>t)&&0!==r)he(e,"bad indentation of a sequence entry");else if(e.lineIndentn?m=1:e.lineIndent===n?m=0:e.lineIndentn?m=1:e.lineIndent===n?m=0:e.lineIndentt)&&(y&&(i=e.line,a=e.lineStart,c=e.position),xe(e,t,G,!0,s)&&(y?m=e.result:g=e.result),y||(we(e,f,d,h,m,g,i,a,c),h=m=g=null),be(e,!0,-1),l=e.input.charCodeAt(e.position)),(e.line===o||e.lineIndent>t)&&0!==l)he(e,"bad indentation of a mapping entry");else if(e.lineIndent=0))break;0===o?he(e,"bad explicit indentation width of a block scalar; it cannot be less than one"):p?he(e,"repeat of an indentation width identifier"):(u=n+o-1,p=!0)}if(re(i)){do{i=e.input.charCodeAt(++e.position)}while(re(i));if(35===i)do{i=e.input.charCodeAt(++e.position)}while(!ne(i)&&0!==i)}for(;0!==i;){for(ve(e),e.lineIndent=0,i=e.input.charCodeAt(e.position);(!p||e.lineIndentu&&(u=e.lineIndent),ne(i))f++;else{if(e.lineIndent0){for(s=i,o=0;s>0;s--)(i=ie(a=e.input.charCodeAt(++e.position)))>=0?o=(o<<4)+i:he(e,"expected hexadecimal character");e.result+=ce(o),e.position++}else he(e,"unknown escape sequence");n=r=e.position}else ne(a)?(ye(e,n,r,!0),Oe(e,be(e,!1,t)),n=r=e.position):e.position===e.lineStart&&Se(e)?he(e,"unexpected end of the document within a double quoted scalar"):(e.position++,r=e.position)}he(e,"unexpected end of the stream within a double quoted scalar")}(e,d)?y=!0:!function(e){var t,n,r;if(42!==(r=e.input.charCodeAt(e.position)))return!1;for(r=e.input.charCodeAt(++e.position),t=e.position;0!==r&&!se(r)&&!oe(r);)r=e.input.charCodeAt(++e.position);return e.position===t&&he(e,"name of an alias node must contain at least one character"),n=e.input.slice(t,e.position),H.call(e.anchorMap,n)||he(e,'unidentified alias "'+n+'"'),e.result=e.anchorMap[n],be(e,!0,-1),!0}(e)?function(e,t,n){var r,s,o,i,a,c,l,p,u=e.kind,f=e.result;if(se(p=e.input.charCodeAt(e.position))||oe(p)||35===p||38===p||42===p||33===p||124===p||62===p||39===p||34===p||37===p||64===p||96===p)return!1;if((63===p||45===p)&&(se(r=e.input.charCodeAt(e.position+1))||n&&oe(r)))return!1;for(e.kind="scalar",e.result="",s=o=e.position,i=!1;0!==p;){if(58===p){if(se(r=e.input.charCodeAt(e.position+1))||n&&oe(r))break}else if(35===p){if(se(e.input.charCodeAt(e.position-1)))break}else{if(e.position===e.lineStart&&Se(e)||n&&oe(p))break;if(ne(p)){if(a=e.line,c=e.lineStart,l=e.lineIndent,be(e,!1,-1),e.lineIndent>=t){i=!0,p=e.input.charCodeAt(e.position);continue}e.position=o,e.line=a,e.lineStart=c,e.lineIndent=l;break}}i&&(ye(e,s,o,!1),Oe(e,e.line-a),s=o=e.position,i=!1),re(p)||(o=e.position+1),p=e.input.charCodeAt(++e.position)}return ye(e,s,o,!1),!!e.result||(e.kind=u,e.result=f,!1)}(e,d,B===r)&&(y=!0,null===e.tag&&(e.tag="?")):(y=!0,null===e.tag&&null===e.anchor||he(e,"alias node should not have any properties")),null!==e.anchor&&(e.anchorMap[e.anchor]=e.result)):0===m&&(y=c&&Ae(e,h))),null===e.tag)null!==e.anchor&&(e.anchorMap[e.anchor]=e.result);else if("?"===e.tag){for(null!==e.result&&"scalar"!==e.kind&&he(e,'unacceptable node kind for ! tag; it should be "scalar", not "'+e.kind+'"'),l=0,p=e.implicitTypes.length;l"),null!==e.result&&f.kind!==e.kind&&he(e,"unacceptable node kind for !<"+e.tag+'> tag; it should be "'+f.kind+'", not "'+e.kind+'"'),f.resolve(e.result,e.tag)?(e.result=f.construct(e.result,e.tag),null!==e.anchor&&(e.anchorMap[e.anchor]=e.result)):he(e,"cannot resolve a node with !<"+e.tag+"> explicit tag")}return null!==e.listener&&e.listener("close",e),null!==e.tag||null!==e.anchor||y}function Re(e){var t,n,r,s,o=e.position,i=!1;for(e.version=null,e.checkLineBreaks=e.legacy,e.tagMap=Object.create(null),e.anchorMap=Object.create(null);0!==(s=e.input.charCodeAt(e.position))&&(be(e,!0,-1),s=e.input.charCodeAt(e.position),!(e.lineIndent>0||37!==s));){for(i=!0,s=e.input.charCodeAt(++e.position),t=e.position;0!==s&&!se(s);)s=e.input.charCodeAt(++e.position);for(r=[],(n=e.input.slice(t,e.position)).length<1&&he(e,"directive name must not be less than one character in length");0!==s;){for(;re(s);)s=e.input.charCodeAt(++e.position);if(35===s){do{s=e.input.charCodeAt(++e.position)}while(0!==s&&!ne(s));break}if(ne(s))break;for(t=e.position;0!==s&&!se(s);)s=e.input.charCodeAt(++e.position);r.push(e.input.slice(t,e.position))}0!==s&&ve(e),H.call(ge,n)?ge[n](e,n,r):me(e,'unknown document directive "'+n+'"')}be(e,!0,-1),0===e.lineIndent&&45===e.input.charCodeAt(e.position)&&45===e.input.charCodeAt(e.position+1)&&45===e.input.charCodeAt(e.position+2)?(e.position+=3,be(e,!0,-1)):i&&he(e,"directives end mark is expected"),xe(e,e.lineIndent-1,G,!1,!0),be(e,!0,-1),e.checkLineBreaks&&W.test(e.input.slice(o,e.position))&&me(e,"non-ASCII line breaks are interpreted as content"),e.documents.push(e.result),e.position===e.lineStart&&Se(e)?46===e.input.charCodeAt(e.position)&&(e.position+=3,be(e,!0,-1)):e.position=55296&&r<=56319&&t+1=56320&&n<=57343?1024*(r-55296)+n-56320+65536:r}function $t(e){return/^\n* /.test(e)}var wt=1,vt=2,bt=3,St=4,Ot=5;function At(e,t,n,r,s,o,i,a){var c,l,p=0,u=null,f=!1,d=!1,h=-1!==r,m=-1,g=ht(l=yt(e,0))&&l!==Ee&&!dt(l)&&l!==Ge&&l!==Ve&&l!==Ke&&l!==Ye&&l!==ze&&l!==Ze&&l!==tt&&l!==rt&&l!==Je&&l!==He&&l!==qe&&l!==Ue&&l!==nt&&l!==Xe&&l!==Qe&&l!==Be&&l!==Me&&l!==_e&&l!==We&&l!==et&&function(e){return!dt(e)&&e!==Ke}(yt(e,e.length-1));if(t||i)for(c=0;c=65536?c+=2:c++){if(!ht(p=yt(e,c)))return Ot;g=g&>(p,u,a),u=p}else{for(c=0;c=65536?c+=2:c++){if((p=yt(e,c))===Fe)f=!0,h&&(d=d||c-m-1>r&&" "!==e[m+1],m=c);else if(!ht(p))return Ot;g=g&>(p,u,a),u=p}d=d||h&&c-m-1>r&&" "!==e[m+1]}return f||d?n>9&&$t(e)?Ot:i?o===lt?Ot:vt:d?St:bt:!g||i||s(e)?o===lt?Ot:vt:wt}function Ct(e,t,n,r,o){e.dump=function(){if(0===t.length)return e.quotingType===lt?'""':"''";if(!e.noCompatMode&&(-1!==ot.indexOf(t)||it.test(t)))return e.quotingType===lt?'"'+t+'"':"'"+t+"'";var i=e.indent*Math.max(1,n),a=-1===e.lineWidth?-1:Math.max(Math.min(e.lineWidth,40),e.lineWidth-i),c=r||e.flowLevel>-1&&n>=e.flowLevel;switch(At(t,c,e.indent,a,function(t){return function(e,t){var n,r;for(n=0,r=e.implicitTypes.length;n"+kt(t,e.indent)+xt(ut(function(e,t){var n,r,s=/(\n+)([^\n]*)/g,o=(a=e.indexOf("\n"),a=-1!==a?a:e.length,s.lastIndex=a,Rt(e.slice(0,a),t)),i="\n"===e[0]||" "===e[0];var a;for(;r=s.exec(e);){var c=r[1],l=r[2];n=" "===l[0],o+=c+(i||n||""===l?"":"\n")+Rt(l,t),i=n}return o}(t,a),i));case Ot:return'"'+function(e){for(var t,n="",r=0,s=0;s=65536?s+=2:s++)r=yt(e,s),!(t=st[r])&&ht(r)?(n+=e[s],r>=65536&&(n+=e[s+1])):n+=t||at(r);return n}(t)+'"';default:throw new s("impossible error: invalid scalar style")}}()}function kt(e,t){var n=$t(e)?String(t):"",r="\n"===e[e.length-1];return n+(r&&("\n"===e[e.length-2]||"\n"===e)?"+":r?"":"-")+"\n"}function xt(e){return"\n"===e[e.length-1]?e.slice(0,-1):e}function Rt(e,t){if(""===e||" "===e[0])return e;for(var n,r,s=/ [^ ]/g,o=0,i=0,a=0,c="";n=s.exec(e);)(a=n.index)-o>t&&(r=i>o?i:a,c+="\n"+e.slice(o,r),o=r+1),i=a;return c+="\n",e.length-o>t&&i>o?c+=e.slice(o,i)+"\n"+e.slice(i+1):c+=e.slice(o),c.slice(1)}function It(e,t,n,r){var s,o,i,a="",c=e.tag;for(s=0,o=n.length;s tag resolver accepts not "'+l+'" style');r=c.represent[l](t,l)}e.dump=r}return!0}return!1}function Tt(e,t,n,r,o,i,a){e.tag=null,e.dump=n,Nt(e,n,!1)||Nt(e,n,!0);var c,l=Te.call(e.dump),p=r;r&&(r=e.flowLevel<0||e.flowLevel>t);var u,f,d="[object Object]"===l||"[object Array]"===l;if(d&&(f=-1!==(u=e.duplicates.indexOf(n))),(null!==e.tag&&"?"!==e.tag||f||2!==e.indent&&t>0)&&(o=!1),f&&e.usedDuplicates[u])e.dump="*ref_"+u;else{if(d&&f&&!e.usedDuplicates[u]&&(e.usedDuplicates[u]=!0),"[object Object]"===l)r&&0!==Object.keys(e.dump).length?(!function(e,t,n,r){var o,i,a,c,l,p,u="",f=e.tag,d=Object.keys(n);if(!0===e.sortKeys)d.sort();else if("function"==typeof e.sortKeys)d.sort(e.sortKeys);else if(e.sortKeys)throw new s("sortKeys must be a boolean or a function");for(o=0,i=d.length;o1024)&&(e.dump&&Fe===e.dump.charCodeAt(0)?p+="?":p+="? "),p+=e.dump,l&&(p+=ft(e,t)),Tt(e,t+1,c,!0,l)&&(e.dump&&Fe===e.dump.charCodeAt(0)?p+=":":p+=": ",u+=p+=e.dump));e.tag=f,e.dump=u||"{}"}(e,t,e.dump,o),f&&(e.dump="&ref_"+u+e.dump)):(!function(e,t,n){var r,s,o,i,a,c="",l=e.tag,p=Object.keys(n);for(r=0,s=p.length;r1024&&(a+="? "),a+=e.dump+(e.condenseFlow?'"':"")+":"+(e.condenseFlow?"":" "),Tt(e,t,i,!1,!1)&&(c+=a+=e.dump));e.tag=l,e.dump="{"+c+"}"}(e,t,e.dump),f&&(e.dump="&ref_"+u+" "+e.dump));else if("[object Array]"===l)r&&0!==e.dump.length?(e.noArrayIndent&&!a&&t>0?It(e,t-1,e.dump,o):It(e,t,e.dump,o),f&&(e.dump="&ref_"+u+e.dump)):(!function(e,t,n){var r,s,o,i="",a=e.tag;for(r=0,s=n.length;r",e.dump=c+" "+e.dump)}return!0}function Pt(e,t){var n,r,s=[],o=[];for(function e(t,n,r){var s,o,i;if(null!==t&&"object"==typeof t)if(-1!==(o=n.indexOf(t)))-1===r.indexOf(o)&&r.push(o);else if(n.push(t),Array.isArray(t))for(o=0,i=t.length;o>>32-t}function n(e,t){var n,r,s,o,i;return s=2147483648&e,o=2147483648&t,i=(1073741823&e)+(1073741823&t),(n=1073741824&e)&(r=1073741824&t)?2147483648^i^s^o:n|r?1073741824&i?3221225472^i^s^o:1073741824^i^s^o:i^s^o}function r(e,r,s,o,i,a,c){return e=n(e,n(n(function(e,t,n){return e&t|~e&n}(r,s,o),i),c)),n(t(e,a),r)}function s(e,r,s,o,i,a,c){return e=n(e,n(n(function(e,t,n){return e&n|t&~n}(r,s,o),i),c)),n(t(e,a),r)}function o(e,r,s,o,i,a,c){return e=n(e,n(n(function(e,t,n){return e^t^n}(r,s,o),i),c)),n(t(e,a),r)}function i(e,r,s,o,i,a,c){return e=n(e,n(n(function(e,t,n){return t^(e|~n)}(r,s,o),i),c)),n(t(e,a),r)}function a(e){var t,n="",r="";for(t=0;t<=3;t++)n+=(r="0"+(e>>>8*t&255).toString(16)).substr(r.length-2,2);return n}var c,l,p,u,f,d,h,m,g,y=Array();for(y=function(e){for(var t,n=e.length,r=n+8,s=16*((r-r%64)/64+1),o=Array(s-1),i=0,a=0;a>>29,o}(e=function(e){e=e.replace(/\r\n/g,"\n");for(var t="",n=0;n127&&r<2048?(t+=String.fromCharCode(r>>6|192),t+=String.fromCharCode(63&r|128)):(t+=String.fromCharCode(r>>12|224),t+=String.fromCharCode(r>>6&63|128),t+=String.fromCharCode(63&r|128))}return t}(e)),d=1732584193,h=4023233417,m=2562383102,g=271733878,c=0;c{s.get(t).then(t=>{const r=t.body;0===r.replace(/\s/g,"").length?n(new Error("订阅内容为空!")):e(r)})});return e[r]=o,o}}} \ No newline at end of file +/** + * ███████╗██╗ ██╗██████╗ ███████╗████████╗ ██████╗ ██████╗ ███████╗ + * ██╔════╝██║ ██║██╔══██╗ ██╔════╝╚══██╔══╝██╔═══██╗██╔══██╗██╔════╝ + * ███████╗██║ ██║██████╔╝█████╗███████╗ ██║ ██║ ██║██████╔╝█████╗ + * ╚════██║██║ ██║██╔══██╗╚════╝╚════██║ ██║ ██║ ██║██╔══██╗██╔══╝ + * ███████║╚██████╔╝██████╔╝ ███████║ ██║ ╚██████╔╝██║ ██║███████╗ + * ╚══════╝ ╚═════╝ ╚═════╝ ╚══════╝ ╚═╝ ╚═════╝ ╚═╝ ╚═╝╚══════╝ + * Advanced Subscription Manager for QX, Loon, Surge and Clash. + * @version: 1.5 + * @author: Peng-YM + * @github: https://github.com/Peng-YM/Sub-Store + * @documentation: https://www.notion.so/Sub-Store-6259586994d34c11a4ced5c406264b46 + */ + +!function(){var createModuleFactory=function(e){var t;return function(r){return t||e(t={exports:{},parent:r},t.exports),t.exports}},_$settings_43=createModuleFactory((function(e,t){const{SETTINGS_KEY:r}=_$constants_41;function n(e,t){const n=_$$_36.read(r);t.json(n)}function o(e,t){const n=e.body,o=_$$_36.read(r);_$$_36.write({...o,...n},r),t.json({status:"success"})}e.exports={register:function(e){_$$_36.read(r)||_$$_36.write({},r),e.route("/api/settings").get(n).patch(o)}}})),_$collections_40=createModuleFactory((function(e,t){const{SUBS_KEY:r,COLLECTIONS_KEY:n}=_$constants_41,{getPlatformFromHeaders:o,getFlowHeaders:s}=_$subscriptions_44({}),{produceArtifact:i}=_$artifacts_39({});async function a(e,t){const{name:a}=e.params,{raw:u}=e.query||"false",c=e.query.target||o(e.headers)||"JSON",p=_$$_36.read(n)[a];_$$_36.info("\u6b63\u5728\u4e0b\u8f7d\u7ec4\u5408\u8ba2\u9605\uff1a"+a);const l=_$$_36.read(r),f=p.subscriptions;if(f.length>0){const e=l[f[0]],r=await s(e.url);r&&t.set("subscription-userinfo",r)}if(p)try{const e=await i({type:"collection",item:p,platform:c,noProcessor:u});"JSON"===c?t.set("Content-Type","application/json;charset=utf-8").send(e):t.send(e)}catch(d){_$$_36.notify("\ud83c\udf0d \u300e \ud835\udc7a\ud835\udc96\ud835\udc83-\ud835\udc7a\ud835\udc95\ud835\udc90\ud835\udc93\ud835\udc86 \u300f \u4e0b\u8f7d\u7ec4\u5408\u8ba2\u9605\u5931\u8d25",`\u274c \u4e0b\u8f7d\u7ec4\u5408\u8ba2\u9605\u9519\u8bef\uff1a${a}\uff01`,"\ud83e\udd14 \u539f\u56e0\uff1a"+d),t.status(500).json({status:"failed",message:d})}else _$$_36.notify("\ud83c\udf0d \u300e \ud835\udc7a\ud835\udc96\ud835\udc83-\ud835\udc7a\ud835\udc95\ud835\udc90\ud835\udc93\ud835\udc86 \u300f \u4e0b\u8f7d\u7ec4\u5408\u8ba2\u9605\u5931\u8d25",`\u274c \u672a\u627e\u5230\u7ec4\u5408\u8ba2\u9605\uff1a${a}\uff01`),t.status(404).json({status:"failed"})}function u(e,t){const r=e.body;_$$_36.info("\u6b63\u5728\u521b\u5efa\u7ec4\u5408\u8ba2\u9605\uff1a"+r.name);const o=_$$_36.read(n);o[r.name]&&t.status(500).json({status:"failed",message:`\u8ba2\u9605\u96c6${r.name}\u5df2\u5b58\u5728\uff01`}),/^[\w-_]*$/.test(r.name)?(o[r.name]=r,_$$_36.write(o,n),t.status(201).json({status:"success",data:r})):t.status(500).json({status:"failed",message:`\u8ba2\u9605\u96c6\u540d\u79f0 ${r.name} \u4e2d\u542b\u6709\u975e\u6cd5\u5b57\u7b26\uff01\u540d\u79f0\u4e2d\u53ea\u80fd\u5305\u542b\u82f1\u6587\u5b57\u6bcd\u3001\u6570\u5b57\u3001\u4e0b\u5212\u7ebf\u3001\u6a2a\u6760\u3002`})}function c(e,t){const{name:r}=e.params,o=_$$_36.read(n)[r];o?t.json({status:"success",data:o}):t.status(404).json({status:"failed",message:`\u672a\u627e\u5230\u8ba2\u9605\u96c6\uff1a${r}!`})}function p(e,t){const{name:r}=e.params;let o=e.body;const s=_$$_36.read(n);if(s[r]){const e={...s[r],...o};_$$_36.info(`\u6b63\u5728\u66f4\u65b0\u7ec4\u5408\u8ba2\u9605\uff1a${r}...`),delete s[r],s[o.name||r]=e,_$$_36.write(s,n),t.json({status:"success",data:e})}else t.status(500).json({status:"failed",message:`\u8ba2\u9605\u96c6${r}\u4e0d\u5b58\u5728\uff0c\u65e0\u6cd5\u66f4\u65b0\uff01`})}function l(e,t){const{name:r}=e.params;_$$_36.info("\u6b63\u5728\u5220\u9664\u7ec4\u5408\u8ba2\u9605\uff1a"+r);let o=_$$_36.read(n);delete o[r],_$$_36.write(o,n),t.json({status:"success"})}function f(e,t){const r=_$$_36.read(n);t.json({status:"success",data:r})}e.exports={register:function(e){_$$_36.read(n)||_$$_36.write({},n),e.get("/download/collection/:name",a),e.route("/api/collection/:name").get(c).patch(p).delete(l),e.route("/api/collections").get(f).post(u)}}})),_$subscriptions_44=createModuleFactory((function(e,t){const{produceArtifact:r}=_$artifacts_39({}),{SUBS_KEY:n,COLLECTIONS_KEY:o}=_$constants_41;async function s(e,t){const{name:o}=e.params,{raw:s}=e.query||"false",i=e.query.target||f(e.headers)||"JSON";_$$_36.info("\u6b63\u5728\u4e0b\u8f7d\u8ba2\u9605\uff1a"+o);const a=_$$_36.read(n)[o];if(a)try{const e=await r({type:"subscription",item:a,platform:i,noProcessor:s}),n=await l(a.url);n&&t.set("subscription-userinfo",n),"JSON"===i?t.set("Content-Type","application/json;charset=utf-8").send(e):t.send(e)}catch(u){_$$_36.notify("\ud83c\udf0d \u300e \ud835\udc7a\ud835\udc96\ud835\udc83-\ud835\udc7a\ud835\udc95\ud835\udc90\ud835\udc93\ud835\udc86 \u300f \u4e0b\u8f7d\u8ba2\u9605\u5931\u8d25",`\u274c \u65e0\u6cd5\u4e0b\u8f7d\u8ba2\u9605\uff1a${o}\uff01`,"\ud83e\udd14 \u539f\u56e0\uff1a"+JSON.stringify(u)),_$$_36.error(JSON.stringify(u)),t.status(500).json({status:"failed",message:u})}else _$$_36.notify("\ud83c\udf0d \u300e \ud835\udc7a\ud835\udc96\ud835\udc83-\ud835\udc7a\ud835\udc95\ud835\udc90\ud835\udc93\ud835\udc86 \u300f \u4e0b\u8f7d\u8ba2\u9605\u5931\u8d25",`\u274c \u672a\u627e\u5230\u8ba2\u9605\uff1a${o}\uff01`),t.status(404).json({status:"failed"})}function i(e,t){const r=e.body,o=_$$_36.read(n);_$$_36.info("\u6b63\u5728\u521b\u5efa\u8ba2\u9605\uff1a "+r.name),o[r.name]&&t.status(500).json({status:"failed",message:`\u8ba2\u9605${r.name}\u5df2\u5b58\u5728\uff01`}),/^[\w-_]*$/.test(r.name)?(o[r.name]=r,_$$_36.write(o,n),t.status(201).json({status:"success",data:r})):t.status(500).json({status:"failed",message:`\u8ba2\u9605\u540d\u79f0 ${r.name} \u4e2d\u542b\u6709\u975e\u6cd5\u5b57\u7b26\uff01\u540d\u79f0\u4e2d\u53ea\u80fd\u5305\u542b\u82f1\u6587\u5b57\u6bcd\u3001\u6570\u5b57\u3001\u4e0b\u5212\u7ebf\u3001\u6a2a\u6760\u3002`})}function a(e,t){const{name:r}=e.params,o=_$$_36.read(n)[r];o?t.json({status:"success",data:o}):t.status(404).json({status:"failed",message:`\u672a\u627e\u5230\u8ba2\u9605\uff1a${r}!`})}function u(e,t){const{name:r}=e.params;let s=e.body;const i=_$$_36.read(n);if(i[r]){const e={...i[r],...s};if(_$$_36.info("\u6b63\u5728\u66f4\u65b0\u8ba2\u9605\uff1a "+r),r!==s.name){const t=_$$_36.read(o);for(const e of Object.keys(t)){const n=t[e].subscriptions.indexOf(r);-1!==n&&(t[e].subscriptions[n]=s.name)}delete i[r],i[s.name]=e}else i[r]=e;_$$_36.write(i,n),t.json({status:"success",data:e})}else t.status(500).json({status:"failed",message:`\u8ba2\u9605${r}\u4e0d\u5b58\u5728\uff0c\u65e0\u6cd5\u66f4\u65b0\uff01`})}function c(e,t){const{name:r}=e.params;_$$_36.info(`\u5220\u9664\u8ba2\u9605\uff1a${r}...`);let s=_$$_36.read(n);delete s[r],_$$_36.write(s,n);let i=_$$_36.read(o);for(const n of Object.keys(i))i[n].subscriptions=i[n].subscriptions.filter(e=>e!==r);_$$_36.write(i,o),t.json({status:"success"})}function p(e,t){const r=_$$_36.read(n);t.json({status:"success",data:r})}async function l(e){const{headers:t}=await _$$_36.http.get({url:e,headers:{"User-Agent":"Quantumult/1.0.13 (iPhone10,3; iOS 14.0)"}});return t[Object.keys(t).filter(e=>/SUBSCRIPTION-USERINFO/i.test(e))[0]]}function f(e){const t=Object.keys(e);let r="";for(let n of t)if(/USER-AGENT/i.test(n)){r=e[n];break}return-1!==r.indexOf("Quantumult%20X")?"QX":-1!==r.indexOf("Surge")?"Surge":-1!==r.indexOf("Decar")||-1!==r.indexOf("Loon")?"Loon":-1!==r.indexOf("Stash")||-1!==r.indexOf("Shadowrocket")?"Clash":null}e.exports={register:function(e){_$$_36.read(n)||_$$_36.write({},n),e.get("/download/:name",s),e.route("/api/sub/:name").get(a).patch(u).delete(c),e.route("/api/subs").get(p).post(i)},getPlatformFromHeaders:f,getFlowHeaders:l}})),_$artifacts_39=createModuleFactory((function(e,t){const{ProxyUtils:r}=_$proxyUtils_37,{RuleUtils:n}=_$ruleUtils_38,{SUBS_KEY:o,ARTIFACTS_KEY:s,ARTIFACT_REPOSITORY_KEY:i,COLLECTIONS_KEY:a,RULES_KEY:u,SETTINGS_KEY:c}=_$constants_41;async function p(e,t){const r=e.params.name,n=e.query.action,i=_$$_36.read(s),c=i[r];if(c)if(n){let e;switch(c.type){case"subscription":e=_$$_36.read(o)[c.source];break;case"collection":e=_$$_36.read(a)[c.source];break;case"rule":e=_$$_36.read(u)[c.source]}const r=await g({type:c.type,item:e,platform:c.platform});if("preview"===n)t.send(r);else if("sync"===n){_$$_36.info(`\u6b63\u5728\u4e0a\u4f20\u914d\u7f6e\uff1a${c.name}\n>>>`),console.log(JSON.stringify(c,null,2));try{const e=await m({[c.name]:{content:r}});c.updated=(new Date).getTime();const n=JSON.parse(e.body);c.url=n.files[c.name].raw_url.replace(/\/raw\/[^\/]*\/(.*)/,"/raw/$1"),_$$_36.write(i,s),t.json({status:"success"})}catch(p){t.status(500).json({status:"failed",message:p})}}}else t.json({status:"success",data:c});else t.status(404).json({status:"failed",message:"\u672a\u627e\u5230\u5bf9\u5e94\u7684\u914d\u7f6e\uff01"})}function l(e,t){const r=e.body;_$$_36.info("\u6b63\u5728\u521b\u5efa\u8fdc\u7a0b\u914d\u7f6e\uff1a"+r.name);const n=_$$_36.read(s);n[r.name]?t.status(500).json({status:"failed",message:`\u8fdc\u7a0b\u914d\u7f6e${r.name}\u5df2\u5b58\u5728\uff01`}):/^[\w-_.]*$/.test(r.name)?(n[r.name]=r,_$$_36.write(n,s),t.status(201).json({status:"success",data:r})):t.status(500).json({status:"failed",message:`\u8fdc\u7a0b\u914d\u7f6e\u540d\u79f0 ${r.name} \u4e2d\u542b\u6709\u975e\u6cd5\u5b57\u7b26\uff01\u540d\u79f0\u4e2d\u53ea\u80fd\u5305\u542b\u82f1\u6587\u5b57\u6bcd\u3001\u6570\u5b57\u3001\u4e0b\u5212\u7ebf\u3001\u6a2a\u6760\u3002`})}function f(e,t){const r=_$$_36.read(s),n=e.params.name,o=r[n];if(o){_$$_36.info("\u6b63\u5728\u66f4\u65b0\u8fdc\u7a0b\u914d\u7f6e\uff1a"+o.name);const i=e.body;if(void 0===i.name||/^[\w-_.]*$/.test(i.name)){const e={...o,...i};r[e.name]=e,e.name!==n&&delete r[n],_$$_36.write(r,s),t.json({status:"success",data:e})}else t.status(500).json({status:"failed",message:`\u8fdc\u7a0b\u914d\u7f6e\u540d\u79f0 ${i.name} \u4e2d\u542b\u6709\u975e\u6cd5\u5b57\u7b26\uff01\u540d\u79f0\u4e2d\u53ea\u80fd\u5305\u542b\u82f1\u6587\u5b57\u6bcd\u3001\u6570\u5b57\u3001\u4e0b\u5212\u7ebf\u3001\u6a2a\u6760\u3002`})}else t.status(404).json({status:"failed",message:"\u672a\u627e\u5230\u5bf9\u5e94\u7684\u8fdc\u7a0b\u914d\u7f6e\uff01"})}async function d(e,t){_$$_36.info("\u5f00\u59cb\u540c\u6b65\u6240\u6709\u8fdc\u7a0b\u914d\u7f6e...");const r=_$$_36.read(s),n={};try{await Promise.all(Object.values(r).map(async e=>{if(e.sync){let t;switch(_$$_36.info(`\u6b63\u5728\u540c\u6b65\u4e91\u914d\u7f6e\uff1a${e.name}...`),e.type){case"subscription":t=_$$_36.read(o)[e.source];break;case"collection":t=_$$_36.read(a)[e.source];break;case"rule":t=_$$_36.read(u)[e.source]}const r=await g({type:e.type,item:t,platform:e.platform});n[e.name]={content:r}}}));const e=await m(n),i=JSON.parse(e.body);for(const t of Object.values(r))t.updated=(new Date).getTime(),t.url=i.files[t.name].raw_url.replace(/\/raw\/[^\/]*\/(.*)/,"/raw/$1");_$$_36.write(r,s),_$$_36.info("\u5168\u90e8\u8ba2\u9605\u540c\u6b65\u6210\u529f\uff01"),t.status(200).end()}catch(i){t.status(500).json({error:i}),_$$_36.info("\u540c\u6b65\u8ba2\u9605\u5931\u8d25\uff0c\u539f\u56e0\uff1a"+i)}}async function h(e,t){const r=e.params.name;_$$_36.info("\u6b63\u5728\u5220\u9664\u8fdc\u7a0b\u914d\u7f6e\uff1a"+r);const n=_$$_36.read(s);try{const e=n[r];if(!e)throw new Error(`\u8fdc\u7a0b\u914d\u7f6e\uff1a${r}\u4e0d\u5b58\u5728\uff01`);e.updated&&await m({filename:r,content:""}),delete n[r],_$$_36.write(n,s),t.json({status:"success"})}catch(o){delete n[r],_$$_36.write(n,s),t.status(500).json({status:"failed",message:`\u65e0\u6cd5\u5220\u9664\u8fdc\u7a0b\u914d\u7f6e\uff1a${r}, \u539f\u56e0\uff1a${o}`})}}function _(e,t){const r=_$$_36.read(s);t.json({status:"success",data:r})}async function m(e){const{gistToken:t}=_$$_36.read(c);return t?new _$gist_49({token:t,key:i}).upload(e):Promise.reject("\u672a\u8bbe\u7f6eGist Token\uff01")}async function g({type:e,item:t,platform:s,noProcessor:i}={platform:"JSON",noProcessor:!1}){if("subscription"===e){const e=t,n=await _$download_46(e.url,e.ua);let o=r.parse(n);i||(o=await r.process(o,e.process||[],s));const a={};for(const t of o){if(a[t.name]){_$$_36.notify("\ud83c\udf0d \u300e \ud835\udc7a\ud835\udc96\ud835\udc83-\ud835\udc7a\ud835\udc95\ud835\udc90\ud835\udc93\ud835\udc86 \u300f","\u26a0\ufe0f \u8ba2\u9605\u5305\u542b\u91cd\u590d\u8282\u70b9\uff01","\u8bf7\u4ed4\u7ec6\u68c0\u6d4b\u914d\u7f6e\uff01",{"media-url":"https://cdn3.iconfinder.com/data/icons/seo-outline-1/512/25_code_program_programming_develop_bug_search_developer-512.png"});break}a[t.name]=!0}return r.produce(o,s)}if("collection"===e){const e=_$$_36.read(o),n=t,a=n.subscriptions;let u=[],c=0;if(await Promise.all(a.map(async t=>{const n=e[t];try{_$$_36.info(`\u6b63\u5728\u5904\u7406\u5b50\u8ba2\u9605\uff1a${n.name}...`);const e=await _$download_46(n.url,n.ua);let t=r.parse(e);i||(t=await r.process(t,n.process||[],s)),u=u.concat(t),c++,_$$_36.info(`\u2705 \u5b50\u8ba2\u9605\uff1a${n.name}\u52a0\u8f7d\u6210\u529f\uff0c\u8fdb\u5ea6--${100*(c/a.length).toFixed(1)}% `)}catch(o){c++,_$$_36.error(`\u274c \u5904\u7406\u7ec4\u5408\u8ba2\u9605\u4e2d\u7684\u5b50\u8ba2\u9605: ${n.name}\u65f6\u51fa\u73b0\u9519\u8bef\uff1a${o}\uff0c\u8be5\u8ba2\u9605\u5df2\u88ab\u8df3\u8fc7\uff01\u8fdb\u5ea6--${100*(c/a.length).toFixed(1)}%`)}})),i||(u=await r.process(u,n.process||[],s)),0===u.length)throw new Error("\u7ec4\u5408\u8ba2\u9605\u4e2d\u4e0d\u542b\u6709\u6548\u8282\u70b9\uff01");const p={};for(const t of u){if(p[t.name]){_$$_36.notify("\ud83c\udf0d \u300e \ud835\udc7a\ud835\udc96\ud835\udc83-\ud835\udc7a\ud835\udc95\ud835\udc90\ud835\udc93\ud835\udc86 \u300f","\u26a0\ufe0f \u8ba2\u9605\u5305\u542b\u91cd\u590d\u8282\u70b9\uff01","\u8bf7\u4ed4\u7ec6\u68c0\u6d4b\u914d\u7f6e\uff01",{"media-url":"https://cdn3.iconfinder.com/data/icons/seo-outline-1/512/25_code_program_programming_develop_bug_search_developer-512.png"});break}p[t.name]=!0}return r.produce(u,s)}if("rule"===e){const e=t;let r=[];for(let t=0;t2147483647)throw new RangeError('The value "'+e+'" is invalid for option "size"');var t=new Uint8Array(e);return t.__proto__=r.prototype,t}function r(e,t,r){if("number"==typeof e){if("string"==typeof t)throw new TypeError('The "string" argument must be of type string. Received type number');return s(e)}return n(e,t,r)}function n(t,n,o){if("string"==typeof t)return function(t,n){if("string"==typeof n&&""!==n||(n="utf8"),!r.isEncoding(n))throw new TypeError("Unknown encoding: "+n);var o=0|u(t,n),s=e(o),i=s.write(t,n);return i!==o&&(s=s.slice(0,i)),s}(t,n);if(ArrayBuffer.isView(t))return i(t);if(null==t)throw TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type "+typeof t);if(k(t,ArrayBuffer)||t&&k(t.buffer,ArrayBuffer))return function(e,t,n){if(t<0||e.byteLength=2147483647)throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+2147483647..toString(16)+" bytes");return 0|e}function u(e,t){if(r.isBuffer(e))return e.length;if(ArrayBuffer.isView(e)||k(e,ArrayBuffer))return e.byteLength;if("string"!=typeof e)throw new TypeError('The "string" argument must be one of type string, Buffer, or ArrayBuffer. Received type '+typeof e);var n=e.length,o=arguments.length>2&&!0===arguments[2];if(!o&&0===n)return 0;for(var s=!1;;)switch(t){case"ascii":case"latin1":case"binary":return n;case"utf8":case"utf-8":return I(e).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*n;case"hex":return n>>>1;case"base64":return L(e).length;default:if(s)return o?-1:I(e).length;t=(""+t).toLowerCase(),s=!0}}function c(e,t,r){var n=e[t];e[t]=e[r],e[r]=n}function p(e,t,n,o,s){if(0===e.length)return-1;if("string"==typeof n?(o=n,n=0):n>2147483647?n=2147483647:n<-2147483648&&(n=-2147483648),x(n=+n)&&(n=s?0:e.length-1),n<0&&(n=e.length+n),n>=e.length){if(s)return-1;n=e.length-1}else if(n<0){if(!s)return-1;n=0}if("string"==typeof t&&(t=r.from(t,o)),r.isBuffer(t))return 0===t.length?-1:l(e,t,n,o,s);if("number"==typeof t)return t&=255,"function"==typeof Uint8Array.prototype.indexOf?s?Uint8Array.prototype.indexOf.call(e,t,n):Uint8Array.prototype.lastIndexOf.call(e,t,n):l(e,[t],n,o,s);throw new TypeError("val must be string, number or Buffer")}function l(e,t,r,n,o){var s,i=1,a=e.length,u=t.length;if(void 0!==n&&("ucs2"===(n=String(n).toLowerCase())||"ucs-2"===n||"utf16le"===n||"utf-16le"===n)){if(e.length<2||t.length<2)return-1;i=2,a/=2,u/=2,r/=2}function c(e,t){return 1===i?e[t]:e.readUInt16BE(t*i)}if(o){var p=-1;for(s=r;sa&&(r=a-u),s=r;s>=0;s--){for(var l=!0,f=0;fo&&(n=o):n=o;var s=t.length;n>s/2&&(n=s/2);for(var i=0;i>8,o=r%256,s.push(o),s.push(n);return s}(t,e.length-r),e,r,n)}function y(e,t,r){return 0===t&&r===e.length?_$base64Js_1.fromByteArray(e):_$base64Js_1.fromByteArray(e.slice(t,r))}function $(e,t,r){r=Math.min(e.length,r);for(var n=[],o=t;o239?4:c>223?3:c>191?2:1;if(o+l<=r)switch(l){case 1:c<128&&(p=c);break;case 2:128==(192&(s=e[o+1]))&&(u=(31&c)<<6|63&s)>127&&(p=u);break;case 3:s=e[o+1],i=e[o+2],128==(192&s)&&128==(192&i)&&(u=(15&c)<<12|(63&s)<<6|63&i)>2047&&(u<55296||u>57343)&&(p=u);break;case 4:s=e[o+1],i=e[o+2],a=e[o+3],128==(192&s)&&128==(192&i)&&128==(192&a)&&(u=(15&c)<<18|(63&s)<<12|(63&i)<<6|63&a)>65535&&u<1114112&&(p=u)}null===p?(p=65533,l=1):p>65535&&(p-=65536,n.push(p>>>10&1023|55296),p=56320|1023&p),n.push(p),o+=l}return function(e){var t=e.length;if(t<=w)return String.fromCharCode.apply(String,e);for(var r="",n=0;nthis.length)return"";if((void 0===r||r>this.length)&&(r=this.length),r<=0)return"";if((r>>>=0)<=(t>>>=0))return"";for(e||(e="utf8");;)switch(e){case"hex":return A(this,t,r);case"utf8":case"utf-8":return $(this,t,r);case"ascii":return E(this,t,r);case"latin1":case"binary":return S(this,t,r);case"base64":return y(this,t,r);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return O(this,t,r);default:if(n)throw new TypeError("Unknown encoding: "+e);e=(e+"").toLowerCase(),n=!0}}.apply(this,arguments)},r.prototype.toLocaleString=r.prototype.toString,r.prototype.equals=function(e){if(!r.isBuffer(e))throw new TypeError("Argument must be a Buffer");return this===e||0===r.compare(this,e)},r.prototype.inspect=function(){var e="",r=t.INSPECT_MAX_BYTES;return e=this.toString("hex",0,r).replace(/(.{2})/g,"$1 ").trim(),this.length>r&&(e+=" ... "),""},r.prototype.compare=function(e,t,n,o,s){if(k(e,Uint8Array)&&(e=r.from(e,e.offset,e.byteLength)),!r.isBuffer(e))throw new TypeError('The "target" argument must be one of type Buffer or Uint8Array. Received type '+typeof e);if(void 0===t&&(t=0),void 0===n&&(n=e?e.length:0),void 0===o&&(o=0),void 0===s&&(s=this.length),t<0||n>e.length||o<0||s>this.length)throw new RangeError("out of range index");if(o>=s&&t>=n)return 0;if(o>=s)return-1;if(t>=n)return 1;if(this===e)return 0;for(var i=(s>>>=0)-(o>>>=0),a=(n>>>=0)-(t>>>=0),u=Math.min(i,a),c=this.slice(o,s),p=e.slice(t,n),l=0;l>>=0,isFinite(r)?(r>>>=0,void 0===n&&(n="utf8")):(n=r,r=void 0)}var o=this.length-t;if((void 0===r||r>o)&&(r=o),e.length>0&&(r<0||t<0)||t>this.length)throw new RangeError("Attempt to write outside buffer bounds");n||(n="utf8");for(var s=!1;;)switch(n){case"hex":return f(this,e,t,r);case"utf8":case"utf-8":return d(this,e,t,r);case"ascii":return h(this,e,t,r);case"latin1":case"binary":return _(this,e,t,r);case"base64":return m(this,e,t,r);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return g(this,e,t,r);default:if(s)throw new TypeError("Unknown encoding: "+n);n=(""+n).toLowerCase(),s=!0}},r.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};var w=4096;function E(e,t,r){var n="";r=Math.min(e.length,r);for(var o=t;oo)&&(r=o);for(var s="",i=t;ir)throw new RangeError("Trying to access beyond buffer length")}function b(e,t,n,o,s,i){if(!r.isBuffer(e))throw new TypeError('"buffer" argument must be a Buffer instance');if(t>s||te.length)throw new RangeError("Index out of range")}function T(e,t,r,n,o,s){if(r+n>e.length)throw new RangeError("Index out of range");if(r<0)throw new RangeError("Index out of range")}function R(e,t,r,n,o){return t=+t,r>>>=0,o||T(e,0,r,4),_$ieee754_3.write(e,t,r,n,23,4),r+4}function C(e,t,r,n,o){return t=+t,r>>>=0,o||T(e,0,r,8),_$ieee754_3.write(e,t,r,n,52,8),r+8}r.prototype.slice=function(e,t){var n=this.length;(e=~~e)<0?(e+=n)<0&&(e=0):e>n&&(e=n),(t=void 0===t?n:~~t)<0?(t+=n)<0&&(t=0):t>n&&(t=n),t>>=0,t>>>=0,r||v(e,t,this.length);for(var n=this[e],o=1,s=0;++s>>=0,t>>>=0,r||v(e,t,this.length);for(var n=this[e+--t],o=1;t>0&&(o*=256);)n+=this[e+--t]*o;return n},r.prototype.readUInt8=function(e,t){return e>>>=0,t||v(e,1,this.length),this[e]},r.prototype.readUInt16LE=function(e,t){return e>>>=0,t||v(e,2,this.length),this[e]|this[e+1]<<8},r.prototype.readUInt16BE=function(e,t){return e>>>=0,t||v(e,2,this.length),this[e]<<8|this[e+1]},r.prototype.readUInt32LE=function(e,t){return e>>>=0,t||v(e,4,this.length),(this[e]|this[e+1]<<8|this[e+2]<<16)+16777216*this[e+3]},r.prototype.readUInt32BE=function(e,t){return e>>>=0,t||v(e,4,this.length),16777216*this[e]+(this[e+1]<<16|this[e+2]<<8|this[e+3])},r.prototype.readIntLE=function(e,t,r){e>>>=0,t>>>=0,r||v(e,t,this.length);for(var n=this[e],o=1,s=0;++s=(o*=128)&&(n-=Math.pow(2,8*t)),n},r.prototype.readIntBE=function(e,t,r){e>>>=0,t>>>=0,r||v(e,t,this.length);for(var n=t,o=1,s=this[e+--n];n>0&&(o*=256);)s+=this[e+--n]*o;return s>=(o*=128)&&(s-=Math.pow(2,8*t)),s},r.prototype.readInt8=function(e,t){return e>>>=0,t||v(e,1,this.length),128&this[e]?-1*(255-this[e]+1):this[e]},r.prototype.readInt16LE=function(e,t){e>>>=0,t||v(e,2,this.length);var r=this[e]|this[e+1]<<8;return 32768&r?4294901760|r:r},r.prototype.readInt16BE=function(e,t){e>>>=0,t||v(e,2,this.length);var r=this[e+1]|this[e]<<8;return 32768&r?4294901760|r:r},r.prototype.readInt32LE=function(e,t){return e>>>=0,t||v(e,4,this.length),this[e]|this[e+1]<<8|this[e+2]<<16|this[e+3]<<24},r.prototype.readInt32BE=function(e,t){return e>>>=0,t||v(e,4,this.length),this[e]<<24|this[e+1]<<16|this[e+2]<<8|this[e+3]},r.prototype.readFloatLE=function(e,t){return e>>>=0,t||v(e,4,this.length),_$ieee754_3.read(this,e,!0,23,4)},r.prototype.readFloatBE=function(e,t){return e>>>=0,t||v(e,4,this.length),_$ieee754_3.read(this,e,!1,23,4)},r.prototype.readDoubleLE=function(e,t){return e>>>=0,t||v(e,8,this.length),_$ieee754_3.read(this,e,!0,52,8)},r.prototype.readDoubleBE=function(e,t){return e>>>=0,t||v(e,8,this.length),_$ieee754_3.read(this,e,!1,52,8)},r.prototype.writeUIntLE=function(e,t,r,n){e=+e,t>>>=0,r>>>=0,n||b(this,e,t,r,Math.pow(2,8*r)-1,0);var o=1,s=0;for(this[t]=255&e;++s>>=0,r>>>=0,n||b(this,e,t,r,Math.pow(2,8*r)-1,0);var o=r-1,s=1;for(this[t+o]=255&e;--o>=0&&(s*=256);)this[t+o]=e/s&255;return t+r},r.prototype.writeUInt8=function(e,t,r){return e=+e,t>>>=0,r||b(this,e,t,1,255,0),this[t]=255&e,t+1},r.prototype.writeUInt16LE=function(e,t,r){return e=+e,t>>>=0,r||b(this,e,t,2,65535,0),this[t]=255&e,this[t+1]=e>>>8,t+2},r.prototype.writeUInt16BE=function(e,t,r){return e=+e,t>>>=0,r||b(this,e,t,2,65535,0),this[t]=e>>>8,this[t+1]=255&e,t+2},r.prototype.writeUInt32LE=function(e,t,r){return e=+e,t>>>=0,r||b(this,e,t,4,4294967295,0),this[t+3]=e>>>24,this[t+2]=e>>>16,this[t+1]=e>>>8,this[t]=255&e,t+4},r.prototype.writeUInt32BE=function(e,t,r){return e=+e,t>>>=0,r||b(this,e,t,4,4294967295,0),this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e,t+4},r.prototype.writeIntLE=function(e,t,r,n){if(e=+e,t>>>=0,!n){var o=Math.pow(2,8*r-1);b(this,e,t,r,o-1,-o)}var s=0,i=1,a=0;for(this[t]=255&e;++s>0)-a&255;return t+r},r.prototype.writeIntBE=function(e,t,r,n){if(e=+e,t>>>=0,!n){var o=Math.pow(2,8*r-1);b(this,e,t,r,o-1,-o)}var s=r-1,i=1,a=0;for(this[t+s]=255&e;--s>=0&&(i*=256);)e<0&&0===a&&0!==this[t+s+1]&&(a=1),this[t+s]=(e/i>>0)-a&255;return t+r},r.prototype.writeInt8=function(e,t,r){return e=+e,t>>>=0,r||b(this,e,t,1,127,-128),e<0&&(e=255+e+1),this[t]=255&e,t+1},r.prototype.writeInt16LE=function(e,t,r){return e=+e,t>>>=0,r||b(this,e,t,2,32767,-32768),this[t]=255&e,this[t+1]=e>>>8,t+2},r.prototype.writeInt16BE=function(e,t,r){return e=+e,t>>>=0,r||b(this,e,t,2,32767,-32768),this[t]=e>>>8,this[t+1]=255&e,t+2},r.prototype.writeInt32LE=function(e,t,r){return e=+e,t>>>=0,r||b(this,e,t,4,2147483647,-2147483648),this[t]=255&e,this[t+1]=e>>>8,this[t+2]=e>>>16,this[t+3]=e>>>24,t+4},r.prototype.writeInt32BE=function(e,t,r){return e=+e,t>>>=0,r||b(this,e,t,4,2147483647,-2147483648),e<0&&(e=4294967295+e+1),this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e,t+4},r.prototype.writeFloatLE=function(e,t,r){return R(this,e,t,!0,r)},r.prototype.writeFloatBE=function(e,t,r){return R(this,e,t,!1,r)},r.prototype.writeDoubleLE=function(e,t,r){return C(this,e,t,!0,r)},r.prototype.writeDoubleBE=function(e,t,r){return C(this,e,t,!1,r)},r.prototype.copy=function(e,t,n,o){if(!r.isBuffer(e))throw new TypeError("argument should be a Buffer");if(n||(n=0),o||0===o||(o=this.length),t>=e.length&&(t=e.length),t||(t=0),o>0&&o=this.length)throw new RangeError("Index out of range");if(o<0)throw new RangeError("sourceEnd out of bounds");o>this.length&&(o=this.length),e.length-t=0;--i)e[i+t]=this[i+n];else Uint8Array.prototype.set.call(e,this.subarray(n,o),t);return s},r.prototype.fill=function(e,t,n,o){if("string"==typeof e){if("string"==typeof t?(o=t,t=0,n=this.length):"string"==typeof n&&(o=n,n=this.length),void 0!==o&&"string"!=typeof o)throw new TypeError("encoding must be a string");if("string"==typeof o&&!r.isEncoding(o))throw new TypeError("Unknown encoding: "+o);if(1===e.length){var s=e.charCodeAt(0);("utf8"===o&&s<128||"latin1"===o)&&(e=s)}}else"number"==typeof e&&(e&=255);if(t<0||this.length>>=0,n=void 0===n?this.length:n>>>0,e||(e=0),"number"==typeof e)for(i=t;i55295&&r<57344){if(!o){if(r>56319){(t-=3)>-1&&s.push(239,191,189);continue}if(i+1===n){(t-=3)>-1&&s.push(239,191,189);continue}o=r;continue}if(r<56320){(t-=3)>-1&&s.push(239,191,189),o=r;continue}r=65536+(o-55296<<10|r-56320)}else o&&(t-=3)>-1&&s.push(239,191,189);if(o=null,r<128){if((t-=1)<0)break;s.push(r)}else if(r<2048){if((t-=2)<0)break;s.push(r>>6|192,63&r|128)}else if(r<65536){if((t-=3)<0)break;s.push(r>>12|224,r>>6&63|128,63&r|128)}else{if(!(r<1114112))throw new Error("Invalid code point");if((t-=4)<0)break;s.push(r>>18|240,r>>12&63|128,r>>6&63|128,63&r|128)}}return s}function L(e){return _$base64Js_1.toByteArray(function(e){if((e=(e=e.split("=")[0]).trim().replace(N,"")).length<2)return"";for(;e.length%4!=0;)e+="=";return e}(e))}function P(e,t,r,n){for(var o=0;o=t.length||o>=e.length);++o)t[o+r]=e[o];return o}function k(e,t){return e instanceof t||null!=e&&null!=e.constructor&&null!=e.constructor.name&&e.constructor.name===t.name}function x(e){return e!=e}}).call(this)}).call(this,_$buffer_2({}).Buffer)})),_$express_47=createModuleFactory((function(module,exports){const{ENV:ENV}=_$openApi_51;function express({port:port}={port:3e3}){const{isNode:isNode}=ENV(),DEFAULT_HEADERS={"Content-Type":"text/plain;charset=UTF-8","Access-Control-Allow-Origin":"*","Access-Control-Allow-Methods":"POST,GET,OPTIONS,PATCH,PUT,DELETE","Access-Control-Allow-Headers":"Origin, X-Requested-With, Content-Type, Accept"};if(isNode){const express_=eval('require("express")'),bodyParser=eval('require("body-parser")'),app=express_();return app.use(bodyParser.json({verify:rawBodySaver})),app.use(bodyParser.urlencoded({verify:rawBodySaver,extended:!0})),app.use(bodyParser.raw({verify:rawBodySaver,type:"*/*"})),app.use((e,t,r)=>{t.set(DEFAULT_HEADERS),r()}),app.start=()=>{app.listen(port,()=>{_$$_36.log("Express started on port: "+port)})},app}const handlers=[],METHODS_NAMES=["GET","POST","PUT","DELETE","PATCH","OPTIONS","HEAD'","ALL"],dispatch=(e,t=0)=>{let{method:r,url:n,headers:o,body:s}=e;/json/i.test(o["Content-Type"])&&(s=JSON.parse(s)),r=r.toUpperCase();const{path:i,query:a}=extractURL(n);let u,c=null,p=0;for(u=t;up&&(c=handlers[u],p=e.split("/").length)}if(c){const e=()=>{dispatch(r,n,u)},t={method:r,url:n,path:i,query:a,params:extractPathParams(c.pattern,i),headers:o,body:s},p=Response(),f=c.callback,d=e=>{p.status(500).json({status:"failed",message:"Internal Server Error: "+e})};if("AsyncFunction"===f.constructor.name)f(t,p,e).catch(d);else try{f(t,p,e)}catch(l){d(l)}}else Response().status(404).json({status:"failed",message:"ERROR: 404 not found"})},app={};return METHODS_NAMES.forEach(e=>{app[e.toLowerCase()]=(t,r)=>{handlers.push({method:e,pattern:t,callback:r})}}),app.route=e=>{const t={};return METHODS_NAMES.forEach(r=>{t[r.toLowerCase()]=n=>(handlers.push({method:r,pattern:e,callback:n}),t)}),t},app.start=()=>{dispatch($request)},app;function rawBodySaver(e,t,r,n){r&&r.length&&(e.rawBody=r.toString(n||"utf8"))}function Response(){let e=200;const{isQX:t,isLoon:r,isSurge:n}=ENV(),o=DEFAULT_HEADERS,s={200:"HTTP/1.1 200 OK",201:"HTTP/1.1 201 Created",302:"HTTP/1.1 302 Found",307:"HTTP/1.1 307 Temporary Redirect",308:"HTTP/1.1 308 Permanent Redirect",404:"HTTP/1.1 404 Not Found",500:"HTTP/1.1 500 Internal Server Error"};return new class{status(t){return e=t,this}send(i=""){const a={status:t?s[e]:e,body:i,headers:o};t?$done(a):(r||n)&&$done({response:a})}end(){this.send()}html(e){this.set("Content-Type","text/html;charset=UTF-8"),this.send(e)}json(e){this.set("Content-Type","application/json;charset=UTF-8"),this.send(JSON.stringify(e))}set(e,t){return o[e]=t,this}}}function patternMatched(e,t){if(e instanceof RegExp&&e.test(t))return!0;if("/"===e)return!0;if(-1===e.indexOf(":")){const r=t.split("/"),n=e.split("/");for(let e=0;e{},onResponse:e=>e,onTimeout:()=>{},...options.events};let worker,timeoutid;events.onRequest(method,options),isQX?worker=$task.fetch({method:method,url:options.url,headers:options.headers,body:options.body}):(isLoon||isSurge||isNode)&&(worker=new Promise((resolve,reject)=>{const request=isNode?eval("require('request')"):$httpClient;request[method.toLowerCase()](options,(e,t,r)=>{e?reject(e):resolve({statusCode:t.status||t.statusCode,headers:t.headers,body:r})})}));const timer=timeout?new Promise((e,t)=>{timeoutid=setTimeout(()=>(events.onTimeout(),t(`${method} URL: ${options.url} exceeds the timeout ${timeout} ms`)),timeout)}):null;return(timer?Promise.race([timer,worker]).then(e=>(clearTimeout(timeoutid),e)):worker).then(e=>events.onResponse(e))}const http={};return methods.forEach(e=>http[e.toLowerCase()]=t=>send(e,t)),http}function API(name="untitled",debug=!1){const{isQX:isQX,isLoon:isLoon,isSurge:isSurge,isNode:isNode}=ENV();return new class{constructor(name,debug){this.name=name,this.debug=debug,this.http=HTTP(),this.env=ENV(),this.node=(()=>{if(isNode){const fs=eval("require('fs')");return{fs:fs}}return null})(),this.initCache();const delay=(e,t)=>new Promise((function(r){setTimeout(r.bind(null,t),e)}));Promise.prototype.delay=function(e){return this.then((function(t){return delay(e,t)}))}}initCache(){if(isQX&&(this.cache=JSON.parse($prefs.valueForKey(this.name)||"{}")),(isLoon||isSurge)&&(this.cache=JSON.parse($persistentStore.read(this.name)||"{}")),isNode){let e="root.json";this.node.fs.existsSync(e)||this.node.fs.writeFileSync(e,JSON.stringify({}),{flag:"wx"},e=>console.log(e)),this.root={},e=this.name+".json",this.node.fs.existsSync(e)?this.cache=JSON.parse(this.node.fs.readFileSync(this.name+".json")):(this.node.fs.writeFileSync(e,JSON.stringify({}),{flag:"wx"},e=>console.log(e)),this.cache={})}}persistCache(){const e=JSON.stringify(this.cache,null,2);isQX&&$prefs.setValueForKey(e,this.name),(isLoon||isSurge)&&$persistentStore.write(e,this.name),isNode&&(this.node.fs.writeFileSync(this.name+".json",e,{flag:"w"},e=>console.log(e)),this.node.fs.writeFileSync("root.json",JSON.stringify(this.root,null,2),{flag:"w"},e=>console.log(e)))}write(e,t){if(this.log("SET "+t),-1!==t.indexOf("#")){if(t=t.substr(1),isSurge||isLoon)return $persistentStore.write(e,t);if(isQX)return $prefs.setValueForKey(e,t);isNode&&(this.root[t]=e)}else this.cache[t]=e;this.persistCache()}read(e){return this.log("READ "+e),-1===e.indexOf("#")?this.cache[e]:(e=e.substr(1),isSurge||isLoon?$persistentStore.read(e):isQX?$prefs.valueForKey(e):isNode?this.root[e]:void 0)}delete(e){if(this.log("DELETE "+e),-1!==e.indexOf("#")){if(e=e.substr(1),isSurge||isLoon)return $persistentStore.write(null,e);if(isQX)return $prefs.removeValueForKey(e);isNode&&delete this.root[e]}else delete this.cache[e];this.persistCache()}notify(e,t="",r="",n={}){const o=n["open-url"],s=n["media-url"];if(isQX&&$notify(e,t,r,n),isSurge&&$notification.post(e,t,r+""+(s?"\n\u591a\u5a92\u4f53:"+s:""),{url:o}),isLoon){let n={};o&&(n.openUrl=o),s&&(n.mediaUrl=s),"{}"===JSON.stringify(n)?$notification.post(e,t,r):$notification.post(e,t,r,n)}if(isNode){const n=r+(o?"\n\u70b9\u51fb\u8df3\u8f6c: "+o:"")+(s?"\n\u591a\u5a92\u4f53: "+s:"");console.log(`${e}\n${t}\n${n}\n\n`)}}log(e){this.debug&&console.log(`[${this.name}] LOG: ${e}`)}info(e){console.log(`[${this.name}] INFO: ${e}`)}error(e){console.log(`[${this.name}] ERROR: ${e}`)}wait(e){return new Promise(t=>setTimeout(t,e))}done(e={}){isQX||isLoon||isSurge?$done(e):isNode&&"undefined"!=typeof $context&&($context.headers=e.headers,$context.statusCode=e.statusCode,$context.body=e.body)}}(name,debug)}var _$openApi_51={HTTP:HTTP,ENV:ENV,API:API};const{API:__API_36}=_$openApi_51,$=__API_36("sub-store");var _$$_36=$;const{HTTP:__HTTP_48}=_$openApi_51;var _$geo_48={getFlag:function(e){const t={"\ud83c\udde6\ud83c\uddff":["\u963f\u585e\u62dc\u7586"],"\ud83c\udde6\ud83c\uddf9":["\u5965\u5730\u5229","\u5967\u5730\u5229","Austria","\u7ef4\u4e5f\u7eb3"],"\ud83c\udde6\ud83c\uddfa":["AU","Australia","Sydney","\u6fb3\u5927\u5229\u4e9a","\u6fb3\u6d32","\u58a8\u5c14\u672c","\u6089\u5c3c","\u571f\u6fb3","\u4eac\u6fb3","\u5ee3\u6fb3","\u6eec\u6fb3","\u6caa\u6fb3","\u5e7f\u6fb3"],"\ud83c\udde7\ud83c\uddea":["BE","\u6bd4\u5229\u6642","\u6bd4\u5229\u65f6"],"\ud83c\udde7\ud83c\uddec":["\u4fdd\u52a0\u5229\u4e9a","\u4fdd\u52a0\u5229\u4e9e","Bulgaria"],"\ud83c\udde7\ud83c\udded":["BH","\u5df4\u6797"],"\ud83c\udde7\ud83c\udde9":["BD","\u5b5f\u52a0\u62c9"],"\ud83c\uddf5\ud83c\uddf0":["\u5df4\u57fa\u65af\u5766"],"\ud83c\uddf0\ud83c\udded":["\u67ec\u57d4\u5be8"],"\ud83c\uddfa\ud83c\udde6":["\u70cf\u514b\u862d","\u4e4c\u514b\u5170"],"\ud83c\udded\ud83c\uddf7":["\u514b\u7f57\u5730\u4e9a","HR","\u514b\u7f85\u5730\u4e9e"],"\ud83c\udde8\ud83c\udde6":["Canada","CANADA","CAN","Waterloo","\u52a0\u62ff\u5927","\u8499\u7279\u5229\u5c14","\u6e29\u54e5\u534e","\u6953\u8449","\u67ab\u53f6","\u6ed1\u94c1\u5362","\u591a\u4f26\u591a","CA"],"\ud83c\udde8\ud83c\udded":["\u745e\u58eb","\u82cf\u9ece\u4e16","Switzerland","Zurich"],"\ud83c\uddf3\ud83c\uddec":["\u5c3c\u65e5\u5229\u4e9a","NG","\u5c3c\u65e5\u5229\u4e9e"],"\ud83c\udde8\ud83c\uddff":["Czechia","\u6377\u514b"],"\ud83c\uddf8\ud83c\uddf0":["\u65af\u6d1b\u4f10\u514b","SK"],"\ud83c\uddf7\ud83c\uddf8":["RS","\u585e\u5c14\u7ef4\u4e9a"],"\ud83c\uddf2\ud83c\udde9":["\u6469\u723e\u591a\u74e6","MD","\u6469\u5c14\u591a\u74e6"],"\ud83c\udde9\ud83c\uddea":["DE","German","GERMAN","\u5fb7\u56fd","\u5fb7\u570b","\u6cd5\u5170\u514b\u798f","\u4eac\u5fb7","\u6eec\u5fb7","\u5ee3\u5fb7","\u6caa\u5fb7","\u5e7f\u5fb7","Frankfurt"],"\ud83c\udde9\ud83c\uddf0":["DK","DNK","\u4e39\u9ea6","\u4e39\u9ea5"],"\ud83c\uddea\ud83c\uddf8":["ES","\u897f\u73ed\u7259","Spain"],"\ud83c\uddea\ud83c\uddfa":["EU","\u6b27\u76df","\u6b27\u7f57\u5df4"],"\ud83c\uddeb\ud83c\uddee":["Finland","\u82ac\u5170","\u82ac\u862d","\u8d6b\u5c14\u8f9b\u57fa"],"\ud83c\uddeb\ud83c\uddf7":["FR","France","\u6cd5\u56fd","\u6cd5\u570b","\u5df4\u9ece"],"\ud83c\uddec\ud83c\udde7":["UK","GB","England","United Kingdom","\u82f1\u56fd","\u4f26\u6566","\u82f1","London"],"\ud83c\uddf2\ud83c\uddf4":["MO","Macao","\u6fb3\u95e8","\u6fb3\u9580","CTM"],"\ud83c\uddf0\ud83c\uddff":["\u54c8\u8428\u514b\u65af\u5766","\u54c8\u8428\u514b"],"\ud83c\udded\ud83c\uddfa":["\u5308\u7259\u5229","Hungary"],"\ud83c\udded\ud83c\uddf0":["HK","Hongkong","Hong Kong","HongKong","HONG KONG","\u9999\u6e2f","\u6df1\u6e2f","\u6caa\u6e2f","\u547c\u6e2f","HKT","HKBN","HGC","WTT","CMI","\u7a57\u6e2f","\u4eac\u6e2f","\u6e2f"],"\ud83c\uddee\ud83c\udde9":["Indonesia","\u5370\u5c3c","\u5370\u5ea6\u5c3c\u897f\u4e9a","\u96c5\u52a0\u8fbe"],"\ud83c\uddee\ud83c\uddea":["Ireland","IRELAND","\u7231\u5c14\u5170","\u611b\u723e\u862d","\u90fd\u67cf\u6797"],"\ud83c\uddee\ud83c\uddf1":["Israel","\u4ee5\u8272\u5217"],"\ud83c\uddee\ud83c\uddf3":["India","IND","INDIA","\u5370\u5ea6","\u5b5f\u4e70","MFumbai"],"\ud83c\uddee\ud83c\uddf8":["IS","ISL","\u51b0\u5c9b","\u51b0\u5cf6"],"\ud83c\uddf0\ud83c\uddf5":["KP","\u671d\u9c9c"],"\ud83c\uddf0\ud83c\uddf7":["KR","Korea","KOR","\u97e9\u56fd","\u9996\u5c14","\u97e9","\u97d3","\u6625\u5ddd","Chuncheon","Seoul"],"\ud83c\uddf1\ud83c\uddfa":["\u5362\u68ee\u5821"],"\ud83c\uddf1\ud83c\uddfb":["Latvia","Latvija","\u62c9\u8131\u7ef4\u4e9a"],"\ud83c\uddf2\ud83c\uddfd":["MEX","MX","\u58a8\u897f\u54e5"],"\ud83c\uddf2\ud83c\uddfe":["MY","Malaysia","MALAYSIA","\u9a6c\u6765\u897f\u4e9a","\u5927\u99ac","\u99ac\u4f86\u897f\u4e9e","\u5409\u9686\u5761"],"\ud83c\uddf3\ud83c\uddf1":["NL","Netherlands","\u8377\u5170","\u8377\u862d","\u5c3c\u5fb7\u862d","\u963f\u59c6\u65af\u7279\u4e39"],"\ud83c\uddf3\ud83c\uddf5":["\u5c3c\u6cca\u5c14"],"\ud83c\uddf5\ud83c\udded":["PH","Philippines","\u83f2\u5f8b\u5bbe","\u83f2\u5f8b\u8cd3"],"\ud83c\uddf5\ud83c\uddf7":["PR","\u6ce2\u591a\u9ece\u5404"],"\ud83c\uddf7\ud83c\uddf4":["RO","\u7f57\u9a6c\u5c3c\u4e9a"],"\ud83c\uddf7\ud83c\uddfa":["RU","Russia","\u4fc4\u7f57\u65af","\u4fc4\u56fd","\u4fc4\u7f85\u65af","\u4f2f\u529b","\u83ab\u65af\u79d1","\u5723\u5f7c\u5f97\u5821","\u897f\u4f2f\u5229\u4e9a","\u65b0\u897f\u4f2f\u5229\u4e9a","\u4eac\u4fc4","\u676d\u4fc4","\u5ee3\u4fc4","\u6eec\u4fc4","\u5e7f\u4fc4","\u6caa\u4fc4","Moscow"],"\ud83c\uddf8\ud83c\udde6":["\u6c99\u7279"],"\ud83c\uddf8\ud83c\uddea":["SE","Sweden","\u745e\u5178"],"\ud83c\uddf2\ud83c\uddf9":["\u9a6c\u8033\u4ed6"],"\ud83c\uddf2\ud83c\udde6":["MA","\u6469\u6d1b\u54e5"],"\ud83c\uddf8\ud83c\uddec":["SG","Singapore","SINGAPORE","\u65b0\u52a0\u5761","\u72ee\u57ce","\u6caa\u65b0","\u4eac\u65b0","\u6cc9\u65b0","\u7a57\u65b0","\u6df1\u65b0","\u676d\u65b0","\u5e7f\u65b0","\u5ee3\u65b0","\u6eec\u65b0"],"\ud83c\uddf9\ud83c\udded":["TH","Thailand","\u6cf0\u56fd","\u6cf0\u570b","\u66fc\u8c37"],"\ud83c\uddf9\ud83c\uddf7":["TR","Turkey","\u571f\u8033\u5176","\u4f0a\u65af\u5766\u5e03\u5c14"],"\ud83c\uddf9\ud83c\uddfc":["TW","Taiwan","TAIWAN","\u53f0\u6e7e","\u53f0\u5317","\u53f0\u4e2d","\u65b0\u5317","\u5f70\u5316","CHT","\u53f0","HINET","Taipei"],"\ud83c\uddfa\ud83c\uddf8":["US","USA","America","United States","\u7f8e\u56fd","\u7f8e","\u4eac\u7f8e","\u6ce2\u7279\u5170","\u8fbe\u62c9\u65af","\u4fc4\u52d2\u5188","\u51e4\u51f0\u57ce","\u8d39\u5229\u8499","\u7845\u8c37","\u77fd\u8c37","\u62c9\u65af\u7ef4\u52a0\u65af","\u6d1b\u6749\u77f6","\u5723\u4f55\u585e","\u5723\u514b\u62c9\u62c9","\u897f\u96c5\u56fe","\u829d\u52a0\u54e5","\u6caa\u7f8e","\u54e5\u4f26\u5e03","\u7ebd\u7ea6","Los Angeles","San Jose","Sillicon Valley","Michigan"],"\ud83c\uddfb\ud83c\uddf3":["VN","\u8d8a\u5357","\u80e1\u5fd7\u660e\u5e02"],"\ud83c\uddfb\ud83c\uddea":["VE","\u59d4\u5185\u745e\u62c9"],"\ud83c\uddee\ud83c\uddf9":["Italy","IT","Nachash","\u610f\u5927\u5229","\u7c73\u5170","\u7fa9\u5927\u5229"],"\ud83c\uddff\ud83c\udde6":["South Africa","\u5357\u975e"],"\ud83c\udde6\ud83c\uddea":["United Arab Emirates","\u963f\u8054\u914b","\u8fea\u62dc","AE"],"\ud83c\udde7\ud83c\uddf7":["BR","Brazil","\u5df4\u897f","\u5723\u4fdd\u7f57"],"\ud83c\uddef\ud83c\uddf5":["JP","Japan","JAPAN","\u65e5\u672c","\u4e1c\u4eac","\u5927\u962a","\u57fc\u7389","\u6caa\u65e5","\u7a57\u65e5","\u5ddd\u65e5","\u4e2d\u65e5","\u6cc9\u65e5","\u676d\u65e5","\u6df1\u65e5","\u8fbd\u65e5","\u5e7f\u65e5","\u5927\u5742","Osaka","Tokyo"],"\ud83c\udde6\ud83c\uddf7":["AR","\u963f\u6839\u5ef7"],"\ud83c\uddf3\ud83c\uddf4":["Norway","\u632a\u5a01","NO"],"\ud83c\udde8\ud83c\uddf3":["CN","China","\u56de\u56fd","\u4e2d\u56fd","\u4e2d\u570b","\u6c5f\u82cf","\u5317\u4eac","\u4e0a\u6d77","\u5e7f\u5dde","\u6df1\u5733","\u676d\u5dde","\u5f90\u5dde","\u9752\u5c9b","\u5b81\u6ce2","\u9547\u6c5f","back"],"\ud83c\uddf5\ud83c\uddf1":["PL","POL","\u6ce2\u5170","\u6ce2\u862d"],"\ud83c\udde8\ud83c\uddf1":["\u667a\u5229"],"\ud83c\uddf3\ud83c\uddff":["\u65b0\u897f\u862d","\u65b0\u897f\u5170"],"\ud83c\uddec\ud83c\uddf7":["\u5e0c\u814a","\u5e0c\u81d8"],"\ud83c\uddea\ud83c\uddec":["\u57c3\u53ca"],"\ud83c\udde8\ud83c\uddfe":["CY","\u585e\u6d66\u8def\u65af"],"\ud83c\udde8\ud83c\uddf7":["CR","\u54e5\u65af\u8fbe\u9ece\u52a0"],"\ud83c\uddf8\ud83c\uddee":["SI","\u65af\u6d1b\u6587\u5c3c\u4e9a"],"\ud83c\uddf1\ud83c\uddf9":["LT","\u7acb\u9676\u5b9b"],"\ud83c\uddf5\ud83c\udde6":["PA","\u5df4\u62ff\u9a6c"],"\ud83c\uddf9\ud83c\uddf3":["TN","\u7a81\u5c3c\u65af"],"\ud83c\uddee\ud83c\uddf2":["\u9a6c\u6069\u5c9b","\u99ac\u6069\u5cf6"],"\ud83c\udde7\ud83c\uddfe":["BY","\u767d\u4fc4","\u767d\u4fc4\u7f57\u65af"],"\ud83c\uddf5\ud83c\uddf9":["\u8461\u8404\u7259"],"\ud83c\uddf0\ud83c\uddea":["KE","\u80af\u5c3c\u4e9a"],"\ud83c\uddf0\ud83c\uddec":["KG","\u5409\u5c14\u5409\u65af\u5766"],"\ud83c\uddef\ud83c\uddf4":["JO","\u7ea6\u65e6"],"\ud83c\uddfa\ud83c\uddfe":["UY","\u4e4c\u62c9\u572d"],"\ud83c\uddf2\ud83c\uddf3":["\u8499\u53e4"],"\ud83c\uddee\ud83c\uddf7":["IR","\u4f0a\u6717"],"\ud83c\uddf5\ud83c\uddea":["\u79d8\u9c81","\u7955\u9b6f"],"\ud83c\udde8\ud83c\uddf4":["\u54e5\u4f26\u6bd4\u4e9a"],"\ud83c\uddea\ud83c\uddea":["\u7231\u6c99\u5c3c\u4e9a"],"\ud83c\uddea\ud83c\udde8":["EC","\u5384\u74dc\u591a\u5c14"],"\ud83c\uddf2\ud83c\uddf0":["\u9a6c\u5176\u987f","\u99ac\u5176\u9813"],"\ud83c\udde7\ud83c\udde6":["\u6ce2\u9ed1\u5171\u548c\u56fd","\u6ce2\u9ed1"],"\ud83c\uddec\ud83c\uddea":["\u683c\u9b6f\u5409\u4e9e","\u683c\u9c81\u5409\u4e9a"],"\ud83c\udde6\ud83c\uddf1":["\u963f\u723e\u5df4\u5c3c\u4e9e","\u963f\u5c14\u5df4\u5c3c\u4e9a"],"\ud83c\udff3\ufe0f\u200d\ud83c\udf08":["\u6d41\u91cf","\u65f6\u95f4","\u5e94\u6025","\u8fc7\u671f","Bandwidth","expire"]};for(let r of Object.keys(t))if(t[r].some(t=>-1!==e.indexOf(t)))return r;return(e.match(/[\uD83C][\uDDE6-\uDDFF][\uD83C][\uDDE6-\uDDFF]/)||[])[0]||"\ud83c\udff4\u200d\u2620\ufe0f"},IP_API:async function(e,t){const r=decodeURIComponent(e.params.server),n=__HTTP_48(),o=await n.get(`http://ip-api.com/json/${r}?lang=zh-CN`).then(e=>JSON.parse(e.body));t.json(o)}};const{HTTP:__HTTP_49}=_$openApi_51;var _$gist_49=function({token:e,key:t}){const r=__HTTP_49({baseURL:"https://api.github.com",headers:{Authorization:"token "+e,"User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.141 Safari/537.36"},events:{onResponse:e=>/^[45]/.test(String(e.statusCode))?Promise.reject("ERROR: "+JSON.parse(e.body).message):e}});async function n(){return r.get("/gists").then(e=>{const r=JSON.parse(e.body);for(let n of r)if(n.description===t)return n.id;return-1})}this.upload=async function(e){const o=await n();return-1===o?r.post({url:"/gists",body:JSON.stringify({description:t,public:!1,files:e})}):r.patch({url:"/gists/"+o,body:JSON.stringify({files:e})})},this.download=async function(e){const t=await n();if(-1===t)return Promise.reject("\u672a\u627e\u5230Gist\u5907\u4efd\uff01");try{const{files:n}=await r.get("/gists/"+t).then(e=>JSON.parse(e.body)),o=n[e].raw_url;return await r.get(o).then(e=>e.body)}catch(o){return Promise.reject(o)}}},_$constants_41={SETTINGS_KEY:"settings",SUBS_KEY:"subs",COLLECTIONS_KEY:"collections",RULES_KEY:"rules",BUILT_IN_KEY:"builtin",ARTIFACTS_KEY:"artifacts",GIST_BACKUP_KEY:"Auto Generated Sub-Store Backup",GIST_BACKUP_FILE_NAME:"Sub-Store",ARTIFACT_REPOSITORY_KEY:"Sub-Store Artifacts Repository"};const{HTTP:__HTTP_46}=_$openApi_51,cache=new Map;var _$download_46=async function(e,t="Quantumult%20X"){const r=t+e;if(cache.has(r))return cache.get(r);const n=__HTTP_46({headers:{"User-Agent":t}}),o=new Promise((t,r)=>{n.get(e).then(e=>{const n=e.body;0===n.replace(/\s/g,"").length?r(new Error("\u8ba2\u9605\u5185\u5bb9\u4e3a\u7a7a\uff01")):t(n)})});return cache[r]=o,o},_$common_7={};function isNothing(e){return null==e}_$common_7.isNothing=isNothing,_$common_7.isObject=function(e){return"object"==typeof e&&null!==e},_$common_7.toArray=function(e){return Array.isArray(e)?e:isNothing(e)?[]:[e]},_$common_7.repeat=function(e,t){var r,n="";for(r=0;r0&&-1==="\0\r\n\x85\u2028\u2029".indexOf(this.buffer.charAt(n-1));)if(n-=1,this.position-n>t/2-1){r=" ... ",n+=5;break}for(o="",s=this.position;st/2-1){o=" ... ",s-=5;break}return i=this.buffer.slice(n,s),_$common_7.repeat(" ",e)+r+i+o+"\n"+_$common_7.repeat(" ",e+this.position-n+r.length)+"^"},Mark.prototype.toString=function(e){var t,r="";return this.name&&(r+='in "'+this.name+'" '),r+="at line "+(this.line+1)+", column "+(this.column+1),e||(t=this.getSnippet())&&(r+=":\n"+t),r},_$mark_11=Mark;var TYPE_CONSTRUCTOR_OPTIONS=["kind","resolve","construct","instanceOf","predicate","represent","defaultStyle","styleAliases"],YAML_NODE_KINDS=["scalar","sequence","mapping"],_$type_18=function(e,t){var r,n;if(t=t||{},Object.keys(t).forEach((function(t){if(-1===TYPE_CONSTRUCTOR_OPTIONS.indexOf(t))throw new _$exception_9('Unknown option "'+t+'" is met in definition of "'+e+'" YAML type.')})),this.tag=e,this.kind=t.kind||null,this.resolve=t.resolve||function(){return!0},this.construct=t.construct||function(e){return e},this.instanceOf=t.instanceOf||null,this.predicate=t.predicate||null,this.represent=t.represent||null,this.defaultStyle=t.defaultStyle||null,this.styleAliases=(r=t.styleAliases||null,n={},null!==r&&Object.keys(r).forEach((function(e){r[e].forEach((function(t){n[String(t)]=e}))})),n),-1===YAML_NODE_KINDS.indexOf(this.kind))throw new _$exception_9('Unknown kind "'+this.kind+'" is specified for "'+e+'" YAML type.')},_$schema_12={};function compileList(e,t,r){var n=[];return e.include.forEach((function(e){r=compileList(e,t,r)})),e[t].forEach((function(e){r.forEach((function(t,r){t.tag===e.tag&&t.kind===e.kind&&n.push(r)})),r.push(e)})),r.filter((function(e,t){return-1===n.indexOf(t)}))}function Schema(e){this.include=e.include||[],this.implicit=e.implicit||[],this.explicit=e.explicit||[],this.implicit.forEach((function(e){if(e.loadKind&&"scalar"!==e.loadKind)throw new _$exception_9("There is a non-scalar type in the implicit list of a schema. Implicit resolving of such types is not supported.")})),this.compiledImplicit=compileList(this,"implicit",[]),this.compiledExplicit=compileList(this,"explicit",[]),this.compiledTypeMap=function(){var e,t,r={scalar:{},sequence:{},mapping:{},fallback:{}};function n(e){r[e.kind][e.tag]=r.fallback[e.tag]=e}for(e=0,t=arguments.length;e=0?"0b"+e.toString(2):"-0b"+e.toString(2).slice(1)},octal:function(e){return e>=0?"0"+e.toString(8):"-0"+e.toString(8).slice(1)},decimal:function(e){return e.toString(10)},hexadecimal:function(e){return e>=0?"0x"+e.toString(16).toUpperCase():"-0x"+e.toString(16).toUpperCase().slice(1)}},defaultStyle:"decimal",styleAliases:{binary:[2,"bin"],octal:[8,"oct"],decimal:[10,"dec"],hexadecimal:[16,"hex"]}}),YAML_FLOAT_PATTERN=new RegExp("^(?:[-+]?(?:0|[1-9][0-9_]*)(?:\\.[0-9_]*)?(?:[eE][-+]?[0-9]+)?|\\.[0-9_]+(?:[eE][-+]?[0-9]+)?|[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\\.[0-9_]*|[-+]?\\.(?:inf|Inf|INF)|\\.(?:nan|NaN|NAN))$"),SCIENTIFIC_WITHOUT_DOT=/^[-+]?[0-9]+e/,_$float_21=new _$type_18("tag:yaml.org,2002:float",{kind:"scalar",resolve:function(e){return null!==e&&!(!YAML_FLOAT_PATTERN.test(e)||"_"===e[e.length-1])},construct:function(e){var t,r,n,o;return r="-"===(t=e.replace(/_/g,"").toLowerCase())[0]?-1:1,o=[],"+-".indexOf(t[0])>=0&&(t=t.slice(1)),".inf"===t?1===r?Number.POSITIVE_INFINITY:Number.NEGATIVE_INFINITY:".nan"===t?NaN:t.indexOf(":")>=0?(t.split(":").forEach((function(e){o.unshift(parseFloat(e,10))})),t=0,n=1,o.forEach((function(e){t+=e*n,n*=60})),r*t):r*parseFloat(t,10)},predicate:function(e){return"[object Number]"===Object.prototype.toString.call(e)&&(e%1!=0||_$common_7.isNegativeZero(e))},represent:function(e,t){var r;if(isNaN(e))switch(t){case"lowercase":return".nan";case"uppercase":return".NAN";case"camelcase":return".NaN"}else if(Number.POSITIVE_INFINITY===e)switch(t){case"lowercase":return".inf";case"uppercase":return".INF";case"camelcase":return".Inf"}else if(Number.NEGATIVE_INFINITY===e)switch(t){case"lowercase":return"-.inf";case"uppercase":return"-.INF";case"camelcase":return"-.Inf"}else if(_$common_7.isNegativeZero(e))return"-0.0";return r=e.toString(10),SCIENTIFIC_WITHOUT_DOT.test(r)?r.replace("e",".e"):r},defaultStyle:"lowercase"}),_$json_17=new _$schema_12({include:[_$failsafe_16],implicit:[_$null_28,_$bool_20,_$int_22,_$float_21]}),_$core_13=new _$schema_12({include:[_$json_17]}),YAML_DATE_REGEXP=new RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9])-([0-9][0-9])$"),YAML_TIMESTAMP_REGEXP=new RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9]?)-([0-9][0-9]?)(?:[Tt]|[ \\t]+)([0-9][0-9]?):([0-9][0-9]):([0-9][0-9])(?:\\.([0-9]*))?(?:[ \\t]*(Z|([-+])([0-9][0-9]?)(?::([0-9][0-9]))?))?$"),_$timestamp_34=new _$type_18("tag:yaml.org,2002:timestamp",{kind:"scalar",resolve:function(e){return null!==e&&(null!==YAML_DATE_REGEXP.exec(e)||null!==YAML_TIMESTAMP_REGEXP.exec(e))},construct:function(e){var t,r,n,o,s,i,a,u,c=0,p=null;if(null===(t=YAML_DATE_REGEXP.exec(e))&&(t=YAML_TIMESTAMP_REGEXP.exec(e)),null===t)throw new Error("Date resolve error");if(r=+t[1],n=+t[2]-1,o=+t[3],!t[4])return new Date(Date.UTC(r,n,o));if(s=+t[4],i=+t[5],a=+t[6],t[7]){for(c=t[7].slice(0,3);c.length<3;)c+="0";c=+c}return t[9]&&(p=6e4*(60*+t[10]+ +(t[11]||0)),"-"===t[9]&&(p=-p)),u=new Date(Date.UTC(r,n,o,s,i,a,c)),p&&u.setTime(u.getTime()-p),u},instanceOf:Date,represent:function(e){return e.toISOString()}}),_$merge_27=new _$type_18("tag:yaml.org,2002:merge",{kind:"scalar",resolve:function(e){return"<<"===e||null===e}}),NodeBuffer;try{var _require=require;NodeBuffer=_require("buffer").Buffer}catch(__){}var BASE64_MAP="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\n\r",_$binary_19=new _$type_18("tag:yaml.org,2002:binary",{kind:"scalar",resolve:function(e){if(null===e)return!1;var t,r,n=0,o=e.length,s=BASE64_MAP;for(r=0;r64)){if(t<0)return!1;n+=6}return n%8==0},construct:function(e){var t,r,n=e.replace(/[\r\n=]/g,""),o=n.length,s=BASE64_MAP,i=0,a=[];for(t=0;t>16&255),a.push(i>>8&255),a.push(255&i)),i=i<<6|s.indexOf(n.charAt(t));return 0==(r=o%4*6)?(a.push(i>>16&255),a.push(i>>8&255),a.push(255&i)):18===r?(a.push(i>>10&255),a.push(i>>2&255)):12===r&&a.push(i>>4&255),NodeBuffer?NodeBuffer.from?NodeBuffer.from(a):new NodeBuffer(a):a},predicate:function(e){return NodeBuffer&&NodeBuffer.isBuffer(e)},represent:function(e){var t,r,n="",o=0,s=e.length,i=BASE64_MAP;for(t=0;t>18&63],n+=i[o>>12&63],n+=i[o>>6&63],n+=i[63&o]),o=(o<<8)+e[t];return 0==(r=s%3)?(n+=i[o>>18&63],n+=i[o>>12&63],n+=i[o>>6&63],n+=i[63&o]):2===r?(n+=i[o>>10&63],n+=i[o>>4&63],n+=i[o<<2&63],n+=i[64]):1===r&&(n+=i[o>>2&63],n+=i[o<<4&63],n+=i[64],n+=i[64]),n}}),_hasOwnProperty=Object.prototype.hasOwnProperty,_toString=Object.prototype.toString,_$omap_29=new _$type_18("tag:yaml.org,2002:omap",{kind:"sequence",resolve:function(e){if(null===e)return!0;var t,r,n,o,s,i=[],a=e;for(t=0,r=a.length;t3)return!1;if("/"!==t[t.length-n.length-1])return!1}return!0},construct:function(e){var t=e,r=/\/([gim]*)$/.exec(e),n="";return"/"===t[0]&&(r&&(n=r[1]),t=t.slice(1,t.length-n.length-1)),new RegExp(t,n)},predicate:function(e){return"[object RegExp]"===Object.prototype.toString.call(e)},represent:function(e){var t="/"+e.source+"/";return e.global&&(t+="g"),e.multiline&&(t+="m"),e.ignoreCase&&(t+="i"),t}}),esprima;try{var ___require_23=require;esprima=___require_23("esprima")}catch(_){"undefined"!=typeof window&&(esprima=window.esprima)}var _$function_23=new _$type_18("tag:yaml.org,2002:js/function",{kind:"scalar",resolve:function(e){if(null===e)return!1;try{var t="("+e+")",r=esprima.parse(t,{range:!0});return"Program"===r.type&&1===r.body.length&&"ExpressionStatement"===r.body[0].type&&("ArrowFunctionExpression"===r.body[0].expression.type||"FunctionExpression"===r.body[0].expression.type)}catch(n){return!1}},construct:function(e){var t,r="("+e+")",n=esprima.parse(r,{range:!0}),o=[];if("Program"!==n.type||1!==n.body.length||"ExpressionStatement"!==n.body[0].type||"ArrowFunctionExpression"!==n.body[0].expression.type&&"FunctionExpression"!==n.body[0].expression.type)throw new Error("Failed to resolve function");return n.body[0].expression.params.forEach((function(e){o.push(e.name)})),t=n.body[0].expression.body.range,"BlockStatement"===n.body[0].expression.body.type?new Function(o,r.slice(t[0]+1,t[1]-1)):new Function(o,"return "+r.slice(t[0],t[1]))},predicate:function(e){return"[object Function]"===Object.prototype.toString.call(e)},represent:function(e){return e.toString()}}),_$default_full_14=_$schema_12.DEFAULT=new _$schema_12({include:[_$default_safe_15],explicit:[_$undefined_25,_$regexp_24,_$function_23]}),_$loader_10={},___hasOwnProperty_10=Object.prototype.hasOwnProperty,CONTEXT_FLOW_IN=1,CONTEXT_FLOW_OUT=2,CONTEXT_BLOCK_IN=3,CONTEXT_BLOCK_OUT=4,CHOMPING_CLIP=1,CHOMPING_STRIP=2,CHOMPING_KEEP=3,PATTERN_NON_PRINTABLE=/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F-\x84\x86-\x9F\uFFFE\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/,PATTERN_NON_ASCII_LINE_BREAKS=/[\x85\u2028\u2029]/,PATTERN_FLOW_INDICATORS=/[,\[\]\{\}]/,PATTERN_TAG_HANDLE=/^(?:!|!!|![a-z\-]+!)$/i,PATTERN_TAG_URI=/^(?:!|[^,\[\]\{\}])(?:%[0-9a-f]{2}|[0-9a-z\-#;\/\?:@&=\+\$,_\.!~\*'\(\)\[\]])*$/i;function _class(e){return Object.prototype.toString.call(e)}function is_EOL(e){return 10===e||13===e}function is_WHITE_SPACE(e){return 9===e||32===e}function is_WS_OR_EOL(e){return 9===e||32===e||10===e||13===e}function is_FLOW_INDICATOR(e){return 44===e||91===e||93===e||123===e||125===e}function fromHexCode(e){var t;return 48<=e&&e<=57?e-48:97<=(t=32|e)&&t<=102?t-97+10:-1}function simpleEscapeSequence(e){return 48===e?"\0":97===e?"\x07":98===e?"\b":116===e||9===e?"\t":110===e?"\n":118===e?"\v":102===e?"\f":114===e?"\r":101===e?"\x1b":32===e?" ":34===e?'"':47===e?"/":92===e?"\\":78===e?"\x85":95===e?"\xa0":76===e?"\u2028":80===e?"\u2029":""}function charFromCodepoint(e){return e<=65535?String.fromCharCode(e):String.fromCharCode(55296+(e-65536>>10),56320+(e-65536&1023))}for(var simpleEscapeCheck=new Array(256),simpleEscapeMap=new Array(256),i=0;i<256;i++)simpleEscapeCheck[i]=simpleEscapeSequence(i)?1:0,simpleEscapeMap[i]=simpleEscapeSequence(i);function State(e,t){this.input=e,this.filename=t.filename||null,this.schema=t.schema||_$default_full_14,this.onWarning=t.onWarning||null,this.legacy=t.legacy||!1,this.json=t.json||!1,this.listener=t.listener||null,this.implicitTypes=this.schema.compiledImplicit,this.typeMap=this.schema.compiledTypeMap,this.length=e.length,this.position=0,this.line=0,this.lineStart=0,this.lineIndent=0,this.documents=[]}function generateError(e,t){return new _$exception_9(t,new _$mark_11(e.filename,e.input,e.position,e.line,e.position-e.lineStart))}function throwError(e,t){throw generateError(e,t)}function throwWarning(e,t){e.onWarning&&e.onWarning.call(null,generateError(e,t))}var directiveHandlers={YAML:function(e,t,r){var n,o,s;null!==e.version&&throwError(e,"duplication of %YAML directive"),1!==r.length&&throwError(e,"YAML directive accepts exactly one argument"),null===(n=/^([0-9]+)\.([0-9]+)$/.exec(r[0]))&&throwError(e,"ill-formed argument of the YAML directive"),o=parseInt(n[1],10),s=parseInt(n[2],10),1!==o&&throwError(e,"unacceptable YAML version of the document"),e.version=r[0],e.checkLineBreaks=s<2,1!==s&&2!==s&&throwWarning(e,"unsupported YAML version of the document")},TAG:function(e,t,r){var n,o;2!==r.length&&throwError(e,"TAG directive accepts exactly two arguments"),n=r[0],o=r[1],PATTERN_TAG_HANDLE.test(n)||throwError(e,"ill-formed tag handle (first argument) of the TAG directive"),___hasOwnProperty_10.call(e.tagMap,n)&&throwError(e,'there is a previously declared suffix for "'+n+'" tag handle'),PATTERN_TAG_URI.test(o)||throwError(e,"ill-formed tag prefix (second argument) of the TAG directive"),e.tagMap[n]=o}};function captureSegment(e,t,r,n){var o,s,i,a;if(t1&&(e.result+=_$common_7.repeat("\n",t-1))}function readBlockSequence(e,t){var r,n,o=e.tag,s=e.anchor,i=[],a=!1;for(null!==e.anchor&&(e.anchorMap[e.anchor]=i),n=e.input.charCodeAt(e.position);0!==n&&45===n&&is_WS_OR_EOL(e.input.charCodeAt(e.position+1));)if(a=!0,e.position++,skipSeparationSpace(e,!0,-1)&&e.lineIndent<=t)i.push(null),n=e.input.charCodeAt(e.position);else if(r=e.line,composeNode(e,t,CONTEXT_BLOCK_IN,!1,!0),i.push(e.result),skipSeparationSpace(e,!0,-1),n=e.input.charCodeAt(e.position),(e.line===r||e.lineIndent>t)&&0!==n)throwError(e,"bad indentation of a sequence entry");else if(e.lineIndentt?d=1:e.lineIndent===t?d=0:e.lineIndentt?d=1:e.lineIndent===t?d=0:e.lineIndentt)&&(composeNode(e,t,CONTEXT_BLOCK_OUT,!0,o)&&(_?d=e.result:h=e.result),_||(storeMappingPair(e,p,l,f,d,h,s,i),f=d=h=null),skipSeparationSpace(e,!0,-1),a=e.input.charCodeAt(e.position)),e.lineIndent>t&&0!==a)throwError(e,"bad indentation of a mapping entry");else if(e.lineIndent=0))break;0===o?throwError(e,"bad explicit indentation width of a block scalar; it cannot be less than one"):c?throwError(e,"repeat of an indentation width identifier"):(p=t+o-1,c=!0)}if(is_WHITE_SPACE(s)){do{s=e.input.charCodeAt(++e.position)}while(is_WHITE_SPACE(s));if(35===s)do{s=e.input.charCodeAt(++e.position)}while(!is_EOL(s)&&0!==s)}for(;0!==s;){for(readLineBreak(e),e.lineIndent=0,s=e.input.charCodeAt(e.position);(!c||e.lineIndentp&&(p=e.lineIndent),is_EOL(s))l++;else{if(e.lineIndent0){for(o=i,s=0;o>0;o--)(i=fromHexCode(a=e.input.charCodeAt(++e.position)))>=0?s=(s<<4)+i:throwError(e,"expected hexadecimal character");e.result+=charFromCodepoint(s),e.position++}else throwError(e,"unknown escape sequence");r=n=e.position}else is_EOL(a)?(captureSegment(e,r,n,!0),writeFoldedLines(e,skipSeparationSpace(e,!1,t)),r=n=e.position):e.position===e.lineStart&&testDocumentSeparator(e)?throwError(e,"unexpected end of the document within a double quoted scalar"):(e.position++,n=e.position)}throwError(e,"unexpected end of the stream within a double quoted scalar")}(e,l)?_=!0:function(e){var t,r,n;if(42!==(n=e.input.charCodeAt(e.position)))return!1;for(n=e.input.charCodeAt(++e.position),t=e.position;0!==n&&!is_WS_OR_EOL(n)&&!is_FLOW_INDICATOR(n);)n=e.input.charCodeAt(++e.position);return e.position===t&&throwError(e,"name of an alias node must contain at least one character"),r=e.input.slice(t,e.position),___hasOwnProperty_10.call(e.anchorMap,r)||throwError(e,'unidentified alias "'+r+'"'),e.result=e.anchorMap[r],skipSeparationSpace(e,!0,-1),!0}(e)?(_=!0,null===e.tag&&null===e.anchor||throwError(e,"alias node should not have any properties")):function(e,t,r){var n,o,s,i,a,u,c,p,l=e.kind,f=e.result;if(is_WS_OR_EOL(p=e.input.charCodeAt(e.position))||is_FLOW_INDICATOR(p)||35===p||38===p||42===p||33===p||124===p||62===p||39===p||34===p||37===p||64===p||96===p)return!1;if((63===p||45===p)&&(is_WS_OR_EOL(n=e.input.charCodeAt(e.position+1))||r&&is_FLOW_INDICATOR(n)))return!1;for(e.kind="scalar",e.result="",o=s=e.position,i=!1;0!==p;){if(58===p){if(is_WS_OR_EOL(n=e.input.charCodeAt(e.position+1))||r&&is_FLOW_INDICATOR(n))break}else if(35===p){if(is_WS_OR_EOL(e.input.charCodeAt(e.position-1)))break}else{if(e.position===e.lineStart&&testDocumentSeparator(e)||r&&is_FLOW_INDICATOR(p))break;if(is_EOL(p)){if(a=e.line,u=e.lineStart,c=e.lineIndent,skipSeparationSpace(e,!1,-1),e.lineIndent>=t){i=!0,p=e.input.charCodeAt(e.position);continue}e.position=s,e.line=a,e.lineStart=u,e.lineIndent=c;break}}i&&(captureSegment(e,o,s,!1),writeFoldedLines(e,e.line-a),o=s=e.position,i=!1),is_WHITE_SPACE(p)||(s=e.position+1),p=e.input.charCodeAt(++e.position)}return captureSegment(e,o,s,!1),!!e.result||(e.kind=l,e.result=f,!1)}(e,l,CONTEXT_FLOW_IN===r)&&(_=!0,null===e.tag&&(e.tag="?")),null!==e.anchor&&(e.anchorMap[e.anchor]=e.result)):0===d&&(_=a&&readBlockSequence(e,f))),null!==e.tag&&"!"!==e.tag)if("?"===e.tag){for(null!==e.result&&"scalar"!==e.kind&&throwError(e,'unacceptable node kind for ! tag; it should be "scalar", not "'+e.kind+'"'),u=0,c=e.implicitTypes.length;u tag; it should be "'+p.kind+'", not "'+e.kind+'"'),p.resolve(e.result)?(e.result=p.construct(e.result),null!==e.anchor&&(e.anchorMap[e.anchor]=e.result)):throwError(e,"cannot resolve a node with !<"+e.tag+"> explicit tag")):throwError(e,"unknown tag !<"+e.tag+">");return null!==e.listener&&e.listener("close",e),null!==e.tag||null!==e.anchor||_}function readDocument(e){var t,r,n,o,s=e.position,i=!1;for(e.version=null,e.checkLineBreaks=e.legacy,e.tagMap={},e.anchorMap={};0!==(o=e.input.charCodeAt(e.position))&&(skipSeparationSpace(e,!0,-1),o=e.input.charCodeAt(e.position),!(e.lineIndent>0||37!==o));){for(i=!0,o=e.input.charCodeAt(++e.position),t=e.position;0!==o&&!is_WS_OR_EOL(o);)o=e.input.charCodeAt(++e.position);for(n=[],(r=e.input.slice(t,e.position)).length<1&&throwError(e,"directive name must not be less than one character in length");0!==o;){for(;is_WHITE_SPACE(o);)o=e.input.charCodeAt(++e.position);if(35===o){do{o=e.input.charCodeAt(++e.position)}while(0!==o&&!is_EOL(o));break}if(is_EOL(o))break;for(t=e.position;0!==o&&!is_WS_OR_EOL(o);)o=e.input.charCodeAt(++e.position);n.push(e.input.slice(t,e.position))}0!==o&&readLineBreak(e),___hasOwnProperty_10.call(directiveHandlers,r)?directiveHandlers[r](e,r,n):throwWarning(e,'unknown document directive "'+r+'"')}skipSeparationSpace(e,!0,-1),0===e.lineIndent&&45===e.input.charCodeAt(e.position)&&45===e.input.charCodeAt(e.position+1)&&45===e.input.charCodeAt(e.position+2)?(e.position+=3,skipSeparationSpace(e,!0,-1)):i&&throwError(e,"directives end mark is expected"),composeNode(e,e.lineIndent-1,CONTEXT_BLOCK_OUT,!1,!0),skipSeparationSpace(e,!0,-1),e.checkLineBreaks&&PATTERN_NON_ASCII_LINE_BREAKS.test(e.input.slice(s,e.position))&&throwWarning(e,"non-ASCII line breaks are interpreted as content"),e.documents.push(e.result),e.position===e.lineStart&&testDocumentSeparator(e)?46===e.input.charCodeAt(e.position)&&(e.position+=3,skipSeparationSpace(e,!0,-1)):e.position0?e.charCodeAt(s-1):null,d=d&&isPlainSafe(i,a)}else{for(s=0;sn&&" "!==e[f+1],f=s);else if(!isPrintable(i))return STYLE_DOUBLE;a=s>0?e.charCodeAt(s-1):null,d=d&&isPlainSafe(i,a)}p=p||l&&s-f-1>n&&" "!==e[f+1]}return c||p?r>9&&needIndentIndicator(e)?STYLE_DOUBLE:p?STYLE_FOLDED:STYLE_LITERAL:d&&!o(e)?STYLE_PLAIN:STYLE_SINGLE}function writeScalar(e,t,r,n){e.dump=function(){if(0===t.length)return"''";if(!e.noCompatMode&&-1!==DEPRECATED_BOOLEANS_SYNTAX.indexOf(t))return"'"+t+"'";var o=e.indent*Math.max(1,r),s=-1===e.lineWidth?-1:Math.max(Math.min(e.lineWidth,40),e.lineWidth-o),i=n||e.flowLevel>-1&&r>=e.flowLevel;switch(chooseScalarStyle(t,i,e.indent,s,(function(t){return function(e,t){var r,n;for(r=0,n=e.implicitTypes.length;r"+blockHeader(t,e.indent)+dropEndingNewline(indentString(function(e,t){for(var r,n,o,s=/(\n+)([^\n]*)/g,i=(o=-1!==(o=e.indexOf("\n"))?o:e.length,s.lastIndex=o,foldLine(e.slice(0,o),t)),a="\n"===e[0]||" "===e[0];n=s.exec(e);){var u=n[1],c=n[2];r=" "===c[0],i+=u+(a||r||""===c?"":"\n")+foldLine(c,t),a=r}return i}(t,s),o));case STYLE_DOUBLE:return'"'+function(e){for(var t,r,n,o="",s=0;s=55296&&t<=56319&&(r=e.charCodeAt(s+1))>=56320&&r<=57343?(o+=encodeHex(1024*(t-55296)+r-56320+65536),s++):o+=!(n=ESCAPE_SEQUENCES[t])&&isPrintable(t)?e[s]:n||encodeHex(t);return o}(t)+'"';default:throw new _$exception_9("impossible error: invalid scalar style")}}()}function blockHeader(e,t){var r=needIndentIndicator(e)?String(t):"",n="\n"===e[e.length-1];return r+(!n||"\n"!==e[e.length-2]&&"\n"!==e?n?"":"-":"+")+"\n"}function dropEndingNewline(e){return"\n"===e[e.length-1]?e.slice(0,-1):e}function foldLine(e,t){if(""===e||" "===e[0])return e;for(var r,n,o=/ [^ ]/g,s=0,i=0,a=0,u="";r=o.exec(e);)(a=r.index)-s>t&&(n=i>s?i:a,u+="\n"+e.slice(s,n),s=n+1),i=a;return u+="\n",e.length-s>t&&i>s?u+=e.slice(s,i)+"\n"+e.slice(i+1):u+=e.slice(s),u.slice(1)}function detectType(e,t,r){var n,o,s,i,a,u;for(s=0,i=(o=r?e.explicitTypes:e.implicitTypes).length;s tag resolver accepts not "'+u+'" style');n=a.represent[u](t,u)}e.dump=n}return!0}return!1}function writeNode(e,t,r,n,o,s){e.tag=null,e.dump=r,detectType(e,r,!1)||detectType(e,r,!0);var i=___toString_8.call(e.dump);n&&(n=e.flowLevel<0||e.flowLevel>t);var a,u,c="[object Object]"===i||"[object Array]"===i;if(c&&(u=-1!==(a=e.duplicates.indexOf(r))),(null!==e.tag&&"?"!==e.tag||u||2!==e.indent&&t>0)&&(o=!1),u&&e.usedDuplicates[a])e.dump="*ref_"+a;else{if(c&&u&&!e.usedDuplicates[a]&&(e.usedDuplicates[a]=!0),"[object Object]"===i)n&&0!==Object.keys(e.dump).length?(function(e,t,r,n){var o,s,i,a,u,c,p="",l=e.tag,f=Object.keys(r);if(!0===e.sortKeys)f.sort();else if("function"==typeof e.sortKeys)f.sort(e.sortKeys);else if(e.sortKeys)throw new _$exception_9("sortKeys must be a boolean or a function");for(o=0,s=f.length;o1024)&&(e.dump&&CHAR_LINE_FEED===e.dump.charCodeAt(0)?c+="?":c+="? "),c+=e.dump,u&&(c+=generateNextLine(e,t)),writeNode(e,t+1,a,!0,u)&&(e.dump&&CHAR_LINE_FEED===e.dump.charCodeAt(0)?c+=":":c+=": ",p+=c+=e.dump));e.tag=l,e.dump=p||"{}"}(e,t,e.dump,o),u&&(e.dump="&ref_"+a+e.dump)):(function(e,t,r){var n,o,s,i,a,u="",c=e.tag,p=Object.keys(r);for(n=0,o=p.length;n1024&&(a+="? "),a+=e.dump+(e.condenseFlow?'"':"")+":"+(e.condenseFlow?"":" "),writeNode(e,t,i,!1,!1)&&(u+=a+=e.dump));e.tag=c,e.dump="{"+u+"}"}(e,t,e.dump),u&&(e.dump="&ref_"+a+" "+e.dump));else if("[object Array]"===i){var p=e.noArrayIndent&&t>0?t-1:t;n&&0!==e.dump.length?(function(e,t,r,n){var o,s,i="",a=e.tag;for(o=0,s=r.length;o "+e.dump)}return!0}function getDuplicateReferences(e,t){var r,n,o=[],s=[];for(function e(t,r,n){var o,s,i;if(null!==t&&"object"==typeof t)if(-1!==(s=r.indexOf(t)))-1===n.indexOf(s)&&n.push(s);else if(r.push(t),Array.isArray(t))for(s=0,i=t.length;s0?o-4:o;for(r=0;r>16&255,i[a++]=t>>8&255,i[a++]=255&t;return 2===s&&(t=revLookup[e.charCodeAt(r)]<<2|revLookup[e.charCodeAt(r+1)]>>4,i[a++]=255&t),1===s&&(t=revLookup[e.charCodeAt(r)]<<10|revLookup[e.charCodeAt(r+1)]<<4|revLookup[e.charCodeAt(r+2)]>>2,i[a++]=t>>8&255,i[a++]=255&t),i},fromByteArray:function(e){for(var t,r=e.length,n=r%3,o=[],s=0,i=r-n;si?i:s+16383));return 1===n?(t=e[r-1],o.push(lookup[t>>2]+lookup[t<<4&63]+"==")):2===n&&(t=(e[r-2]<<8)+e[r-1],o.push(lookup[t>>10]+lookup[t>>4&63]+lookup[t<<2&63]+"=")),o.join("")}},lookup=[],revLookup=[],Arr="undefined"!=typeof Uint8Array?Uint8Array:Array,code="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",__i_1=0,len=code.length;__i_10)throw new Error("Invalid string. Length must be a multiple of 4");var r=e.indexOf("=");return-1===r&&(r=t),[r,r===t?0:4-r%4]}function encodeChunk(e,t,r){for(var n,o,s=[],i=t;i>18&63]+lookup[o>>12&63]+lookup[o>>6&63]+lookup[63&o]);return s.join("")}revLookup["-".charCodeAt(0)]=62,revLookup["_".charCodeAt(0)]=63;var _$ieee754_3={read:function(e,t,r,n,o){var s,i,a=8*o-n-1,u=(1<>1,p=-7,l=r?o-1:0,f=r?-1:1,d=e[t+l];for(l+=f,s=d&(1<<-p)-1,d>>=-p,p+=a;p>0;s=256*s+e[t+l],l+=f,p-=8);for(i=s&(1<<-p)-1,s>>=-p,p+=n;p>0;i=256*i+e[t+l],l+=f,p-=8);if(0===s)s=1-c;else{if(s===u)return i?NaN:1/0*(d?-1:1);i+=Math.pow(2,n),s-=c}return(d?-1:1)*i*Math.pow(2,s-n)},write:function(e,t,r,n,o,s){var i,a,u,c=8*s-o-1,p=(1<>1,f=23===o?Math.pow(2,-24)-Math.pow(2,-77):0,d=n?0:s-1,h=n?1:-1,_=t<0||0===t&&1/t<0?1:0;for(t=Math.abs(t),isNaN(t)||t===1/0?(a=isNaN(t)?1:0,i=p):(i=Math.floor(Math.log(t)/Math.LN2),t*(u=Math.pow(2,-i))<1&&(i--,u*=2),(t+=i+l>=1?f/u:f*Math.pow(2,1-l))*u>=2&&(i++,u/=2),i+l>=p?(a=0,i=p):i+l>=1?(a=(t*u-1)*Math.pow(2,o),i+=l):(a=t*Math.pow(2,l-1)*Math.pow(2,o),i=0));o>=8;e[r+d]=255&a,d+=h,a/=256,o-=8);for(i=i<0;e[r+d]=255&i,d+=h,i/=256,c-=8);e[r+d-h]|=128*_}},_$base64_4={exports:{}};(function(e,t){(function(){!function(e,t){var r,n;"object"==typeof _$base64_4.exports?_$base64_4.exports=t():"function"==typeof define&&define.amd?define(t):(r=e.Base64,(n=t()).noConflict=function(){return e.Base64=r,n},e.Meteor&&(Base64=n),e.Base64=n)}("undefined"!=typeof self?self:"undefined"!=typeof window?window:void 0!==e?e:this,(function(){"use strict";var e,r="function"==typeof atob,n="function"==typeof btoa,o="function"==typeof t,s="function"==typeof TextDecoder?new TextDecoder:void 0,i="function"==typeof TextEncoder?new TextEncoder:void 0,a=Array.prototype.slice.call("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="),u=(e={},a.forEach((function(t,r){return e[t]=r})),e),c=/^(?:[A-Za-z\d+\/]{4})*?(?:[A-Za-z\d+\/]{2}(?:==)?|[A-Za-z\d+\/]{3}=?)?$/,p=String.fromCharCode.bind(String),l="function"==typeof Uint8Array.from?Uint8Array.from.bind(Uint8Array):function(e,t){return void 0===t&&(t=function(e){return e}),new Uint8Array(Array.prototype.slice.call(e,0).map(t))},f=function(e){return e.replace(/=/g,"").replace(/[+\/]/g,(function(e){return"+"==e?"-":"_"}))},d=function(e){return e.replace(/[^A-Za-z0-9\+\/]/g,"")},h=function(e){for(var t,r,n,o,s="",i=e.length%3,u=0;u255||(n=e.charCodeAt(u++))>255||(o=e.charCodeAt(u++))>255)throw new TypeError("invalid character found");s+=a[(t=r<<16|n<<8|o)>>18&63]+a[t>>12&63]+a[t>>6&63]+a[63&t]}return i?s.slice(0,i-3)+"===".substring(i):s},_=n?function(e){return btoa(e)}:o?function(e){return t.from(e,"binary").toString("base64")}:h,m=o?function(e){return t.from(e).toString("base64")}:function(e){for(var t=[],r=0,n=e.length;r>>6)+p(128|63&t):p(224|t>>>12&15)+p(128|t>>>6&63)+p(128|63&t);var t=65536+1024*(e.charCodeAt(0)-55296)+(e.charCodeAt(1)-56320);return p(240|t>>>18&7)+p(128|t>>>12&63)+p(128|t>>>6&63)+p(128|63&t)},$=/[\uD800-\uDBFF][\uDC00-\uDFFFF]|[^\x00-\x7F]/g,w=function(e){return e.replace($,y)},E=o?function(e){return t.from(e,"utf8").toString("base64")}:i?function(e){return m(i.encode(e))}:function(e){return _(w(e))},S=function(e,t){return void 0===t&&(t=!1),t?f(E(e)):E(e)},A=function(e){return S(e,!0)},O=/[\xC0-\xDF][\x80-\xBF]|[\xE0-\xEF][\x80-\xBF]{2}|[\xF0-\xF7][\x80-\xBF]{3}/g,v=function(e){switch(e.length){case 4:var t=((7&e.charCodeAt(0))<<18|(63&e.charCodeAt(1))<<12|(63&e.charCodeAt(2))<<6|63&e.charCodeAt(3))-65536;return p(55296+(t>>>10))+p(56320+(1023&t));case 3:return p((15&e.charCodeAt(0))<<12|(63&e.charCodeAt(1))<<6|63&e.charCodeAt(2));default:return p((31&e.charCodeAt(0))<<6|63&e.charCodeAt(1))}},b=function(e){return e.replace(O,v)},T=function(e){if(e=e.replace(/\s+/g,""),!c.test(e))throw new TypeError("malformed base64.");e+="==".slice(2-(3&e.length));for(var t,r,n,o="",s=0;s>16&255):64===n?p(t>>16&255,t>>8&255):p(t>>16&255,t>>8&255,255&t);return o},R=r?function(e){return atob(d(e))}:o?function(e){return t.from(e,"base64").toString("binary")}:T,C=o?function(e){return l(t.from(e,"base64"))}:function(e){return l(R(e),(function(e){return e.charCodeAt(0)}))},N=function(e){return C(L(e))},I=o?function(e){return t.from(e,"base64").toString("utf8")}:s?function(e){return s.decode(C(e))}:function(e){return b(R(e))},L=function(e){return d(e.replace(/[-_]/g,(function(e){return"-"==e?"+":"/"})))},P=function(e){return I(L(e))},k=function(e){return{value:e,enumerable:!1,writable:!0,configurable:!0}},x=function(){var e=function(e,t){return Object.defineProperty(String.prototype,e,k(t))};e("fromBase64",(function(){return P(this)})),e("toBase64",(function(e){return S(this,e)})),e("toBase64URI",(function(){return S(this,!0)})),e("toBase64URL",(function(){return S(this,!0)})),e("toUint8Array",(function(){return N(this)}))},U=function(){var e=function(e,t){return Object.defineProperty(Uint8Array.prototype,e,k(t))};e("toBase64",(function(e){return g(this,e)})),e("toBase64URI",(function(){return g(this,!0)})),e("toBase64URL",(function(){return g(this,!0)}))},F={version:"3.7.2",VERSION:"3.7.2",atob:R,atobPolyfill:T,btoa:_,btoaPolyfill:h,fromBase64:P,toBase64:S,encode:S,encodeURI:A,encodeURL:A,utob:w,btou:b,decode:P,isValid:function(e){if("string"!=typeof e)return!1;var t=e.replace(/\s+/g,"").replace(/={0,2}$/,"");return!/[^\s0-9a-zA-Z\+/]/.test(t)||!/[^\s0-9a-zA-Z\-_]/.test(t)},fromUint8Array:g,toUint8Array:N,extendString:x,extendUint8Array:U,extendBuiltins:function(){x(),U()},Base64:{}};return Object.keys(F).forEach((function(e){return F.Base64[e]=F[e]})),F}))}).call(this)}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{},_$buffer_2({}).Buffer),_$base64_4=_$base64_4.exports;var _$logical_50={AND:function(...e){return e.reduce((e,t)=>e.map((e,r)=>t[r]&&e))},OR:function(...e){return e.reduce((e,t)=>e.map((e,r)=>t[r]||e))},NOT:function(e){return e.map(e=>!e)},FULL:function(e,t){return[...Array(e).keys()].map(()=>t)}};const{Base64:__Base64_37}=_$base64_4,{AND:AND,FULL:FULL}=_$logical_50,{getFlag:getFlag}=_$geo_48,PROXY_PREPROCESSORS=[{name:"HTML",test:e=>/^/.test(e),parse:e=>""},function(){const e=["dm1lc3M","c3NyOi8v","dHJvamFu","c3M6Ly","c3NkOi8v","c2hhZG93","aHR0c"];return{name:"Base64 Pre-processor",test:function(t){return e.some(e=>-1!==t.indexOf(e))},parse:function(e){return __Base64_37.decode(e)}}}(),{name:"Clash Pre-processor",test:function(e){return/proxies/.test(e)},parse:function(e){return _$staticJsYaml_35.safeLoad(e).proxies.map(e=>JSON.stringify(e)).join("\n")}},{name:"SSD Pre-processor",test:function(e){return 0===e.indexOf("ssd://")},parse:function(e){const t=[];let r=JSON.parse(__Base64_37.decode(e.split("ssd://")[1]));r.traffic_used,r.traffic_total,r.expiry,r.airport;let n=r.port,o=r.encryption,s=r.password,i=r.servers;for(let a=0;a{let[t,o]=e.split("=");if(t=t.trim(),o=o.trim(),-1!==n.indexOf(t)){r.type=t;const e=o.split(":");r.server=e[0],r.port=e[1]}else r[t.trim()]=o.trim()}),r}function t(){return{name:"Loon HTTP Parser",test:e=>/^.*=\s*http/i.test(e.split(",")[0])&&5===e.split(",").length&&-1===e.indexOf("username")&&-1===e.indexOf("password"),parse:e=>{const t=e.split("=")[1].split(","),r={name:e.split("=")[0].trim(),type:"http",server:t[1],port:t[2],tls:"443"===t[2]};return t[3]&&(r.username=t[3]),t[4]&&(r.password=t[4]),r.tls&&(r.sni=t["tls-name"]||r.server,r["skip-cert-verify"]=JSON.parse(t["skip-cert-verify"]||"false")),r}}}function r(e){const t={};t.name=e.split("=")[0].trim();const r=e.split(",");t.server=r[1].trim(),t.port=r[2].trim();for(let n=3;n/^ss:\/\//.test(e),parse:e=>{const t={};let r=e.split("ss://")[1];const n={name:decodeURIComponent(e.split("#")[1]),type:"ss",supported:t},o=(r=r.split("#")[0]).match(/@([^\/]*)(\/|$)/)[1],s=o.lastIndexOf(":");n.server=o.substring(0,s),n.port=o.substring(s+1);const i=__Base64_37.decode(r.split("@")[0]).split(":");if(n.cipher=i[0],n.password=i[1],-1!==r.indexOf("?plugin=")){const e=("plugin="+decodeURIComponent(r.split("?plugin=")[1].split("&")[0])).split(";"),o={};for(const t of e){const[e,r]=t.split("=");e&&(o[e]=r||!0)}switch(o.plugin){case"obfs-local":case"simple-obfs":n.plugin="obfs",n["plugin-opts"]={mode:o.obfs,host:o["obfs-host"]};break;case"v2ray-plugin":n.supported={...t,Loon:!1,Surge:!1},n.obfs="v2ray-plugin",n["plugin-opts"]={mode:"websocket",host:o["obfs-host"],path:o.path||"",tls:o.tls||!1};break;default:throw new Error("Unsupported plugin option: "+o.plugin)}}return n}},function(){const e={Surge:!1};return{name:"URI SSR Parser",test:e=>/^ssr:\/\//.test(e),parse:t=>{let r=(t=__Base64_37.decode(t.split("ssr://")[1])).indexOf(":origin");-1===r&&(r=t.indexOf(":auth_"));const n=t.substring(0,r),o=n.substring(0,n.lastIndexOf(":")),s=n.substring(n.lastIndexOf(":")+1);let i=t.substring(r+1).split("/?")[0].split(":"),a={type:"ssr",server:o,port:s,protocol:i[0],cipher:i[1],obfs:i[2],password:__Base64_37.decode(i[3]),supported:e};const u={};if((t=t.split("/?")[1].split("&")).length>1)for(const e of t){const[t,r]=e.split("=");u[t]=r.trim()}return{...a,name:u.remarks?__Base64_37.decode(u.remarks):a.server,"protocol-param":__Base64_37.decode(u.protoparam||"").replace(/\s/g,""),"obfs-param":__Base64_37.decode(u.obfsparam||"").replace(/\s/g,"")}}}}(),{name:"URI VMess Parser",test:e=>/^vmess:\/\//.test(e),parse:e=>{const t={};e=e.split("vmess://")[1];const r=__Base64_37.decode(e);if(/=\s*vmess/.test(r)){const e=r.split(",").map(e=>e.trim()),t={};for(const r of e)if(-1!==r.indexOf("=")){const[e,n]=r.split("=");t[e.trim()]=n.trim()}const n={name:e[0].split("=")[0].trim(),type:"vmess",server:e[1],port:e[2],cipher:e[3],uuid:e[4].match(/^"(.*)"$/)[1],tls:"over-tls"===t.obfs||"wss"===t.obfs};if(void 0!==t["udp-relay"]&&(n.udp=JSON.parse(t["udp-relay"])),void 0!==t["fast-open"]&&(n.udp=JSON.parse(t["fast-open"])),"ws"===t.obfs||"wss"===t.obfs){n.network="ws",n["ws-opts"].path=(t["obfs-path"]||'"/"').match(/^"(.*)"$/)[1];let e=t["obfs-header"];e&&-1!==e.indexOf("Host")&&(e=e.match(/Host:\s*([a-zA-Z0-9-.]*)/)[1]),n["ws-opts"].headers={Host:e||n.server}}return n.tls&&"false"===t['"tls-verification"']&&(n["skip-cert-verify"]=!0),n.tls&&t["obfs-host"]&&(n.sni=t["obfs-host"]),n}{const e=JSON.parse(r),n={name:e.ps,type:"vmess",server:e.add,port:e.port,cipher:"auto",uuid:e.id,alterId:e.aid||0,tls:"tls"===e.tls||!0===e.tls,supported:t};return"ws"===e.net&&(n.network="ws",n["ws-opts"]={path:e.path,headers:{Host:e.host||e.add}},n.tls&&e.host&&(n.sni=e.host)),!1===e.verify_cert&&(n["skip-cert-verify"]=!0),n}}},{name:"URI Trojan Parser",test:e=>/^trojan:\/\//.test(e),parse:e=>{e=e.split("trojan://")[1];const[t,r]=e.split("@")[1].split("?")[0].split(":"),n=decodeURIComponent(e.split("#")[1].trim());let o=e.split("?"),s=null;return o.length>1&&(o=o[1].split("#")[0].split("&"),s=new Map(o.map(e=>e.split("="))).get("sni")),{name:n||"[Trojan] "+t,type:"trojan",server:t,port:r,password:e.split("@")[0],sni:s,supported:{}}}},{name:"Clash Parser",test:e=>{try{JSON.parse(e)}catch(t){return!1}return!0},parse:e=>JSON.parse(e)},{name:"Surge SS Parser",test:e=>/^.*=\s*ss/.test(e.split(",")[0]),parse:e=>{const t=r(e),n={name:t.name,type:"ss",server:t.server,port:t.port,cipher:t["encrypt-method"],password:t.password,tfo:JSON.parse(t.tfo||"false"),udp:JSON.parse(t["udp-relay"]||"false")};return t.obfs&&(n.plugin="obfs",n["plugin-opts"]={mode:t.obfs,host:t["obfs-host"]}),n}},{name:"Surge VMess Parser",test:e=>/^.*=\s*vmess/.test(e.split(",")[0])&&-1!==e.indexOf("username"),parse:e=>{const t=r(e),n={name:t.name,type:"vmess",server:t.server,port:t.port,uuid:t.username,alterId:0,cipher:"none",tls:JSON.parse(t.tls||"false"),tfo:JSON.parse(t.tfo||"false")};if(n.tls&&(void 0!==t["skip-cert-verify"]&&(n["skip-cert-verify"]=!0===t["skip-cert-verify"]||"1"===t["skip-cert-verify"]),n.sni=t.sni||t.server),JSON.parse(t.ws||"false")){n.network="ws",n["ws-opts"]={path:t["ws-path"]};const e=t["ws-headers"].match(/(,|^|\s)*HOST:\s*(.*?)(,|$)/),r=e?e[2]:n.server;n["ws-opts"].headers={Host:r||t.server}}return n}},{name:"Surge Trojan Parser",test:e=>/^.*=\s*trojan/.test(e.split(",")[0])&&-1!==e.indexOf("sni"),parse:e=>{const t=r(e),n={name:t.name,type:"trojan",server:t.server,port:t.port,password:t.password,sni:t.sni||t.server,tfo:JSON.parse(t.tfo||"false")};return void 0!==t["skip-cert-verify"]&&(n["skip-cert-verify"]=!0===t["skip-cert-verify"]||"1"===t["skip-cert-verify"]),n}},{name:"Surge HTTP Parser",test:e=>/^.*=\s*http/.test(e.split(",")[0])&&!t().test(e),parse:e=>{const t=r(e),n={name:t.name,type:"http",server:t.server,port:t.port,tls:JSON.parse(t.tls||"false"),tfo:JSON.parse(t.tfo||"false")};return n.tls&&(void 0!==t["skip-cert-verify"]&&(n["skip-cert-verify"]=!0===t["skip-cert-verify"]||"1"===t["skip-cert-verify"]),n.sni=t.sni||t.server),t.username&&"none"!==t.username&&(n.username=t.username),t.password&&"none"!==t.password&&(n.password=t.password),n}},{name:"Loon SS Parser",test:e=>"shadowsocks"===e.split(",")[0].split("=")[1].trim().toLowerCase(),parse:e=>{const t=e.split("=")[1].split(","),r={name:e.split("=")[0].trim(),type:"ss",server:t[1],port:t[2],cipher:t[3],password:t[4].replace(/"/g,"")};return t.length>5&&(r.plugin="obfs",r["plugin-opts"]={mode:t[5],host:t[6]}),r}},{name:"Loon SSR Parser",test:e=>"shadowsocksr"===e.split(",")[0].split("=")[1].trim().toLowerCase(),parse:e=>{const t=e.split("=")[1].split(",");return{name:e.split("=")[0].trim(),type:"ssr",server:t[1],port:t[2],cipher:t[3],password:t[4].replace(/"/g,""),protocol:t[5],"protocol-param":t[6].match(/{(.*)}/)[1],supported:{Surge:!1},obfs:t[7],"obfs-param":t[8].match(/{(.*)}/)[1]}}},{name:"Loon VMess Parser",test:e=>/^.*=\s*vmess/i.test(e.split(",")[0])&&-1===e.indexOf("username"),parse:e=>{let t=e.split("=")[1].split(",");const r={name:e.split("=")[0].trim(),type:"vmess",server:t[1],port:t[2],cipher:t[3]||"none",uuid:t[4].replace(/"/g,""),alterId:0};t=t.splice(5);for(const n of t){const[e,r]=n.split(":");t[e]=r}switch(r.tls=JSON.parse(t["over-tls"]||"false"),r.tls&&(r.sni=t["tls-name"]||r.server,r["skip-cert-verify"]=JSON.parse(t["skip-cert-verify"]||"false")),t.transport){case"tcp":break;case"ws":r.network=t.transport,r["ws-opts"]={path:t.path,headers:{Host:t.host}}}return r.tls&&(r["skip-cert-verify"]=JSON.parse(t["skip-cert-verify"]||"false")),r}},{name:"Loon Trojan Parser",test:e=>/^.*=\s*trojan/i.test(e.split(",")[0])&&-1===e.indexOf("password"),parse:e=>{const t=e.split("=")[1].split(","),r={name:e.split("=")[0].trim(),type:"trojan",server:t[1],port:t[2],password:t[3].replace(/"/g,""),sni:t[1],"skip-cert-verify":JSON.parse(t["skip-cert-verify"]||"false")};if(t.length>4){const[n,o]=t[4].split(":");if("tls-name"!==n)throw new Error(`Unknown option ${n} for line: \n${e}`);r.sni=o}return r}},t(),{name:"QX SS Parser",test:e=>/^shadowsocks\s*=/.test(e.split(",")[0].trim())&&-1===e.indexOf("ssr-protocol"),parse:t=>{const r=e(t),n={name:r.tag,type:"ss",server:r.server,port:r.port,cipher:r.method,password:r.password,udp:JSON.parse(r["udp-relay"]||"false"),tfo:JSON.parse(r["fast-open"]||"false"),supported:{}};if(r.obfs)switch(n["plugin-opts"]={host:r["obfs-host"]||n.server},r.obfs){case"http":case"tls":n.plugin="obfs",n["plugin-opts"].mode=r.obfs;break;case"ws":case"wss":n["plugin-opts"]={...n["plugin-opts"],mode:"websocket",path:r["obfs-uri"]||"/",tls:"wss"===r.obfs},n["plugin-opts"].tls&&void 0!==r["tls-verification"]&&(n["plugin-opts"]["skip-cert-verify"]=r["tls-verification"]),n.plugin="v2ray-plugin",n.supported.Surge=!1,n.supported.Loon=!1}return n}},{name:"QX SSR Parser",test:e=>/^shadowsocks\s*=/.test(e.split(",")[0].trim())&&-1!==e.indexOf("ssr-protocol"),parse:t=>{const r=e(t),n={name:r.tag,type:"ssr",server:r.server,port:r.port,cipher:r.method,password:r.password,protocol:r["ssr-protocol"],obfs:"plain","protocol-param":r["ssr-protocol-param"],udp:JSON.parse(r["udp-relay"]||"false"),tfo:JSON.parse(r["fast-open"]||"false"),supported:{Surge:!1}};return r.obfs&&(n.obfs=r.obfs,n["obfs-param"]=r["obfs-host"]),n}},{name:"QX VMess Parser",test:e=>/^vmess\s*=/.test(e.split(",")[0].trim()),parse:t=>{const r=e(t),n={type:"vmess",name:r.tag,server:r.server,port:r.port,cipher:r.method||"none",uuid:r.password,alterId:0,tls:"over-tls"===r.obfs||"wss"===r.obfs,udp:JSON.parse(r["udp-relay"]||"false"),tfo:JSON.parse(r["fast-open"]||"false")};return n.tls&&(n.sni=r["obfs-host"]||r.server,n["skip-cert-verify"]=!JSON.parse(r["tls-verification"]||"true")),"ws"!==r.obfs&&"wss"!==r.obfs||(n.network="ws",n["ws-opts"]={path:r["obfs-uri"],headers:{Host:r["obfs-host"]||r.server}}),n}},{name:"QX Trojan Parser",test:e=>/^trojan\s*=/.test(e.split(",")[0].trim()),parse:t=>{const r=e(t),n={type:"trojan",name:r.tag,server:r.server,port:r.port,password:r.password,sni:r["tls-host"]||r.server,udp:JSON.parse(r["udp-relay"]||"false"),tfo:JSON.parse(r["fast-open"]||"false")};return n["skip-cert-verify"]=!JSON.parse(r["tls-verification"]||"true"),n}},{name:"QX HTTP Parser",test:e=>/^http\s*=/.test(e.split(",")[0].trim()),parse:t=>{const r=e(t),n={type:"http",name:r.tag,server:r.server,port:r.port,tls:JSON.parse(r["over-tls"]||"false"),udp:JSON.parse(r["udp-relay"]||"false"),tfo:JSON.parse(r["fast-open"]||"false")};return r.username&&"none"!==r.username&&(n.username=r.username),r.password&&"none"!==r.password&&(n.password=r.password),n.tls&&(n.sni=r["tls-host"]||n.server,n["skip-cert-verify"]=!JSON.parse(r["tls-verification"]||"true")),n}}]}(),PROXY_PROCESSORS=function(){function SetPropertyOperator({key:e,value:t}){return{name:"Set Property Operator",func:r=>r.map(r=>(r[e]=t,r))}}function FlagOperator(e=!0){return{name:"Flag Operator",func:t=>t.map(t=>{if(e){const e=getFlag(t.name);t.name=removeFlag(t.name),t.name=e+" "+t.name,t.name=t.name.replace(/\ud83c\uddf9\ud83c\uddfc/g,"\ud83c\udde8\ud83c\uddf3")}else t.name=removeFlag(t.name);return t})}}function HandleDuplicateOperator(e){const{action:t,template:r,link:n,position:o}={action:"rename",template:"0 1 2 3 4 5 6 7 8 9",link:"-",position:"back",...e};return{name:"Handle Duplicate Operator",func:e=>{if("delete"===t){const t={};return e.filter(e=>!t[e.name]&&(t[e.name]=!0,!0))}if("rename"===t){const t=r.split(" "),s={};let i=0;e.forEach(e=>{void 0===s[e.name]?s[e.name]=1:s[e.name]++,i=Math.max(s[e.name].toString().length,i)});const a={};return e.map(e=>{if(s[e.name]>1){void 0===a[e.name]&&(a[e.name]=1);let r="",s=a[e.name]++,u=0;for(;s>0;)r=t[s%10]+r,s=parseInt(s/10),u++;for(;u++{switch(e){case"asc":case"desc":return t.sort((t,r)=>(t.name>r.name?1:-1)*("desc"===e?-1:1));case"random":return shuffle(t);default:throw new Error("Unknown sort option: "+e)}}}}function RegexSortOperator(e){return{name:"Regex Sort Operator",func:t=>(e=e.map(e=>buildRegex(e)),t.sort((t,r)=>{const n=getRegexOrder(e,t.name),o=getRegexOrder(e,r.name);return n&&!o?-1:o&&!n?1:n&&o?nt.map(t=>{for(const{expr:r,now:n}of e)t.name=t.name.replace(buildRegex(r,"g"),n).trim();return t})}}function RegexDeleteOperator(e){return{name:"Regex Delete Operator",func:RegexRenameOperator(e.map(e=>({expr:e,now:""}))).func}}function ScriptOperator(script,targetPlatform,$arguments){return{name:"Script Operator",func:proxies=>{let output=proxies;return function(){const $get=(e,t)=>(0,PROXY_PROCESSORS[e])(t),$process=__ApplyProcessor_37;eval(script),output=operator(proxies,targetPlatform)}(),output}}}function UselessFilter(){return{name:"Useless Filter",func:RegexFilter({regex:["\u7f51\u5740","\u6d41\u91cf","\u65f6\u95f4","\u5e94\u6025","\u8fc7\u671f","Bandwidth","expire"],keep:!1}).func}}function RegionFilter(e){const t={HK:"\ud83c\udded\ud83c\uddf0",TW:"\ud83c\uddf9\ud83c\uddfc",US:"\ud83c\uddfa\ud83c\uddf8",SG:"\ud83c\uddf8\ud83c\uddec",JP:"\ud83c\uddef\ud83c\uddf5",UK:"\ud83c\uddec\ud83c\udde7"};return{name:"Region Filter",func:r=>r.map(r=>{const n=getFlag(r.name);return e.some(e=>t[e]===n)})}}function RegexFilter({regex:e=[],keep:t=!0}){return{name:"Regex Filter",func:r=>r.map(r=>{const n=e.some(e=>buildRegex(e).test(r.name));return t?n:!n})}}function buildRegex(e,...t){return t=t.join(""),e.startsWith("(?i)")?(e=e.substr(4),new RegExp(e,"i"+t)):new RegExp(e,t)}function TypeFilter(e){return{name:"Type Filter",func:t=>t.map(t=>e.some(e=>t.type===e))}}function ScriptFilter(script,targetPlatform,$arguments){return{name:"Script Filter",func:proxies=>{let output=FULL(proxies.length,!0);return function(){eval(script),output=filter(proxies,targetPlatform)}(),output}}}return{"Useless Filter":UselessFilter,"Region Filter":RegionFilter,"Regex Filter":RegexFilter,"Type Filter":TypeFilter,"Script Filter":ScriptFilter,"Set Property Operator":SetPropertyOperator,"Flag Operator":FlagOperator,"Sort Operator":SortOperator,"Regex Sort Operator":RegexSortOperator,"Regex Rename Operator":RegexRenameOperator,"Regex Delete Operator":RegexDeleteOperator,"Script Operator":ScriptOperator,"Handle Duplicate Operator":HandleDuplicateOperator}}(),PROXY_PRODUCERS={QX:{produce:e=>{let t,r;switch(e.type){case"ss":if(t="","obfs"===e.plugin){const{host:r,mode:n}=e["plugin-opts"];t=`,obfs=${n}${r?",obfs-host="+r:""}`}if("v2ray-plugin"===e.plugin){const{tls:r,host:n,path:o}=e["plugin-opts"];t=`,obfs=${r?"wss":"ws"}${n?",obfs-host="+n:""}${o?",obfs-uri="+o:""}`}return`shadowsocks=${e.server}:${e.port},method=${e.cipher},password=${e.password}${t}${e.tfo?",fast-open=true":",fast-open=false"}${e.udp?",udp-relay=true":",udp-relay=false"},tag=${e.name}`;case"ssr":return`shadowsocks=${e.server}:${e.port},method=${e.cipher},password=${e.password},ssr-protocol=${e.protocol}${e["protocol-param"]?",ssr-protocol-param="+e["protocol-param"]:""}${e.obfs?",obfs="+e.obfs:""}${e["obfs-param"]?",obfs-host="+e["obfs-param"]:""},fast-open=${e.tfo||!1}${e.udp?",udp-relay=true":",udp-relay=false"},tag=${e.name}`;case"vmess":t="","ws"===e.network?t=e.tls?`,obfs=wss${e.sni?",obfs-host="+e.sni:""}${e["ws-opts"].path?",obfs-uri="+e["ws-opts"].path:""},tls-verification=${e["skip-cert-verify"]?"false":"true"}`:`,obfs=ws${e["ws-opts"].headers.Host?",obfs-host="+e["ws-opts"].headers.Host:""}${e["ws-opts"].path?",obfs-uri="+e["ws-opts"].path:""}`:e.tls&&(t=`,obfs=over-tls${e.sni?",obfs-host="+e.sni:""},tls-verification=${e["skip-cert-verify"]?"false":"true"}`);let n=`vmess=${e.server}:${e.port},method=${"auto"===e.cipher?"none":e.cipher},password=${e.uuid}${t},fast-open=${e.tfo||!1}${e.udp?",udp-relay=true":",udp-relay=false"}`;return 0===e.alterId&&(e["vmess-aead"]=!0),void 0!==e["vmess-aead"]&&(n+=",aead="+e["vmess-aead"]),n+=",tag="+e.name;case"trojan":return`trojan=${e.server}:${e.port},password=${e.password}${e.sni?",tls-host="+e.sni:""},over-tls=true,tls-verification=${e["skip-cert-verify"]?"false":"true"},fast-open=${e.tfo||!1}${e.udp?",udp-relay=true":",udp-relay=false"},tag=${e.name}`;case"http":return r="",e.tls&&(r=`,over-tls=true,tls-verification=${e["skip-cert-verify"]?"false":"true"}${e.sni?",tls-host="+e.sni:""}`),`http=${e.server}:${e.port},username=${e.username},password=${e.password}${r},fast-open=${e.tfo||!1},tag=${e.name}`}throw new Error("Platform QX does not support proxy type: "+e.type)}},Surge:{produce:e=>{let t,r,n="";switch(e.type){case"ss":if(t="",e.plugin){const{host:r,mode:n}=e["plugin-opts"];if("obfs"!==e.plugin)throw new Error("Platform Surge does not support obfs option: "+e.obfs);t=`,obfs=${n}${r?",obfs-host="+r:""}`}n=`${e.name}=ss,${e.server}, ${e.port},encrypt-method=${e.cipher},password=${e.password}${t},tfo=${e.tfo||"false"},udp-relay=${e.udp||"false"}`;break;case"vmess":if(r="",n=`${e.name}=vmess,${e.server},${e.port},username=${e.uuid},tls=${e.tls||"false"},tfo=${e.tfo||"false"}`,0===e.alterId&&(e["vmess-aead"]=!0),void 0!==e["vmess-aead"]&&(n+=",vmess-aead="+e["vmess-aead"]),"ws"===e.network){const t=e["ws-opts"].path||"/",r=Object.entries(e["ws-opts"].headers).map(([e,t])=>`${e}:"${t}"`).join("|");n+=`,ws=true${t?",ws-path="+t:""}${r?",ws-headers="+r:""}`}e.tls&&(n+=void 0!==e["skip-cert-verify"]?",skip-cert-verify="+e["skip-cert-verify"]:"",n+=e.sni?",sni="+e.sni:"");break;case"trojan":n=`${e.name}=trojan,${e.server},${e.port},password=${e.password}${void 0!==e["skip-cert-verify"]?",skip-cert-verify="+e["skip-cert-verify"]:""}${e.sni?",sni="+e.sni:""},tfo=${e.tfo||"false"},udp-relay=${e.udp||"false"}`;break;case"http":r=", tls=false",e.tls&&(r=`,tls=true,skip-cert-verify=${e["skip-cert-verify"]},sni=${e.sni}`),n=`${e.name}=http, ${e.server}, ${e.port}${e.username?",username="+e.username:""}${e.password?",password="+e.password:""}${r},tfo=${e.tfo||"false"}`;break;default:throw new Error("Platform Surge does not support proxy type: "+e.type)}return n+(void 0!==e["surge-hybrid"]?",hybrid="+e["surge-hybrid"]:"")}},Loon:{produce:e=>{let t="",r="",n="",o="";switch(void 0!==e.udp&&(n=e.udp?",udp=true":",udp=false"),o=",fast-open="+(e.tfo||!1),e.type){case"ss":if(t=",,",e.plugin){if("obfs"!==e.plugin)throw new Error("Platform Loon does not support obfs option: "+e.obfs);{const{mode:r,host:n}=e["plugin-opts"];t=`,${r},${n||""}`}}return`${e.name}=shadowsocks,${e.server},${e.port},${e.cipher},"${e.password}"${t}${n}${o}`;case"ssr":return`${e.name}=shadowsocksr,${e.server},${e.port},${e.cipher},"${e.password}",${e.protocol},{${e["protocol-param"]||""}},${e.obfs},{${e["obfs-param"]||""}}${n}${o}`;case"vmess":t="",t="ws"===e.network?`,transport:ws,host:${e["ws-opts"].headers.Host||e.server},path:${e["ws-opts"].path||"/"}`:",transport:tcp",e.tls&&(t+=`${e.sni?",tls-name:"+e.sni:""},skip-cert-verify:${e["skip-cert-verify"]||"false"}`);let s=`${e.name}=vmess,${e.server},${e.port},${"auto"===e.cipher?"none":e.cipher},"${e.uuid}",over-tls:${e.tls||"false"}${t}`;return 0===e.alterId&&(e["vmess-aead"]=!0),void 0!==e["vmess-aead"]&&(s+=",vmess-aead="+e["vmess-aead"]),s;case"trojan":return`${e.name}=trojan,${e.server},${e.port},"${e.password}"${e.sni?",tls-name:"+e.sni:""},skip-cert-verify:${e["skip-cert-verify"]||"false"}${n}`;case"http":r="";const i=`${e.name}=${e.tls?"http":"https"},${e.server},${e.port},${e.username||""},${e.password||""}`;return e.tls?i+(r=`${e.sni?",tls-name:"+e.sni:""},skip-cert-verify:${e["skip-cert-verify"]}`):i}throw new Error("Platform Loon does not support proxy type: "+e.type)}},Clash:{type:"ALL",produce:e=>"proxies:\n"+e.map(e=>(delete e.supported," - "+JSON.stringify(e)+"\n")).join("")},URI:{type:"SINGLE",produce:e=>{let t="";switch(e.type){case"ss":const r=`${e.cipher}:${e.password}`;if(t=`ss://${__Base64_37.encode(r)}@${e.server}:${e.port}/`,e.plugin){t+="?plugin=";const r=e["plugin-opts"];switch(e.plugin){case"obfs":t+=encodeURIComponent(`simple-obfs;obfs=${r.mode}${r.host?";obfs-host="+r.host:""}`);break;case"v2ray-plugin":t+=encodeURIComponent(`v2ray-plugin;obfs=${r.mode}${r.host?";obfs-host"+r.host:""}${r.tls?";tls":""}`);break;default:throw new Error("Unsupported plugin option: "+e.plugin)}}t+="#"+encodeURIComponent(e.name);break;case"ssr":t=`${e.server}:${e.port}:${e.protocol}:${e.cipher}:${e.obfs}:${__Base64_37.encode(e.password)}/`,t+=`?remarks=${__Base64_37.encode(e.name)}${e["obfs-param"]?"&obfsparam="+__Base64_37.encode(e["obfs-param"]):""}${e["protocol-param"]?"&protocolparam="+__Base64_37.encode(e["protocol-param"]):""}`,t="ssr://"+__Base64_37.encode(t);break;case"vmess":t={ps:e.name,add:e.server,port:e.port,id:e.uuid,type:"",aid:0,net:e.network||"tcp",tls:e.tls?"tls":""},"ws"===e.network&&(t.path=e["ws-opts"].path||"/",t.host=e["ws-opts"].headers.Host||e.server),t="vmess://"+__Base64_37.encode(JSON.stringify(t));break;case"trojan":t=`trojan://${e.password}@${e.server}:${e.port}#${encodeURIComponent(e.name)}`;break;default:throw new Error("Cannot handle proxy type: "+e.type)}return t}},JSON:{type:"ALL",produce:e=>JSON.stringify(e,null,2)}},ProxyUtils=function(){function e(e,t){let r;try{r=e.test(t)}catch(n){r=!1}return r}return{parse:function(t){const r=(t=function(e){for(const r of PROXY_PREPROCESSORS)try{if(r.test(e))return _$$_36.info(`Pre-processor [${r.name}] activated`),r.parse(e)}catch(t){_$$_36.error(`Parser [${r.name}] failed\n Reason: ${t}`)}return e}(t)).split("\n"),n=[];let o;for(let i of r){if(0===(i=i.trim()).length)continue;let t=o&&e(o,i);if(!t)for(const r of PROXY_PARSERS)if(e(r,i)){o=r,t=!0,_$$_36.info(`Proxy parser: ${r.name} is activated`);break}if(t)try{const e=o.parse(i);e||_$$_36.error(`Parser ${o.name} return nothing for \n${i}\n`),n.push(e)}catch(s){_$$_36.error(`Failed to parse line: \n ${i}\n Reason: ${s.stack}`)}else _$$_36.error(`Failed to find a rule to parse line: \n${i}\n`)}return n},process:async function(e,t=[],r){for(const o of t){let t;const s={};if(-1!==o.type.indexOf("Script")){const{mode:e,content:r}=o.args;if("link"===e){const e=r,i=e.split("#");if(i.length>1)for(const t of i[1].split("&")){const e=t.split("=")[0],r=t.split("=")[1]||!0;s[e]=r}try{t=await _$download_46(e.split("#")[0]),_$$_36.info("Script loaded: >>>\n "+t)}catch(n){_$$_36.error(`Error when downloading remote script: ${o.args.content}.\n Reason: ${n}`);continue}}else t=r}if(!PROXY_PROCESSORS[o.type]){_$$_36.error(`Unknown operator: "${o.type}"`);continue}let i;_$$_36.info(`Applying "${o.type}" with arguments:\n >>> ${JSON.stringify(o.args,null,2)||"None"}`),e=__ApplyProcessor_37(i=-1!==o.type.indexOf("Script")?PROXY_PROCESSORS[o.type](t,r,s):PROXY_PROCESSORS[o.type](o.args),e)}return e},produce:function(e,t){const r=PROXY_PRODUCERS[t];if(!r)throw new Error(`Target platform: ${t} is not supported!`);return e=e.filter(e=>!(e.supported&&!1===e.supported[t])),_$$_36.info("Producing proxies for target: "+t),void 0===r.type||"SINGLE"===r.type?e.map(e=>{try{return r.produce(e)}catch(t){return _$$_36.error(`Cannot produce proxy: ${JSON.stringify(e,null,2)}\nReason: ${t}`),""}}).filter(e=>e.length>0).join("\n"):"ALL"===r.type?r.produce(e):void 0}}}();function __ApplyProcessor_37(e,t){return-1!==e.name.indexOf("Filter")?function(e,t){let r=FULL(t.length,!0);try{r=AND(r,e.func(t))}catch(n){console.log(`Cannot apply filter ${e.name}\n Reason: ${n}`)}return t.filter((e,t)=>r[t])}(e,t):-1!==e.name.indexOf("Operator")?function(e,t){let r=clone(t);try{const t=e.func(r);t&&(r=t)}catch(n){console.log(`Cannot apply operator ${e.name}! Reason: ${n}`)}return r}(e,t):void 0}function shuffle(e){let t,r,n=e.length;for(;0!==n;)r=Math.floor(Math.random()*n),t=e[n-=1],e[n]=e[r],e[r]=t;return e}function clone(e){return JSON.parse(JSON.stringify(e))}function removeFlag(e){return e.replace(/[\uD83C][\uDDE6-\uDDFF][\uD83C][\uDDE6-\uDDFF]/g,"").trim()}var _$proxyUtils_37={ProxyUtils:ProxyUtils,ApplyProcessor:__ApplyProcessor_37};const RULE_TYPES_MAPPING=[[/^(DOMAIN|host|HOST)$/,"DOMAIN"],[/^(DOMAIN-KEYWORD|host-keyword|HOST-KEYWORD)$/,"DOMAIN-KEYWORD"],[/^(DOMAIN-SUFFIX|host-suffix|HOST-SUFFIX)$/,"DOMAIN-SUFFIX"],[/^USER-AGENT$/i,"USER-AGENT"],[/^PROCESS-NAME$/,"PROCESS-NAME"],[/^(DEST-PORT|DST-PORT)$/,"DST-PORT"],[/^SRC-IP(-CIDR)?$/,"SRC-IP"],[/^(IN|SRC)-PORT$/,"IN-PORT"],[/^PROTOCOL$/,"PROTOCOL"],[/^IP-CIDR$/i,"IP-CIDR"],[/^(IP-CIDR6|ip6-cidr|IP6-CIDR)$/]],RULE_PREPROCESSORS=[{name:"HTML",test:e=>/^/.test(e),parse:e=>""},{name:"Clash Provider",test:e=>0===e.indexOf("payload:"),parse:e=>e.replace("payload:","").replace(/^\s*-\s*/gm,"")}],RULE_PARSERS=[{name:"Universal Rule Parser",test:()=>!0,parse:e=>{const t=e.split("\n"),r=[];for(let o of t)if(0!==(o=o.trim()).length&&!/\s*#/.test(o))try{const e=o.split(",").map(e=>e.trim());let t=e[0],n=!1;for(const o of RULE_TYPES_MAPPING)if(o[0].test(t)){n=!0;const t={type:o[1],content:e[1]};"IP-CIDR"!==t.type&&"IP-CIDR6"!==t.type||(t.options=e.slice(2)),r.push(t)}if(!n)throw new Error("Invalid rule type: "+t)}catch(n){console.error(`Failed to parse line: ${o}\n Reason: ${n}`)}return r}}],RULE_PROCESSORS={"Regex Filter":function({regex:e=[],keep:t=!0}){return{name:"Regex Filter",func:r=>r.map(r=>{const n=e.some(e=>(e=new RegExp(e)).test(r));return t?n:!n})}},"Remove Duplicate Filter":function(){return{name:"Remove Duplicate Filter",func:e=>{const t=new Set,r=[];return e.forEach(e=>{const n=e.options||[];n.sort();const o=`${e.type},${e.content},${JSON.stringify(n)}`;t.has(o)||(r.push(e),t.add(o))}),r}}},"Type Filter":function(e){return{name:"Type Filter",func:t=>t.map(t=>e.some(e=>t.type===e))}},"Regex Replace Operator":function(e){return{name:"Regex Rename Operator",func:t=>t.map(t=>{for(const{expr:r,now:n}of e)t.content=t.content.replace(new RegExp(r,"g"),n).trim();return t})}}},RULE_PRODUCERS={QX:{type:"SINGLE",func:e=>-1!==["URL-REGEX","DEST-PORT","SRC-IP","IN-PORT","PROTOCOL"].indexOf(e.type)?null:`${{"DOMAIN-KEYWORD":"HOST-KEYWORD","DOMAIN-SUFFIX":"HOST-SUFFIX",DOMAIN:"HOST","IP-CIDR6":"IP6-CIDR"}[e.type]||e.type},${e.content},SUB-STORE`},Surge:{type:"SINGLE",func:e=>{let t=`${e.type},${e.content}`;return"IP-CIDR"!==e.type&&"IP-CIDR6"!==e.type||(t+=e.options?","+e.options[0]:""),t}},Loon:{type:"SINGLE",func:e=>-1!==["DEST-PORT","SRC-IP","IN-PORT","PROTOCOL"].indexOf(e.type)?null:(e=>{let t=`${e.type},${e.content}`;return"IP-CIDR"!==e.type&&"IP-CIDR6"!==e.type||(t+=e.options?","+e.options[0]:""),t})(e)},Clash:{type:"ALL",func:e=>{const t={"DEST-PORT":"DST-PORT","SRC-IP":"SRC-IP-CIDR","IN-PORT":"SRC-PORT"},r={payload:e.map(e=>{let r=`${t[e.type]||e.type},${e.content}`;return"IP-CIDR"!==e.type&&"IP-CIDR6"!==e.type||(r+=e.options?","+e.options[0]:""),r})};return YAML.stringify(r)}}},RuleUtils={parse:function(e){e=function(e){for(const r of RULE_PREPROCESSORS)try{if(r.test(e))return _$$_36.info(`Pre-processor [${r.name}] activated`),r.parse(e)}catch(t){_$$_36.error(`Parser [${r.name}] failed\n Reason: ${t}`)}return e}(e);for(const r of RULE_PARSERS){let n;try{n=r.test(e)}catch(t){n=!1}if(n)return _$$_36.info(`Rule parser [${r.name}] is activated!`),r.parse(e)}},process:async function(e,t){for(const r of t){if(!RULE_PROCESSORS[r.type]){console.error(`Unknown operator: ${r.type}!`);continue}const t=RULE_PROCESSORS[r.type](r.args);_$$_36.info(`Applying "${r.type}" with arguments: \n >>> ${JSON.stringify(r.args)||"None"}`),e=ApplyProcessor(t,e)}return e},produce:function(e,t){const r=RULE_PRODUCERS[t];if(!r)throw new Error(`Target platform: ${t} is not supported!`);return void 0===r.type||"SINGLE"===r.type?e.map(e=>{try{return r.func(e)}catch(t){return console.log(`ERROR: cannot produce rule: ${JSON.stringify(e)}\nReason: ${t}`),""}}).filter(e=>e.length>0).join("\n"):"ALL"===r.type?r.func(e):void 0}};var _$ruleUtils_38={RuleUtils:RuleUtils};const{ENV:__ENV_42}=_$openApi_51,{IP_API:IP_API}=_$geo_48,{SETTINGS_KEY:__SETTINGS_KEY_42,GIST_BACKUP_KEY:GIST_BACKUP_KEY,GIST_BACKUP_FILE_NAME:GIST_BACKUP_FILE_NAME}=_$constants_41;function getEnv(e,t){const{isNode:r,isQX:n,isLoon:o,isSurge:s}=__ENV_42();let i="Node";r&&(i="Node"),n&&(i="QX"),o&&(i="Loon"),s&&(i="Surge"),t.json({backend:i})}async function gistBackup(e,t){const{action:r}=e.query,{gistToken:n}=_$$_36.read(__SETTINGS_KEY_42);if(n){const e=new _$gist_49({token:n,key:GIST_BACKUP_KEY});try{let n;switch(r){case"upload":const t=_$$_36.read(__SETTINGS_KEY_42);t.syncTime=(new Date).getTime(),_$$_36.write(t,__SETTINGS_KEY_42),n=_$$_36.read("#sub-store"),_$$_36.env.isNode&&(n=JSON.stringify(_$$_36.cache,null," ")),_$$_36.info("\u4e0a\u4f20\u5907\u4efd\u4e2d..."),await e.upload({[GIST_BACKUP_FILE_NAME]:{content:n}});break;case"download":_$$_36.info("\u8fd8\u539f\u5907\u4efd\u4e2d..."),n=await e.download(GIST_BACKUP_FILE_NAME),_$$_36.write(n,"#sub-store"),_$$_36.env.isNode&&(n=JSON.parse(n),Object.keys(n).forEach(e=>{_$$_36.write(n[e],e)}))}t.json({status:"success"})}catch(o){const e=`${"upload"===r?"\u4e0a\u4f20":"\u4e0b\u8f7d"}\u5907\u4efd\u5931\u8d25\uff01${o}`;_$$_36.error(e),t.status(500).json({status:"failed",message:e})}}else t.status(500).json({status:"failed",message:"\u672a\u627e\u5230Gist\u5907\u4efdToken!"})}var _$facade_42=function(){const e=_$express_47({})();_$collections_40({}).register(e),_$subscriptions_44({}).register(e),_$settings_43({}).register(e),_$artifacts_39({}).register(e),e.get("/api/utils/IP_API/:server",IP_API),e.get("/api/utils/env",getEnv),e.get("/api/utils/backup",gistBackup),e.get("/",async(e,t)=>{t.set("location","https://sub-store.vercel.app/").status(302).end()}),__ENV_42().isQX&&e.options("/",async(e,t)=>{t.status(200).end()}),e.all("/",(e,t)=>{t.send("Hello from sub-store, made with \u2764\ufe0f by Peng-YM")}),e.start()},_$main_45={};console.log("\n\u2505\u2505\u2505\u2505\u2505\u2505\u2505\u2505\u2505\u2505\u2505\u2505\u2505\u2505\u2505\u2505\u2505\u2505\u2505\u2505\u2505\u2505\u2505\u2505\u2505\u2505\u2505\u2505\u2505\u2505\u2505\u2505\u2505\u2505\u2505\u2505\u2505\u2505\u2505\u2505\u2505\u2505\u2505\u2505\n \ud835\udc7a\ud835\udc96\ud835\udc83-\ud835\udc7a\ud835\udc95\ud835\udc90\ud835\udc93\ud835\udc86 \xa9 \ud835\udc77\ud835\udc86\ud835\udc8f\ud835\udc88-\ud835\udc80\ud835\udc74\n\u2505\u2505\u2505\u2505\u2505\u2505\u2505\u2505\u2505\u2505\u2505\u2505\u2505\u2505\u2505\u2505\u2505\u2505\u2505\u2505\u2505\u2505\u2505\u2505\u2505\u2505\u2505\u2505\u2505\u2505\u2505\u2505\u2505\u2505\u2505\u2505\u2505\u2505\u2505\u2505\u2505\u2505\u2505\u2505\n"),_$facade_42()}(); \ No newline at end of file