From ee90735d29b28ae15af580a6ef032e6a22c110f0 Mon Sep 17 00:00:00 2001 From: Dhruv Baliyan Date: Wed, 17 Jan 2024 13:50:27 +0530 Subject: [PATCH 1/5] feat: add server setup script --- .DS_Store | Bin 0 -> 8196 bytes .gitignore | 3 +- bun.lockb | Bin 180369 -> 180024 bytes package-lock.json | 1210 ---------- readme.md | 9 +- server/.DS_Store | Bin 0 -> 6148 bytes server/package-lock.json | 4965 -------------------------------------- setup.sh | 25 + 8 files changed, 29 insertions(+), 6183 deletions(-) create mode 100644 .DS_Store delete mode 100644 package-lock.json create mode 100644 server/.DS_Store delete mode 100644 server/package-lock.json create mode 100755 setup.sh diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..c2b9e6e8021014bc40447ddb92dd7f3eef46b8f0 GIT binary patch literal 8196 zcmeHMF^|(Q6n^f7Hq~*W14u!~8-iht~-s0Q9-sV?yU5tC!97F++x>!e#ci|`==)nlwWK;n8c$txm zjg>#{tJpIAgnSXAI=!Z@u8jJzC4MW(#Uvq4!Nnmk_!E_=L%&w3w>5`QtB9= za2P1U0B7ic2cej02wo=g?@N)#$Q-~SUgtopGyl{uYmhjvsXf!ol}CNZEhj zM;;&7`6%*Y;oFoAX3;FRO6AF9=SpqM+PQjdx@AqS%ku7YS~M?IF5kG@ItapuzaU9) z8Phr@+mJBN=`N<`l)Q6B<>HrYd-Bdz-<030wVmoCxw2Prl6TIiyrqCrePo_NYNt6^ z3T=fmiDG(~>HQz|(54kQjS8&Epv!drzrFhV|7o0>j#(?975GC1n9*o9>PQy5`Y}$l v%UhTpVx_A|)yaxg-)v3^66BqN=U#>ZVF( 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 diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index afdcc42..0000000 --- a/package-lock.json +++ /dev/null @@ -1,1210 +0,0 @@ -{ - "name": "geoip", - "version": "1.0.0", - "lockfileVersion": 2, - "requires": true, - "packages": { - "": { - "dependencies": { - "@maxmind/geoip2-node": "^4.2.0", - "express": "^4.18.2" - } - }, - "node_modules/@maxmind/geoip2-node": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@maxmind/geoip2-node/-/geoip2-node-4.2.0.tgz", - "integrity": "sha512-TIyKmvdIjDtRRRZTM2tgm8vHoKH1Sxr7+r7g2bB+5+Uvho7M9/+gXMZalQMpqMtm2hKFq27qoHpMpqq82ycxQA==", - "dependencies": { - "ip6addr": "^0.2.5", - "maxmind": "^4.2.0" - } - }, - "node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" - }, - "node_modules/assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/body-parser": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", - "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", - "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.11.0", - "raw-body": "2.5.1", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", - "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": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" - }, - "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": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" - }, - "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/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" - }, - "node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" - }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/express": { - "version": "4.18.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", - "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", - "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.1", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.5.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.2.0", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.7", - "qs": "6.11.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", - "engines": [ - "node >=0.6.0" - ] - }, - "node_modules/finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-intrinsic": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", - "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", - "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.4.tgz", - "integrity": "sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "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/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "node_modules/ip6addr": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/ip6addr/-/ip6addr-0.2.5.tgz", - "integrity": "sha512-9RGGSB6Zc9Ox5DpDGFnJdIeF0AsqXzdH+FspCfPPaU/L/4tI6P+5lIoFUFm9JXs9IrJv1boqAaNCQmoDADTSKQ==", - "dependencies": { - "assert-plus": "^1.0.0", - "jsprim": "^2.0.2" - } - }, - "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/json-schema": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" - }, - "node_modules/jsprim": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-2.0.2.tgz", - "integrity": "sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ==", - "engines": [ - "node >=0.6.0" - ], - "dependencies": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.4.0", - "verror": "1.10.0" - } - }, - "node_modules/maxmind": { - "version": "4.3.16", - "resolved": "https://registry.npmjs.org/maxmind/-/maxmind-4.3.16.tgz", - "integrity": "sha512-bfmiULzt9vO3tZ0SvQOX6cMZMqPCWtncbtNUefeSspoScf8S7n6qB66uOFQN00IWaJUr9oLjtlx3d6M8/KatuQ==", - "dependencies": { - "mmdb-lib": "2.0.2", - "tiny-lru": "11.2.3" - }, - "engines": { - "node": ">=12", - "npm": ">=6" - } - }, - "node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" - }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "engines": { - "node": ">= 0.6" - } - }, - "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.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mmdb-lib": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/mmdb-lib/-/mmdb-lib-2.0.2.tgz", - "integrity": "sha512-shi1I+fCPQonhTi7qyb6hr7hi87R7YS69FlfJiMFuJ12+grx0JyL56gLNzGTYXPU7EhAPkMLliGeyHer0K+AVA==", - "engines": { - "node": ">=10", - "npm": ">=6" - } - }, - "node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/object-inspect": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", - "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "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-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" - }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", - "dependencies": { - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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.5.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", - "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "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/send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", - "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/send/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, - "node_modules/serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", - "dependencies": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.18.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" - }, - "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/tiny-lru": { - "version": "11.2.3", - "resolved": "https://registry.npmjs.org/tiny-lru/-/tiny-lru-11.2.3.tgz", - "integrity": "sha512-mF9jPTrvN7UHk0bekOk3RlFdFwfyS4CJYVsGc7nInL3pVgUCYj5r9X6GpZBFQgLr0TKJo8Dp+F3oRvYzxU9xiA==", - "engines": { - "node": ">=12" - } - }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/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/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", - "engines": [ - "node >=0.6.0" - ], - "dependencies": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - } - }, - "dependencies": { - "@maxmind/geoip2-node": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@maxmind/geoip2-node/-/geoip2-node-4.2.0.tgz", - "integrity": "sha512-TIyKmvdIjDtRRRZTM2tgm8vHoKH1Sxr7+r7g2bB+5+Uvho7M9/+gXMZalQMpqMtm2hKFq27qoHpMpqq82ycxQA==", - "requires": { - "ip6addr": "^0.2.5", - "maxmind": "^4.2.0" - } - }, - "accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "requires": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - } - }, - "array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==" - }, - "body-parser": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", - "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", - "requires": { - "bytes": "3.1.2", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.11.0", - "raw-body": "2.5.1", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - } - }, - "bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" - }, - "call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - } - }, - "content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "requires": { - "safe-buffer": "5.2.1" - } - }, - "content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==" - }, - "cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==" - }, - "cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" - }, - "destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==" - }, - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" - }, - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" - }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" - }, - "etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" - }, - "express": { - "version": "4.18.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", - "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", - "requires": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.1", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.5.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.2.0", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.7", - "qs": "6.11.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - } - }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==" - }, - "finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", - "requires": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - } - }, - "forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" - }, - "fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==" - }, - "function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==" - }, - "get-intrinsic": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", - "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3" - } - }, - "has": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.4.tgz", - "integrity": "sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==" - }, - "has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==" - }, - "has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" - }, - "http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "requires": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - } - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "ip6addr": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/ip6addr/-/ip6addr-0.2.5.tgz", - "integrity": "sha512-9RGGSB6Zc9Ox5DpDGFnJdIeF0AsqXzdH+FspCfPPaU/L/4tI6P+5lIoFUFm9JXs9IrJv1boqAaNCQmoDADTSKQ==", - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^2.0.2" - } - }, - "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==" - }, - "json-schema": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" - }, - "jsprim": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-2.0.2.tgz", - "integrity": "sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ==", - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.4.0", - "verror": "1.10.0" - } - }, - "maxmind": { - "version": "4.3.16", - "resolved": "https://registry.npmjs.org/maxmind/-/maxmind-4.3.16.tgz", - "integrity": "sha512-bfmiULzt9vO3tZ0SvQOX6cMZMqPCWtncbtNUefeSspoScf8S7n6qB66uOFQN00IWaJUr9oLjtlx3d6M8/KatuQ==", - "requires": { - "mmdb-lib": "2.0.2", - "tiny-lru": "11.2.3" - } - }, - "media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==" - }, - "merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" - }, - "methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==" - }, - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" - }, - "mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" - }, - "mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "requires": { - "mime-db": "1.52.0" - } - }, - "mmdb-lib": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/mmdb-lib/-/mmdb-lib-2.0.2.tgz", - "integrity": "sha512-shi1I+fCPQonhTi7qyb6hr7hi87R7YS69FlfJiMFuJ12+grx0JyL56gLNzGTYXPU7EhAPkMLliGeyHer0K+AVA==" - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" - }, - "object-inspect": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", - "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==" - }, - "on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "requires": { - "ee-first": "1.1.1" - } - }, - "parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" - }, - "path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" - }, - "proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "requires": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - } - }, - "qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", - "requires": { - "side-channel": "^1.0.4" - } - }, - "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==" - }, - "raw-body": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", - "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", - "requires": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", - "requires": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, - "dependencies": { - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - } - } - }, - "serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", - "requires": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.18.0" - } - }, - "setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" - }, - "side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "requires": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - } - }, - "statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" - }, - "tiny-lru": { - "version": "11.2.3", - "resolved": "https://registry.npmjs.org/tiny-lru/-/tiny-lru-11.2.3.tgz", - "integrity": "sha512-mF9jPTrvN7UHk0bekOk3RlFdFwfyS4CJYVsGc7nInL3pVgUCYj5r9X6GpZBFQgLr0TKJo8Dp+F3oRvYzxU9xiA==" - }, - "toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" - }, - "type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "requires": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - } - }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" - }, - "utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==" - }, - "vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==" - }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - } - } -} diff --git a/readme.md b/readme.md index 511f166..f6922c8 100644 --- a/readme.md +++ b/readme.md @@ -6,14 +6,9 @@ See code example in the [server](./server/app.js) folder. #### Setup Server -Make sure you have [`bun`](https://bun.sh/) installed. +Run `./setup.sh`. This script will install bun and download required files to setup server ```sh -curl -fsSL https://bun.sh/install | bash -``` - -Install/Build -```sh -bun install +./setup.sh ``` Start Server diff --git a/server/.DS_Store b/server/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..692bf1cb0440cc97c7aefcef0f2c368bcb4f76e6 GIT binary patch literal 6148 zcmeHK%}T>S5T0#ezd~($tRg_sa&&xTy$=l`j`t|)|yf1QbVC3qd zUYY-w6w?OldZavG)_u`a-B(}B{r3BJEg`okcPr@fchrsOg@4Ve<`Y%Dr(W~?E7T0$ zUB$MySI_08@{ZAS@6gsX$3J{)k~D9d_&EQje9Oq?2)#F^{io{0YUl>abfEP9_!9Q5jGM znhZp8JLLX=6.0.0" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.22.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", - "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", - "dev": true, - "dependencies": { - "@babel/highlight": "^7.22.13", - "chalk": "^2.4.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/code-frame/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/code-frame/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/code-frame/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/code-frame/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/@babel/code-frame/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/code-frame/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/code-frame/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.2.tgz", - "integrity": "sha512-0S9TQMmDHlqAZ2ITT95irXKfxN9bncq8ZCoJhun3nHL/lLUxd2NKBJYoNGWH7S0hz6fRQwWlAWn/ILM0C70KZQ==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.2.tgz", - "integrity": "sha512-n7s51eWdaWZ3vGT2tD4T7J6eJs3QoBXydv7vkUM06Bf1cbVD2Kc2UrkzhiQwobfV7NwOnQXYL7UBJ5VPU+RGoQ==", - "dev": true, - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.23.0", - "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-module-transforms": "^7.23.0", - "@babel/helpers": "^7.23.2", - "@babel/parser": "^7.23.0", - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.2", - "@babel/types": "^7.23.0", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/core/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@babel/core/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/@babel/generator": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", - "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", - "dev": true, - "dependencies": { - "@babel/types": "^7.23.0", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz", - "integrity": "sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.22.9", - "@babel/helper-validator-option": "^7.22.15", - "browserslist": "^4.21.9", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", - "dev": true, - "dependencies": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", - "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.15" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.0.tgz", - "integrity": "sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw==", - "dev": true, - "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.20" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", - "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-simple-access": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", - "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", - "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz", - "integrity": "sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.2.tgz", - "integrity": "sha512-lzchcp8SjTSVe/fPmLwtWVBFC7+Tbn8LGHDVfDp9JGxpAY5opSaEFgt8UQvrnECWOTdji2mOWMz1rOhkHscmGQ==", - "dev": true, - "dependencies": { - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.2", - "@babel/types": "^7.23.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", - "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.22.20", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/highlight/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/@babel/highlight/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/highlight/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/parser": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", - "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", - "dev": true, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-bigint": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz", - "integrity": "sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.22.5.tgz", - "integrity": "sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/template": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", - "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.23.0", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.0", - "@babel/types": "^7.23.0", - "debug": "^4.1.0", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@babel/traverse/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/@babel/types": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", - "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", - "dev": true, - "dependencies": { - "@babel/helper-string-parser": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.20", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "dev": true - }, - "node_modules/@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "dev": true, - "dependencies": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/console": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", - "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", - "dev": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/core": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", - "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", - "dev": true, - "dependencies": { - "@jest/console": "^29.7.0", - "@jest/reporters": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-changed-files": "^29.7.0", - "jest-config": "^29.7.0", - "jest-haste-map": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-resolve-dependencies": "^29.7.0", - "jest-runner": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "jest-watcher": "^29.7.0", - "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/@jest/environment": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", - "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", - "dev": true, - "dependencies": { - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-mock": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/expect": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", - "dev": true, - "dependencies": { - "expect": "^29.7.0", - "jest-snapshot": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/expect-utils": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", - "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", - "dev": true, - "dependencies": { - "jest-get-type": "^29.6.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/fake-timers": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", - "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", - "dev": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@sinonjs/fake-timers": "^10.0.2", - "@types/node": "*", - "jest-message-util": "^29.7.0", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/globals": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", - "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", - "dev": true, - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/expect": "^29.7.0", - "@jest/types": "^29.6.3", - "jest-mock": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/reporters": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", - "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", - "dev": true, - "dependencies": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@jridgewell/trace-mapping": "^0.3.18", - "@types/node": "*", - "chalk": "^4.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^6.0.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.1.3", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "jest-worker": "^29.7.0", - "slash": "^3.0.0", - "string-length": "^4.0.1", - "strip-ansi": "^6.0.0", - "v8-to-istanbul": "^9.0.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/@jest/schemas": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", - "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", - "dev": true, - "dependencies": { - "@sinclair/typebox": "^0.27.8" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/source-map": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", - "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", - "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.18", - "callsites": "^3.0.0", - "graceful-fs": "^4.2.9" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/test-result": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", - "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", - "dev": true, - "dependencies": { - "@jest/console": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/test-sequencer": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", - "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", - "dev": true, - "dependencies": { - "@jest/test-result": "^29.7.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/transform": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", - "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", - "dev": true, - "dependencies": { - "@babel/core": "^7.11.6", - "@jest/types": "^29.6.3", - "@jridgewell/trace-mapping": "^0.3.18", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", - "convert-source-map": "^2.0.0", - "fast-json-stable-stringify": "^2.1.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", - "slash": "^3.0.0", - "write-file-atomic": "^4.0.2" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", - "dev": true, - "dependencies": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", - "dev": true, - "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", - "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "dev": true - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.20", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", - "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", - "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@maxmind/geoip2-node": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@maxmind/geoip2-node/-/geoip2-node-4.2.0.tgz", - "integrity": "sha512-TIyKmvdIjDtRRRZTM2tgm8vHoKH1Sxr7+r7g2bB+5+Uvho7M9/+gXMZalQMpqMtm2hKFq27qoHpMpqq82ycxQA==", - "dependencies": { - "ip6addr": "^0.2.5", - "maxmind": "^4.2.0" - } - }, - "node_modules/@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", - "dev": true - }, - "node_modules/@sinonjs/commons": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz", - "integrity": "sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==", - "dev": true, - "dependencies": { - "type-detect": "4.0.8" - } - }, - "node_modules/@sinonjs/fake-timers": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", - "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", - "dev": true, - "dependencies": { - "@sinonjs/commons": "^3.0.0" - } - }, - "node_modules/@stricjs/router": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/@stricjs/router/-/router-5.0.6.tgz", - "integrity": "sha512-PfoGCj8H29UjJ4nBlvzgnvLtX4xYNoe+pWA09yPzQqDuwBApQWFTpSEKLWKzhPJpYjLvpclfBK9Js9xpTTJhEw==" - }, - "node_modules/@types/babel__core": { - "version": "7.20.3", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.3.tgz", - "integrity": "sha512-54fjTSeSHwfan8AyHWrKbfBWiEUrNTZsUwPTDSNaaP1QDQIZbeNUg3a59E9D+375MzUw/x1vx2/0F5LBz+AeYA==", - "dev": true, - "dependencies": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "node_modules/@types/babel__generator": { - "version": "7.6.6", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.6.tgz", - "integrity": "sha512-66BXMKb/sUWbMdBNdMvajU7i/44RkrA3z/Yt1c7R5xejt8qh84iU54yUWCtm0QwGJlDcf/gg4zd/x4mpLAlb/w==", - "dev": true, - "dependencies": { - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__template": { - "version": "7.4.3", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.3.tgz", - "integrity": "sha512-ciwyCLeuRfxboZ4isgdNZi/tkt06m8Tw6uGbBSBgWrnnZGNXiEyM27xc/PjXGQLqlZ6ylbgHMnm7ccF9tCkOeQ==", - "dev": true, - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__traverse": { - "version": "7.20.3", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.3.tgz", - "integrity": "sha512-Lsh766rGEFbaxMIDH7Qa+Yha8cMVI3qAK6CHt3OR0YfxOIn5Z54iHiyDRycHrBqeIiqGa20Kpsv1cavfBKkRSw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.20.7" - } - }, - "node_modules/@types/graceful-fs": { - "version": "4.1.8", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.8.tgz", - "integrity": "sha512-NhRH7YzWq8WiNKVavKPBmtLYZHxNY19Hh+az28O/phfp68CF45pMFud+ZzJ8ewnxnC5smIdF3dqFeiSUQ5I+pw==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", - "integrity": "sha512-zONci81DZYCZjiLe0r6equvZut0b+dBRPBN5kBDjsONnutYNtJMoWQ9uR2RkL1gLG9NMTzvf+29e5RFfPbeKhQ==", - "dev": true - }, - "node_modules/@types/istanbul-lib-report": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.2.tgz", - "integrity": "sha512-8toY6FgdltSdONav1XtUHl4LN1yTmLza+EuDazb/fEmRNCwjyqNVIQWs2IfC74IqjHkREs/nQ2FWq5kZU9IC0w==", - "dev": true, - "dependencies": { - "@types/istanbul-lib-coverage": "*" - } - }, - "node_modules/@types/istanbul-reports": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.3.tgz", - "integrity": "sha512-1nESsePMBlf0RPRffLZi5ujYh7IH1BWL4y9pr+Bn3cJBdxz+RTP8bUFljLz9HvzhhOSWKdyBZ4DIivdL6rvgZg==", - "dev": true, - "dependencies": { - "@types/istanbul-lib-report": "*" - } - }, - "node_modules/@types/node": { - "version": "20.8.9", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.8.9.tgz", - "integrity": "sha512-UzykFsT3FhHb1h7yD4CA4YhBHq545JC0YnEz41xkipN88eKQtL6rSgocL5tbAP6Ola9Izm/Aw4Ora8He4x0BHg==", - "dev": true, - "dependencies": { - "undici-types": "~5.26.4" - } - }, - "node_modules/@types/stack-utils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.2.tgz", - "integrity": "sha512-g7CK9nHdwjK2n0ymT2CW698FuWJRIx+RP6embAzZ2Qi8/ilIrA1Imt2LVSeHUzKvpoi7BhmmQcXz95eS0f2JXw==", - "dev": true - }, - "node_modules/@types/yargs": { - "version": "17.0.29", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.29.tgz", - "integrity": "sha512-nacjqA3ee9zRF/++a3FUY1suHTFKZeHba2n8WeDw9cCVdmzmHpIxyzOJBcpHvvEmS8E9KqWlSnWHUkOrkhWcvA==", - "dev": true, - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@types/yargs-parser": { - "version": "21.0.2", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.2.tgz", - "integrity": "sha512-5qcvofLPbfjmBfKaLfj/+f+Sbd6pN4zl7w7VSVI5uz7m9QZTuB2aZAa2uo1wHFBNN2x6g/SoTkXmd8mQnQF2Cw==", - "dev": true - }, - "node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "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": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" - }, - "node_modules/asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", - "dev": true - }, - "node_modules/assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/async": { - "version": "0.2.10", - "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", - "integrity": "sha512-eAkdoKxU6/LkKDBzLpT+t6Ff5EtfSF4wx1WfJiPEEV7WNLnDaRXk0oVysiEPm262roaachGexwUv94WhSgN5TQ==" - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true - }, - "node_modules/babel-jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", - "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", - "dev": true, - "dependencies": { - "@jest/transform": "^29.7.0", - "@types/babel__core": "^7.1.14", - "babel-plugin-istanbul": "^6.1.1", - "babel-preset-jest": "^29.6.3", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.8.0" - } - }, - "node_modules/babel-plugin-istanbul": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", - "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^5.0.4", - "test-exclude": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", - "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", - "dev": true, - "dependencies": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/babel-plugin-jest-hoist": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", - "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", - "dev": true, - "dependencies": { - "@babel/template": "^7.3.3", - "@babel/types": "^7.3.3", - "@types/babel__core": "^7.1.14", - "@types/babel__traverse": "^7.0.6" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/babel-preset-current-node-syntax": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", - "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", - "dev": true, - "dependencies": { - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-bigint": "^7.8.3", - "@babel/plugin-syntax-class-properties": "^7.8.3", - "@babel/plugin-syntax-import-meta": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.8.3", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-top-level-await": "^7.8.3" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/babel-preset-jest": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", - "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", - "dev": true, - "dependencies": { - "babel-plugin-jest-hoist": "^29.6.3", - "babel-preset-current-node-syntax": "^1.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "node_modules/big-integer": { - "version": "1.6.51", - "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", - "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/body-parser": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", - "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", - "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.11.0", - "raw-body": "2.5.1", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/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/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browserslist": { - "version": "4.22.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.1.tgz", - "integrity": "sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "caniuse-lite": "^1.0.30001541", - "electron-to-chromium": "^1.4.535", - "node-releases": "^2.0.13", - "update-browserslist-db": "^1.0.13" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/bser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", - "dev": true, - "dependencies": { - "node-int64": "^0.4.0" - } - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true - }, - "node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/call-bind": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", - "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", - "dependencies": { - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.1", - "set-function-length": "^1.1.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001554", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001554.tgz", - "integrity": "sha512-A2E3U//MBwbJVzebddm1YfNp7Nud5Ip+IPn4BozBmn4KqVX7AvluoIDFWjsv5OkGnKUXQVmMSoMKLa3ScCblcQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ] - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/char-regex": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/ci-info": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "engines": { - "node": ">=8" - } - }, - "node_modules/cjs-module-lexer": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", - "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==", - "dev": true - }, - "node_modules/cli": { - "version": "0.6.6", - "resolved": "https://registry.npmjs.org/cli/-/cli-0.6.6.tgz", - "integrity": "sha512-4H6IzYk78R+VBeJ3fH3VQejcQRkGPR+kMjA9n30srEN+YVMPJLHfoQDtLquIzcLnfrlUrVA8qSQRB9fdgWpUBw==", - "dependencies": { - "exit": "0.1.2", - "glob": "~ 3.2.1" - }, - "engines": { - "node": ">=0.2.5" - } - }, - "node_modules/cli/node_modules/glob": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.11.tgz", - "integrity": "sha512-hVb0zwEZwC1FXSKRPFTeOtN7AArJcJlI6ULGLtrstaswKNlrTJqAA+1lYlSUop4vjA423xlBzqfVS3iWGlqJ+g==", - "dependencies": { - "inherits": "2", - "minimatch": "0.3" - }, - "engines": { - "node": "*" - } - }, - "node_modules/cli/node_modules/lru-cache": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", - "integrity": "sha512-WpibWJ60c3AgAz8a2iYErDrcT2C7OmKnsWhIcHOjkUHFjkXncJhtLxNSqUmxRxRunpb5I8Vprd7aNSd2NtksJQ==" - }, - "node_modules/cli/node_modules/minimatch": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz", - "integrity": "sha512-WFX1jI1AaxNTZVOHLBVazwTWKaQjoykSzCBNXB72vDTCzopQGtyP91tKdFK5cv1+qMwPyiTu1HqUriqplI8pcA==", - "deprecated": "Please update to minimatch 3.0.2 or higher to avoid a RegExp DoS issue", - "dependencies": { - "lru-cache": "2", - "sigmund": "~1.0.0" - }, - "engines": { - "node": "*" - } - }, - "node_modules/cliff": { - "version": "0.1.10", - "resolved": "https://registry.npmjs.org/cliff/-/cliff-0.1.10.tgz", - "integrity": "sha512-roZWcC2Cxo/kKjRXw7YUpVNtxJccbvcl7VzTjUYgLQk6Ot0R8bm2netbhSZYWWNrKlOO/7HD6GXHl8dtzE6SiQ==", - "dependencies": { - "colors": "~1.0.3", - "eyes": "~0.1.8", - "winston": "0.8.x" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", - "dev": true, - "engines": { - "iojs": ">= 1.0.0", - "node": ">= 0.12.0" - } - }, - "node_modules/collect-v8-coverage": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", - "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", - "dev": true - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/colors": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", - "integrity": "sha512-pFGrxThWcWQ2MsAz6RtgeWe4NK2kUE1WfsrvvlctdII745EW9I0yflqhe7++M5LEc7bV2c/9/5zc8sFcpL0Drw==", - "engines": { - "node": ">=0.1.90" - } - }, - "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==", - "dev": true, - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", - "dev": true - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "node_modules/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true - }, - "node_modules/cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", - "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": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" - }, - "node_modules/cookiejar": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.4.tgz", - "integrity": "sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==", - "dev": true - }, - "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": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" - }, - "node_modules/create-jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", - "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", - "dev": true, - "dependencies": { - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-config": "^29.7.0", - "jest-util": "^29.7.0", - "prompts": "^2.0.1" - }, - "bin": { - "create-jest": "bin/create-jest.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/cycle": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz", - "integrity": "sha512-TVF6svNzeQCOpjCqsy0/CSy8VgObG3wXusJ73xW2GbG5rGx7lC8zxDSURicsXI2UsGdi2L0QNRCi745/wUDvsA==", - "engines": { - "node": ">=0.4.0" - } - }, - "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": "1.5.1", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.1.tgz", - "integrity": "sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==", - "dev": true, - "peerDependencies": { - "babel-plugin-macros": "^3.1.0" - }, - "peerDependenciesMeta": { - "babel-plugin-macros": { - "optional": true - } - } - }, - "node_modules/deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/define-data-property": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", - "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", - "dependencies": { - "get-intrinsic": "^1.2.1", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/detect-newline": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", - "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/dezalgo": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", - "integrity": "sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==", - "dev": true, - "dependencies": { - "asap": "^2.0.0", - "wrappy": "1" - } - }, - "node_modules/diff-sequences": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", - "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", - "dev": true, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" - }, - "node_modules/electron-to-chromium": { - "version": "1.4.567", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.567.tgz", - "integrity": "sha512-8KR114CAYQ4/r5EIEsOmOMqQ9j0MRbJZR3aXD/KFA8RuKzyoUB4XrUCg+l8RUGqTVQgKNIgTpjaG8YHRPAbX2w==", - "dev": true - }, - "node_modules/emittery": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", - "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sindresorhus/emittery?sponsor=1" - } - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" - }, - "node_modules/escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/expect": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", - "dev": true, - "dependencies": { - "@jest/expect-utils": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/express": { - "version": "4.18.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", - "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", - "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.1", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.5.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.2.0", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.7", - "qs": "6.11.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", - "engines": [ - "node >=0.6.0" - ] - }, - "node_modules/eyes": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz", - "integrity": "sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ==", - "engines": { - "node": "> 0.1.90" - } - }, - "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==", - "dev": true - }, - "node_modules/fast-safe-stringify": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", - "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", - "dev": true - }, - "node_modules/fb-watchman": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", - "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", - "dev": true, - "dependencies": { - "bser": "2.1.1" - } - }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "dev": true, - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/formidable": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/formidable/-/formidable-2.1.2.tgz", - "integrity": "sha512-CM3GuJ57US06mlpQ47YcunuUZ9jpm8Vx+P2CGt2j7HpgkKZO/DJYQ0Bobim8G6PFQmK5lOqOOdUXboU+h73A4g==", - "dev": true, - "dependencies": { - "dezalgo": "^1.0.4", - "hexoid": "^1.0.0", - "once": "^1.4.0", - "qs": "^6.11.0" - }, - "funding": { - "url": "https://ko-fi.com/tunnckoCore/commissions" - } - }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-intrinsic": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", - "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", - "dependencies": { - "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/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": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dependencies": { - "get-intrinsic": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/has-property-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", - "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", - "dependencies": { - "get-intrinsic": "^1.2.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hasown": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", - "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/hexoid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/hexoid/-/hexoid-1.0.0.tgz", - "integrity": "sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true - }, - "node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true, - "engines": { - "node": ">=10.17.0" - } - }, - "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/import-local": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", - "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", - "dev": true, - "dependencies": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - }, - "bin": { - "import-local-fixture": "fixtures/cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/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.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "node_modules/ip-address": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-4.0.0.tgz", - "integrity": "sha512-tHFS7QAsEbp0kGtRY/P1DNsGL5dIPSCxxXpXxXz/xH+OCWy7arkCNs0gi49zs/Uy3+bQMItjSvvBsZVfbdvbiQ==", - "dependencies": { - "cli": "0.6.x", - "cliff": "0.1.x", - "jsbn": "0.0.0", - "lodash.find": "^3.2.0", - "lodash.merge": "^3.2.1", - "sprintf": "0.1.x" - }, - "bin": { - "ipv6": "bin/ipv6.js", - "ipv6grep": "bin/ipv6grep.js" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/ip6addr": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/ip6addr/-/ip6addr-0.2.5.tgz", - "integrity": "sha512-9RGGSB6Zc9Ox5DpDGFnJdIeF0AsqXzdH+FspCfPPaU/L/4tI6P+5lIoFUFm9JXs9IrJv1boqAaNCQmoDADTSKQ==", - "dependencies": { - "assert-plus": "^1.0.0", - "jsprim": "^2.0.2" - } - }, - "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-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true - }, - "node_modules/is-core-module": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", - "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", - "dev": true, - "dependencies": { - "hasown": "^2.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-generator-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", - "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "node_modules/isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==" - }, - "node_modules/istanbul-lib-coverage": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", - "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.1.tgz", - "integrity": "sha512-EAMEJBsYuyyztxMxW3g7ugGPkrZsV57v0Hmv3mm1uQsmB+QnZuepg731CRaIgeUVSdmsTngOkSnauNF8p7FIhA==", - "dev": true, - "dependencies": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^7.5.4" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-instrument/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-instrument/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-instrument/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/istanbul-lib-report": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", - "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", - "dev": true, - "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^4.0.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-source-maps": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", - "dev": true, - "dependencies": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-source-maps/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/istanbul-lib-source-maps/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/istanbul-reports": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.6.tgz", - "integrity": "sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==", - "dev": true, - "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", - "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", - "dev": true, - "dependencies": { - "@jest/core": "^29.7.0", - "@jest/types": "^29.6.3", - "import-local": "^3.0.2", - "jest-cli": "^29.7.0" - }, - "bin": { - "jest": "bin/jest.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/jest-changed-files": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", - "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", - "dev": true, - "dependencies": { - "execa": "^5.0.0", - "jest-util": "^29.7.0", - "p-limit": "^3.1.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-circus": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", - "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", - "dev": true, - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/expect": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "dedent": "^1.0.0", - "is-generator-fn": "^2.0.0", - "jest-each": "^29.7.0", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "p-limit": "^3.1.0", - "pretty-format": "^29.7.0", - "pure-rand": "^6.0.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-cli": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", - "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", - "dev": true, - "dependencies": { - "@jest/core": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "create-jest": "^29.7.0", - "exit": "^0.1.2", - "import-local": "^3.0.2", - "jest-config": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "yargs": "^17.3.1" - }, - "bin": { - "jest": "bin/jest.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/jest-config": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", - "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", - "dev": true, - "dependencies": { - "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^29.7.0", - "@jest/types": "^29.6.3", - "babel-jest": "^29.7.0", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "deepmerge": "^4.2.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-circus": "^29.7.0", - "jest-environment-node": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-runner": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "micromatch": "^4.0.4", - "parse-json": "^5.2.0", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@types/node": "*", - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "ts-node": { - "optional": true - } - } - }, - "node_modules/jest-diff": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", - "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", - "dev": true, - "dependencies": { - "chalk": "^4.0.0", - "diff-sequences": "^29.6.3", - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-docblock": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", - "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", - "dev": true, - "dependencies": { - "detect-newline": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-each": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", - "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", - "dev": true, - "dependencies": { - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "jest-get-type": "^29.6.3", - "jest-util": "^29.7.0", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-environment-node": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", - "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", - "dev": true, - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-get-type": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", - "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", - "dev": true, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-haste-map": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", - "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", - "dev": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@types/graceful-fs": "^4.1.3", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", - "jest-worker": "^29.7.0", - "micromatch": "^4.0.4", - "walker": "^1.0.8" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "optionalDependencies": { - "fsevents": "^2.3.2" - } - }, - "node_modules/jest-leak-detector": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", - "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", - "dev": true, - "dependencies": { - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-matcher-utils": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", - "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", - "dev": true, - "dependencies": { - "chalk": "^4.0.0", - "jest-diff": "^29.7.0", - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-message-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", - "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.6.3", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-mock": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", - "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", - "dev": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-pnp-resolver": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", - "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", - "dev": true, - "engines": { - "node": ">=6" - }, - "peerDependencies": { - "jest-resolve": "*" - }, - "peerDependenciesMeta": { - "jest-resolve": { - "optional": true - } - } - }, - "node_modules/jest-regex-util": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", - "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", - "dev": true, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-resolve": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", - "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", - "dev": true, - "dependencies": { - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "resolve": "^1.20.0", - "resolve.exports": "^2.0.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-resolve-dependencies": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", - "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", - "dev": true, - "dependencies": { - "jest-regex-util": "^29.6.3", - "jest-snapshot": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-runner": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", - "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", - "dev": true, - "dependencies": { - "@jest/console": "^29.7.0", - "@jest/environment": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "graceful-fs": "^4.2.9", - "jest-docblock": "^29.7.0", - "jest-environment-node": "^29.7.0", - "jest-haste-map": "^29.7.0", - "jest-leak-detector": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-resolve": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-util": "^29.7.0", - "jest-watcher": "^29.7.0", - "jest-worker": "^29.7.0", - "p-limit": "^3.1.0", - "source-map-support": "0.5.13" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-runtime": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", - "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", - "dev": true, - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", - "@jest/globals": "^29.7.0", - "@jest/source-map": "^29.6.3", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "cjs-module-lexer": "^1.0.0", - "collect-v8-coverage": "^1.0.0", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-mock": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "slash": "^3.0.0", - "strip-bom": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-snapshot": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", - "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", - "dev": true, - "dependencies": { - "@babel/core": "^7.11.6", - "@babel/generator": "^7.7.2", - "@babel/plugin-syntax-jsx": "^7.7.2", - "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/types": "^7.3.3", - "@jest/expect-utils": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "babel-preset-current-node-syntax": "^1.0.0", - "chalk": "^4.0.0", - "expect": "^29.7.0", - "graceful-fs": "^4.2.9", - "jest-diff": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "natural-compare": "^1.4.0", - "pretty-format": "^29.7.0", - "semver": "^7.5.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-snapshot/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/jest-snapshot/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/jest-snapshot/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/jest-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", - "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", - "dev": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-validate": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", - "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", - "dev": true, - "dependencies": { - "@jest/types": "^29.6.3", - "camelcase": "^6.2.0", - "chalk": "^4.0.0", - "jest-get-type": "^29.6.3", - "leven": "^3.1.0", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-validate/node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/jest-watcher": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", - "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", - "dev": true, - "dependencies": { - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "jest-util": "^29.7.0", - "string-length": "^4.0.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-worker": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", - "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", - "dev": true, - "dependencies": { - "@types/node": "*", - "jest-util": "^29.7.0", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-worker/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsbn": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.0.0.tgz", - "integrity": "sha512-0QJ9Y7EnU2hLfA/xQYrCbJGGIb+eI7qbDVkWIyaKMLpE9EqLA9NUJkvqWagQs4Rl+WndRP+HycMgw2Cfoe0tww==" - }, - "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, - "node_modules/json-schema": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jsprim": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-2.0.2.tgz", - "integrity": "sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ==", - "engines": [ - "node >=0.6.0" - ], - "dependencies": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.4.0", - "verror": "1.10.0" - } - }, - "node_modules/kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true - }, - "node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/lodash._arraycopy": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._arraycopy/-/lodash._arraycopy-3.0.0.tgz", - "integrity": "sha512-RHShTDnPKP7aWxlvXKiDT6IX2jCs6YZLCtNhOru/OX2Q/tzX295vVBK5oX1ECtN+2r86S0Ogy8ykP1sgCZAN0A==" - }, - "node_modules/lodash._arrayeach": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._arrayeach/-/lodash._arrayeach-3.0.0.tgz", - "integrity": "sha512-Mn7HidOVcl3mkQtbPsuKR0Fj0N6Q6DQB77CtYncZcJc0bx5qv2q4Gl6a0LC1AN+GSxpnBDNnK3CKEm9XNA4zqQ==" - }, - "node_modules/lodash._basecallback": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/lodash._basecallback/-/lodash._basecallback-3.3.1.tgz", - "integrity": "sha512-LQffghuO63ufDY33KKO1ezGKbcFZK3ngYV7JpxaUomoM5acf0YeXU3Pm8csVE0girVs50TXzfNibl69Co3ggJA==", - "dependencies": { - "lodash._baseisequal": "^3.0.0", - "lodash._bindcallback": "^3.0.0", - "lodash.isarray": "^3.0.0", - "lodash.pairs": "^3.0.0" - } - }, - "node_modules/lodash._basecopy": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", - "integrity": "sha512-rFR6Vpm4HeCK1WPGvjZSJ+7yik8d8PVUdCJx5rT2pogG4Ve/2ZS7kfmO5l5T2o5V2mqlNIfSF5MZlr1+xOoYQQ==" - }, - "node_modules/lodash._baseeach": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/lodash._baseeach/-/lodash._baseeach-3.0.4.tgz", - "integrity": "sha512-IqUZ9MQo2UT1XPGuBntInqTOlc+oV+bCo0kMp+yuKGsfvRSNgUW0YjWVZUrG/gs+8z/Eyuc0jkJjOBESt9BXxg==", - "dependencies": { - "lodash.keys": "^3.0.0" - } - }, - "node_modules/lodash._basefind": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._basefind/-/lodash._basefind-3.0.0.tgz", - "integrity": "sha512-OCYxW9f0nMWjRaJyvGxrM/x/xGZTIYEiz+PyFux4YIZr7DtXLQpmCc6aDJdhPA1vnnsrY+N7BvS76hAdlnGHfg==" - }, - "node_modules/lodash._basefindindex": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/lodash._basefindindex/-/lodash._basefindindex-3.6.0.tgz", - "integrity": "sha512-Ay3Ok74tVwGB79L5lVZlVgpGYjV9ty8DEVPxIUhgGGkqrqk6I+BPJ5kUIxd5S1b2Qg03VXtdg/Dpv2zcwQReoA==" - }, - "node_modules/lodash._basefor": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash._basefor/-/lodash._basefor-3.0.3.tgz", - "integrity": "sha512-6bc3b8grkpMgDcVJv9JYZAk/mHgcqMljzm7OsbmcE2FGUMmmLQTPHlh/dFqR8LA0GQ7z4K67JSotVKu5058v1A==" - }, - "node_modules/lodash._baseisequal": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/lodash._baseisequal/-/lodash._baseisequal-3.0.7.tgz", - "integrity": "sha512-U+3GsNEZj9ebI03ncLC2pLmYVjgtYZEwdkAPO7UGgtGvAz36JVFPAQUufpSaVL93Cz5arc6JGRKZRhaOhyVJYA==", - "dependencies": { - "lodash.isarray": "^3.0.0", - "lodash.istypedarray": "^3.0.0", - "lodash.keys": "^3.0.0" - } - }, - "node_modules/lodash._bindcallback": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz", - "integrity": "sha512-2wlI0JRAGX8WEf4Gm1p/mv/SZ+jLijpj0jyaE/AXeuQphzCgD8ZQW4oSpoN8JAopujOFGU3KMuq7qfHBWlGpjQ==" - }, - "node_modules/lodash._createassigner": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/lodash._createassigner/-/lodash._createassigner-3.1.1.tgz", - "integrity": "sha512-LziVL7IDnJjQeeV95Wvhw6G28Z8Q6da87LWKOPWmzBLv4u6FAT/x5v00pyGW0u38UoogNF2JnD3bGgZZDaNEBw==", - "dependencies": { - "lodash._bindcallback": "^3.0.0", - "lodash._isiterateecall": "^3.0.0", - "lodash.restparam": "^3.0.0" - } - }, - "node_modules/lodash._getnative": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", - "integrity": "sha512-RrL9VxMEPyDMHOd9uFbvMe8X55X16/cGM5IgOKgRElQZutpX89iS6vwl64duTV1/16w5JY7tuFNXqoekmh1EmA==" - }, - "node_modules/lodash._isiterateecall": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", - "integrity": "sha512-De+ZbrMu6eThFti/CSzhRvTKMgQToLxbij58LMfM8JnYDNSOjkjTCIaa8ixglOeGh2nyPlakbt5bJWJ7gvpYlQ==" - }, - "node_modules/lodash.find": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/lodash.find/-/lodash.find-3.2.1.tgz", - "integrity": "sha512-pN4ZB4KEepNd/97vLC5F3rl1tAAa5uWvISru2psLyLA8BtqBQwOA+2D7fdusG0aGmElOEurbSMlKI3UxjqoLQg==", - "dependencies": { - "lodash._basecallback": "^3.0.0", - "lodash._baseeach": "^3.0.0", - "lodash._basefind": "^3.0.0", - "lodash._basefindindex": "^3.0.0", - "lodash.isarray": "^3.0.0", - "lodash.keys": "^3.0.0" - } - }, - "node_modules/lodash.isarguments": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", - "integrity": "sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==" - }, - "node_modules/lodash.isarray": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", - "integrity": "sha512-JwObCrNJuT0Nnbuecmqr5DgtuBppuCvGD9lxjFpAzwnVtdGoDQ1zig+5W8k5/6Gcn0gZ3936HDAlGd28i7sOGQ==" - }, - "node_modules/lodash.isplainobject": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-3.2.0.tgz", - "integrity": "sha512-P4wZnho5curNqeEq/x292Pb57e1v+woR7DJ84DURelKB46lby8aDEGVobSaYtzHdQBWQrJSdxcCwjlGOvvdIyg==", - "dependencies": { - "lodash._basefor": "^3.0.0", - "lodash.isarguments": "^3.0.0", - "lodash.keysin": "^3.0.0" - } - }, - "node_modules/lodash.istypedarray": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/lodash.istypedarray/-/lodash.istypedarray-3.0.6.tgz", - "integrity": "sha512-lGWJ6N8AA3KSv+ZZxlTdn4f6A7kMfpJboeyvbFdE7IU9YAgweODqmOgdUHOA+c6lVWeVLysdaxciFXi+foVsWw==" - }, - "node_modules/lodash.keys": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", - "integrity": "sha512-CuBsapFjcubOGMn3VD+24HOAPxM79tH+V6ivJL3CHYjtrawauDJHUk//Yew9Hvc6e9rbCrURGk8z6PC+8WJBfQ==", - "dependencies": { - "lodash._getnative": "^3.0.0", - "lodash.isarguments": "^3.0.0", - "lodash.isarray": "^3.0.0" - } - }, - "node_modules/lodash.keysin": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/lodash.keysin/-/lodash.keysin-3.0.8.tgz", - "integrity": "sha512-YDB/5xkL3fBKFMDaC+cfGV00pbiJ6XoJIfRmBhv7aR6wWtbCW6IzkiWnTfkiHTF6ALD7ff83dAtB3OEaSoyQPg==", - "dependencies": { - "lodash.isarguments": "^3.0.0", - "lodash.isarray": "^3.0.0" - } - }, - "node_modules/lodash.merge": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-3.3.2.tgz", - "integrity": "sha512-ZgGZpRhWLjivGUbjtApZR4HyLv/UAyoYqESVYkK4aLBJVHRrbFpG+GNnE9JPijliME4LkKM0SFI/WyOiBiv1+w==", - "dependencies": { - "lodash._arraycopy": "^3.0.0", - "lodash._arrayeach": "^3.0.0", - "lodash._createassigner": "^3.0.0", - "lodash._getnative": "^3.0.0", - "lodash.isarguments": "^3.0.0", - "lodash.isarray": "^3.0.0", - "lodash.isplainobject": "^3.0.0", - "lodash.istypedarray": "^3.0.0", - "lodash.keys": "^3.0.0", - "lodash.keysin": "^3.0.0", - "lodash.toplainobject": "^3.0.0" - } - }, - "node_modules/lodash.pairs": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash.pairs/-/lodash.pairs-3.0.1.tgz", - "integrity": "sha512-lgXvpU43ZNQrZ/pK2cR97YzKeAno3e3HhcyvLKsofljeHKrQcZhT1vW7fg4X61c92tM+mjD/DypoLZYuAKNIkQ==", - "dependencies": { - "lodash.keys": "^3.0.0" - } - }, - "node_modules/lodash.restparam": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz", - "integrity": "sha512-L4/arjjuq4noiUJpt3yS6KIKDtJwNe2fIYgMqyYYKoeIfV1iEqvPwhCx23o+R9dzouGihDAPN1dTIRWa7zk8tw==" - }, - "node_modules/lodash.toplainobject": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash.toplainobject/-/lodash.toplainobject-3.0.0.tgz", - "integrity": "sha512-wMI0Ju1bvSmnBS3EcRRH/3zDnZOPpDtMtNDzbbNMKuTrEpALsf+sPyMeogmv63Y11qZQO7H1xFzohIEGRMjPYA==", - "dependencies": { - "lodash._basecopy": "^3.0.0", - "lodash.keysin": "^3.0.0" - } - }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/make-dir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", - "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", - "dev": true, - "dependencies": { - "semver": "^7.5.3" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/make-dir/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/make-dir/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/make-dir/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/makeerror": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", - "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", - "dev": true, - "dependencies": { - "tmpl": "1.0.5" - } - }, - "node_modules/maxmind": { - "version": "4.3.16", - "resolved": "https://registry.npmjs.org/maxmind/-/maxmind-4.3.16.tgz", - "integrity": "sha512-bfmiULzt9vO3tZ0SvQOX6cMZMqPCWtncbtNUefeSspoScf8S7n6qB66uOFQN00IWaJUr9oLjtlx3d6M8/KatuQ==", - "dependencies": { - "mmdb-lib": "2.0.2", - "tiny-lru": "11.2.3" - }, - "engines": { - "node": ">=12", - "npm": ">=6" - } - }, - "node_modules/maxmind-db-reader": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/maxmind-db-reader/-/maxmind-db-reader-0.2.1.tgz", - "integrity": "sha512-xe0gjU95DJTmNd4DmkCvwwbUCla+KGmaiEovQqidknDDkU2WAiOCvtqGY9K0Cu8eZ0KcwDIhsoXuw1Z6R/cqjg==", - "dependencies": { - "big-integer": ">=1.1.5", - "ip-address": "4.0.0" - }, - "bin": { - "mmdb-geoip": "repl" - } - }, - "node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "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.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/mmdb-lib": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/mmdb-lib/-/mmdb-lib-2.0.2.tgz", - "integrity": "sha512-shi1I+fCPQonhTi7qyb6hr7hi87R7YS69FlfJiMFuJ12+grx0JyL56gLNzGTYXPU7EhAPkMLliGeyHer0K+AVA==", - "engines": { - "node": ">=10", - "npm": ">=6" - } - }, - "node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", - "dev": true - }, - "node_modules/node-releases": { - "version": "2.0.13", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", - "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", - "dev": true - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/object-inspect": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", - "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-locate/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "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": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" - }, - "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pirates": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", - "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkginfo": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.3.1.tgz", - "integrity": "sha512-yO5feByMzAp96LtP58wvPKSbaKAi/1C4kV9XpTctr6EepnP6F33RBNOiVrdz9BrPA98U2BMFsTNHo44TWcbQ2A==", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "dev": true, - "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/prompts": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", - "dev": true, - "dependencies": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/pure-rand": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.4.tgz", - "integrity": "sha512-LA0Y9kxMYv47GIPJy6MI84fqTd2HmYZI83W/kM/SkKfDlajnZYfmXFTxkbY+xSBPkLJxltMa9hIkmdc29eguMA==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/dubzzz" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fast-check" - } - ] - }, - "node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", - "dependencies": { - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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.5.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", - "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", - "dev": true - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", - "dev": true, - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "dev": true, - "dependencies": { - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve.exports": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", - "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "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/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", - "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/send/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, - "node_modules/serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", - "dependencies": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.18.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/set-function-length": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", - "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==", - "dependencies": { - "define-data-property": "^1.1.1", - "get-intrinsic": "^1.2.1", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/sigmund": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", - "integrity": "sha512-fCvEXfh6NWpm+YSuY2bpXb/VIihqWA6hLsgboC+0nl71Q7N7o2eaCW8mJa/NLvQhs6jpd3VZV4UiUQlV6+lc8g==" - }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "node_modules/sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "dev": true - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.13", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", - "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", - "dev": true, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/sprintf": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/sprintf/-/sprintf-0.1.5.tgz", - "integrity": "sha512-4X5KsuXFQ7f+d7Y+bi4qSb6eI+YoifDTGr0MQJXRoYO7BO7evfRCjds6kk3z7l5CiJYxgDN1x5Er4WiyCt+zTQ==", - "deprecated": "The sprintf package is deprecated in favor of sprintf-js.", - "engines": { - "node": ">=0.2.4" - } - }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true - }, - "node_modules/stack-trace": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", - "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==", - "engines": { - "node": "*" - } - }, - "node_modules/stack-utils": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", - "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", - "dev": true, - "dependencies": { - "escape-string-regexp": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/string-length": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", - "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", - "dev": true, - "dependencies": { - "char-regex": "^1.0.2", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/superagent": { - "version": "8.1.2", - "resolved": "https://registry.npmjs.org/superagent/-/superagent-8.1.2.tgz", - "integrity": "sha512-6WTxW1EB6yCxV5VFOIPQruWGHqc3yI7hEmZK6h+pyk69Lk/Ut7rLUY6W/ONF2MjBuGjvmMiIpsrVJ2vjrHlslA==", - "dev": true, - "dependencies": { - "component-emitter": "^1.3.0", - "cookiejar": "^2.1.4", - "debug": "^4.3.4", - "fast-safe-stringify": "^2.1.1", - "form-data": "^4.0.0", - "formidable": "^2.1.2", - "methods": "^1.1.2", - "mime": "2.6.0", - "qs": "^6.11.0", - "semver": "^7.3.8" - }, - "engines": { - "node": ">=6.4.0 <13 || >=14" - } - }, - "node_modules/superagent/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/superagent/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/superagent/node_modules/mime": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", - "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", - "dev": true, - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/superagent/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/superagent/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/superagent/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/supertest": { - "version": "6.3.3", - "resolved": "https://registry.npmjs.org/supertest/-/supertest-6.3.3.tgz", - "integrity": "sha512-EMCG6G8gDu5qEqRQ3JjjPs6+FYT1a7Hv5ApHvtSghmOFJYtsU5S+pSb6Y2EUeCEY3CmEL3mmQ8YWlPOzQomabA==", - "dev": true, - "dependencies": { - "methods": "^1.1.2", - "superagent": "^8.0.5" - }, - "engines": { - "node": ">=6.4.0" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dev": true, - "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/tiny-lru": { - "version": "11.2.3", - "resolved": "https://registry.npmjs.org/tiny-lru/-/tiny-lru-11.2.3.tgz", - "integrity": "sha512-mF9jPTrvN7UHk0bekOk3RlFdFwfyS4CJYVsGc7nInL3pVgUCYj5r9X6GpZBFQgLr0TKJo8Dp+F3oRvYzxU9xiA==", - "engines": { - "node": ">=12" - } - }, - "node_modules/tmpl": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", - "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", - "dev": true - }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", - "dev": true - }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", - "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/v8-to-istanbul": { - "version": "9.1.3", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.1.3.tgz", - "integrity": "sha512-9lDD+EVI2fjFsMWXc6dy5JJzBsVTcQ2fVkfBvncZ6xJWG9wtBhOldG+mHkSL0+V1K/xgZz0JDO5UT5hFwHUghg==", - "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.12", - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^2.0.0" - }, - "engines": { - "node": ">=10.12.0" - } - }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", - "engines": [ - "node >=0.6.0" - ], - "dependencies": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "node_modules/walker": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", - "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", - "dev": true, - "dependencies": { - "makeerror": "1.0.12" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/winston": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/winston/-/winston-0.8.3.tgz", - "integrity": "sha512-fPoamsHq8leJ62D1M9V/f15mjQ1UHe4+7j1wpAT3fqgA5JqhJkk4aIfPEjfMTI9x6ZTjaLOpMAjluLtmgO5b6g==", - "dependencies": { - "async": "0.2.x", - "colors": "0.6.x", - "cycle": "1.0.x", - "eyes": "0.1.x", - "isstream": "0.1.x", - "pkginfo": "0.3.x", - "stack-trace": "0.0.x" - }, - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/winston/node_modules/colors": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/colors/-/colors-0.6.2.tgz", - "integrity": "sha512-OsSVtHK8Ir8r3+Fxw/b4jS1ZLPXkV6ZxDRJQzeD7qo0SqMXWrHDM71DgYzPMHY8SFJ0Ao+nNU2p1MmwdzKqPrw==", - "engines": { - "node": ">=0.1.90" - } - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true - }, - "node_modules/write-file-atomic": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", - "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", - "dev": true, - "dependencies": { - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - }, - "node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "dev": true, - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - } - } -} diff --git a/setup.sh b/setup.sh new file mode 100755 index 0000000..21688a0 --- /dev/null +++ b/setup.sh @@ -0,0 +1,25 @@ +#!/bin/bash + +# Check & Install bun +if command -v bun &> /dev/null ; then + echo "bun is installed." +else + echo "bun is not installed." + echo "installing bun." + curl -fsSL https://bun.sh/install | bash + + # add to ~/.zshrc or ~/.bashrc + export BUN_INSTALL="$HOME/.bun" + export PATH="$BUN_INSTALL/bin:$PATH" +fi + +# Install/build +bun install + +# Changing PWD to download geojson data using curl +cd server/geojson-data + +curl -LO "https://github.com/datta07/INDIAN-SHAPEFILES/raw/master/INDIA/INDIA_DISTRICTS.geojson" + +# Changing PWD back to project root +cd - > /dev/null \ No newline at end of file From 470631b4a16783114729b3e9650223857993f697 Mon Sep 17 00:00:00 2001 From: Dhruv Baliyan Date: Wed, 17 Jan 2024 16:09:26 +0530 Subject: [PATCH 2/5] feat: add dist/centroid API --- .DS_Store | Bin 8196 -> 8196 bytes bun.lockb | Bin 180024 -> 246618 bytes server/.DS_Store | Bin 6148 -> 6148 bytes server/__tests__/sample.test.js | 6 +- server/app.js | 142 ++++++++++++++++++++++---------- server/schemas.yaml | 14 +++- server/spec.yaml | 21 ++++- server/util/swagger.js | 4 +- setup.sh | 2 + 9 files changed, 138 insertions(+), 51 deletions(-) diff --git a/.DS_Store b/.DS_Store index c2b9e6e8021014bc40447ddb92dd7f3eef46b8f0..bb719d230926c0731948f76ae7f2c26ae610559c 100644 GIT binary patch delta 152 zcmZp1XmOa}FDk{rz`)4BAi$7RUR;orlb;0S@7$QUn0+%l2MdQJNScK~k0G5Qlc5Az z$>bwKg*=kg)kfyVItqpsCT5czgrym~C&viOGxlue5eQ|J6l5r1NMuN6$Oe+>45ApYb6K?x>?^_znPuQF}SILow|UE({-2Eonj94s7+5}WS|gfea}5jw`S SS)Jzr^JaF5?<^ZD*_Z(o!4fb4 diff --git a/bun.lockb b/bun.lockb index 1cdf4827def4a09a0d3e9505c9e9561a17766b5d..13e14d373bdcb1a8ceb30382a48d7a3e53ae3bfc 100755 GIT binary patch delta 72280 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 (;3R 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 ksA|z@Zm-D=PnnOOLAm4}(KpKmY&$ diff --git a/server/.DS_Store b/server/.DS_Store index 692bf1cb0440cc97c7aefcef0f2c368bcb4f76e6..a2884c742535f555685832b51f2cabbe8e21d1c0 100644 GIT binary patch literal 6148 zcmeHLv2N5r5Ph3Fg-f_1bTmlrQ6l9JOk|2kbSFBbVEZl?h+ZT4@KXGN9KE3bxUEC;u0yz6BY z^TSDAl}q(w`(=MrStW_i}=DIxf7q ze52o=ONJ{f7+au1j&o!_!#wFQ9$<=$@g*A85`{k=MC~?jhp|ht@=Xj?yUiH#>0F9xe$Pg9?v3+T;^3Td zO&{&`cY6Kn&-!cm?^a!(zh|ut@LsM?cJf5q*|{h`H}iv0&eP89>CYy!#(S67y4TMt zVyE{qSwXbXLyMsf3Iqj$0*wOleu!8EV~4dxeRZ(XPXOYO&1$^Y6POrD12J}3TVxB( zSSry{jr+tfmd^Ib#l;S5iB)qu~2NHo}wrZ0|Nsi1A_nqLoq`M5XUpb=cI2eT+YbIGue)1@#L#) u^^>dEdp9d^u(M2TaNW$#!OsEIy;+dsJM(0I5l0T7evknyn { it('should return the index.html page', async () => { - const response = await request(app).get('/'); + const response = await fetch(BASE_URL); expect(response.status).toBe(200); expect(response.headers['content-type']).toContain('text/html'); }); diff --git a/server/app.js b/server/app.js index 657a6c0..6a832e7 100644 --- a/server/app.js +++ b/server/app.js @@ -5,16 +5,36 @@ import * as turf from '@turf/turf' import {Router} from '@stricjs/router'; import * as fs from 'fs'; import Bun from 'bun'; +import * as turf from '@turf/turf' import express from 'express'; import swagger from './util/swagger'; -const buffer = fs.readFileSync('./db.mmdb'); +const buffer = fs.readFileSync(`${import.meta.dir}/db.mmdb`); const reader = Reader.openBuffer(buffer); const swaggerApp = express(); swagger(swaggerApp); +// Check if required geojson files exists +const requiredGeoJsonFiles = [ "INDIA_DISTRICTS.geojson" ] +const geoJsonFilesPath = `${import.meta.dir}/geojson-data` +fs.readdir(geoJsonFilesPath, (err, files) => { + if (err) { + console.error("Error reading folder: ", err); + process.exit(); + } + + for (const requiredFile of requiredGeoJsonFiles) { + if (!files.includes(requiredFile)) { + console.error("Required GeoJson files not present"); + process.exit(); + } + } +}); + +const INDIA_DISTRICTS = JSON.parse(fs.readFileSync(`${geoJsonFilesPath}/INDIA_DISTRICTS.geojson`, 'utf8')); + // format the success response data const formatSuccessResponse = (data) => { return { @@ -82,55 +102,87 @@ function individualQuery(geoJSONPaths, coordinates) { } } -const app = new Router() - .get('/', () => new Response(Bun.file(__dirname + '/www/index.html'))) - .get('/city/:ip', (ctx) => { - try { - const resp = reader.city(ctx.params.ip); - return Response.json(formatSuccessResponse(resp)); - } catch (error) { - return Response.json(formatErrorResponse(error, ctx.params.ip)); +export const app = new Router() + .get('/', () => new Response(Bun.file(__dirname + '/www/index.html'))) + .get('/city/:ip', (ctx) => { + try { + const resp = reader.city(ctx.params.ip); + return Response.json(formatSuccessResponse(resp)); + } catch (error) { + return Response.json(formatErrorResponse(error,ctx.params.ip)); + } + }) + .post('/city/batch', async (req) => { + try { + const { ips } = await req.json(); // Extract the 'ips' array from the request body + + // Create an array of promises, each promise resolves to the city corresponding to the IP address + const promises = ips.map(async (ip) => { + let response; + try { + response = reader.city(ip); + return formatSuccessResponse(response); + } catch (error) { + return formatErrorResponse(error,ip); + } + }); + // Wait for all promises to settle and collect the results + const results = await Promise.all(promises); + + return Response.json(results, { status: 200 }); + } catch (error) { + return new Response('Error processing IP addresses', { status: 500 }); + } + }) + .get('/georev', (ctx) => { + try { + let url = new URL(ctx.url); + let latitude = url.searchParams.get('lat'); + let longitude = url.searchParams.get('lon'); + let resp = individualQuery(['/path/to/geojson/file'], [longitude, latitude]) + return Response.json(formatGeorevSuccessResponse(resp)); + } catch (error) { + return Response.json({ + status: "fail", + error: error.name + }) + } + }) + .get('/location/centroid', async (ctx) => { + try { + let url = new URL(ctx.url); + let district = url.searchParams.get('district'); + let distFeature, state; + for (const feature of INDIA_DISTRICTS.features) { + if (feature.properties.dtname.toLowerCase() === district.toLowerCase()) { + district = feature.properties.dtname; + state = feature.properties.stname; + distFeature = feature; + } } - }) - .post('/city/batch', async (req) => { - try { - const {ips} = await req.json(); // Extract the 'ips' array from the request body - - // Create an array of promises, each promise resolves to the city corresponding to the IP address - const promises = ips.map(async (ip) => { - let response; - try { - response = reader.city(ip); - return formatSuccessResponse(response); - } catch (error) { - return formatErrorResponse(error, ip); - } - }); - // Wait for all promises to settle and collect the results - const results = await Promise.all(promises); - - return Response.json(results, {status: 200}); - } catch (error) { - return new Response('Error processing IP addresses', {status: 500}); + if (!distFeature) throw new Error(`No district found with name: ${district}`); + let polygonFeature; + if (distFeature.geometry.type === 'Polygon') { + polygonFeature = turf.polygon(distFeature.geometry.coordinates); + } else { + polygonFeature = turf.multiPolygon(distFeature.geometry.coordinates); } - }) - .get('/georev', (ctx) => { - try { - let url = new URL(ctx.url); - let latitude = url.searchParams.get('lat'); - let longitude = url.searchParams.get('lon'); - let resp = individualQuery(['/path/to/geojson/file'], [longitude, latitude]) - return Response.json(formatGeorevSuccessResponse(resp)); - } catch (error) { + const centroid = turf.centroid(polygonFeature); + const longitude = centroid.geometry.coordinates[0]; + const latitude = centroid.geometry.coordinates[1]; return Response.json({ - status: "fail", - error: error.name - }) - } - }); + district, + state, + lon: longitude, + lat: latitude, + }, { status : 200 }) + } catch (error) { + return Response.json({ error: error.message }, { status: 404 }); + } + }); app.use(404, () => { - return new Response(Bun.file(__dirname + '/www/404.html')) + return new Response(Bun.file(import.meta.dir + '/www/404.html')) }); app.port = (process.env.PORT || 3000); diff --git a/server/schemas.yaml b/server/schemas.yaml index 6847e2d..96252dc 100644 --- a/server/schemas.yaml +++ b/server/schemas.yaml @@ -194,4 +194,16 @@ components: ip: type: string geo: - type: string \ No newline at end of file + type: string + + DistCentroidReponseObject: + type: object + properties: + district: + type: string + state: + type: string + lon: + type: number + lat: + type: number \ No newline at end of file diff --git a/server/spec.yaml b/server/spec.yaml index 7cc6ba0..729e7cc 100644 --- a/server/spec.yaml +++ b/server/spec.yaml @@ -311,4 +311,23 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/GeoLocationResponseObject' \ No newline at end of file + $ref: '#/components/schemas/GeoLocationResponseObject' + + /location/centroid: + get: + description: 'Return pylygon centroid coordinates & state for given district in query' + parameters: + - name: district + in: query + schema: + type: string + reqired: true + responses: + '200': + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/DistCentroidReponseObject' + '404': + desctiption: District Not Found diff --git a/server/util/swagger.js b/server/util/swagger.js index 6f76600..de107e9 100644 --- a/server/util/swagger.js +++ b/server/util/swagger.js @@ -5,8 +5,8 @@ import fs from 'fs'; const version = process.env.npm_package_version; -const definition = yaml.load(fs.readFileSync('./spec.yaml', 'utf8')); -const schemas = yaml.load(fs.readFileSync('./schemas.yaml', 'utf8')); +const definition = yaml.load(fs.readFileSync(`${import.meta.dir}/../spec.yaml`, 'utf8')); +const schemas = yaml.load(fs.readFileSync(`${import.meta.dir}/../spec.yaml`, 'utf8')); definition.components.schemas = schemas.components.schemas; const options = { diff --git a/setup.sh b/setup.sh index 21688a0..2d2866f 100755 --- a/setup.sh +++ b/setup.sh @@ -20,6 +20,8 @@ bun install cd server/geojson-data curl -LO "https://github.com/datta07/INDIAN-SHAPEFILES/raw/master/INDIA/INDIA_DISTRICTS.geojson" +curl -LO "://github.com/datta07/INDIAN-SHAPEFILES/raw/master/INDIA/INDIAN_SUB_DISTRICTS.geojson" +curl -LO "https://github.com/datta07/INDIAN-SHAPEFILES/raw/master/INDIA/INDIA_STATES.geojson" # Changing PWD back to project root cd - > /dev/null \ No newline at end of file From b295808423ea50fb6703c7c1f6581512b459f4ab Mon Sep 17 00:00:00 2001 From: Dhruv Baliyan Date: Fri, 19 Jan 2024 10:42:24 +0530 Subject: [PATCH 3/5] test: add tests for /location/centroid API --- .github/workflows/test.yaml | 25 +++++------ server/__tests__/sample.test.js | 73 ++++++++++++++++++++++----------- server/app.js | 4 +- 3 files changed, 60 insertions(+), 42 deletions(-) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index fc4cc4c..fd98c58 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -4,13 +4,13 @@ on: push: branches: - master + pull_request: + branches: + - master jobs: tests: runs-on: ubuntu-latest - strategy: - matrix: - node: [14, 16, 18] steps: - name: Checkout code @@ -18,21 +18,16 @@ jobs: with: path: ./geoip # Set the path to your project root directory - - name: Set up Node.js - uses: actions/setup-node@v3 + - name: Setup Bun + uses: oven-sh/setup-bun@v1 with: - node-version: ${{ matrix.node }} + bun-version: 1.0.23 + - name: Install dependencies - run: npm install + run: bun install working-directory: ./geoip/server # Set the working directory to your project root - - name: Run jest test - run: npx jest --coverage + - name: Run bun test + run: bun test working-directory: ./geoip/server # Set the working directory to your project root - - - name: Upload test results - uses: actions/upload-artifact@v2 - with: - name: test-results - path: ./geoip/coverage diff --git a/server/__tests__/sample.test.js b/server/__tests__/sample.test.js index cc8df1b..f75529e 100644 --- a/server/__tests__/sample.test.js +++ b/server/__tests__/sample.test.js @@ -1,65 +1,90 @@ -import request from 'supertest'; -import { app } from '../app.js'; +import { app } from '../app.js' -const BASE_URL = `http://localhost:${app.port}`; +const BASE_URL = `http://0.0.0.0:${app.port}`; describe('GET /', () => { it('should return the index.html page', async () => { const response = await fetch(BASE_URL); expect(response.status).toBe(200); - expect(response.headers['content-type']).toContain('text/html'); + expect(response.headers.get('content-type')).toContain('text/html'); }); }); describe('GET /city/:ip', () => { it('should return geolocation data for a valid IP', async () => { - const response = await request(app).get('/city/8.8.8.8'); // Replace with a valid IP address + const response = await fetch(`${BASE_URL}/city/8.8.8.8`); // Replace with a valid IP address + const jsonResponse = await response.json(); expect(response.status).toBe(200); - expect(response.body.status).toBe('success'); + expect(jsonResponse.status).toBe('success'); }); it('should return an error for an invalid IP', async () => { - const response = await request(app).get('/city/invalid_ip'); + const response = await fetch(`${BASE_URL}/city/invalid_ip`); + const jsonResponse = await response.json(); expect(response.status).toBe(200); // Handle error gracefully in your app, so it returns 200 status - expect(response.body.status).toBe('fail'); + expect(jsonResponse.status).toBe('fail'); }); }); describe('POST /city/batch', () => { it('should return geolocation data for an array of valid IPs', async () => { - const ips = ['8.8.8.8', '4.4.4.4']; // Replace with valid IP addresses - const response = await request(app) - .post('/city/batch') - .send({ ips }); + const response = await fetch(`http://0.0.0.0:3000/city/batch`, { + method: 'POST', + body: JSON.stringify(['8.8.8.8', '4.4.4.4']), // Replace with valid IP addresses + headers: { "Content-Type": "application/json" }, + }); + const jsonResponse = await response.json(); expect(response.status).toBe(200); - expect(Array.isArray(response.body)).toBe(true); + expect(Array.isArray(jsonResponse)).toBe(true); }); it('should handle errors when processing IP addresses', async () => { - const ips = ['8.8.8.8', 'invalid_ip']; // Include an invalid IP - const response = await request(app) - .post('/city/batch') - .send({ ips }); - expect(response.status).toBe(500); // Handle error gracefully in your app, so it returns 500 status + const response = await fetch(`${BASE_URL}/city/batch`, { + method: 'POST', + body: JSON.stringify(['8.8.8.8', 'invalid_id']), // Replace with valid IP addresses + headers: { "Content-Type": "application/json" }, + }); + const jsonResponse = await response.json(); + expect(response.status).toBe(200); // Handle error gracefully in your app, so it returns 500 status + expect(jsonResponse[1].status).toBe('fail'); }); }); describe('GET /georev', () => { - // Test with valid latitude and longitude it('returns location data for valid coordinates', async () => { const latitude = '26.8756'; // Use a valid latitude const longitude = '80.9115'; // Use a valid longitude - const response = await request(app).get(`/georev?lat=${latitude}&lon=${longitude}`); + const response = await fetch(`/georev?lat=${latitude}&lon=${longitude}`); + const jsonResponse = await response.json(); expect(response.status).toBe(200); - expect(response.body).toHaveProperty('status', 'success'); + expect(jsonResponse).toHaveProperty('status', 'success'); }); - // Test with invalid latitude and longitude it('returns an error for invalid coordinates', async () => { const latitude = 'invalid_lat'; // Invalid latitude const longitude = 'invalid_lon'; // Invalid longitude - const response = await request(app).get(`/georev?lat=${latitude}&lon=${longitude}`); + const response = await fetch(`/georev?lat=${latitude}&lon=${longitude}`); + const jsonResponse = await response.json(); expect(response.status).toBe(200); - expect(response.body).toHaveProperty('status', 'fail'); + expect(jsonResponse).toHaveProperty('status', 'fail'); }); +}); + +describe('POST /location/centroid', () => { + it ('should return lat lon for given district name in query', async() => { + const response = await fetch(`${BASE_URL}/location/centroid?district=lucknow`); + const jsonResponse = await response.json(); + expect(response.status).toBe(200); + expect(jsonResponse).toEqual({ + district: "Lucknow", + state: "UTTAR PRADESH", + lon: 80.89119983155268, + lat: 26.830190863213858, + }); + }) + + it ('should return error for invalid district name in query', async() => { + const response = await fetch(`${BASE_URL}/location/centroid?district=lalaland`); + expect(response.status).toBe(404); + }) }); \ No newline at end of file diff --git a/server/app.js b/server/app.js index 6a832e7..8165881 100644 --- a/server/app.js +++ b/server/app.js @@ -5,7 +5,6 @@ import * as turf from '@turf/turf' import {Router} from '@stricjs/router'; import * as fs from 'fs'; import Bun from 'bun'; -import * as turf from '@turf/turf' import express from 'express'; import swagger from './util/swagger'; @@ -114,8 +113,7 @@ export const app = new Router() }) .post('/city/batch', async (req) => { try { - const { ips } = await req.json(); // Extract the 'ips' array from the request body - + const ips = await req.json(); // Extract the 'ips' array from the request body // Create an array of promises, each promise resolves to the city corresponding to the IP address const promises = ips.map(async (ip) => { let response; From 76c0850205e79ec501fdfcf7d201622db52c53d6 Mon Sep 17 00:00:00 2001 From: Dhruv Baliyan Date: Fri, 19 Jan 2024 12:03:56 +0530 Subject: [PATCH 4/5] feat: improve error handling for /location/centroid --- .DS_Store | Bin 8196 -> 0 bytes bun.lockb | Bin 246618 -> 246650 bytes readme.md | 8 ++ server/.DS_Store | Bin 6148 -> 0 bytes server/__tests__/sample.test.js | 123 +++++++++++++++++++++++---- server/app.js | 142 +++++++++++++++++++++----------- server/config.json | 8 ++ server/schemas.yaml | 12 ++- server/spec.yaml | 15 +++- setup.sh | 9 +- 10 files changed, 242 insertions(+), 75 deletions(-) delete mode 100644 .DS_Store delete mode 100644 server/.DS_Store create mode 100644 server/config.json diff --git a/.DS_Store b/.DS_Store deleted file mode 100644 index bb719d230926c0731948f76ae7f2c26ae610559c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8196 zcmeHMF>ljA6n>YQ#8IgT5=bc(lBKRCByE%yv4ju?R)S!lsMvATnmWEHP8viMDFYMm zOF#%l7#NvhVq$=w0YZZJeAndckd75^MGm@czRLS~qA0Gy|Fe&46Y=Gw?q!fbVP)bIyBTSaq!# z&Z;UZq0xfEgez*{%H$D)33qI_ zB(5s;SZLu6OddX%9GS@z3X4X^{;dcOtSYpwH3OP~SqA9rZa@Kc!GoT9es?;)7xs$9 zuPn7-oJnWQjJaq&Z0zwtqi6T}Va@J7pu4-A`_AFD?cDQPgPq)kn>^^*UeM}B4xZaW z$o73NaQUFd`+*xqz71h8vu1WDw>%uKZ*HtvrLA&hv}O&jtryp<@#tpCFb-}oshp_EdP01#+K-(&8HF0N2zfF zSU4DD!NE8JjLHWNP1pzLw$GcA4SIqS6NNvKkOQ2D4%iXW#;wwVD-+KGJcbZ^2@*ZL zP4sX!(Zd`+b~)jfMnB{X$Mc{WAA`|eP@{}tV=No5&LK8tS2_M&op7AMOc|bsiScWE z!C{c!E^=gp3vJW|tldQ9KW8Ej5!rHL3d{`dbAGhaOs&46ZLmH}qe8}%BtAHJcJ5ISpHSRP>^A>3H#$OWs| nhXA~v{9%aK7DCCVD)m@sY(Y8x4*`?k8T$Pnt$?mhBLjZ{w|8Vc diff --git a/bun.lockb b/bun.lockb index 13e14d373bdcb1a8ceb30382a48d7a3e53ae3bfc..8124cfa37c605b6c9b4f17263d841375efdc5b26 100755 GIT binary patch delta 23342 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 SZ9h?#ZEak#rnmLAN&f@GZvqhj delta 23346 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 { it('should return the index.html page', async () => { const response = await fetch(BASE_URL); + const htmlResponse = await response.text(); + const indexPage = Bun.file(`${import.meta.dir}/../www/index.html`); expect(response.status).toBe(200); - expect(response.headers.get('content-type')).toContain('text/html'); + expect(htmlResponse).toEqual(await indexPage.text()); }); }); @@ -15,14 +18,34 @@ describe('GET /city/:ip', () => { const response = await fetch(`${BASE_URL}/city/8.8.8.8`); // Replace with a valid IP address const jsonResponse = await response.json(); expect(response.status).toBe(200); - expect(jsonResponse.status).toBe('success'); + expect(jsonResponse).toEqual({ + status: "success", + continent: "North America", + continentCode: "NA", + country: "United States", + countryCode: "", + region: "", + regionName: "", + city: "", + zip: "", + lat: 37.751, + lon: -97.822, + timezone: "America/Chicago", + proxy: false, + hosting: false, + query: "8.8.8.8", + }); }); it('should return an error for an invalid IP', async () => { const response = await fetch(`${BASE_URL}/city/invalid_ip`); const jsonResponse = await response.json(); expect(response.status).toBe(200); // Handle error gracefully in your app, so it returns 200 status - expect(jsonResponse.status).toBe('fail'); + expect(jsonResponse).toEqual({ + status: 'fail', + message: 'ValueError', + query: 'invalid_ip' + }); }); }); @@ -35,7 +58,41 @@ describe('POST /city/batch', () => { }); const jsonResponse = await response.json(); expect(response.status).toBe(200); - expect(Array.isArray(jsonResponse)).toBe(true); + expect(jsonResponse).toEqual([ + { + status: "success", + continent: "North America", + continentCode: "NA", + country: "United States", + countryCode: "", + region: "", + regionName: "", + city: "", + zip: "", + lat: 37.751, + lon: -97.822, + timezone: "America/Chicago", + proxy: false, + hosting: false, + query: "8.8.8.8", + }, { + status: "success", + continent: "North America", + continentCode: "NA", + country: "United States", + countryCode: "", + region: "IL", + regionName: "Illinois", + city: "Geneva", + zip: "60134", + lat: 41.8847, + lon: -88.3028, + timezone: "America/Chicago", + proxy: false, + hosting: false, + query: "4.4.4.4", + } + ]); }); it('should handle errors when processing IP addresses', async () => { @@ -45,8 +102,29 @@ describe('POST /city/batch', () => { headers: { "Content-Type": "application/json" }, }); const jsonResponse = await response.json(); - expect(response.status).toBe(200); // Handle error gracefully in your app, so it returns 500 status - expect(jsonResponse[1].status).toBe('fail'); + expect(response.status).toBe(200); + expect(jsonResponse[0]).toEqual({ + status: "success", + continent: "North America", + continentCode: "NA", + country: "United States", + countryCode: "", + region: "", + regionName: "", + city: "", + zip: "", + lat: 37.751, + lon: -97.822, + timezone: "America/Chicago", + proxy: false, + hosting: false, + query: "8.8.8.8", + }); + expect(jsonResponse[1]).toEqual({ + status: "fail", + message: "ValueError", + query: "invalid_id", + }); }); }); @@ -54,37 +132,50 @@ describe('GET /georev', () => { it('returns location data for valid coordinates', async () => { const latitude = '26.8756'; // Use a valid latitude const longitude = '80.9115'; // Use a valid longitude - const response = await fetch(`/georev?lat=${latitude}&lon=${longitude}`); + const response = await fetch(`${BASE_URL}/georev?lat=${latitude}&lon=${longitude}`); const jsonResponse = await response.json(); expect(response.status).toBe(200); - expect(jsonResponse).toHaveProperty('status', 'success'); + expect(jsonResponse).toEqual({ + status: "success", + state: "UTTAR PRADESH", + district: "Lucknow", + subDistrict: "Lucknow", + }); }); it('returns an error for invalid coordinates', async () => { const latitude = 'invalid_lat'; // Invalid latitude const longitude = 'invalid_lon'; // Invalid longitude - const response = await fetch(`/georev?lat=${latitude}&lon=${longitude}`); + const response = await fetch(`${BASE_URL}/georev?lat=${latitude}&lon=${longitude}`); const jsonResponse = await response.json(); - expect(response.status).toBe(200); - expect(jsonResponse).toHaveProperty('status', 'fail'); + expect(response.status).toBe(500); + expect(jsonResponse).toEqual({ + status: "fail", + error: "coordinates must contain numbers", + }); }); }); -describe('POST /location/centroid', () => { +describe('GET /location/:locationlevel/centroid', () => { it ('should return lat lon for given district name in query', async() => { - const response = await fetch(`${BASE_URL}/location/centroid?district=lucknow`); + const response = await fetch(`${BASE_URL}/location/DISTRICT/centroid?zone=lucknow`); const jsonResponse = await response.json(); expect(response.status).toBe(200); expect(jsonResponse).toEqual({ - district: "Lucknow", + status: "success", state: "UTTAR PRADESH", - lon: 80.89119983155268, + district: "Lucknow", + subDistrict: "", + city: "", + block: "", + village: "", lat: 26.830190863213858, + lon: 80.89119983155268, }); }) it ('should return error for invalid district name in query', async() => { - const response = await fetch(`${BASE_URL}/location/centroid?district=lalaland`); + const response = await fetch(`${BASE_URL}/location/DISTRICT/centroid?zone=lalaland`); expect(response.status).toBe(404); }) }); \ No newline at end of file diff --git a/server/app.js b/server/app.js index 8165881..1ecad1c 100644 --- a/server/app.js +++ b/server/app.js @@ -1,12 +1,11 @@ import {Reader} from '@maxmind/geoip2-node'; -// var geojsonRbush = require('geojson-rbush').default; -import {default as geojsonRbush} from 'geojson-rbush'; import * as turf from '@turf/turf' import {Router} from '@stricjs/router'; import * as fs from 'fs'; import Bun from 'bun'; import express from 'express'; import swagger from './util/swagger'; +import config from './config.json'; const buffer = fs.readFileSync(`${import.meta.dir}/db.mmdb`); const reader = Reader.openBuffer(buffer); @@ -15,24 +14,34 @@ const swaggerApp = express(); swagger(swaggerApp); +const GeoLocationLevel = { + SUBDISTRICT: 'SUBDISTRICT', + DISTRICT: 'DISTRICT', + STATE: 'STATE' +} + // Check if required geojson files exists -const requiredGeoJsonFiles = [ "INDIA_DISTRICTS.geojson" ] -const geoJsonFilesPath = `${import.meta.dir}/geojson-data` +const geoJsonFilesPath = `${import.meta.dir}/geojson-data`; fs.readdir(geoJsonFilesPath, (err, files) => { if (err) { console.error("Error reading folder: ", err); process.exit(); } - for (const requiredFile of requiredGeoJsonFiles) { - if (!files.includes(requiredFile)) { - console.error("Required GeoJson files not present"); + for (const locationLevel of config.requiredGeoLocationLevels) { + const geoJsonFileName = `${config.country}_${locationLevel}.geojson`; + if (!files.includes(geoJsonFileName)) { + console.error(`Required GeoJson file: ${geoJsonFileName} not present`); process.exit(); } } }); -const INDIA_DISTRICTS = JSON.parse(fs.readFileSync(`${geoJsonFilesPath}/INDIA_DISTRICTS.geojson`, 'utf8')); +const geoJsonFiles = {}; +for (const locationLevel of config.requiredGeoLocationLevels) { + const geoJsonFileName = `${config.country}_${locationLevel}`; + geoJsonFiles[geoJsonFileName] = JSON.parse(fs.readFileSync(`${geoJsonFilesPath}/${geoJsonFileName}.geojson`, 'utf8')); +} // format the success response data const formatSuccessResponse = (data) => { @@ -74,6 +83,20 @@ const formatErrorResponse = (error, ip) => { } } +const formatCentroidResponse = (data, latitude, longitude) => { + return { + status: 'success', + state: data.stname ? data.stname : '', + district: data.dtname ? data.dtname : '', + subDistrict: data.sdtname ? data.sdtname : '', + city: '', + block: '', + village: '', + lat: latitude, + lon: longitude + } +} + function isPointInMultiPolygon(multiPolygon, point) { return multiPolygon.geometry.coordinates.some(polygonCoordinates => { const poly = turf.polygon(polygonCoordinates); @@ -81,21 +104,17 @@ function isPointInMultiPolygon(multiPolygon, point) { }); } -function individualQuery(geoJSONPaths, coordinates) { - for (let path of geoJSONPaths) { - const geoJSON = JSON.parse(fs.readFileSync(path, 'utf8')); - const turf_point = turf.point(coordinates); - - for (let feature of geoJSON.features) { - if (feature.geometry.type === 'Polygon') { - let poly = turf.polygon(feature.geometry.coordinates, feature.properties); - if (turf.booleanContains(poly, turf_point)) { - return poly.properties; - } - } else if (feature.geometry.type === 'MultiPolygon') { - if (isPointInMultiPolygon(feature, turf_point)) { - return feature.properties; - } +function individualQuery(country, geoLocationLevel, coordinates) { + const pointToSearch = turf.point(coordinates); + for (let feature of geoJsonFiles[`${country}_${geoLocationLevel}`].features) { + if (feature.geometry.type === 'Polygon') { + let poly = turf.polygon(feature.geometry.coordinates, feature.properties); + if (turf.booleanContains(poly, pointToSearch)) { + return poly.properties; + } + } else if (feature.geometry.type === 'MultiPolygon') { + if (isPointInMultiPolygon(feature, pointToSearch)) { + return feature.properties; } } } @@ -137,45 +156,72 @@ export const app = new Router() let url = new URL(ctx.url); let latitude = url.searchParams.get('lat'); let longitude = url.searchParams.get('lon'); - let resp = individualQuery(['/path/to/geojson/file'], [longitude, latitude]) + if (!latitude || !longitude) { + return Response.json({ + status: 'fail', + error: `lat lon query missing` + }, { status: 400 }); + } + // Searching for SUBDISTRICT GeoLocation Level + let resp = individualQuery(config.country, GeoLocationLevel.SUBDISTRICT, [longitude, latitude]) + if (!resp) { + return Response.json({ + status: "fail", + error: `No GeoLocation found for lat: ${latitude}, lon ${longitude}` + }, { status: 404 }); + } return Response.json(formatGeorevSuccessResponse(resp)); } catch (error) { return Response.json({ status: "fail", - error: error.name - }) + error: error.message + }, { status: 500 }) } }) - .get('/location/centroid', async (ctx) => { + .get('/location/:locationlevel/centroid', async (ctx) => { try { let url = new URL(ctx.url); - let district = url.searchParams.get('district'); - let distFeature, state; - for (const feature of INDIA_DISTRICTS.features) { - if (feature.properties.dtname.toLowerCase() === district.toLowerCase()) { - district = feature.properties.dtname; - state = feature.properties.stname; - distFeature = feature; + const locationLevel = ctx.params.locationlevel; + if (!Object.keys(GeoLocationLevel).includes(locationLevel)) { + return Response.json({ + status: 'fail', + error: `Unsupported GeoLocation Level: ${locationLevel}` + }, { status: 400}); + } + let zone = url.searchParams.get('zone'); + if (!zone) { + return Response.json({ + status: 'fail', + error: `No ${locationLevel} zone query found` + }, { status: 400 }); + } + let zoneFeature; + for (const feature of geoJsonFiles[`${config.country}_${locationLevel}`].features) { + if (feature.properties.dtname.toLowerCase() === zone.toLowerCase()) { + zoneFeature = feature; } } - if (!distFeature) throw new Error(`No district found with name: ${district}`); + if (!zoneFeature) { + return Response.json({ + status: 'fail', + error: `No ${locationLevel} found with name: ${zone}` + }, { status: 404 }); + } let polygonFeature; - if (distFeature.geometry.type === 'Polygon') { - polygonFeature = turf.polygon(distFeature.geometry.coordinates); + if (zoneFeature.geometry.type === 'Polygon') { + polygonFeature = turf.polygon(zoneFeature.geometry.coordinates); } else { - polygonFeature = turf.multiPolygon(distFeature.geometry.coordinates); + polygonFeature = turf.multiPolygon(zoneFeature.geometry.coordinates); } const centroid = turf.centroid(polygonFeature); - const longitude = centroid.geometry.coordinates[0]; - const latitude = centroid.geometry.coordinates[1]; - return Response.json({ - district, - state, - lon: longitude, - lat: latitude, - }, { status : 200 }) + const longitude = centroid.geometry.coordinates[0]; + const latitude = centroid.geometry.coordinates[1]; + return Response.json(formatCentroidResponse(zoneFeature.properties, latitude, longitude), { status : 200 }) } catch (error) { - return Response.json({ error: error.message }, { status: 404 }); + return Response.json({ + status: 'fail', + error: error.name + }, { status: 500 }); } }); @@ -189,5 +235,3 @@ app.hostname = '0.0.0.0'; swaggerApp.listen(3001, () => console.log('Swagger listening on port 3000')) app.listen(); - -export default app; \ No newline at end of file diff --git a/server/config.json b/server/config.json new file mode 100644 index 0000000..fd03254 --- /dev/null +++ b/server/config.json @@ -0,0 +1,8 @@ +{ + "requiredGeoLocationLevels": [ + "SUBDISTRICT", + "DISTRICT", + "STATE" + ], + "country": "INDIA" +} \ No newline at end of file diff --git a/server/schemas.yaml b/server/schemas.yaml index 96252dc..e12c32f 100644 --- a/server/schemas.yaml +++ b/server/schemas.yaml @@ -196,12 +196,20 @@ components: geo: type: string - DistCentroidReponseObject: + CentroidReponseObject: type: object properties: + state: + type: string district: type: string - state: + subdistrict: + type: string + city: + type: string + block: + type: string + village: type: string lon: type: number diff --git a/server/spec.yaml b/server/spec.yaml index 729e7cc..f4f02d1 100644 --- a/server/spec.yaml +++ b/server/spec.yaml @@ -313,11 +313,16 @@ paths: schema: $ref: '#/components/schemas/GeoLocationResponseObject' - /location/centroid: + /location/{locationlevel}/centroid: get: description: 'Return pylygon centroid coordinates & state for given district in query' parameters: - - name: district + - name: locationlevel + in: path + schema: + type: string + required: true + - name: zone in: query schema: type: string @@ -328,6 +333,8 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/DistCentroidReponseObject' + $ref: '#/components/schemas/CentroidReponseObject' + '400': + description: District not found in query '404': - desctiption: District Not Found + description: District Not Found in geojson diff --git a/setup.sh b/setup.sh index 2d2866f..a5cb8a4 100755 --- a/setup.sh +++ b/setup.sh @@ -17,11 +17,12 @@ fi bun install # Changing PWD to download geojson data using curl +mkdir server/geojson-data &> /dev/null cd server/geojson-data -curl -LO "https://github.com/datta07/INDIAN-SHAPEFILES/raw/master/INDIA/INDIA_DISTRICTS.geojson" -curl -LO "://github.com/datta07/INDIAN-SHAPEFILES/raw/master/INDIA/INDIAN_SUB_DISTRICTS.geojson" -curl -LO "https://github.com/datta07/INDIAN-SHAPEFILES/raw/master/INDIA/INDIA_STATES.geojson" +curl -Lo INDIA_DISTRICT.geojson "https://github.com/datta07/INDIAN-SHAPEFILES/raw/master/INDIA/INDIA_DISTRICTS.geojson" +curl -Lo INDIA_SUBDISTRICT.geojson "https://github.com/datta07/INDIAN-SHAPEFILES/raw/master/INDIA/INDIAN_SUB_DISTRICTS.geojson" +curl -Lo INDIA_STATE.geojson "https://github.com/datta07/INDIAN-SHAPEFILES/raw/master/INDIA/INDIA_STATES.geojson" # Changing PWD back to project root -cd - > /dev/null \ No newline at end of file +cd - &> /dev/null \ No newline at end of file From 24db96db8478b79bb6ded0135a5bacd77273e3a4 Mon Sep 17 00:00:00 2001 From: Dhruv Baliyan Date: Mon, 22 Jan 2024 10:16:37 +0530 Subject: [PATCH 5/5] feat: add script to make geoJSON files generic --- .gitignore | 2 ++ readme.md | 4 +-- server/app.js | 24 +++++++++--------- server/scripts/parse.geojson.js | 43 +++++++++++++++++++++++++++++++++ server/spec.yaml | 8 +++--- setup.sh | 7 ++++++ 6 files changed, 70 insertions(+), 18 deletions(-) create mode 100644 server/scripts/parse.geojson.js diff --git a/.gitignore b/.gitignore index 2a867de..4f47424 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,5 @@ node_modules .idea /server/geojson-data/* +.DS_store +server/.DS_Store diff --git a/readme.md b/readme.md index c8f2064..a88ab8b 100644 --- a/readme.md +++ b/readme.md @@ -30,9 +30,9 @@ Get geolocation for given `lat` & `lon` curl https://geoip.samagra.io/georev?lat=28.7041&lon=77.1025 ``` -Get polygon centroid for given `STATE/DISTRICT/SUBDISTRICT` with `zone` query +Get polygon centroid for given `STATE/DISTRICT/SUBDISTRICT` with some query ```shell -curl https://geoip.samagra.io/location/:DISTRICT/centroid?zone=lucknow +curl https://geoip.samagra.io/location/DISTRICT/centroid?query=lucknow ``` #### Notes diff --git a/server/app.js b/server/app.js index 1ecad1c..7f13953 100644 --- a/server/app.js +++ b/server/app.js @@ -188,35 +188,35 @@ export const app = new Router() error: `Unsupported GeoLocation Level: ${locationLevel}` }, { status: 400}); } - let zone = url.searchParams.get('zone'); - if (!zone) { + let query = url.searchParams.get('query'); + if (!query) { return Response.json({ status: 'fail', - error: `No ${locationLevel} zone query found` + error: `No ${locationLevel} query found` }, { status: 400 }); } - let zoneFeature; + let queryFeature; for (const feature of geoJsonFiles[`${config.country}_${locationLevel}`].features) { - if (feature.properties.dtname.toLowerCase() === zone.toLowerCase()) { - zoneFeature = feature; + if (feature.properties.levelLocationName.toLowerCase() === query.toLowerCase()) { + queryFeature = feature; } } - if (!zoneFeature) { + if (!queryFeature) { return Response.json({ status: 'fail', - error: `No ${locationLevel} found with name: ${zone}` + error: `No ${locationLevel} found with name: ${query}` }, { status: 404 }); } let polygonFeature; - if (zoneFeature.geometry.type === 'Polygon') { - polygonFeature = turf.polygon(zoneFeature.geometry.coordinates); + if (queryFeature.geometry.type === 'Polygon') { + polygonFeature = turf.polygon(queryFeature.geometry.coordinates); } else { - polygonFeature = turf.multiPolygon(zoneFeature.geometry.coordinates); + polygonFeature = turf.multiPolygon(queryFeature.geometry.coordinates); } const centroid = turf.centroid(polygonFeature); const longitude = centroid.geometry.coordinates[0]; const latitude = centroid.geometry.coordinates[1]; - return Response.json(formatCentroidResponse(zoneFeature.properties, latitude, longitude), { status : 200 }) + return Response.json(formatCentroidResponse(queryFeature.properties, latitude, longitude), { status : 200 }) } catch (error) { return Response.json({ status: 'fail', diff --git a/server/scripts/parse.geojson.js b/server/scripts/parse.geojson.js new file mode 100644 index 0000000..f90110b --- /dev/null +++ b/server/scripts/parse.geojson.js @@ -0,0 +1,43 @@ +import * as fs from 'fs'; + + +const geoJsonFilesPath = `${import.meta.dir}/../geojson-data`; +let featuresLength; + +console.log('Parsing INDIA_STATE'); +const INDIA_STATE = JSON.parse(fs.readFileSync(`${geoJsonFilesPath}/INDIA_STATE.geojson`, 'utf8')); +featuresLength = INDIA_STATE.features.length; +for (let i = 0; i < featuresLength; i++) { + const locationProperty = INDIA_STATE.features[i].properties; + INDIA_STATE.features[i].properties = { + stname: locationProperty.STNAME, + stcode11: locationProperty.STCODE11, + levelLocationName: locationProperty.STNAME, + ...locationProperty + } +} +fs.writeFileSync(`${geoJsonFilesPath}/INDIA_STATE.geojson`, JSON.stringify(INDIA_STATE)); + +console.log('Parsing INDIA_DISTRICT'); +const INDIA_DISTRICT = JSON.parse(fs.readFileSync(`${geoJsonFilesPath}/INDIA_DISTRICT.geojson`, 'utf8')); +featuresLength = INDIA_DISTRICT.features.length; +for (let i = 0; i < featuresLength; i++) { + const locationProperty = INDIA_DISTRICT.features[i].properties; + INDIA_DISTRICT.features[i].properties = { + levelLocationName: locationProperty.dtname, + ...locationProperty + } +} +fs.writeFileSync(`${geoJsonFilesPath}/INDIA_DISTRICT.geojson`, JSON.stringify(INDIA_DISTRICT)); + +console.log('Parsing INDIA_SUBDISTRICT'); +const INDIA_SUBDISTRICT = JSON.parse(fs.readFileSync(`${geoJsonFilesPath}/INDIA_SUBDISTRICT.geojson`, 'utf8')); +featuresLength = INDIA_SUBDISTRICT.features.length; +for (let i = 0; i < featuresLength; i++) { + const locationProperty = INDIA_SUBDISTRICT.features[i].properties; + INDIA_SUBDISTRICT.features[i].properties = { + levelLocationName: locationProperty.sdtname, + ...locationProperty + } +} +fs.writeFileSync(`${geoJsonFilesPath}/INDIA_SUBDISTRICT.geojson`, JSON.stringify(INDIA_SUBDISTRICT)); diff --git a/server/spec.yaml b/server/spec.yaml index f4f02d1..a45cd83 100644 --- a/server/spec.yaml +++ b/server/spec.yaml @@ -315,14 +315,14 @@ paths: /location/{locationlevel}/centroid: get: - description: 'Return pylygon centroid coordinates & state for given district in query' + description: 'Return polygon centroid coordinates for given query from sub-district, district or state level' parameters: - name: locationlevel in: path schema: type: string required: true - - name: zone + - name: query in: query schema: type: string @@ -335,6 +335,6 @@ paths: schema: $ref: '#/components/schemas/CentroidReponseObject' '400': - description: District not found in query + description: No query found '404': - description: District Not Found in geojson + description: Query not Found in geojson diff --git a/setup.sh b/setup.sh index a5cb8a4..221ebb9 100755 --- a/setup.sh +++ b/setup.sh @@ -24,5 +24,12 @@ curl -Lo INDIA_DISTRICT.geojson "https://github.com/datta07/INDIAN-SHAPEFILES/ra curl -Lo INDIA_SUBDISTRICT.geojson "https://github.com/datta07/INDIAN-SHAPEFILES/raw/master/INDIA/INDIAN_SUB_DISTRICTS.geojson" curl -Lo INDIA_STATE.geojson "https://github.com/datta07/INDIAN-SHAPEFILES/raw/master/INDIA/INDIA_STATES.geojson" +# Changing PWD back to project root +cd - &> /dev/null + +# Updating geoJSON files through script to make them usable in server +cd server/scripts +bun parse.geojson.js + # Changing PWD back to project root cd - &> /dev/null \ No newline at end of file