├── README.md ├── preclass ├── index.html ├── package-lock.json ├── package.json └── src │ ├── gestures.js │ └── index.js └── recorded ├── .vscode └── settings.json ├── index.html ├── package-lock.json ├── package.json └── src ├── gestures.js └── index.js /README.md: -------------------------------------------------------------------------------- 1 | # live-recognizing-multiple-gestures-tensorflowjs 2 | 3 | ## About 4 | 5 | This is the examples shown in my live screen about [Recognizing gestures in real time right from the browser (pt-br)](https://www.youtube.com/live/MeS6dX2a2zQ?feature=share) 6 | 7 | First of all, leave your star 🌟 on this repo. 8 | 9 | Access our [**exclusive telegram channel**](https://bit.ly/canalerickwendel) so I'll let you know about all the content I've been producing 10 | 11 | ## Complete source code 12 | - Access it in [app](./recorded/) 13 | - Checkout the [live demo](https://erickwendel.github.io/live-recognizing-multiple-gestures-tensorflowjs/recorded/). 14 | - It recognizes, single hand gestures 🖐,👊,✌️,👍🏻 and the multigesture 🙅 15 | 16 | 17 | ## Have fun! 18 | ![THUMB---JS-EXPERTPrancheta-1](https://user-images.githubusercontent.com/8060102/219484100-3b362e7a-6a2f-4df9-b4ce-d3be64a0964a.png) 19 | 20 | ## References: 21 | - https://github.com/ErickWendel/fingerpose 22 | - Rock, Paper & Scissors: https://github.com/andypotato/rock-paper-scissors 23 | - Pacman: https://storage.googleapis.com/tfjs-examples/webcam-transfer-learning/dist/index.html 24 | - https://github.com/tensorflow/tfjs-examples/ 25 | - https://www.npmjs.com/package/fingerpose 26 | - https://github.com/andypotato/rock-paper-scissors/blob/master/src/js/Gestures.js 27 | - https://www.tensorflow.org/js/demos 28 | - https://github.com/tensorflow/tfjs-models/tree/master/hand-pose-detection#mediapipe-hands-keypoints-used-in-mediapipe-hands 29 | -------------------------------------------------------------------------------- /preclass/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | FingerPose Example 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 17 | 18 | 19 | 20 | 21 | 22 | 92 | 93 | 94 | 95 | 96 |
97 | 98 |
99 |
100 | 101 | 102 |
103 |
104 |
105 |
106 |
107 | 108 |
109 |

Left Hand

110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 |
IdxFingerCurlDirection
0Thumb--
1Index--
2Middle--
3Ring--
4Pinky--
152 |
153 |

Right Hand

154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | 175 | 176 | 177 | 178 | 179 | 180 | 181 | 182 | 183 | 184 | 185 | 186 | 187 | 188 | 189 | 190 | 191 | 192 | 193 | 194 | 195 |
IdxFingerCurlDirection
0Thumb--
1Index--
2Middle--
3Ring--
4Pinky--
196 |
197 | 198 |
199 | 200 | 202 | 203 | 204 | 205 | -------------------------------------------------------------------------------- /preclass/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "gestures", 3 | "version": "0.0.1", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "gestures", 9 | "version": "0.0.1", 10 | "license": "ISC", 11 | "devDependencies": { 12 | "browser-sync": "^2.27.11" 13 | } 14 | }, 15 | "node_modules/@socket.io/component-emitter": { 16 | "version": "3.1.0", 17 | "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz", 18 | "integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==", 19 | "dev": true 20 | }, 21 | "node_modules/@types/cookie": { 22 | "version": "0.4.1", 23 | "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", 24 | "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==", 25 | "dev": true 26 | }, 27 | "node_modules/@types/cors": { 28 | "version": "2.8.13", 29 | "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.13.tgz", 30 | "integrity": "sha512-RG8AStHlUiV5ysZQKq97copd2UmVYw3/pRMLefISZ3S1hK104Cwm7iLQ3fTKx+lsUH2CE8FlLaYeEA2LSeqYUA==", 31 | "dev": true, 32 | "dependencies": { 33 | "@types/node": "*" 34 | } 35 | }, 36 | "node_modules/@types/node": { 37 | "version": "18.13.0", 38 | "resolved": "https://registry.npmjs.org/@types/node/-/node-18.13.0.tgz", 39 | "integrity": "sha512-gC3TazRzGoOnoKAhUx+Q0t8S9Tzs74z7m0ipwGpSqQrleP14hKxP4/JUeEQcD3W1/aIpnWl8pHowI7WokuZpXg==", 40 | "dev": true 41 | }, 42 | "node_modules/accepts": { 43 | "version": "1.3.8", 44 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", 45 | "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", 46 | "dev": true, 47 | "dependencies": { 48 | "mime-types": "~2.1.34", 49 | "negotiator": "0.6.3" 50 | }, 51 | "engines": { 52 | "node": ">= 0.6" 53 | } 54 | }, 55 | "node_modules/ansi-regex": { 56 | "version": "2.1.1", 57 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 58 | "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", 59 | "dev": true, 60 | "engines": { 61 | "node": ">=0.10.0" 62 | } 63 | }, 64 | "node_modules/ansi-styles": { 65 | "version": "2.2.1", 66 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", 67 | "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", 68 | "dev": true, 69 | "engines": { 70 | "node": ">=0.10.0" 71 | } 72 | }, 73 | "node_modules/anymatch": { 74 | "version": "3.1.3", 75 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", 76 | "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", 77 | "dev": true, 78 | "dependencies": { 79 | "normalize-path": "^3.0.0", 80 | "picomatch": "^2.0.4" 81 | }, 82 | "engines": { 83 | "node": ">= 8" 84 | } 85 | }, 86 | "node_modules/async": { 87 | "version": "2.6.4", 88 | "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", 89 | "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", 90 | "dev": true, 91 | "dependencies": { 92 | "lodash": "^4.17.14" 93 | } 94 | }, 95 | "node_modules/async-each-series": { 96 | "version": "0.1.1", 97 | "resolved": "https://registry.npmjs.org/async-each-series/-/async-each-series-0.1.1.tgz", 98 | "integrity": "sha512-p4jj6Fws4Iy2m0iCmI2am2ZNZCgbdgE+P8F/8csmn2vx7ixXrO2zGcuNsD46X5uZSVecmkEy/M06X2vG8KD6dQ==", 99 | "dev": true, 100 | "engines": { 101 | "node": ">=0.8.0" 102 | } 103 | }, 104 | "node_modules/axios": { 105 | "version": "0.21.4", 106 | "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", 107 | "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", 108 | "dev": true, 109 | "dependencies": { 110 | "follow-redirects": "^1.14.0" 111 | } 112 | }, 113 | "node_modules/balanced-match": { 114 | "version": "1.0.2", 115 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 116 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 117 | "dev": true 118 | }, 119 | "node_modules/base64id": { 120 | "version": "2.0.0", 121 | "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", 122 | "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", 123 | "dev": true, 124 | "engines": { 125 | "node": "^4.5.0 || >= 5.9" 126 | } 127 | }, 128 | "node_modules/batch": { 129 | "version": "0.6.1", 130 | "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", 131 | "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", 132 | "dev": true 133 | }, 134 | "node_modules/binary-extensions": { 135 | "version": "2.2.0", 136 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", 137 | "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", 138 | "dev": true, 139 | "engines": { 140 | "node": ">=8" 141 | } 142 | }, 143 | "node_modules/brace-expansion": { 144 | "version": "1.1.11", 145 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 146 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 147 | "dev": true, 148 | "dependencies": { 149 | "balanced-match": "^1.0.0", 150 | "concat-map": "0.0.1" 151 | } 152 | }, 153 | "node_modules/braces": { 154 | "version": "3.0.2", 155 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", 156 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 157 | "dev": true, 158 | "dependencies": { 159 | "fill-range": "^7.0.1" 160 | }, 161 | "engines": { 162 | "node": ">=8" 163 | } 164 | }, 165 | "node_modules/browser-sync": { 166 | "version": "2.27.11", 167 | "resolved": "https://registry.npmjs.org/browser-sync/-/browser-sync-2.27.11.tgz", 168 | "integrity": "sha512-U5f9u97OYJH66T0MGWWzG9rOQTW6ZmDMj97vsmtqwNS03JAwdLVES8eel2lD3rvAqQCNAFqaJ74NMacBI57vJg==", 169 | "dev": true, 170 | "dependencies": { 171 | "browser-sync-client": "^2.27.11", 172 | "browser-sync-ui": "^2.27.11", 173 | "bs-recipes": "1.3.4", 174 | "bs-snippet-injector": "^2.0.1", 175 | "chokidar": "^3.5.1", 176 | "connect": "3.6.6", 177 | "connect-history-api-fallback": "^1", 178 | "dev-ip": "^1.0.1", 179 | "easy-extender": "^2.3.4", 180 | "eazy-logger": "3.1.0", 181 | "etag": "^1.8.1", 182 | "fresh": "^0.5.2", 183 | "fs-extra": "3.0.1", 184 | "http-proxy": "^1.18.1", 185 | "immutable": "^3", 186 | "localtunnel": "^2.0.1", 187 | "micromatch": "^4.0.2", 188 | "opn": "5.3.0", 189 | "portscanner": "2.2.0", 190 | "qs": "^6.11.0", 191 | "raw-body": "^2.3.2", 192 | "resp-modifier": "6.0.2", 193 | "rx": "4.1.0", 194 | "send": "0.16.2", 195 | "serve-index": "1.9.1", 196 | "serve-static": "1.13.2", 197 | "server-destroy": "1.0.1", 198 | "socket.io": "^4.4.1", 199 | "ua-parser-js": "1.0.2", 200 | "yargs": "^17.3.1" 201 | }, 202 | "bin": { 203 | "browser-sync": "dist/bin.js" 204 | }, 205 | "engines": { 206 | "node": ">= 8.0.0" 207 | } 208 | }, 209 | "node_modules/browser-sync-client": { 210 | "version": "2.27.11", 211 | "resolved": "https://registry.npmjs.org/browser-sync-client/-/browser-sync-client-2.27.11.tgz", 212 | "integrity": "sha512-okMNfD2NasL/XD1/BclP3onXjhahisk3e/kTQ5HPDT/lLqdBqNDd6QFcjI5I1ak7na2hxKQSLjryql+7fp5gKQ==", 213 | "dev": true, 214 | "dependencies": { 215 | "etag": "1.8.1", 216 | "fresh": "0.5.2", 217 | "mitt": "^1.1.3", 218 | "rxjs": "^5.5.6", 219 | "typescript": "^4.6.2" 220 | }, 221 | "engines": { 222 | "node": ">=8.0.0" 223 | } 224 | }, 225 | "node_modules/browser-sync-ui": { 226 | "version": "2.27.11", 227 | "resolved": "https://registry.npmjs.org/browser-sync-ui/-/browser-sync-ui-2.27.11.tgz", 228 | "integrity": "sha512-1T/Y8Pp1R68aUL7zVSFq0nxtr258xWd/nTasCAHX2M6EsGaswVOFtXsw3bKqsr35z+J+LfVfOdz1HFLYKxdgrA==", 229 | "dev": true, 230 | "dependencies": { 231 | "async-each-series": "0.1.1", 232 | "connect-history-api-fallback": "^1", 233 | "immutable": "^3", 234 | "server-destroy": "1.0.1", 235 | "socket.io-client": "^4.4.1", 236 | "stream-throttle": "^0.1.3" 237 | } 238 | }, 239 | "node_modules/bs-recipes": { 240 | "version": "1.3.4", 241 | "resolved": "https://registry.npmjs.org/bs-recipes/-/bs-recipes-1.3.4.tgz", 242 | "integrity": "sha512-BXvDkqhDNxXEjeGM8LFkSbR+jzmP/CYpCiVKYn+soB1dDldeU15EBNDkwVXndKuX35wnNUaPd0qSoQEAkmQtMw==", 243 | "dev": true 244 | }, 245 | "node_modules/bs-snippet-injector": { 246 | "version": "2.0.1", 247 | "resolved": "https://registry.npmjs.org/bs-snippet-injector/-/bs-snippet-injector-2.0.1.tgz", 248 | "integrity": "sha512-4u8IgB+L9L+S5hknOj3ddNSb42436gsnGm1AuM15B7CdbkpQTyVWgIM5/JUBiKiRwGOR86uo0Lu/OsX+SAlJmw==", 249 | "dev": true 250 | }, 251 | "node_modules/bytes": { 252 | "version": "3.1.2", 253 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", 254 | "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", 255 | "dev": true, 256 | "engines": { 257 | "node": ">= 0.8" 258 | } 259 | }, 260 | "node_modules/call-bind": { 261 | "version": "1.0.2", 262 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", 263 | "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", 264 | "dev": true, 265 | "dependencies": { 266 | "function-bind": "^1.1.1", 267 | "get-intrinsic": "^1.0.2" 268 | }, 269 | "funding": { 270 | "url": "https://github.com/sponsors/ljharb" 271 | } 272 | }, 273 | "node_modules/chalk": { 274 | "version": "1.1.3", 275 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", 276 | "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", 277 | "dev": true, 278 | "dependencies": { 279 | "ansi-styles": "^2.2.1", 280 | "escape-string-regexp": "^1.0.2", 281 | "has-ansi": "^2.0.0", 282 | "strip-ansi": "^3.0.0", 283 | "supports-color": "^2.0.0" 284 | }, 285 | "engines": { 286 | "node": ">=0.10.0" 287 | } 288 | }, 289 | "node_modules/chokidar": { 290 | "version": "3.5.3", 291 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", 292 | "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", 293 | "dev": true, 294 | "funding": [ 295 | { 296 | "type": "individual", 297 | "url": "https://paulmillr.com/funding/" 298 | } 299 | ], 300 | "dependencies": { 301 | "anymatch": "~3.1.2", 302 | "braces": "~3.0.2", 303 | "glob-parent": "~5.1.2", 304 | "is-binary-path": "~2.1.0", 305 | "is-glob": "~4.0.1", 306 | "normalize-path": "~3.0.0", 307 | "readdirp": "~3.6.0" 308 | }, 309 | "engines": { 310 | "node": ">= 8.10.0" 311 | }, 312 | "optionalDependencies": { 313 | "fsevents": "~2.3.2" 314 | } 315 | }, 316 | "node_modules/cliui": { 317 | "version": "8.0.1", 318 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", 319 | "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", 320 | "dev": true, 321 | "dependencies": { 322 | "string-width": "^4.2.0", 323 | "strip-ansi": "^6.0.1", 324 | "wrap-ansi": "^7.0.0" 325 | }, 326 | "engines": { 327 | "node": ">=12" 328 | } 329 | }, 330 | "node_modules/cliui/node_modules/ansi-regex": { 331 | "version": "5.0.1", 332 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 333 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 334 | "dev": true, 335 | "engines": { 336 | "node": ">=8" 337 | } 338 | }, 339 | "node_modules/cliui/node_modules/strip-ansi": { 340 | "version": "6.0.1", 341 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 342 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 343 | "dev": true, 344 | "dependencies": { 345 | "ansi-regex": "^5.0.1" 346 | }, 347 | "engines": { 348 | "node": ">=8" 349 | } 350 | }, 351 | "node_modules/color-convert": { 352 | "version": "2.0.1", 353 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 354 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 355 | "dev": true, 356 | "dependencies": { 357 | "color-name": "~1.1.4" 358 | }, 359 | "engines": { 360 | "node": ">=7.0.0" 361 | } 362 | }, 363 | "node_modules/color-name": { 364 | "version": "1.1.4", 365 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 366 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 367 | "dev": true 368 | }, 369 | "node_modules/commander": { 370 | "version": "2.20.3", 371 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", 372 | "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", 373 | "dev": true 374 | }, 375 | "node_modules/concat-map": { 376 | "version": "0.0.1", 377 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 378 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", 379 | "dev": true 380 | }, 381 | "node_modules/connect": { 382 | "version": "3.6.6", 383 | "resolved": "https://registry.npmjs.org/connect/-/connect-3.6.6.tgz", 384 | "integrity": "sha512-OO7axMmPpu/2XuX1+2Yrg0ddju31B6xLZMWkJ5rYBu4YRmRVlOjvlY6kw2FJKiAzyxGwnrDUAG4s1Pf0sbBMCQ==", 385 | "dev": true, 386 | "dependencies": { 387 | "debug": "2.6.9", 388 | "finalhandler": "1.1.0", 389 | "parseurl": "~1.3.2", 390 | "utils-merge": "1.0.1" 391 | }, 392 | "engines": { 393 | "node": ">= 0.10.0" 394 | } 395 | }, 396 | "node_modules/connect-history-api-fallback": { 397 | "version": "1.6.0", 398 | "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", 399 | "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", 400 | "dev": true, 401 | "engines": { 402 | "node": ">=0.8" 403 | } 404 | }, 405 | "node_modules/cookie": { 406 | "version": "0.4.2", 407 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", 408 | "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", 409 | "dev": true, 410 | "engines": { 411 | "node": ">= 0.6" 412 | } 413 | }, 414 | "node_modules/cors": { 415 | "version": "2.8.5", 416 | "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", 417 | "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", 418 | "dev": true, 419 | "dependencies": { 420 | "object-assign": "^4", 421 | "vary": "^1" 422 | }, 423 | "engines": { 424 | "node": ">= 0.10" 425 | } 426 | }, 427 | "node_modules/debug": { 428 | "version": "2.6.9", 429 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 430 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 431 | "dev": true, 432 | "dependencies": { 433 | "ms": "2.0.0" 434 | } 435 | }, 436 | "node_modules/depd": { 437 | "version": "2.0.0", 438 | "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", 439 | "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", 440 | "dev": true, 441 | "engines": { 442 | "node": ">= 0.8" 443 | } 444 | }, 445 | "node_modules/destroy": { 446 | "version": "1.0.4", 447 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", 448 | "integrity": "sha512-3NdhDuEXnfun/z7x9GOElY49LoqVHoGScmOKwmxhsS8N5Y+Z8KyPPDnaSzqWgYt/ji4mqwfTS34Htrk0zPIXVg==", 449 | "dev": true 450 | }, 451 | "node_modules/dev-ip": { 452 | "version": "1.0.1", 453 | "resolved": "https://registry.npmjs.org/dev-ip/-/dev-ip-1.0.1.tgz", 454 | "integrity": "sha512-LmVkry/oDShEgSZPNgqCIp2/TlqtExeGmymru3uCELnfyjY11IzpAproLYs+1X88fXO6DBoYP3ul2Xo2yz2j6A==", 455 | "dev": true, 456 | "bin": { 457 | "dev-ip": "lib/dev-ip.js" 458 | }, 459 | "engines": { 460 | "node": ">= 0.8.0" 461 | } 462 | }, 463 | "node_modules/dlv": { 464 | "version": "1.1.3", 465 | "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", 466 | "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", 467 | "dev": true 468 | }, 469 | "node_modules/easy-extender": { 470 | "version": "2.3.4", 471 | "resolved": "https://registry.npmjs.org/easy-extender/-/easy-extender-2.3.4.tgz", 472 | "integrity": "sha512-8cAwm6md1YTiPpOvDULYJL4ZS6WfM5/cTeVVh4JsvyYZAoqlRVUpHL9Gr5Fy7HA6xcSZicUia3DeAgO3Us8E+Q==", 473 | "dev": true, 474 | "dependencies": { 475 | "lodash": "^4.17.10" 476 | }, 477 | "engines": { 478 | "node": ">= 4.0.0" 479 | } 480 | }, 481 | "node_modules/eazy-logger": { 482 | "version": "3.1.0", 483 | "resolved": "https://registry.npmjs.org/eazy-logger/-/eazy-logger-3.1.0.tgz", 484 | "integrity": "sha512-/snsn2JqBtUSSstEl4R0RKjkisGHAhvYj89i7r3ytNUKW12y178KDZwXLXIgwDqLW6E/VRMT9qfld7wvFae8bQ==", 485 | "dev": true, 486 | "dependencies": { 487 | "tfunk": "^4.0.0" 488 | }, 489 | "engines": { 490 | "node": ">= 0.8.0" 491 | } 492 | }, 493 | "node_modules/ee-first": { 494 | "version": "1.1.1", 495 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 496 | "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", 497 | "dev": true 498 | }, 499 | "node_modules/emoji-regex": { 500 | "version": "8.0.0", 501 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 502 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 503 | "dev": true 504 | }, 505 | "node_modules/encodeurl": { 506 | "version": "1.0.2", 507 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 508 | "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", 509 | "dev": true, 510 | "engines": { 511 | "node": ">= 0.8" 512 | } 513 | }, 514 | "node_modules/engine.io": { 515 | "version": "6.4.0", 516 | "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.4.0.tgz", 517 | "integrity": "sha512-OgxY1c/RuCSeO/rTr8DIFXx76IzUUft86R7/P7MMbbkuzeqJoTNw2lmeD91IyGz41QYleIIjWeMJGgug043sfQ==", 518 | "dev": true, 519 | "dependencies": { 520 | "@types/cookie": "^0.4.1", 521 | "@types/cors": "^2.8.12", 522 | "@types/node": ">=10.0.0", 523 | "accepts": "~1.3.4", 524 | "base64id": "2.0.0", 525 | "cookie": "~0.4.1", 526 | "cors": "~2.8.5", 527 | "debug": "~4.3.1", 528 | "engine.io-parser": "~5.0.3", 529 | "ws": "~8.11.0" 530 | }, 531 | "engines": { 532 | "node": ">=10.0.0" 533 | } 534 | }, 535 | "node_modules/engine.io-client": { 536 | "version": "6.4.0", 537 | "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.4.0.tgz", 538 | "integrity": "sha512-GyKPDyoEha+XZ7iEqam49vz6auPnNJ9ZBfy89f+rMMas8AuiMWOZ9PVzu8xb9ZC6rafUqiGHSCfu22ih66E+1g==", 539 | "dev": true, 540 | "dependencies": { 541 | "@socket.io/component-emitter": "~3.1.0", 542 | "debug": "~4.3.1", 543 | "engine.io-parser": "~5.0.3", 544 | "ws": "~8.11.0", 545 | "xmlhttprequest-ssl": "~2.0.0" 546 | } 547 | }, 548 | "node_modules/engine.io-client/node_modules/debug": { 549 | "version": "4.3.4", 550 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", 551 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 552 | "dev": true, 553 | "dependencies": { 554 | "ms": "2.1.2" 555 | }, 556 | "engines": { 557 | "node": ">=6.0" 558 | }, 559 | "peerDependenciesMeta": { 560 | "supports-color": { 561 | "optional": true 562 | } 563 | } 564 | }, 565 | "node_modules/engine.io-client/node_modules/ms": { 566 | "version": "2.1.2", 567 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 568 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 569 | "dev": true 570 | }, 571 | "node_modules/engine.io-parser": { 572 | "version": "5.0.6", 573 | "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.6.tgz", 574 | "integrity": "sha512-tjuoZDMAdEhVnSFleYPCtdL2GXwVTGtNjoeJd9IhIG3C1xs9uwxqRNEu5WpnDZCaozwVlK/nuQhpodhXSIMaxw==", 575 | "dev": true, 576 | "engines": { 577 | "node": ">=10.0.0" 578 | } 579 | }, 580 | "node_modules/engine.io/node_modules/debug": { 581 | "version": "4.3.4", 582 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", 583 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 584 | "dev": true, 585 | "dependencies": { 586 | "ms": "2.1.2" 587 | }, 588 | "engines": { 589 | "node": ">=6.0" 590 | }, 591 | "peerDependenciesMeta": { 592 | "supports-color": { 593 | "optional": true 594 | } 595 | } 596 | }, 597 | "node_modules/engine.io/node_modules/ms": { 598 | "version": "2.1.2", 599 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 600 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 601 | "dev": true 602 | }, 603 | "node_modules/escalade": { 604 | "version": "3.1.1", 605 | "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", 606 | "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", 607 | "dev": true, 608 | "engines": { 609 | "node": ">=6" 610 | } 611 | }, 612 | "node_modules/escape-html": { 613 | "version": "1.0.3", 614 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 615 | "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", 616 | "dev": true 617 | }, 618 | "node_modules/escape-string-regexp": { 619 | "version": "1.0.5", 620 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 621 | "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", 622 | "dev": true, 623 | "engines": { 624 | "node": ">=0.8.0" 625 | } 626 | }, 627 | "node_modules/etag": { 628 | "version": "1.8.1", 629 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 630 | "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", 631 | "dev": true, 632 | "engines": { 633 | "node": ">= 0.6" 634 | } 635 | }, 636 | "node_modules/eventemitter3": { 637 | "version": "4.0.7", 638 | "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", 639 | "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", 640 | "dev": true 641 | }, 642 | "node_modules/fill-range": { 643 | "version": "7.0.1", 644 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", 645 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 646 | "dev": true, 647 | "dependencies": { 648 | "to-regex-range": "^5.0.1" 649 | }, 650 | "engines": { 651 | "node": ">=8" 652 | } 653 | }, 654 | "node_modules/finalhandler": { 655 | "version": "1.1.0", 656 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.0.tgz", 657 | "integrity": "sha512-ejnvM9ZXYzp6PUPUyQBMBf0Co5VX2gr5H2VQe2Ui2jWXNlxv+PYZo8wpAymJNJdLsG1R4p+M4aynF8KuoUEwRw==", 658 | "dev": true, 659 | "dependencies": { 660 | "debug": "2.6.9", 661 | "encodeurl": "~1.0.1", 662 | "escape-html": "~1.0.3", 663 | "on-finished": "~2.3.0", 664 | "parseurl": "~1.3.2", 665 | "statuses": "~1.3.1", 666 | "unpipe": "~1.0.0" 667 | }, 668 | "engines": { 669 | "node": ">= 0.8" 670 | } 671 | }, 672 | "node_modules/follow-redirects": { 673 | "version": "1.15.2", 674 | "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", 675 | "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", 676 | "dev": true, 677 | "funding": [ 678 | { 679 | "type": "individual", 680 | "url": "https://github.com/sponsors/RubenVerborgh" 681 | } 682 | ], 683 | "engines": { 684 | "node": ">=4.0" 685 | }, 686 | "peerDependenciesMeta": { 687 | "debug": { 688 | "optional": true 689 | } 690 | } 691 | }, 692 | "node_modules/fresh": { 693 | "version": "0.5.2", 694 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 695 | "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", 696 | "dev": true, 697 | "engines": { 698 | "node": ">= 0.6" 699 | } 700 | }, 701 | "node_modules/fs-extra": { 702 | "version": "3.0.1", 703 | "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-3.0.1.tgz", 704 | "integrity": "sha512-V3Z3WZWVUYd8hoCL5xfXJCaHWYzmtwW5XWYSlLgERi8PWd8bx1kUHUk8L1BT57e49oKnDDD180mjfrHc1yA9rg==", 705 | "dev": true, 706 | "dependencies": { 707 | "graceful-fs": "^4.1.2", 708 | "jsonfile": "^3.0.0", 709 | "universalify": "^0.1.0" 710 | } 711 | }, 712 | "node_modules/fsevents": { 713 | "version": "2.3.2", 714 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", 715 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", 716 | "dev": true, 717 | "hasInstallScript": true, 718 | "optional": true, 719 | "os": [ 720 | "darwin" 721 | ], 722 | "engines": { 723 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 724 | } 725 | }, 726 | "node_modules/function-bind": { 727 | "version": "1.1.1", 728 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 729 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", 730 | "dev": true 731 | }, 732 | "node_modules/get-caller-file": { 733 | "version": "2.0.5", 734 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", 735 | "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", 736 | "dev": true, 737 | "engines": { 738 | "node": "6.* || 8.* || >= 10.*" 739 | } 740 | }, 741 | "node_modules/get-intrinsic": { 742 | "version": "1.2.0", 743 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", 744 | "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", 745 | "dev": true, 746 | "dependencies": { 747 | "function-bind": "^1.1.1", 748 | "has": "^1.0.3", 749 | "has-symbols": "^1.0.3" 750 | }, 751 | "funding": { 752 | "url": "https://github.com/sponsors/ljharb" 753 | } 754 | }, 755 | "node_modules/glob-parent": { 756 | "version": "5.1.2", 757 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 758 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 759 | "dev": true, 760 | "dependencies": { 761 | "is-glob": "^4.0.1" 762 | }, 763 | "engines": { 764 | "node": ">= 6" 765 | } 766 | }, 767 | "node_modules/graceful-fs": { 768 | "version": "4.2.10", 769 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", 770 | "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", 771 | "dev": true 772 | }, 773 | "node_modules/has": { 774 | "version": "1.0.3", 775 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 776 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 777 | "dev": true, 778 | "dependencies": { 779 | "function-bind": "^1.1.1" 780 | }, 781 | "engines": { 782 | "node": ">= 0.4.0" 783 | } 784 | }, 785 | "node_modules/has-ansi": { 786 | "version": "2.0.0", 787 | "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", 788 | "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==", 789 | "dev": true, 790 | "dependencies": { 791 | "ansi-regex": "^2.0.0" 792 | }, 793 | "engines": { 794 | "node": ">=0.10.0" 795 | } 796 | }, 797 | "node_modules/has-symbols": { 798 | "version": "1.0.3", 799 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", 800 | "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", 801 | "dev": true, 802 | "engines": { 803 | "node": ">= 0.4" 804 | }, 805 | "funding": { 806 | "url": "https://github.com/sponsors/ljharb" 807 | } 808 | }, 809 | "node_modules/http-errors": { 810 | "version": "2.0.0", 811 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", 812 | "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", 813 | "dev": true, 814 | "dependencies": { 815 | "depd": "2.0.0", 816 | "inherits": "2.0.4", 817 | "setprototypeof": "1.2.0", 818 | "statuses": "2.0.1", 819 | "toidentifier": "1.0.1" 820 | }, 821 | "engines": { 822 | "node": ">= 0.8" 823 | } 824 | }, 825 | "node_modules/http-errors/node_modules/statuses": { 826 | "version": "2.0.1", 827 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", 828 | "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", 829 | "dev": true, 830 | "engines": { 831 | "node": ">= 0.8" 832 | } 833 | }, 834 | "node_modules/http-proxy": { 835 | "version": "1.18.1", 836 | "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", 837 | "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", 838 | "dev": true, 839 | "dependencies": { 840 | "eventemitter3": "^4.0.0", 841 | "follow-redirects": "^1.0.0", 842 | "requires-port": "^1.0.0" 843 | }, 844 | "engines": { 845 | "node": ">=8.0.0" 846 | } 847 | }, 848 | "node_modules/iconv-lite": { 849 | "version": "0.4.24", 850 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 851 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 852 | "dev": true, 853 | "dependencies": { 854 | "safer-buffer": ">= 2.1.2 < 3" 855 | }, 856 | "engines": { 857 | "node": ">=0.10.0" 858 | } 859 | }, 860 | "node_modules/immutable": { 861 | "version": "3.8.2", 862 | "resolved": "https://registry.npmjs.org/immutable/-/immutable-3.8.2.tgz", 863 | "integrity": "sha512-15gZoQ38eYjEjxkorfbcgBKBL6R7T459OuK+CpcWt7O3KF4uPCx2tD0uFETlUDIyo+1789crbMhTvQBSR5yBMg==", 864 | "dev": true, 865 | "engines": { 866 | "node": ">=0.10.0" 867 | } 868 | }, 869 | "node_modules/inherits": { 870 | "version": "2.0.4", 871 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 872 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 873 | "dev": true 874 | }, 875 | "node_modules/is-binary-path": { 876 | "version": "2.1.0", 877 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", 878 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", 879 | "dev": true, 880 | "dependencies": { 881 | "binary-extensions": "^2.0.0" 882 | }, 883 | "engines": { 884 | "node": ">=8" 885 | } 886 | }, 887 | "node_modules/is-extglob": { 888 | "version": "2.1.1", 889 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 890 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 891 | "dev": true, 892 | "engines": { 893 | "node": ">=0.10.0" 894 | } 895 | }, 896 | "node_modules/is-fullwidth-code-point": { 897 | "version": "3.0.0", 898 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 899 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 900 | "dev": true, 901 | "engines": { 902 | "node": ">=8" 903 | } 904 | }, 905 | "node_modules/is-glob": { 906 | "version": "4.0.3", 907 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 908 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 909 | "dev": true, 910 | "dependencies": { 911 | "is-extglob": "^2.1.1" 912 | }, 913 | "engines": { 914 | "node": ">=0.10.0" 915 | } 916 | }, 917 | "node_modules/is-number": { 918 | "version": "7.0.0", 919 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 920 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 921 | "dev": true, 922 | "engines": { 923 | "node": ">=0.12.0" 924 | } 925 | }, 926 | "node_modules/is-number-like": { 927 | "version": "1.0.8", 928 | "resolved": "https://registry.npmjs.org/is-number-like/-/is-number-like-1.0.8.tgz", 929 | "integrity": "sha512-6rZi3ezCyFcn5L71ywzz2bS5b2Igl1En3eTlZlvKjpz1n3IZLAYMbKYAIQgFmEu0GENg92ziU/faEOA/aixjbA==", 930 | "dev": true, 931 | "dependencies": { 932 | "lodash.isfinite": "^3.3.2" 933 | } 934 | }, 935 | "node_modules/is-wsl": { 936 | "version": "1.1.0", 937 | "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", 938 | "integrity": "sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==", 939 | "dev": true, 940 | "engines": { 941 | "node": ">=4" 942 | } 943 | }, 944 | "node_modules/jsonfile": { 945 | "version": "3.0.1", 946 | "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-3.0.1.tgz", 947 | "integrity": "sha512-oBko6ZHlubVB5mRFkur5vgYR1UyqX+S6Y/oCfLhqNdcc2fYFlDpIoNc7AfKS1KOGcnNAkvsr0grLck9ANM815w==", 948 | "dev": true, 949 | "optionalDependencies": { 950 | "graceful-fs": "^4.1.6" 951 | } 952 | }, 953 | "node_modules/limiter": { 954 | "version": "1.1.5", 955 | "resolved": "https://registry.npmjs.org/limiter/-/limiter-1.1.5.tgz", 956 | "integrity": "sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA==", 957 | "dev": true 958 | }, 959 | "node_modules/localtunnel": { 960 | "version": "2.0.2", 961 | "resolved": "https://registry.npmjs.org/localtunnel/-/localtunnel-2.0.2.tgz", 962 | "integrity": "sha512-n418Cn5ynvJd7m/N1d9WVJISLJF/ellZnfsLnx8WBWGzxv/ntNcFkJ1o6se5quUhCplfLGBNL5tYHiq5WF3Nug==", 963 | "dev": true, 964 | "dependencies": { 965 | "axios": "0.21.4", 966 | "debug": "4.3.2", 967 | "openurl": "1.1.1", 968 | "yargs": "17.1.1" 969 | }, 970 | "bin": { 971 | "lt": "bin/lt.js" 972 | }, 973 | "engines": { 974 | "node": ">=8.3.0" 975 | } 976 | }, 977 | "node_modules/localtunnel/node_modules/ansi-regex": { 978 | "version": "5.0.1", 979 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 980 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 981 | "dev": true, 982 | "engines": { 983 | "node": ">=8" 984 | } 985 | }, 986 | "node_modules/localtunnel/node_modules/cliui": { 987 | "version": "7.0.4", 988 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", 989 | "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", 990 | "dev": true, 991 | "dependencies": { 992 | "string-width": "^4.2.0", 993 | "strip-ansi": "^6.0.0", 994 | "wrap-ansi": "^7.0.0" 995 | } 996 | }, 997 | "node_modules/localtunnel/node_modules/debug": { 998 | "version": "4.3.2", 999 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", 1000 | "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", 1001 | "dev": true, 1002 | "dependencies": { 1003 | "ms": "2.1.2" 1004 | }, 1005 | "engines": { 1006 | "node": ">=6.0" 1007 | }, 1008 | "peerDependenciesMeta": { 1009 | "supports-color": { 1010 | "optional": true 1011 | } 1012 | } 1013 | }, 1014 | "node_modules/localtunnel/node_modules/ms": { 1015 | "version": "2.1.2", 1016 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 1017 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 1018 | "dev": true 1019 | }, 1020 | "node_modules/localtunnel/node_modules/strip-ansi": { 1021 | "version": "6.0.1", 1022 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 1023 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 1024 | "dev": true, 1025 | "dependencies": { 1026 | "ansi-regex": "^5.0.1" 1027 | }, 1028 | "engines": { 1029 | "node": ">=8" 1030 | } 1031 | }, 1032 | "node_modules/localtunnel/node_modules/yargs": { 1033 | "version": "17.1.1", 1034 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.1.1.tgz", 1035 | "integrity": "sha512-c2k48R0PwKIqKhPMWjeiF6y2xY/gPMUlro0sgxqXpbOIohWiLNXWslsootttv7E1e73QPAMQSg5FeySbVcpsPQ==", 1036 | "dev": true, 1037 | "dependencies": { 1038 | "cliui": "^7.0.2", 1039 | "escalade": "^3.1.1", 1040 | "get-caller-file": "^2.0.5", 1041 | "require-directory": "^2.1.1", 1042 | "string-width": "^4.2.0", 1043 | "y18n": "^5.0.5", 1044 | "yargs-parser": "^20.2.2" 1045 | }, 1046 | "engines": { 1047 | "node": ">=12" 1048 | } 1049 | }, 1050 | "node_modules/localtunnel/node_modules/yargs-parser": { 1051 | "version": "20.2.9", 1052 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", 1053 | "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", 1054 | "dev": true, 1055 | "engines": { 1056 | "node": ">=10" 1057 | } 1058 | }, 1059 | "node_modules/lodash": { 1060 | "version": "4.17.21", 1061 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", 1062 | "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", 1063 | "dev": true 1064 | }, 1065 | "node_modules/lodash.isfinite": { 1066 | "version": "3.3.2", 1067 | "resolved": "https://registry.npmjs.org/lodash.isfinite/-/lodash.isfinite-3.3.2.tgz", 1068 | "integrity": "sha512-7FGG40uhC8Mm633uKW1r58aElFlBlxCrg9JfSi3P6aYiWmfiWF0PgMd86ZUsxE5GwWPdHoS2+48bwTh2VPkIQA==", 1069 | "dev": true 1070 | }, 1071 | "node_modules/micromatch": { 1072 | "version": "4.0.5", 1073 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", 1074 | "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", 1075 | "dev": true, 1076 | "dependencies": { 1077 | "braces": "^3.0.2", 1078 | "picomatch": "^2.3.1" 1079 | }, 1080 | "engines": { 1081 | "node": ">=8.6" 1082 | } 1083 | }, 1084 | "node_modules/mime": { 1085 | "version": "1.4.1", 1086 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", 1087 | "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==", 1088 | "dev": true, 1089 | "bin": { 1090 | "mime": "cli.js" 1091 | } 1092 | }, 1093 | "node_modules/mime-db": { 1094 | "version": "1.52.0", 1095 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", 1096 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", 1097 | "dev": true, 1098 | "engines": { 1099 | "node": ">= 0.6" 1100 | } 1101 | }, 1102 | "node_modules/mime-types": { 1103 | "version": "2.1.35", 1104 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", 1105 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 1106 | "dev": true, 1107 | "dependencies": { 1108 | "mime-db": "1.52.0" 1109 | }, 1110 | "engines": { 1111 | "node": ">= 0.6" 1112 | } 1113 | }, 1114 | "node_modules/minimatch": { 1115 | "version": "3.1.2", 1116 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 1117 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 1118 | "dev": true, 1119 | "dependencies": { 1120 | "brace-expansion": "^1.1.7" 1121 | }, 1122 | "engines": { 1123 | "node": "*" 1124 | } 1125 | }, 1126 | "node_modules/mitt": { 1127 | "version": "1.2.0", 1128 | "resolved": "https://registry.npmjs.org/mitt/-/mitt-1.2.0.tgz", 1129 | "integrity": "sha512-r6lj77KlwqLhIUku9UWYes7KJtsczvolZkzp8hbaDPPaE24OmWl5s539Mytlj22siEQKosZ26qCBgda2PKwoJw==", 1130 | "dev": true 1131 | }, 1132 | "node_modules/ms": { 1133 | "version": "2.0.0", 1134 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 1135 | "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", 1136 | "dev": true 1137 | }, 1138 | "node_modules/negotiator": { 1139 | "version": "0.6.3", 1140 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", 1141 | "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", 1142 | "dev": true, 1143 | "engines": { 1144 | "node": ">= 0.6" 1145 | } 1146 | }, 1147 | "node_modules/normalize-path": { 1148 | "version": "3.0.0", 1149 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 1150 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", 1151 | "dev": true, 1152 | "engines": { 1153 | "node": ">=0.10.0" 1154 | } 1155 | }, 1156 | "node_modules/object-assign": { 1157 | "version": "4.1.1", 1158 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 1159 | "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", 1160 | "dev": true, 1161 | "engines": { 1162 | "node": ">=0.10.0" 1163 | } 1164 | }, 1165 | "node_modules/object-inspect": { 1166 | "version": "1.12.3", 1167 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", 1168 | "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", 1169 | "dev": true, 1170 | "funding": { 1171 | "url": "https://github.com/sponsors/ljharb" 1172 | } 1173 | }, 1174 | "node_modules/on-finished": { 1175 | "version": "2.3.0", 1176 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", 1177 | "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", 1178 | "dev": true, 1179 | "dependencies": { 1180 | "ee-first": "1.1.1" 1181 | }, 1182 | "engines": { 1183 | "node": ">= 0.8" 1184 | } 1185 | }, 1186 | "node_modules/openurl": { 1187 | "version": "1.1.1", 1188 | "resolved": "https://registry.npmjs.org/openurl/-/openurl-1.1.1.tgz", 1189 | "integrity": "sha512-d/gTkTb1i1GKz5k3XE3XFV/PxQ1k45zDqGP2OA7YhgsaLoqm6qRvARAZOFer1fcXritWlGBRCu/UgeS4HAnXAA==", 1190 | "dev": true 1191 | }, 1192 | "node_modules/opn": { 1193 | "version": "5.3.0", 1194 | "resolved": "https://registry.npmjs.org/opn/-/opn-5.3.0.tgz", 1195 | "integrity": "sha512-bYJHo/LOmoTd+pfiYhfZDnf9zekVJrY+cnS2a5F2x+w5ppvTqObojTP7WiFG+kVZs9Inw+qQ/lw7TroWwhdd2g==", 1196 | "dev": true, 1197 | "dependencies": { 1198 | "is-wsl": "^1.1.0" 1199 | }, 1200 | "engines": { 1201 | "node": ">=4" 1202 | } 1203 | }, 1204 | "node_modules/parseurl": { 1205 | "version": "1.3.3", 1206 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", 1207 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", 1208 | "dev": true, 1209 | "engines": { 1210 | "node": ">= 0.8" 1211 | } 1212 | }, 1213 | "node_modules/picomatch": { 1214 | "version": "2.3.1", 1215 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 1216 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 1217 | "dev": true, 1218 | "engines": { 1219 | "node": ">=8.6" 1220 | }, 1221 | "funding": { 1222 | "url": "https://github.com/sponsors/jonschlinkert" 1223 | } 1224 | }, 1225 | "node_modules/portscanner": { 1226 | "version": "2.2.0", 1227 | "resolved": "https://registry.npmjs.org/portscanner/-/portscanner-2.2.0.tgz", 1228 | "integrity": "sha512-IFroCz/59Lqa2uBvzK3bKDbDDIEaAY8XJ1jFxcLWTqosrsc32//P4VuSB2vZXoHiHqOmx8B5L5hnKOxL/7FlPw==", 1229 | "dev": true, 1230 | "dependencies": { 1231 | "async": "^2.6.0", 1232 | "is-number-like": "^1.0.3" 1233 | }, 1234 | "engines": { 1235 | "node": ">=0.4", 1236 | "npm": ">=1.0.0" 1237 | } 1238 | }, 1239 | "node_modules/qs": { 1240 | "version": "6.11.0", 1241 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", 1242 | "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", 1243 | "dev": true, 1244 | "dependencies": { 1245 | "side-channel": "^1.0.4" 1246 | }, 1247 | "engines": { 1248 | "node": ">=0.6" 1249 | }, 1250 | "funding": { 1251 | "url": "https://github.com/sponsors/ljharb" 1252 | } 1253 | }, 1254 | "node_modules/range-parser": { 1255 | "version": "1.2.1", 1256 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", 1257 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", 1258 | "dev": true, 1259 | "engines": { 1260 | "node": ">= 0.6" 1261 | } 1262 | }, 1263 | "node_modules/raw-body": { 1264 | "version": "2.5.1", 1265 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", 1266 | "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", 1267 | "dev": true, 1268 | "dependencies": { 1269 | "bytes": "3.1.2", 1270 | "http-errors": "2.0.0", 1271 | "iconv-lite": "0.4.24", 1272 | "unpipe": "1.0.0" 1273 | }, 1274 | "engines": { 1275 | "node": ">= 0.8" 1276 | } 1277 | }, 1278 | "node_modules/readdirp": { 1279 | "version": "3.6.0", 1280 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", 1281 | "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", 1282 | "dev": true, 1283 | "dependencies": { 1284 | "picomatch": "^2.2.1" 1285 | }, 1286 | "engines": { 1287 | "node": ">=8.10.0" 1288 | } 1289 | }, 1290 | "node_modules/require-directory": { 1291 | "version": "2.1.1", 1292 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", 1293 | "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", 1294 | "dev": true, 1295 | "engines": { 1296 | "node": ">=0.10.0" 1297 | } 1298 | }, 1299 | "node_modules/requires-port": { 1300 | "version": "1.0.0", 1301 | "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", 1302 | "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", 1303 | "dev": true 1304 | }, 1305 | "node_modules/resp-modifier": { 1306 | "version": "6.0.2", 1307 | "resolved": "https://registry.npmjs.org/resp-modifier/-/resp-modifier-6.0.2.tgz", 1308 | "integrity": "sha512-U1+0kWC/+4ncRFYqQWTx/3qkfE6a4B/h3XXgmXypfa0SPZ3t7cbbaFk297PjQS/yov24R18h6OZe6iZwj3NSLw==", 1309 | "dev": true, 1310 | "dependencies": { 1311 | "debug": "^2.2.0", 1312 | "minimatch": "^3.0.2" 1313 | }, 1314 | "engines": { 1315 | "node": ">= 0.8.0" 1316 | } 1317 | }, 1318 | "node_modules/rx": { 1319 | "version": "4.1.0", 1320 | "resolved": "https://registry.npmjs.org/rx/-/rx-4.1.0.tgz", 1321 | "integrity": "sha512-CiaiuN6gapkdl+cZUr67W6I8jquN4lkak3vtIsIWCl4XIPP8ffsoyN6/+PuGXnQy8Cu8W2y9Xxh31Rq4M6wUug==", 1322 | "dev": true 1323 | }, 1324 | "node_modules/rxjs": { 1325 | "version": "5.5.12", 1326 | "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.12.tgz", 1327 | "integrity": "sha512-xx2itnL5sBbqeeiVgNPVuQQ1nC8Jp2WfNJhXWHmElW9YmrpS9UVnNzhP3EH3HFqexO5Tlp8GhYY+WEcqcVMvGw==", 1328 | "dev": true, 1329 | "dependencies": { 1330 | "symbol-observable": "1.0.1" 1331 | }, 1332 | "engines": { 1333 | "npm": ">=2.0.0" 1334 | } 1335 | }, 1336 | "node_modules/safer-buffer": { 1337 | "version": "2.1.2", 1338 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 1339 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", 1340 | "dev": true 1341 | }, 1342 | "node_modules/send": { 1343 | "version": "0.16.2", 1344 | "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", 1345 | "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", 1346 | "dev": true, 1347 | "dependencies": { 1348 | "debug": "2.6.9", 1349 | "depd": "~1.1.2", 1350 | "destroy": "~1.0.4", 1351 | "encodeurl": "~1.0.2", 1352 | "escape-html": "~1.0.3", 1353 | "etag": "~1.8.1", 1354 | "fresh": "0.5.2", 1355 | "http-errors": "~1.6.2", 1356 | "mime": "1.4.1", 1357 | "ms": "2.0.0", 1358 | "on-finished": "~2.3.0", 1359 | "range-parser": "~1.2.0", 1360 | "statuses": "~1.4.0" 1361 | }, 1362 | "engines": { 1363 | "node": ">= 0.8.0" 1364 | } 1365 | }, 1366 | "node_modules/send/node_modules/depd": { 1367 | "version": "1.1.2", 1368 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", 1369 | "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", 1370 | "dev": true, 1371 | "engines": { 1372 | "node": ">= 0.6" 1373 | } 1374 | }, 1375 | "node_modules/send/node_modules/http-errors": { 1376 | "version": "1.6.3", 1377 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", 1378 | "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", 1379 | "dev": true, 1380 | "dependencies": { 1381 | "depd": "~1.1.2", 1382 | "inherits": "2.0.3", 1383 | "setprototypeof": "1.1.0", 1384 | "statuses": ">= 1.4.0 < 2" 1385 | }, 1386 | "engines": { 1387 | "node": ">= 0.6" 1388 | } 1389 | }, 1390 | "node_modules/send/node_modules/inherits": { 1391 | "version": "2.0.3", 1392 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 1393 | "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", 1394 | "dev": true 1395 | }, 1396 | "node_modules/send/node_modules/setprototypeof": { 1397 | "version": "1.1.0", 1398 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", 1399 | "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", 1400 | "dev": true 1401 | }, 1402 | "node_modules/send/node_modules/statuses": { 1403 | "version": "1.4.0", 1404 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", 1405 | "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", 1406 | "dev": true, 1407 | "engines": { 1408 | "node": ">= 0.6" 1409 | } 1410 | }, 1411 | "node_modules/serve-index": { 1412 | "version": "1.9.1", 1413 | "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", 1414 | "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", 1415 | "dev": true, 1416 | "dependencies": { 1417 | "accepts": "~1.3.4", 1418 | "batch": "0.6.1", 1419 | "debug": "2.6.9", 1420 | "escape-html": "~1.0.3", 1421 | "http-errors": "~1.6.2", 1422 | "mime-types": "~2.1.17", 1423 | "parseurl": "~1.3.2" 1424 | }, 1425 | "engines": { 1426 | "node": ">= 0.8.0" 1427 | } 1428 | }, 1429 | "node_modules/serve-index/node_modules/depd": { 1430 | "version": "1.1.2", 1431 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", 1432 | "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", 1433 | "dev": true, 1434 | "engines": { 1435 | "node": ">= 0.6" 1436 | } 1437 | }, 1438 | "node_modules/serve-index/node_modules/http-errors": { 1439 | "version": "1.6.3", 1440 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", 1441 | "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", 1442 | "dev": true, 1443 | "dependencies": { 1444 | "depd": "~1.1.2", 1445 | "inherits": "2.0.3", 1446 | "setprototypeof": "1.1.0", 1447 | "statuses": ">= 1.4.0 < 2" 1448 | }, 1449 | "engines": { 1450 | "node": ">= 0.6" 1451 | } 1452 | }, 1453 | "node_modules/serve-index/node_modules/inherits": { 1454 | "version": "2.0.3", 1455 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 1456 | "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", 1457 | "dev": true 1458 | }, 1459 | "node_modules/serve-index/node_modules/setprototypeof": { 1460 | "version": "1.1.0", 1461 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", 1462 | "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", 1463 | "dev": true 1464 | }, 1465 | "node_modules/serve-index/node_modules/statuses": { 1466 | "version": "1.5.0", 1467 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", 1468 | "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", 1469 | "dev": true, 1470 | "engines": { 1471 | "node": ">= 0.6" 1472 | } 1473 | }, 1474 | "node_modules/serve-static": { 1475 | "version": "1.13.2", 1476 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", 1477 | "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", 1478 | "dev": true, 1479 | "dependencies": { 1480 | "encodeurl": "~1.0.2", 1481 | "escape-html": "~1.0.3", 1482 | "parseurl": "~1.3.2", 1483 | "send": "0.16.2" 1484 | }, 1485 | "engines": { 1486 | "node": ">= 0.8.0" 1487 | } 1488 | }, 1489 | "node_modules/server-destroy": { 1490 | "version": "1.0.1", 1491 | "resolved": "https://registry.npmjs.org/server-destroy/-/server-destroy-1.0.1.tgz", 1492 | "integrity": "sha512-rb+9B5YBIEzYcD6x2VKidaa+cqYBJQKnU4oe4E3ANwRRN56yk/ua1YCJT1n21NTS8w6CcOclAKNP3PhdCXKYtQ==", 1493 | "dev": true 1494 | }, 1495 | "node_modules/setprototypeof": { 1496 | "version": "1.2.0", 1497 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", 1498 | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", 1499 | "dev": true 1500 | }, 1501 | "node_modules/side-channel": { 1502 | "version": "1.0.4", 1503 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", 1504 | "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", 1505 | "dev": true, 1506 | "dependencies": { 1507 | "call-bind": "^1.0.0", 1508 | "get-intrinsic": "^1.0.2", 1509 | "object-inspect": "^1.9.0" 1510 | }, 1511 | "funding": { 1512 | "url": "https://github.com/sponsors/ljharb" 1513 | } 1514 | }, 1515 | "node_modules/socket.io": { 1516 | "version": "4.6.0", 1517 | "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.6.0.tgz", 1518 | "integrity": "sha512-b65bp6INPk/BMMrIgVvX12x3Q+NqlGqSlTuvKQWt0BUJ3Hyy3JangBl7fEoWZTXbOKlCqNPbQ6MbWgok/km28w==", 1519 | "dev": true, 1520 | "dependencies": { 1521 | "accepts": "~1.3.4", 1522 | "base64id": "~2.0.0", 1523 | "debug": "~4.3.2", 1524 | "engine.io": "~6.4.0", 1525 | "socket.io-adapter": "~2.5.2", 1526 | "socket.io-parser": "~4.2.1" 1527 | }, 1528 | "engines": { 1529 | "node": ">=10.0.0" 1530 | } 1531 | }, 1532 | "node_modules/socket.io-adapter": { 1533 | "version": "2.5.2", 1534 | "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.2.tgz", 1535 | "integrity": "sha512-87C3LO/NOMc+eMcpcxUBebGjkpMDkNBS9tf7KJqcDsmL936EChtVva71Dw2q4tQcuVC+hAUy4an2NO/sYXmwRA==", 1536 | "dev": true, 1537 | "dependencies": { 1538 | "ws": "~8.11.0" 1539 | } 1540 | }, 1541 | "node_modules/socket.io-client": { 1542 | "version": "4.6.0", 1543 | "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.6.0.tgz", 1544 | "integrity": "sha512-2XOp18xnGghUICSd5ziUIS4rB0dhr6S8OvAps8y+HhOjFQlqGcf+FIh6fCIsKKZyWFxJeFPrZRNPGsHDTsz1Ug==", 1545 | "dev": true, 1546 | "dependencies": { 1547 | "@socket.io/component-emitter": "~3.1.0", 1548 | "debug": "~4.3.2", 1549 | "engine.io-client": "~6.4.0", 1550 | "socket.io-parser": "~4.2.1" 1551 | }, 1552 | "engines": { 1553 | "node": ">=10.0.0" 1554 | } 1555 | }, 1556 | "node_modules/socket.io-client/node_modules/debug": { 1557 | "version": "4.3.4", 1558 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", 1559 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 1560 | "dev": true, 1561 | "dependencies": { 1562 | "ms": "2.1.2" 1563 | }, 1564 | "engines": { 1565 | "node": ">=6.0" 1566 | }, 1567 | "peerDependenciesMeta": { 1568 | "supports-color": { 1569 | "optional": true 1570 | } 1571 | } 1572 | }, 1573 | "node_modules/socket.io-client/node_modules/ms": { 1574 | "version": "2.1.2", 1575 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 1576 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 1577 | "dev": true 1578 | }, 1579 | "node_modules/socket.io-parser": { 1580 | "version": "4.2.2", 1581 | "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.2.tgz", 1582 | "integrity": "sha512-DJtziuKypFkMMHCm2uIshOYC7QaylbtzQwiMYDuCKy3OPkjLzu4B2vAhTlqipRHHzrI0NJeBAizTK7X+6m1jVw==", 1583 | "dev": true, 1584 | "dependencies": { 1585 | "@socket.io/component-emitter": "~3.1.0", 1586 | "debug": "~4.3.1" 1587 | }, 1588 | "engines": { 1589 | "node": ">=10.0.0" 1590 | } 1591 | }, 1592 | "node_modules/socket.io-parser/node_modules/debug": { 1593 | "version": "4.3.4", 1594 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", 1595 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 1596 | "dev": true, 1597 | "dependencies": { 1598 | "ms": "2.1.2" 1599 | }, 1600 | "engines": { 1601 | "node": ">=6.0" 1602 | }, 1603 | "peerDependenciesMeta": { 1604 | "supports-color": { 1605 | "optional": true 1606 | } 1607 | } 1608 | }, 1609 | "node_modules/socket.io-parser/node_modules/ms": { 1610 | "version": "2.1.2", 1611 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 1612 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 1613 | "dev": true 1614 | }, 1615 | "node_modules/socket.io/node_modules/debug": { 1616 | "version": "4.3.4", 1617 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", 1618 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 1619 | "dev": true, 1620 | "dependencies": { 1621 | "ms": "2.1.2" 1622 | }, 1623 | "engines": { 1624 | "node": ">=6.0" 1625 | }, 1626 | "peerDependenciesMeta": { 1627 | "supports-color": { 1628 | "optional": true 1629 | } 1630 | } 1631 | }, 1632 | "node_modules/socket.io/node_modules/ms": { 1633 | "version": "2.1.2", 1634 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 1635 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 1636 | "dev": true 1637 | }, 1638 | "node_modules/statuses": { 1639 | "version": "1.3.1", 1640 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", 1641 | "integrity": "sha512-wuTCPGlJONk/a1kqZ4fQM2+908lC7fa7nPYpTC1EhnvqLX/IICbeP1OZGDtA374trpSq68YubKUMo8oRhN46yg==", 1642 | "dev": true, 1643 | "engines": { 1644 | "node": ">= 0.6" 1645 | } 1646 | }, 1647 | "node_modules/stream-throttle": { 1648 | "version": "0.1.3", 1649 | "resolved": "https://registry.npmjs.org/stream-throttle/-/stream-throttle-0.1.3.tgz", 1650 | "integrity": "sha512-889+B9vN9dq7/vLbGyuHeZ6/ctf5sNuGWsDy89uNxkFTAgzy0eK7+w5fL3KLNRTkLle7EgZGvHUphZW0Q26MnQ==", 1651 | "dev": true, 1652 | "dependencies": { 1653 | "commander": "^2.2.0", 1654 | "limiter": "^1.0.5" 1655 | }, 1656 | "bin": { 1657 | "throttleproxy": "bin/throttleproxy.js" 1658 | }, 1659 | "engines": { 1660 | "node": ">= 0.10.0" 1661 | } 1662 | }, 1663 | "node_modules/string-width": { 1664 | "version": "4.2.3", 1665 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 1666 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 1667 | "dev": true, 1668 | "dependencies": { 1669 | "emoji-regex": "^8.0.0", 1670 | "is-fullwidth-code-point": "^3.0.0", 1671 | "strip-ansi": "^6.0.1" 1672 | }, 1673 | "engines": { 1674 | "node": ">=8" 1675 | } 1676 | }, 1677 | "node_modules/string-width/node_modules/ansi-regex": { 1678 | "version": "5.0.1", 1679 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 1680 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 1681 | "dev": true, 1682 | "engines": { 1683 | "node": ">=8" 1684 | } 1685 | }, 1686 | "node_modules/string-width/node_modules/strip-ansi": { 1687 | "version": "6.0.1", 1688 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 1689 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 1690 | "dev": true, 1691 | "dependencies": { 1692 | "ansi-regex": "^5.0.1" 1693 | }, 1694 | "engines": { 1695 | "node": ">=8" 1696 | } 1697 | }, 1698 | "node_modules/strip-ansi": { 1699 | "version": "3.0.1", 1700 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", 1701 | "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", 1702 | "dev": true, 1703 | "dependencies": { 1704 | "ansi-regex": "^2.0.0" 1705 | }, 1706 | "engines": { 1707 | "node": ">=0.10.0" 1708 | } 1709 | }, 1710 | "node_modules/supports-color": { 1711 | "version": "2.0.0", 1712 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", 1713 | "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", 1714 | "dev": true, 1715 | "engines": { 1716 | "node": ">=0.8.0" 1717 | } 1718 | }, 1719 | "node_modules/symbol-observable": { 1720 | "version": "1.0.1", 1721 | "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz", 1722 | "integrity": "sha512-Kb3PrPYz4HanVF1LVGuAdW6LoVgIwjUYJGzFe7NDrBLCN4lsV/5J0MFurV+ygS4bRVwrCEt2c7MQ1R2a72oJDw==", 1723 | "dev": true, 1724 | "engines": { 1725 | "node": ">=0.10.0" 1726 | } 1727 | }, 1728 | "node_modules/tfunk": { 1729 | "version": "4.0.0", 1730 | "resolved": "https://registry.npmjs.org/tfunk/-/tfunk-4.0.0.tgz", 1731 | "integrity": "sha512-eJQ0dGfDIzWNiFNYFVjJ+Ezl/GmwHaFTBTjrtqNPW0S7cuVDBrZrmzUz6VkMeCR4DZFqhd4YtLwsw3i2wYHswQ==", 1732 | "dev": true, 1733 | "dependencies": { 1734 | "chalk": "^1.1.3", 1735 | "dlv": "^1.1.3" 1736 | } 1737 | }, 1738 | "node_modules/to-regex-range": { 1739 | "version": "5.0.1", 1740 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 1741 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 1742 | "dev": true, 1743 | "dependencies": { 1744 | "is-number": "^7.0.0" 1745 | }, 1746 | "engines": { 1747 | "node": ">=8.0" 1748 | } 1749 | }, 1750 | "node_modules/toidentifier": { 1751 | "version": "1.0.1", 1752 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", 1753 | "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", 1754 | "dev": true, 1755 | "engines": { 1756 | "node": ">=0.6" 1757 | } 1758 | }, 1759 | "node_modules/typescript": { 1760 | "version": "4.9.5", 1761 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", 1762 | "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", 1763 | "dev": true, 1764 | "bin": { 1765 | "tsc": "bin/tsc", 1766 | "tsserver": "bin/tsserver" 1767 | }, 1768 | "engines": { 1769 | "node": ">=4.2.0" 1770 | } 1771 | }, 1772 | "node_modules/ua-parser-js": { 1773 | "version": "1.0.2", 1774 | "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.2.tgz", 1775 | "integrity": "sha512-00y/AXhx0/SsnI51fTc0rLRmafiGOM4/O+ny10Ps7f+j/b8p/ZY11ytMgznXkOVo4GQ+KwQG5UQLkLGirsACRg==", 1776 | "dev": true, 1777 | "funding": [ 1778 | { 1779 | "type": "opencollective", 1780 | "url": "https://opencollective.com/ua-parser-js" 1781 | }, 1782 | { 1783 | "type": "paypal", 1784 | "url": "https://paypal.me/faisalman" 1785 | } 1786 | ], 1787 | "engines": { 1788 | "node": "*" 1789 | } 1790 | }, 1791 | "node_modules/universalify": { 1792 | "version": "0.1.2", 1793 | "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", 1794 | "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", 1795 | "dev": true, 1796 | "engines": { 1797 | "node": ">= 4.0.0" 1798 | } 1799 | }, 1800 | "node_modules/unpipe": { 1801 | "version": "1.0.0", 1802 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 1803 | "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", 1804 | "dev": true, 1805 | "engines": { 1806 | "node": ">= 0.8" 1807 | } 1808 | }, 1809 | "node_modules/utils-merge": { 1810 | "version": "1.0.1", 1811 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 1812 | "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", 1813 | "dev": true, 1814 | "engines": { 1815 | "node": ">= 0.4.0" 1816 | } 1817 | }, 1818 | "node_modules/vary": { 1819 | "version": "1.1.2", 1820 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 1821 | "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", 1822 | "dev": true, 1823 | "engines": { 1824 | "node": ">= 0.8" 1825 | } 1826 | }, 1827 | "node_modules/wrap-ansi": { 1828 | "version": "7.0.0", 1829 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", 1830 | "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", 1831 | "dev": true, 1832 | "dependencies": { 1833 | "ansi-styles": "^4.0.0", 1834 | "string-width": "^4.1.0", 1835 | "strip-ansi": "^6.0.0" 1836 | }, 1837 | "engines": { 1838 | "node": ">=10" 1839 | }, 1840 | "funding": { 1841 | "url": "https://github.com/chalk/wrap-ansi?sponsor=1" 1842 | } 1843 | }, 1844 | "node_modules/wrap-ansi/node_modules/ansi-regex": { 1845 | "version": "5.0.1", 1846 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 1847 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 1848 | "dev": true, 1849 | "engines": { 1850 | "node": ">=8" 1851 | } 1852 | }, 1853 | "node_modules/wrap-ansi/node_modules/ansi-styles": { 1854 | "version": "4.3.0", 1855 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 1856 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 1857 | "dev": true, 1858 | "dependencies": { 1859 | "color-convert": "^2.0.1" 1860 | }, 1861 | "engines": { 1862 | "node": ">=8" 1863 | }, 1864 | "funding": { 1865 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 1866 | } 1867 | }, 1868 | "node_modules/wrap-ansi/node_modules/strip-ansi": { 1869 | "version": "6.0.1", 1870 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 1871 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 1872 | "dev": true, 1873 | "dependencies": { 1874 | "ansi-regex": "^5.0.1" 1875 | }, 1876 | "engines": { 1877 | "node": ">=8" 1878 | } 1879 | }, 1880 | "node_modules/ws": { 1881 | "version": "8.11.0", 1882 | "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", 1883 | "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", 1884 | "dev": true, 1885 | "engines": { 1886 | "node": ">=10.0.0" 1887 | }, 1888 | "peerDependencies": { 1889 | "bufferutil": "^4.0.1", 1890 | "utf-8-validate": "^5.0.2" 1891 | }, 1892 | "peerDependenciesMeta": { 1893 | "bufferutil": { 1894 | "optional": true 1895 | }, 1896 | "utf-8-validate": { 1897 | "optional": true 1898 | } 1899 | } 1900 | }, 1901 | "node_modules/xmlhttprequest-ssl": { 1902 | "version": "2.0.0", 1903 | "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.0.0.tgz", 1904 | "integrity": "sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A==", 1905 | "dev": true, 1906 | "engines": { 1907 | "node": ">=0.4.0" 1908 | } 1909 | }, 1910 | "node_modules/y18n": { 1911 | "version": "5.0.8", 1912 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", 1913 | "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", 1914 | "dev": true, 1915 | "engines": { 1916 | "node": ">=10" 1917 | } 1918 | }, 1919 | "node_modules/yargs": { 1920 | "version": "17.7.0", 1921 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.0.tgz", 1922 | "integrity": "sha512-dwqOPg5trmrre9+v8SUo2q/hAwyKoVfu8OC1xPHKJGNdxAvPl4sKxL4vBnh3bQz/ZvvGAFeA5H3ou2kcOY8sQQ==", 1923 | "dev": true, 1924 | "dependencies": { 1925 | "cliui": "^8.0.1", 1926 | "escalade": "^3.1.1", 1927 | "get-caller-file": "^2.0.5", 1928 | "require-directory": "^2.1.1", 1929 | "string-width": "^4.2.3", 1930 | "y18n": "^5.0.5", 1931 | "yargs-parser": "^21.1.1" 1932 | }, 1933 | "engines": { 1934 | "node": ">=12" 1935 | } 1936 | }, 1937 | "node_modules/yargs-parser": { 1938 | "version": "21.1.1", 1939 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", 1940 | "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", 1941 | "dev": true, 1942 | "engines": { 1943 | "node": ">=12" 1944 | } 1945 | } 1946 | } 1947 | } 1948 | -------------------------------------------------------------------------------- /preclass/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "gestures", 3 | "version": "0.0.1", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "start": "browser-sync start --server --files src/*.js", 8 | "test": "echo \"Error: no test specified\" && exit 1" 9 | }, 10 | "keywords": [], 11 | "author": "", 12 | "license": "ISC", 13 | "devDependencies": { 14 | "browser-sync": "^2.27.11" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /preclass/src/gestures.js: -------------------------------------------------------------------------------- 1 | const { GestureDescription, Finger, FingerCurl, FingerDirection } = window.fp 2 | 3 | const rockGesture = new GestureDescription('rock') // ✊️ 4 | const paperGesture = new GestureDescription('paper') // 🖐 5 | const scissorsGesture = new GestureDescription('scissors') // ✌️ 6 | const dontGesture = new GestureDescription('dont') // ✌️ 7 | 8 | 9 | // Rock 10 | // ----------------------------------------------------------------------------- 11 | 12 | // thumb: half curled 13 | // accept no curl with a bit lower confidence 14 | rockGesture.addCurl(Finger.Thumb, FingerCurl.HalfCurl, 1.0) 15 | rockGesture.addCurl(Finger.Thumb, FingerCurl.NoCurl, 0.5) 16 | 17 | // all other fingers: curled 18 | for (let finger of [Finger.Index, Finger.Middle, Finger.Ring, Finger.Pinky]) { 19 | rockGesture.addCurl(finger, FingerCurl.FullCurl, 1.0) 20 | rockGesture.addCurl(finger, FingerCurl.HalfCurl, 0.9) 21 | } 22 | 23 | 24 | // Paper 25 | // ----------------------------------------------------------------------------- 26 | 27 | // no finger should be curled 28 | for (let finger of Finger.all) { 29 | paperGesture.addCurl(finger, FingerCurl.NoCurl, 1.0) 30 | } 31 | 32 | 33 | // Scissors 34 | //------------------------------------------------------------------------------ 35 | 36 | // index and middle finger: stretched out 37 | scissorsGesture.addCurl(Finger.Index, FingerCurl.NoCurl, 1.0) 38 | scissorsGesture.addCurl(Finger.Middle, FingerCurl.NoCurl, 1.0) 39 | 40 | // ring: curled 41 | scissorsGesture.addCurl(Finger.Ring, FingerCurl.FullCurl, 1.0) 42 | scissorsGesture.addCurl(Finger.Ring, FingerCurl.HalfCurl, 0.9) 43 | 44 | // pinky: curled 45 | scissorsGesture.addCurl(Finger.Pinky, FingerCurl.FullCurl, 1.0) 46 | scissorsGesture.addCurl(Finger.Pinky, FingerCurl.HalfCurl, 0.9) 47 | 48 | 49 | // dontGesture🙅 50 | //------------------------------------------------------------------------------ 51 | for (let finger of Finger.all) { 52 | 53 | dontGesture.addCurl(finger, FingerCurl.NoCurl, 1.0) 54 | dontGesture.addCurl(finger, FingerCurl.HalfCurl, 0.8) 55 | dontGesture.addDirection(finger, FingerDirection.DiagonalUpRight, 1.0) 56 | dontGesture.addDirection(finger, FingerDirection.DiagonalUpLeft, 1.0) 57 | 58 | dontGesture.addDirection(finger, FingerDirection.HorizontalRight, 1.0) 59 | dontGesture.addDirection(finger, FingerDirection.HorizontalLeft, 1.0) 60 | } 61 | 62 | const gestures = [ 63 | rockGesture, paperGesture, scissorsGesture, 64 | dontGesture 65 | ] 66 | export { 67 | gestures 68 | } 69 | -------------------------------------------------------------------------------- /preclass/src/index.js: -------------------------------------------------------------------------------- 1 | import { gestures } from "./gestures.js" 2 | 3 | const config = { 4 | video: { width: 640, height: 480, fps: 30 } 5 | } 6 | 7 | const landmarkColors = { 8 | thumb: 'red', 9 | index: 'blue', 10 | middle: 'yellow', 11 | ring: 'green', 12 | pinky: 'pink', 13 | wrist: 'white' 14 | } 15 | 16 | const gestureStrings = { 17 | 'thumbs_up': '👍', 18 | 'victory': '✌🏻', 19 | 'rock': '👊🏻', 20 | 'paper': '🖐', 21 | 'scissors': '✌🏻', 22 | 'dont': '🙅' 23 | } 24 | const base = ['Horizontal ', 'Diagonal Up '] 25 | const dont = { 26 | left: [...base].map(i => i.concat(`Right`)), 27 | right: [...base].map(i => i.concat(`Left`)) 28 | } 29 | 30 | async function createDetector() { 31 | return window.handPoseDetection.createDetector( 32 | window.handPoseDetection.SupportedModels.MediaPipeHands, 33 | { 34 | runtime: "mediapipe", 35 | modelType: "full", 36 | maxHands: 2, 37 | solutionPath: `https://cdn.jsdelivr.net/npm/@mediapipe/hands@0.4.1646424915`, 38 | } 39 | ) 40 | } 41 | 42 | async function main() { 43 | 44 | const video = document.querySelector("#pose-video") 45 | const canvas = document.querySelector("#pose-canvas") 46 | const ctx = canvas.getContext("2d") 47 | 48 | const resultLayer = { 49 | right: document.querySelector("#pose-result-right"), 50 | left: document.querySelector("#pose-result-left") 51 | } 52 | // configure gesture estimator 53 | // add "✌🏻" and "👍" as sample gestures 54 | const knownGestures = [ 55 | fp.Gestures.VictoryGesture, 56 | fp.Gestures.ThumbsUpGesture, 57 | ...gestures 58 | ] 59 | const GE = new fp.GestureEstimator(knownGestures) 60 | // load handpose model 61 | const detector = await createDetector() 62 | console.log("mediaPose model loaded") 63 | 64 | const pair = new Set() 65 | function checkGestureCombination(chosenHand, poseData) { 66 | const addToPairIfCorrect = (chosenHand) => { 67 | const containsHand = poseData.some(finger => dont[chosenHand].includes(finger[2])) 68 | if (!containsHand) return 69 | pair.add(chosenHand) 70 | } 71 | 72 | 73 | addToPairIfCorrect(chosenHand) 74 | 75 | if (pair.size !== 2) return 76 | resultLayer.left.innerText = resultLayer.right.innerText = gestureStrings.dont 77 | pair.clear() 78 | } 79 | // main estimation loop 80 | const estimateHands = async () => { 81 | 82 | // clear canvas overlay 83 | ctx.clearRect(0, 0, config.video.width, config.video.height) 84 | resultLayer.right.innerText = '' 85 | resultLayer.left.innerText = '' 86 | 87 | // get hand landmarks from video 88 | const hands = await detector.estimateHands(video, { 89 | flipHorizontal: true 90 | }) 91 | 92 | for (const hand of hands) { 93 | for (const keypoint of hand.keypoints) { 94 | const name = keypoint.name.split('_')[0].toString().toLowerCase() 95 | const color = landmarkColors[name] 96 | drawPoint(ctx, keypoint.x, keypoint.y, 3, color) 97 | } 98 | 99 | 100 | const keypoints3D = hand.keypoints3D.map(keypoint => [keypoint.x, keypoint.y, keypoint.z]) 101 | const prediction = GE.estimate(keypoints3D, 8.5) 102 | if (prediction.gestures.length === 0) { 103 | updateDebugInfo(prediction.poseData, 'left') 104 | } 105 | 106 | if (!prediction.gestures.length) continue 107 | 108 | 109 | // find gesture with highest match score 110 | const result = prediction.gestures.reduce((p, c) => (p.score > c.score) ? p : c) 111 | const found = gestureStrings[result.name] 112 | const chosenHand = hand.handedness.toLowerCase() 113 | updateDebugInfo(prediction.poseData, chosenHand) 114 | 115 | if (found !== gestureStrings.dont) { 116 | resultLayer[chosenHand].innerText = found 117 | continue 118 | } 119 | 120 | checkGestureCombination(chosenHand, prediction.poseData) 121 | 122 | } 123 | // ...and so on 124 | setTimeout(() => { estimateHands() }, 1000 / config.video.fps) 125 | } 126 | 127 | 128 | estimateHands() 129 | console.log("Starting predictions") 130 | } 131 | 132 | async function initCamera(width, height, fps) { 133 | 134 | const constraints = { 135 | audio: false, 136 | video: { 137 | facingMode: "user", 138 | width: width, 139 | height: height, 140 | frameRate: { max: fps } 141 | } 142 | } 143 | 144 | const video = document.querySelector("#pose-video") 145 | video.width = width 146 | video.height = height 147 | 148 | // get video stream 149 | const stream = await navigator.mediaDevices.getUserMedia(constraints) 150 | video.srcObject = stream 151 | 152 | return new Promise(resolve => { 153 | video.onloadedmetadata = () => { resolve(video) } 154 | }) 155 | } 156 | 157 | function drawPoint(ctx, x, y, r, color) { 158 | ctx.beginPath() 159 | ctx.arc(x, y, r, 0, 2 * Math.PI) 160 | ctx.fillStyle = color 161 | ctx.fill() 162 | } 163 | 164 | function updateDebugInfo(data, hand) { 165 | const summaryTable = `#summary-${hand}` 166 | for (let fingerIdx in data) { 167 | document.querySelector(`${summaryTable} span#curl-${fingerIdx}`).innerHTML = data[fingerIdx][1] 168 | document.querySelector(`${summaryTable} span#dir-${fingerIdx}`).innerHTML = data[fingerIdx][2] 169 | } 170 | } 171 | 172 | window.addEventListener("DOMContentLoaded", () => { 173 | 174 | initCamera( 175 | config.video.width, config.video.height, config.video.fps 176 | ).then(video => { 177 | video.play() 178 | video.addEventListener("loadeddata", event => { 179 | console.log("Camera is ready") 180 | main() 181 | }) 182 | }) 183 | 184 | const canvas = document.querySelector("#pose-canvas") 185 | canvas.width = config.video.width 186 | canvas.height = config.video.height 187 | console.log("Canvas initialized") 188 | }) -------------------------------------------------------------------------------- /recorded/.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "window.zoomLevel": 3 3 | } -------------------------------------------------------------------------------- /recorded/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | FingerPose Example 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 90 | 91 | 92 | 93 | 94 |
95 | 96 |
97 |
98 | 99 | 100 |
101 |
102 |
103 |
104 |
105 | 106 |
107 |

Left Hand

108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 |
IdxFingerCurlDirection
0Thumb--
1Index--
2Middle--
3Ring--
4Pinky--
150 |
151 |

Right Hand

152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | 175 | 176 | 177 | 178 | 179 | 180 | 181 | 182 | 183 | 184 | 185 | 186 | 187 | 188 | 189 | 190 | 191 | 192 | 193 |
IdxFingerCurlDirection
0Thumb--
1Index--
2Middle--
3Ring--
4Pinky--
194 |
195 | 196 |
197 | 198 | 199 | 200 | 201 | 202 | -------------------------------------------------------------------------------- /recorded/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "recorded", 3 | "version": "0.0.1", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "recorded", 9 | "version": "0.0.1", 10 | "license": "ISC", 11 | "devDependencies": { 12 | "browser-sync": "^2.27.11" 13 | } 14 | }, 15 | "node_modules/@socket.io/component-emitter": { 16 | "version": "3.1.0", 17 | "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz", 18 | "integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==", 19 | "dev": true 20 | }, 21 | "node_modules/@types/cookie": { 22 | "version": "0.4.1", 23 | "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", 24 | "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==", 25 | "dev": true 26 | }, 27 | "node_modules/@types/cors": { 28 | "version": "2.8.13", 29 | "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.13.tgz", 30 | "integrity": "sha512-RG8AStHlUiV5ysZQKq97copd2UmVYw3/pRMLefISZ3S1hK104Cwm7iLQ3fTKx+lsUH2CE8FlLaYeEA2LSeqYUA==", 31 | "dev": true, 32 | "dependencies": { 33 | "@types/node": "*" 34 | } 35 | }, 36 | "node_modules/@types/node": { 37 | "version": "18.13.0", 38 | "resolved": "https://registry.npmjs.org/@types/node/-/node-18.13.0.tgz", 39 | "integrity": "sha512-gC3TazRzGoOnoKAhUx+Q0t8S9Tzs74z7m0ipwGpSqQrleP14hKxP4/JUeEQcD3W1/aIpnWl8pHowI7WokuZpXg==", 40 | "dev": true 41 | }, 42 | "node_modules/accepts": { 43 | "version": "1.3.8", 44 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", 45 | "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", 46 | "dev": true, 47 | "dependencies": { 48 | "mime-types": "~2.1.34", 49 | "negotiator": "0.6.3" 50 | }, 51 | "engines": { 52 | "node": ">= 0.6" 53 | } 54 | }, 55 | "node_modules/ansi-regex": { 56 | "version": "2.1.1", 57 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 58 | "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", 59 | "dev": true, 60 | "engines": { 61 | "node": ">=0.10.0" 62 | } 63 | }, 64 | "node_modules/ansi-styles": { 65 | "version": "2.2.1", 66 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", 67 | "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", 68 | "dev": true, 69 | "engines": { 70 | "node": ">=0.10.0" 71 | } 72 | }, 73 | "node_modules/anymatch": { 74 | "version": "3.1.3", 75 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", 76 | "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", 77 | "dev": true, 78 | "dependencies": { 79 | "normalize-path": "^3.0.0", 80 | "picomatch": "^2.0.4" 81 | }, 82 | "engines": { 83 | "node": ">= 8" 84 | } 85 | }, 86 | "node_modules/async": { 87 | "version": "2.6.4", 88 | "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", 89 | "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", 90 | "dev": true, 91 | "dependencies": { 92 | "lodash": "^4.17.14" 93 | } 94 | }, 95 | "node_modules/async-each-series": { 96 | "version": "0.1.1", 97 | "resolved": "https://registry.npmjs.org/async-each-series/-/async-each-series-0.1.1.tgz", 98 | "integrity": "sha512-p4jj6Fws4Iy2m0iCmI2am2ZNZCgbdgE+P8F/8csmn2vx7ixXrO2zGcuNsD46X5uZSVecmkEy/M06X2vG8KD6dQ==", 99 | "dev": true, 100 | "engines": { 101 | "node": ">=0.8.0" 102 | } 103 | }, 104 | "node_modules/axios": { 105 | "version": "0.21.4", 106 | "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", 107 | "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", 108 | "dev": true, 109 | "dependencies": { 110 | "follow-redirects": "^1.14.0" 111 | } 112 | }, 113 | "node_modules/balanced-match": { 114 | "version": "1.0.2", 115 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 116 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 117 | "dev": true 118 | }, 119 | "node_modules/base64id": { 120 | "version": "2.0.0", 121 | "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", 122 | "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", 123 | "dev": true, 124 | "engines": { 125 | "node": "^4.5.0 || >= 5.9" 126 | } 127 | }, 128 | "node_modules/batch": { 129 | "version": "0.6.1", 130 | "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", 131 | "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", 132 | "dev": true 133 | }, 134 | "node_modules/binary-extensions": { 135 | "version": "2.2.0", 136 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", 137 | "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", 138 | "dev": true, 139 | "engines": { 140 | "node": ">=8" 141 | } 142 | }, 143 | "node_modules/brace-expansion": { 144 | "version": "1.1.11", 145 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 146 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 147 | "dev": true, 148 | "dependencies": { 149 | "balanced-match": "^1.0.0", 150 | "concat-map": "0.0.1" 151 | } 152 | }, 153 | "node_modules/braces": { 154 | "version": "3.0.2", 155 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", 156 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 157 | "dev": true, 158 | "dependencies": { 159 | "fill-range": "^7.0.1" 160 | }, 161 | "engines": { 162 | "node": ">=8" 163 | } 164 | }, 165 | "node_modules/browser-sync": { 166 | "version": "2.27.11", 167 | "resolved": "https://registry.npmjs.org/browser-sync/-/browser-sync-2.27.11.tgz", 168 | "integrity": "sha512-U5f9u97OYJH66T0MGWWzG9rOQTW6ZmDMj97vsmtqwNS03JAwdLVES8eel2lD3rvAqQCNAFqaJ74NMacBI57vJg==", 169 | "dev": true, 170 | "dependencies": { 171 | "browser-sync-client": "^2.27.11", 172 | "browser-sync-ui": "^2.27.11", 173 | "bs-recipes": "1.3.4", 174 | "bs-snippet-injector": "^2.0.1", 175 | "chokidar": "^3.5.1", 176 | "connect": "3.6.6", 177 | "connect-history-api-fallback": "^1", 178 | "dev-ip": "^1.0.1", 179 | "easy-extender": "^2.3.4", 180 | "eazy-logger": "3.1.0", 181 | "etag": "^1.8.1", 182 | "fresh": "^0.5.2", 183 | "fs-extra": "3.0.1", 184 | "http-proxy": "^1.18.1", 185 | "immutable": "^3", 186 | "localtunnel": "^2.0.1", 187 | "micromatch": "^4.0.2", 188 | "opn": "5.3.0", 189 | "portscanner": "2.2.0", 190 | "qs": "^6.11.0", 191 | "raw-body": "^2.3.2", 192 | "resp-modifier": "6.0.2", 193 | "rx": "4.1.0", 194 | "send": "0.16.2", 195 | "serve-index": "1.9.1", 196 | "serve-static": "1.13.2", 197 | "server-destroy": "1.0.1", 198 | "socket.io": "^4.4.1", 199 | "ua-parser-js": "1.0.2", 200 | "yargs": "^17.3.1" 201 | }, 202 | "bin": { 203 | "browser-sync": "dist/bin.js" 204 | }, 205 | "engines": { 206 | "node": ">= 8.0.0" 207 | } 208 | }, 209 | "node_modules/browser-sync-client": { 210 | "version": "2.27.11", 211 | "resolved": "https://registry.npmjs.org/browser-sync-client/-/browser-sync-client-2.27.11.tgz", 212 | "integrity": "sha512-okMNfD2NasL/XD1/BclP3onXjhahisk3e/kTQ5HPDT/lLqdBqNDd6QFcjI5I1ak7na2hxKQSLjryql+7fp5gKQ==", 213 | "dev": true, 214 | "dependencies": { 215 | "etag": "1.8.1", 216 | "fresh": "0.5.2", 217 | "mitt": "^1.1.3", 218 | "rxjs": "^5.5.6", 219 | "typescript": "^4.6.2" 220 | }, 221 | "engines": { 222 | "node": ">=8.0.0" 223 | } 224 | }, 225 | "node_modules/browser-sync-ui": { 226 | "version": "2.27.11", 227 | "resolved": "https://registry.npmjs.org/browser-sync-ui/-/browser-sync-ui-2.27.11.tgz", 228 | "integrity": "sha512-1T/Y8Pp1R68aUL7zVSFq0nxtr258xWd/nTasCAHX2M6EsGaswVOFtXsw3bKqsr35z+J+LfVfOdz1HFLYKxdgrA==", 229 | "dev": true, 230 | "dependencies": { 231 | "async-each-series": "0.1.1", 232 | "connect-history-api-fallback": "^1", 233 | "immutable": "^3", 234 | "server-destroy": "1.0.1", 235 | "socket.io-client": "^4.4.1", 236 | "stream-throttle": "^0.1.3" 237 | } 238 | }, 239 | "node_modules/bs-recipes": { 240 | "version": "1.3.4", 241 | "resolved": "https://registry.npmjs.org/bs-recipes/-/bs-recipes-1.3.4.tgz", 242 | "integrity": "sha512-BXvDkqhDNxXEjeGM8LFkSbR+jzmP/CYpCiVKYn+soB1dDldeU15EBNDkwVXndKuX35wnNUaPd0qSoQEAkmQtMw==", 243 | "dev": true 244 | }, 245 | "node_modules/bs-snippet-injector": { 246 | "version": "2.0.1", 247 | "resolved": "https://registry.npmjs.org/bs-snippet-injector/-/bs-snippet-injector-2.0.1.tgz", 248 | "integrity": "sha512-4u8IgB+L9L+S5hknOj3ddNSb42436gsnGm1AuM15B7CdbkpQTyVWgIM5/JUBiKiRwGOR86uo0Lu/OsX+SAlJmw==", 249 | "dev": true 250 | }, 251 | "node_modules/bytes": { 252 | "version": "3.1.2", 253 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", 254 | "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", 255 | "dev": true, 256 | "engines": { 257 | "node": ">= 0.8" 258 | } 259 | }, 260 | "node_modules/call-bind": { 261 | "version": "1.0.2", 262 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", 263 | "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", 264 | "dev": true, 265 | "dependencies": { 266 | "function-bind": "^1.1.1", 267 | "get-intrinsic": "^1.0.2" 268 | }, 269 | "funding": { 270 | "url": "https://github.com/sponsors/ljharb" 271 | } 272 | }, 273 | "node_modules/chalk": { 274 | "version": "1.1.3", 275 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", 276 | "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", 277 | "dev": true, 278 | "dependencies": { 279 | "ansi-styles": "^2.2.1", 280 | "escape-string-regexp": "^1.0.2", 281 | "has-ansi": "^2.0.0", 282 | "strip-ansi": "^3.0.0", 283 | "supports-color": "^2.0.0" 284 | }, 285 | "engines": { 286 | "node": ">=0.10.0" 287 | } 288 | }, 289 | "node_modules/chokidar": { 290 | "version": "3.5.3", 291 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", 292 | "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", 293 | "dev": true, 294 | "funding": [ 295 | { 296 | "type": "individual", 297 | "url": "https://paulmillr.com/funding/" 298 | } 299 | ], 300 | "dependencies": { 301 | "anymatch": "~3.1.2", 302 | "braces": "~3.0.2", 303 | "glob-parent": "~5.1.2", 304 | "is-binary-path": "~2.1.0", 305 | "is-glob": "~4.0.1", 306 | "normalize-path": "~3.0.0", 307 | "readdirp": "~3.6.0" 308 | }, 309 | "engines": { 310 | "node": ">= 8.10.0" 311 | }, 312 | "optionalDependencies": { 313 | "fsevents": "~2.3.2" 314 | } 315 | }, 316 | "node_modules/cliui": { 317 | "version": "8.0.1", 318 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", 319 | "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", 320 | "dev": true, 321 | "dependencies": { 322 | "string-width": "^4.2.0", 323 | "strip-ansi": "^6.0.1", 324 | "wrap-ansi": "^7.0.0" 325 | }, 326 | "engines": { 327 | "node": ">=12" 328 | } 329 | }, 330 | "node_modules/cliui/node_modules/ansi-regex": { 331 | "version": "5.0.1", 332 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 333 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 334 | "dev": true, 335 | "engines": { 336 | "node": ">=8" 337 | } 338 | }, 339 | "node_modules/cliui/node_modules/strip-ansi": { 340 | "version": "6.0.1", 341 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 342 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 343 | "dev": true, 344 | "dependencies": { 345 | "ansi-regex": "^5.0.1" 346 | }, 347 | "engines": { 348 | "node": ">=8" 349 | } 350 | }, 351 | "node_modules/color-convert": { 352 | "version": "2.0.1", 353 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 354 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 355 | "dev": true, 356 | "dependencies": { 357 | "color-name": "~1.1.4" 358 | }, 359 | "engines": { 360 | "node": ">=7.0.0" 361 | } 362 | }, 363 | "node_modules/color-name": { 364 | "version": "1.1.4", 365 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 366 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 367 | "dev": true 368 | }, 369 | "node_modules/commander": { 370 | "version": "2.20.3", 371 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", 372 | "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", 373 | "dev": true 374 | }, 375 | "node_modules/concat-map": { 376 | "version": "0.0.1", 377 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 378 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", 379 | "dev": true 380 | }, 381 | "node_modules/connect": { 382 | "version": "3.6.6", 383 | "resolved": "https://registry.npmjs.org/connect/-/connect-3.6.6.tgz", 384 | "integrity": "sha512-OO7axMmPpu/2XuX1+2Yrg0ddju31B6xLZMWkJ5rYBu4YRmRVlOjvlY6kw2FJKiAzyxGwnrDUAG4s1Pf0sbBMCQ==", 385 | "dev": true, 386 | "dependencies": { 387 | "debug": "2.6.9", 388 | "finalhandler": "1.1.0", 389 | "parseurl": "~1.3.2", 390 | "utils-merge": "1.0.1" 391 | }, 392 | "engines": { 393 | "node": ">= 0.10.0" 394 | } 395 | }, 396 | "node_modules/connect-history-api-fallback": { 397 | "version": "1.6.0", 398 | "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", 399 | "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", 400 | "dev": true, 401 | "engines": { 402 | "node": ">=0.8" 403 | } 404 | }, 405 | "node_modules/cookie": { 406 | "version": "0.4.2", 407 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", 408 | "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", 409 | "dev": true, 410 | "engines": { 411 | "node": ">= 0.6" 412 | } 413 | }, 414 | "node_modules/cors": { 415 | "version": "2.8.5", 416 | "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", 417 | "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", 418 | "dev": true, 419 | "dependencies": { 420 | "object-assign": "^4", 421 | "vary": "^1" 422 | }, 423 | "engines": { 424 | "node": ">= 0.10" 425 | } 426 | }, 427 | "node_modules/debug": { 428 | "version": "2.6.9", 429 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 430 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 431 | "dev": true, 432 | "dependencies": { 433 | "ms": "2.0.0" 434 | } 435 | }, 436 | "node_modules/depd": { 437 | "version": "2.0.0", 438 | "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", 439 | "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", 440 | "dev": true, 441 | "engines": { 442 | "node": ">= 0.8" 443 | } 444 | }, 445 | "node_modules/destroy": { 446 | "version": "1.0.4", 447 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", 448 | "integrity": "sha512-3NdhDuEXnfun/z7x9GOElY49LoqVHoGScmOKwmxhsS8N5Y+Z8KyPPDnaSzqWgYt/ji4mqwfTS34Htrk0zPIXVg==", 449 | "dev": true 450 | }, 451 | "node_modules/dev-ip": { 452 | "version": "1.0.1", 453 | "resolved": "https://registry.npmjs.org/dev-ip/-/dev-ip-1.0.1.tgz", 454 | "integrity": "sha512-LmVkry/oDShEgSZPNgqCIp2/TlqtExeGmymru3uCELnfyjY11IzpAproLYs+1X88fXO6DBoYP3ul2Xo2yz2j6A==", 455 | "dev": true, 456 | "bin": { 457 | "dev-ip": "lib/dev-ip.js" 458 | }, 459 | "engines": { 460 | "node": ">= 0.8.0" 461 | } 462 | }, 463 | "node_modules/dlv": { 464 | "version": "1.1.3", 465 | "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", 466 | "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", 467 | "dev": true 468 | }, 469 | "node_modules/easy-extender": { 470 | "version": "2.3.4", 471 | "resolved": "https://registry.npmjs.org/easy-extender/-/easy-extender-2.3.4.tgz", 472 | "integrity": "sha512-8cAwm6md1YTiPpOvDULYJL4ZS6WfM5/cTeVVh4JsvyYZAoqlRVUpHL9Gr5Fy7HA6xcSZicUia3DeAgO3Us8E+Q==", 473 | "dev": true, 474 | "dependencies": { 475 | "lodash": "^4.17.10" 476 | }, 477 | "engines": { 478 | "node": ">= 4.0.0" 479 | } 480 | }, 481 | "node_modules/eazy-logger": { 482 | "version": "3.1.0", 483 | "resolved": "https://registry.npmjs.org/eazy-logger/-/eazy-logger-3.1.0.tgz", 484 | "integrity": "sha512-/snsn2JqBtUSSstEl4R0RKjkisGHAhvYj89i7r3ytNUKW12y178KDZwXLXIgwDqLW6E/VRMT9qfld7wvFae8bQ==", 485 | "dev": true, 486 | "dependencies": { 487 | "tfunk": "^4.0.0" 488 | }, 489 | "engines": { 490 | "node": ">= 0.8.0" 491 | } 492 | }, 493 | "node_modules/ee-first": { 494 | "version": "1.1.1", 495 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 496 | "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", 497 | "dev": true 498 | }, 499 | "node_modules/emoji-regex": { 500 | "version": "8.0.0", 501 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 502 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 503 | "dev": true 504 | }, 505 | "node_modules/encodeurl": { 506 | "version": "1.0.2", 507 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 508 | "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", 509 | "dev": true, 510 | "engines": { 511 | "node": ">= 0.8" 512 | } 513 | }, 514 | "node_modules/engine.io": { 515 | "version": "6.4.0", 516 | "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.4.0.tgz", 517 | "integrity": "sha512-OgxY1c/RuCSeO/rTr8DIFXx76IzUUft86R7/P7MMbbkuzeqJoTNw2lmeD91IyGz41QYleIIjWeMJGgug043sfQ==", 518 | "dev": true, 519 | "dependencies": { 520 | "@types/cookie": "^0.4.1", 521 | "@types/cors": "^2.8.12", 522 | "@types/node": ">=10.0.0", 523 | "accepts": "~1.3.4", 524 | "base64id": "2.0.0", 525 | "cookie": "~0.4.1", 526 | "cors": "~2.8.5", 527 | "debug": "~4.3.1", 528 | "engine.io-parser": "~5.0.3", 529 | "ws": "~8.11.0" 530 | }, 531 | "engines": { 532 | "node": ">=10.0.0" 533 | } 534 | }, 535 | "node_modules/engine.io-client": { 536 | "version": "6.4.0", 537 | "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.4.0.tgz", 538 | "integrity": "sha512-GyKPDyoEha+XZ7iEqam49vz6auPnNJ9ZBfy89f+rMMas8AuiMWOZ9PVzu8xb9ZC6rafUqiGHSCfu22ih66E+1g==", 539 | "dev": true, 540 | "dependencies": { 541 | "@socket.io/component-emitter": "~3.1.0", 542 | "debug": "~4.3.1", 543 | "engine.io-parser": "~5.0.3", 544 | "ws": "~8.11.0", 545 | "xmlhttprequest-ssl": "~2.0.0" 546 | } 547 | }, 548 | "node_modules/engine.io-client/node_modules/debug": { 549 | "version": "4.3.4", 550 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", 551 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 552 | "dev": true, 553 | "dependencies": { 554 | "ms": "2.1.2" 555 | }, 556 | "engines": { 557 | "node": ">=6.0" 558 | }, 559 | "peerDependenciesMeta": { 560 | "supports-color": { 561 | "optional": true 562 | } 563 | } 564 | }, 565 | "node_modules/engine.io-client/node_modules/ms": { 566 | "version": "2.1.2", 567 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 568 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 569 | "dev": true 570 | }, 571 | "node_modules/engine.io-parser": { 572 | "version": "5.0.6", 573 | "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.6.tgz", 574 | "integrity": "sha512-tjuoZDMAdEhVnSFleYPCtdL2GXwVTGtNjoeJd9IhIG3C1xs9uwxqRNEu5WpnDZCaozwVlK/nuQhpodhXSIMaxw==", 575 | "dev": true, 576 | "engines": { 577 | "node": ">=10.0.0" 578 | } 579 | }, 580 | "node_modules/engine.io/node_modules/debug": { 581 | "version": "4.3.4", 582 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", 583 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 584 | "dev": true, 585 | "dependencies": { 586 | "ms": "2.1.2" 587 | }, 588 | "engines": { 589 | "node": ">=6.0" 590 | }, 591 | "peerDependenciesMeta": { 592 | "supports-color": { 593 | "optional": true 594 | } 595 | } 596 | }, 597 | "node_modules/engine.io/node_modules/ms": { 598 | "version": "2.1.2", 599 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 600 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 601 | "dev": true 602 | }, 603 | "node_modules/escalade": { 604 | "version": "3.1.1", 605 | "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", 606 | "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", 607 | "dev": true, 608 | "engines": { 609 | "node": ">=6" 610 | } 611 | }, 612 | "node_modules/escape-html": { 613 | "version": "1.0.3", 614 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 615 | "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", 616 | "dev": true 617 | }, 618 | "node_modules/escape-string-regexp": { 619 | "version": "1.0.5", 620 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 621 | "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", 622 | "dev": true, 623 | "engines": { 624 | "node": ">=0.8.0" 625 | } 626 | }, 627 | "node_modules/etag": { 628 | "version": "1.8.1", 629 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 630 | "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", 631 | "dev": true, 632 | "engines": { 633 | "node": ">= 0.6" 634 | } 635 | }, 636 | "node_modules/eventemitter3": { 637 | "version": "4.0.7", 638 | "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", 639 | "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", 640 | "dev": true 641 | }, 642 | "node_modules/fill-range": { 643 | "version": "7.0.1", 644 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", 645 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 646 | "dev": true, 647 | "dependencies": { 648 | "to-regex-range": "^5.0.1" 649 | }, 650 | "engines": { 651 | "node": ">=8" 652 | } 653 | }, 654 | "node_modules/finalhandler": { 655 | "version": "1.1.0", 656 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.0.tgz", 657 | "integrity": "sha512-ejnvM9ZXYzp6PUPUyQBMBf0Co5VX2gr5H2VQe2Ui2jWXNlxv+PYZo8wpAymJNJdLsG1R4p+M4aynF8KuoUEwRw==", 658 | "dev": true, 659 | "dependencies": { 660 | "debug": "2.6.9", 661 | "encodeurl": "~1.0.1", 662 | "escape-html": "~1.0.3", 663 | "on-finished": "~2.3.0", 664 | "parseurl": "~1.3.2", 665 | "statuses": "~1.3.1", 666 | "unpipe": "~1.0.0" 667 | }, 668 | "engines": { 669 | "node": ">= 0.8" 670 | } 671 | }, 672 | "node_modules/follow-redirects": { 673 | "version": "1.15.2", 674 | "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", 675 | "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", 676 | "dev": true, 677 | "funding": [ 678 | { 679 | "type": "individual", 680 | "url": "https://github.com/sponsors/RubenVerborgh" 681 | } 682 | ], 683 | "engines": { 684 | "node": ">=4.0" 685 | }, 686 | "peerDependenciesMeta": { 687 | "debug": { 688 | "optional": true 689 | } 690 | } 691 | }, 692 | "node_modules/fresh": { 693 | "version": "0.5.2", 694 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 695 | "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", 696 | "dev": true, 697 | "engines": { 698 | "node": ">= 0.6" 699 | } 700 | }, 701 | "node_modules/fs-extra": { 702 | "version": "3.0.1", 703 | "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-3.0.1.tgz", 704 | "integrity": "sha512-V3Z3WZWVUYd8hoCL5xfXJCaHWYzmtwW5XWYSlLgERi8PWd8bx1kUHUk8L1BT57e49oKnDDD180mjfrHc1yA9rg==", 705 | "dev": true, 706 | "dependencies": { 707 | "graceful-fs": "^4.1.2", 708 | "jsonfile": "^3.0.0", 709 | "universalify": "^0.1.0" 710 | } 711 | }, 712 | "node_modules/fsevents": { 713 | "version": "2.3.2", 714 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", 715 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", 716 | "dev": true, 717 | "hasInstallScript": true, 718 | "optional": true, 719 | "os": [ 720 | "darwin" 721 | ], 722 | "engines": { 723 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 724 | } 725 | }, 726 | "node_modules/function-bind": { 727 | "version": "1.1.1", 728 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 729 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", 730 | "dev": true 731 | }, 732 | "node_modules/get-caller-file": { 733 | "version": "2.0.5", 734 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", 735 | "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", 736 | "dev": true, 737 | "engines": { 738 | "node": "6.* || 8.* || >= 10.*" 739 | } 740 | }, 741 | "node_modules/get-intrinsic": { 742 | "version": "1.2.0", 743 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", 744 | "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", 745 | "dev": true, 746 | "dependencies": { 747 | "function-bind": "^1.1.1", 748 | "has": "^1.0.3", 749 | "has-symbols": "^1.0.3" 750 | }, 751 | "funding": { 752 | "url": "https://github.com/sponsors/ljharb" 753 | } 754 | }, 755 | "node_modules/glob-parent": { 756 | "version": "5.1.2", 757 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 758 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 759 | "dev": true, 760 | "dependencies": { 761 | "is-glob": "^4.0.1" 762 | }, 763 | "engines": { 764 | "node": ">= 6" 765 | } 766 | }, 767 | "node_modules/graceful-fs": { 768 | "version": "4.2.10", 769 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", 770 | "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", 771 | "dev": true 772 | }, 773 | "node_modules/has": { 774 | "version": "1.0.3", 775 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 776 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 777 | "dev": true, 778 | "dependencies": { 779 | "function-bind": "^1.1.1" 780 | }, 781 | "engines": { 782 | "node": ">= 0.4.0" 783 | } 784 | }, 785 | "node_modules/has-ansi": { 786 | "version": "2.0.0", 787 | "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", 788 | "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==", 789 | "dev": true, 790 | "dependencies": { 791 | "ansi-regex": "^2.0.0" 792 | }, 793 | "engines": { 794 | "node": ">=0.10.0" 795 | } 796 | }, 797 | "node_modules/has-symbols": { 798 | "version": "1.0.3", 799 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", 800 | "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", 801 | "dev": true, 802 | "engines": { 803 | "node": ">= 0.4" 804 | }, 805 | "funding": { 806 | "url": "https://github.com/sponsors/ljharb" 807 | } 808 | }, 809 | "node_modules/http-errors": { 810 | "version": "2.0.0", 811 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", 812 | "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", 813 | "dev": true, 814 | "dependencies": { 815 | "depd": "2.0.0", 816 | "inherits": "2.0.4", 817 | "setprototypeof": "1.2.0", 818 | "statuses": "2.0.1", 819 | "toidentifier": "1.0.1" 820 | }, 821 | "engines": { 822 | "node": ">= 0.8" 823 | } 824 | }, 825 | "node_modules/http-errors/node_modules/statuses": { 826 | "version": "2.0.1", 827 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", 828 | "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", 829 | "dev": true, 830 | "engines": { 831 | "node": ">= 0.8" 832 | } 833 | }, 834 | "node_modules/http-proxy": { 835 | "version": "1.18.1", 836 | "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", 837 | "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", 838 | "dev": true, 839 | "dependencies": { 840 | "eventemitter3": "^4.0.0", 841 | "follow-redirects": "^1.0.0", 842 | "requires-port": "^1.0.0" 843 | }, 844 | "engines": { 845 | "node": ">=8.0.0" 846 | } 847 | }, 848 | "node_modules/iconv-lite": { 849 | "version": "0.4.24", 850 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 851 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 852 | "dev": true, 853 | "dependencies": { 854 | "safer-buffer": ">= 2.1.2 < 3" 855 | }, 856 | "engines": { 857 | "node": ">=0.10.0" 858 | } 859 | }, 860 | "node_modules/immutable": { 861 | "version": "3.8.2", 862 | "resolved": "https://registry.npmjs.org/immutable/-/immutable-3.8.2.tgz", 863 | "integrity": "sha512-15gZoQ38eYjEjxkorfbcgBKBL6R7T459OuK+CpcWt7O3KF4uPCx2tD0uFETlUDIyo+1789crbMhTvQBSR5yBMg==", 864 | "dev": true, 865 | "engines": { 866 | "node": ">=0.10.0" 867 | } 868 | }, 869 | "node_modules/inherits": { 870 | "version": "2.0.4", 871 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 872 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 873 | "dev": true 874 | }, 875 | "node_modules/is-binary-path": { 876 | "version": "2.1.0", 877 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", 878 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", 879 | "dev": true, 880 | "dependencies": { 881 | "binary-extensions": "^2.0.0" 882 | }, 883 | "engines": { 884 | "node": ">=8" 885 | } 886 | }, 887 | "node_modules/is-extglob": { 888 | "version": "2.1.1", 889 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 890 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 891 | "dev": true, 892 | "engines": { 893 | "node": ">=0.10.0" 894 | } 895 | }, 896 | "node_modules/is-fullwidth-code-point": { 897 | "version": "3.0.0", 898 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 899 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 900 | "dev": true, 901 | "engines": { 902 | "node": ">=8" 903 | } 904 | }, 905 | "node_modules/is-glob": { 906 | "version": "4.0.3", 907 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 908 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 909 | "dev": true, 910 | "dependencies": { 911 | "is-extglob": "^2.1.1" 912 | }, 913 | "engines": { 914 | "node": ">=0.10.0" 915 | } 916 | }, 917 | "node_modules/is-number": { 918 | "version": "7.0.0", 919 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 920 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 921 | "dev": true, 922 | "engines": { 923 | "node": ">=0.12.0" 924 | } 925 | }, 926 | "node_modules/is-number-like": { 927 | "version": "1.0.8", 928 | "resolved": "https://registry.npmjs.org/is-number-like/-/is-number-like-1.0.8.tgz", 929 | "integrity": "sha512-6rZi3ezCyFcn5L71ywzz2bS5b2Igl1En3eTlZlvKjpz1n3IZLAYMbKYAIQgFmEu0GENg92ziU/faEOA/aixjbA==", 930 | "dev": true, 931 | "dependencies": { 932 | "lodash.isfinite": "^3.3.2" 933 | } 934 | }, 935 | "node_modules/is-wsl": { 936 | "version": "1.1.0", 937 | "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", 938 | "integrity": "sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==", 939 | "dev": true, 940 | "engines": { 941 | "node": ">=4" 942 | } 943 | }, 944 | "node_modules/jsonfile": { 945 | "version": "3.0.1", 946 | "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-3.0.1.tgz", 947 | "integrity": "sha512-oBko6ZHlubVB5mRFkur5vgYR1UyqX+S6Y/oCfLhqNdcc2fYFlDpIoNc7AfKS1KOGcnNAkvsr0grLck9ANM815w==", 948 | "dev": true, 949 | "optionalDependencies": { 950 | "graceful-fs": "^4.1.6" 951 | } 952 | }, 953 | "node_modules/limiter": { 954 | "version": "1.1.5", 955 | "resolved": "https://registry.npmjs.org/limiter/-/limiter-1.1.5.tgz", 956 | "integrity": "sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA==", 957 | "dev": true 958 | }, 959 | "node_modules/localtunnel": { 960 | "version": "2.0.2", 961 | "resolved": "https://registry.npmjs.org/localtunnel/-/localtunnel-2.0.2.tgz", 962 | "integrity": "sha512-n418Cn5ynvJd7m/N1d9WVJISLJF/ellZnfsLnx8WBWGzxv/ntNcFkJ1o6se5quUhCplfLGBNL5tYHiq5WF3Nug==", 963 | "dev": true, 964 | "dependencies": { 965 | "axios": "0.21.4", 966 | "debug": "4.3.2", 967 | "openurl": "1.1.1", 968 | "yargs": "17.1.1" 969 | }, 970 | "bin": { 971 | "lt": "bin/lt.js" 972 | }, 973 | "engines": { 974 | "node": ">=8.3.0" 975 | } 976 | }, 977 | "node_modules/localtunnel/node_modules/ansi-regex": { 978 | "version": "5.0.1", 979 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 980 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 981 | "dev": true, 982 | "engines": { 983 | "node": ">=8" 984 | } 985 | }, 986 | "node_modules/localtunnel/node_modules/cliui": { 987 | "version": "7.0.4", 988 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", 989 | "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", 990 | "dev": true, 991 | "dependencies": { 992 | "string-width": "^4.2.0", 993 | "strip-ansi": "^6.0.0", 994 | "wrap-ansi": "^7.0.0" 995 | } 996 | }, 997 | "node_modules/localtunnel/node_modules/debug": { 998 | "version": "4.3.2", 999 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", 1000 | "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", 1001 | "dev": true, 1002 | "dependencies": { 1003 | "ms": "2.1.2" 1004 | }, 1005 | "engines": { 1006 | "node": ">=6.0" 1007 | }, 1008 | "peerDependenciesMeta": { 1009 | "supports-color": { 1010 | "optional": true 1011 | } 1012 | } 1013 | }, 1014 | "node_modules/localtunnel/node_modules/ms": { 1015 | "version": "2.1.2", 1016 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 1017 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 1018 | "dev": true 1019 | }, 1020 | "node_modules/localtunnel/node_modules/strip-ansi": { 1021 | "version": "6.0.1", 1022 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 1023 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 1024 | "dev": true, 1025 | "dependencies": { 1026 | "ansi-regex": "^5.0.1" 1027 | }, 1028 | "engines": { 1029 | "node": ">=8" 1030 | } 1031 | }, 1032 | "node_modules/localtunnel/node_modules/yargs": { 1033 | "version": "17.1.1", 1034 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.1.1.tgz", 1035 | "integrity": "sha512-c2k48R0PwKIqKhPMWjeiF6y2xY/gPMUlro0sgxqXpbOIohWiLNXWslsootttv7E1e73QPAMQSg5FeySbVcpsPQ==", 1036 | "dev": true, 1037 | "dependencies": { 1038 | "cliui": "^7.0.2", 1039 | "escalade": "^3.1.1", 1040 | "get-caller-file": "^2.0.5", 1041 | "require-directory": "^2.1.1", 1042 | "string-width": "^4.2.0", 1043 | "y18n": "^5.0.5", 1044 | "yargs-parser": "^20.2.2" 1045 | }, 1046 | "engines": { 1047 | "node": ">=12" 1048 | } 1049 | }, 1050 | "node_modules/localtunnel/node_modules/yargs-parser": { 1051 | "version": "20.2.9", 1052 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", 1053 | "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", 1054 | "dev": true, 1055 | "engines": { 1056 | "node": ">=10" 1057 | } 1058 | }, 1059 | "node_modules/lodash": { 1060 | "version": "4.17.21", 1061 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", 1062 | "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", 1063 | "dev": true 1064 | }, 1065 | "node_modules/lodash.isfinite": { 1066 | "version": "3.3.2", 1067 | "resolved": "https://registry.npmjs.org/lodash.isfinite/-/lodash.isfinite-3.3.2.tgz", 1068 | "integrity": "sha512-7FGG40uhC8Mm633uKW1r58aElFlBlxCrg9JfSi3P6aYiWmfiWF0PgMd86ZUsxE5GwWPdHoS2+48bwTh2VPkIQA==", 1069 | "dev": true 1070 | }, 1071 | "node_modules/micromatch": { 1072 | "version": "4.0.5", 1073 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", 1074 | "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", 1075 | "dev": true, 1076 | "dependencies": { 1077 | "braces": "^3.0.2", 1078 | "picomatch": "^2.3.1" 1079 | }, 1080 | "engines": { 1081 | "node": ">=8.6" 1082 | } 1083 | }, 1084 | "node_modules/mime": { 1085 | "version": "1.4.1", 1086 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", 1087 | "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==", 1088 | "dev": true, 1089 | "bin": { 1090 | "mime": "cli.js" 1091 | } 1092 | }, 1093 | "node_modules/mime-db": { 1094 | "version": "1.52.0", 1095 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", 1096 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", 1097 | "dev": true, 1098 | "engines": { 1099 | "node": ">= 0.6" 1100 | } 1101 | }, 1102 | "node_modules/mime-types": { 1103 | "version": "2.1.35", 1104 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", 1105 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 1106 | "dev": true, 1107 | "dependencies": { 1108 | "mime-db": "1.52.0" 1109 | }, 1110 | "engines": { 1111 | "node": ">= 0.6" 1112 | } 1113 | }, 1114 | "node_modules/minimatch": { 1115 | "version": "3.1.2", 1116 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 1117 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 1118 | "dev": true, 1119 | "dependencies": { 1120 | "brace-expansion": "^1.1.7" 1121 | }, 1122 | "engines": { 1123 | "node": "*" 1124 | } 1125 | }, 1126 | "node_modules/mitt": { 1127 | "version": "1.2.0", 1128 | "resolved": "https://registry.npmjs.org/mitt/-/mitt-1.2.0.tgz", 1129 | "integrity": "sha512-r6lj77KlwqLhIUku9UWYes7KJtsczvolZkzp8hbaDPPaE24OmWl5s539Mytlj22siEQKosZ26qCBgda2PKwoJw==", 1130 | "dev": true 1131 | }, 1132 | "node_modules/ms": { 1133 | "version": "2.0.0", 1134 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 1135 | "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", 1136 | "dev": true 1137 | }, 1138 | "node_modules/negotiator": { 1139 | "version": "0.6.3", 1140 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", 1141 | "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", 1142 | "dev": true, 1143 | "engines": { 1144 | "node": ">= 0.6" 1145 | } 1146 | }, 1147 | "node_modules/normalize-path": { 1148 | "version": "3.0.0", 1149 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 1150 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", 1151 | "dev": true, 1152 | "engines": { 1153 | "node": ">=0.10.0" 1154 | } 1155 | }, 1156 | "node_modules/object-assign": { 1157 | "version": "4.1.1", 1158 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 1159 | "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", 1160 | "dev": true, 1161 | "engines": { 1162 | "node": ">=0.10.0" 1163 | } 1164 | }, 1165 | "node_modules/object-inspect": { 1166 | "version": "1.12.3", 1167 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", 1168 | "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", 1169 | "dev": true, 1170 | "funding": { 1171 | "url": "https://github.com/sponsors/ljharb" 1172 | } 1173 | }, 1174 | "node_modules/on-finished": { 1175 | "version": "2.3.0", 1176 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", 1177 | "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", 1178 | "dev": true, 1179 | "dependencies": { 1180 | "ee-first": "1.1.1" 1181 | }, 1182 | "engines": { 1183 | "node": ">= 0.8" 1184 | } 1185 | }, 1186 | "node_modules/openurl": { 1187 | "version": "1.1.1", 1188 | "resolved": "https://registry.npmjs.org/openurl/-/openurl-1.1.1.tgz", 1189 | "integrity": "sha512-d/gTkTb1i1GKz5k3XE3XFV/PxQ1k45zDqGP2OA7YhgsaLoqm6qRvARAZOFer1fcXritWlGBRCu/UgeS4HAnXAA==", 1190 | "dev": true 1191 | }, 1192 | "node_modules/opn": { 1193 | "version": "5.3.0", 1194 | "resolved": "https://registry.npmjs.org/opn/-/opn-5.3.0.tgz", 1195 | "integrity": "sha512-bYJHo/LOmoTd+pfiYhfZDnf9zekVJrY+cnS2a5F2x+w5ppvTqObojTP7WiFG+kVZs9Inw+qQ/lw7TroWwhdd2g==", 1196 | "dev": true, 1197 | "dependencies": { 1198 | "is-wsl": "^1.1.0" 1199 | }, 1200 | "engines": { 1201 | "node": ">=4" 1202 | } 1203 | }, 1204 | "node_modules/parseurl": { 1205 | "version": "1.3.3", 1206 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", 1207 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", 1208 | "dev": true, 1209 | "engines": { 1210 | "node": ">= 0.8" 1211 | } 1212 | }, 1213 | "node_modules/picomatch": { 1214 | "version": "2.3.1", 1215 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 1216 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 1217 | "dev": true, 1218 | "engines": { 1219 | "node": ">=8.6" 1220 | }, 1221 | "funding": { 1222 | "url": "https://github.com/sponsors/jonschlinkert" 1223 | } 1224 | }, 1225 | "node_modules/portscanner": { 1226 | "version": "2.2.0", 1227 | "resolved": "https://registry.npmjs.org/portscanner/-/portscanner-2.2.0.tgz", 1228 | "integrity": "sha512-IFroCz/59Lqa2uBvzK3bKDbDDIEaAY8XJ1jFxcLWTqosrsc32//P4VuSB2vZXoHiHqOmx8B5L5hnKOxL/7FlPw==", 1229 | "dev": true, 1230 | "dependencies": { 1231 | "async": "^2.6.0", 1232 | "is-number-like": "^1.0.3" 1233 | }, 1234 | "engines": { 1235 | "node": ">=0.4", 1236 | "npm": ">=1.0.0" 1237 | } 1238 | }, 1239 | "node_modules/qs": { 1240 | "version": "6.11.0", 1241 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", 1242 | "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", 1243 | "dev": true, 1244 | "dependencies": { 1245 | "side-channel": "^1.0.4" 1246 | }, 1247 | "engines": { 1248 | "node": ">=0.6" 1249 | }, 1250 | "funding": { 1251 | "url": "https://github.com/sponsors/ljharb" 1252 | } 1253 | }, 1254 | "node_modules/range-parser": { 1255 | "version": "1.2.1", 1256 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", 1257 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", 1258 | "dev": true, 1259 | "engines": { 1260 | "node": ">= 0.6" 1261 | } 1262 | }, 1263 | "node_modules/raw-body": { 1264 | "version": "2.5.1", 1265 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", 1266 | "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", 1267 | "dev": true, 1268 | "dependencies": { 1269 | "bytes": "3.1.2", 1270 | "http-errors": "2.0.0", 1271 | "iconv-lite": "0.4.24", 1272 | "unpipe": "1.0.0" 1273 | }, 1274 | "engines": { 1275 | "node": ">= 0.8" 1276 | } 1277 | }, 1278 | "node_modules/readdirp": { 1279 | "version": "3.6.0", 1280 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", 1281 | "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", 1282 | "dev": true, 1283 | "dependencies": { 1284 | "picomatch": "^2.2.1" 1285 | }, 1286 | "engines": { 1287 | "node": ">=8.10.0" 1288 | } 1289 | }, 1290 | "node_modules/require-directory": { 1291 | "version": "2.1.1", 1292 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", 1293 | "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", 1294 | "dev": true, 1295 | "engines": { 1296 | "node": ">=0.10.0" 1297 | } 1298 | }, 1299 | "node_modules/requires-port": { 1300 | "version": "1.0.0", 1301 | "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", 1302 | "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", 1303 | "dev": true 1304 | }, 1305 | "node_modules/resp-modifier": { 1306 | "version": "6.0.2", 1307 | "resolved": "https://registry.npmjs.org/resp-modifier/-/resp-modifier-6.0.2.tgz", 1308 | "integrity": "sha512-U1+0kWC/+4ncRFYqQWTx/3qkfE6a4B/h3XXgmXypfa0SPZ3t7cbbaFk297PjQS/yov24R18h6OZe6iZwj3NSLw==", 1309 | "dev": true, 1310 | "dependencies": { 1311 | "debug": "^2.2.0", 1312 | "minimatch": "^3.0.2" 1313 | }, 1314 | "engines": { 1315 | "node": ">= 0.8.0" 1316 | } 1317 | }, 1318 | "node_modules/rx": { 1319 | "version": "4.1.0", 1320 | "resolved": "https://registry.npmjs.org/rx/-/rx-4.1.0.tgz", 1321 | "integrity": "sha512-CiaiuN6gapkdl+cZUr67W6I8jquN4lkak3vtIsIWCl4XIPP8ffsoyN6/+PuGXnQy8Cu8W2y9Xxh31Rq4M6wUug==", 1322 | "dev": true 1323 | }, 1324 | "node_modules/rxjs": { 1325 | "version": "5.5.12", 1326 | "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.12.tgz", 1327 | "integrity": "sha512-xx2itnL5sBbqeeiVgNPVuQQ1nC8Jp2WfNJhXWHmElW9YmrpS9UVnNzhP3EH3HFqexO5Tlp8GhYY+WEcqcVMvGw==", 1328 | "dev": true, 1329 | "dependencies": { 1330 | "symbol-observable": "1.0.1" 1331 | }, 1332 | "engines": { 1333 | "npm": ">=2.0.0" 1334 | } 1335 | }, 1336 | "node_modules/safer-buffer": { 1337 | "version": "2.1.2", 1338 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 1339 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", 1340 | "dev": true 1341 | }, 1342 | "node_modules/send": { 1343 | "version": "0.16.2", 1344 | "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", 1345 | "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", 1346 | "dev": true, 1347 | "dependencies": { 1348 | "debug": "2.6.9", 1349 | "depd": "~1.1.2", 1350 | "destroy": "~1.0.4", 1351 | "encodeurl": "~1.0.2", 1352 | "escape-html": "~1.0.3", 1353 | "etag": "~1.8.1", 1354 | "fresh": "0.5.2", 1355 | "http-errors": "~1.6.2", 1356 | "mime": "1.4.1", 1357 | "ms": "2.0.0", 1358 | "on-finished": "~2.3.0", 1359 | "range-parser": "~1.2.0", 1360 | "statuses": "~1.4.0" 1361 | }, 1362 | "engines": { 1363 | "node": ">= 0.8.0" 1364 | } 1365 | }, 1366 | "node_modules/send/node_modules/depd": { 1367 | "version": "1.1.2", 1368 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", 1369 | "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", 1370 | "dev": true, 1371 | "engines": { 1372 | "node": ">= 0.6" 1373 | } 1374 | }, 1375 | "node_modules/send/node_modules/http-errors": { 1376 | "version": "1.6.3", 1377 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", 1378 | "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", 1379 | "dev": true, 1380 | "dependencies": { 1381 | "depd": "~1.1.2", 1382 | "inherits": "2.0.3", 1383 | "setprototypeof": "1.1.0", 1384 | "statuses": ">= 1.4.0 < 2" 1385 | }, 1386 | "engines": { 1387 | "node": ">= 0.6" 1388 | } 1389 | }, 1390 | "node_modules/send/node_modules/inherits": { 1391 | "version": "2.0.3", 1392 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 1393 | "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", 1394 | "dev": true 1395 | }, 1396 | "node_modules/send/node_modules/setprototypeof": { 1397 | "version": "1.1.0", 1398 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", 1399 | "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", 1400 | "dev": true 1401 | }, 1402 | "node_modules/send/node_modules/statuses": { 1403 | "version": "1.4.0", 1404 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", 1405 | "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", 1406 | "dev": true, 1407 | "engines": { 1408 | "node": ">= 0.6" 1409 | } 1410 | }, 1411 | "node_modules/serve-index": { 1412 | "version": "1.9.1", 1413 | "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", 1414 | "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", 1415 | "dev": true, 1416 | "dependencies": { 1417 | "accepts": "~1.3.4", 1418 | "batch": "0.6.1", 1419 | "debug": "2.6.9", 1420 | "escape-html": "~1.0.3", 1421 | "http-errors": "~1.6.2", 1422 | "mime-types": "~2.1.17", 1423 | "parseurl": "~1.3.2" 1424 | }, 1425 | "engines": { 1426 | "node": ">= 0.8.0" 1427 | } 1428 | }, 1429 | "node_modules/serve-index/node_modules/depd": { 1430 | "version": "1.1.2", 1431 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", 1432 | "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", 1433 | "dev": true, 1434 | "engines": { 1435 | "node": ">= 0.6" 1436 | } 1437 | }, 1438 | "node_modules/serve-index/node_modules/http-errors": { 1439 | "version": "1.6.3", 1440 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", 1441 | "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", 1442 | "dev": true, 1443 | "dependencies": { 1444 | "depd": "~1.1.2", 1445 | "inherits": "2.0.3", 1446 | "setprototypeof": "1.1.0", 1447 | "statuses": ">= 1.4.0 < 2" 1448 | }, 1449 | "engines": { 1450 | "node": ">= 0.6" 1451 | } 1452 | }, 1453 | "node_modules/serve-index/node_modules/inherits": { 1454 | "version": "2.0.3", 1455 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 1456 | "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", 1457 | "dev": true 1458 | }, 1459 | "node_modules/serve-index/node_modules/setprototypeof": { 1460 | "version": "1.1.0", 1461 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", 1462 | "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", 1463 | "dev": true 1464 | }, 1465 | "node_modules/serve-index/node_modules/statuses": { 1466 | "version": "1.5.0", 1467 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", 1468 | "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", 1469 | "dev": true, 1470 | "engines": { 1471 | "node": ">= 0.6" 1472 | } 1473 | }, 1474 | "node_modules/serve-static": { 1475 | "version": "1.13.2", 1476 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", 1477 | "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", 1478 | "dev": true, 1479 | "dependencies": { 1480 | "encodeurl": "~1.0.2", 1481 | "escape-html": "~1.0.3", 1482 | "parseurl": "~1.3.2", 1483 | "send": "0.16.2" 1484 | }, 1485 | "engines": { 1486 | "node": ">= 0.8.0" 1487 | } 1488 | }, 1489 | "node_modules/server-destroy": { 1490 | "version": "1.0.1", 1491 | "resolved": "https://registry.npmjs.org/server-destroy/-/server-destroy-1.0.1.tgz", 1492 | "integrity": "sha512-rb+9B5YBIEzYcD6x2VKidaa+cqYBJQKnU4oe4E3ANwRRN56yk/ua1YCJT1n21NTS8w6CcOclAKNP3PhdCXKYtQ==", 1493 | "dev": true 1494 | }, 1495 | "node_modules/setprototypeof": { 1496 | "version": "1.2.0", 1497 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", 1498 | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", 1499 | "dev": true 1500 | }, 1501 | "node_modules/side-channel": { 1502 | "version": "1.0.4", 1503 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", 1504 | "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", 1505 | "dev": true, 1506 | "dependencies": { 1507 | "call-bind": "^1.0.0", 1508 | "get-intrinsic": "^1.0.2", 1509 | "object-inspect": "^1.9.0" 1510 | }, 1511 | "funding": { 1512 | "url": "https://github.com/sponsors/ljharb" 1513 | } 1514 | }, 1515 | "node_modules/socket.io": { 1516 | "version": "4.6.0", 1517 | "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.6.0.tgz", 1518 | "integrity": "sha512-b65bp6INPk/BMMrIgVvX12x3Q+NqlGqSlTuvKQWt0BUJ3Hyy3JangBl7fEoWZTXbOKlCqNPbQ6MbWgok/km28w==", 1519 | "dev": true, 1520 | "dependencies": { 1521 | "accepts": "~1.3.4", 1522 | "base64id": "~2.0.0", 1523 | "debug": "~4.3.2", 1524 | "engine.io": "~6.4.0", 1525 | "socket.io-adapter": "~2.5.2", 1526 | "socket.io-parser": "~4.2.1" 1527 | }, 1528 | "engines": { 1529 | "node": ">=10.0.0" 1530 | } 1531 | }, 1532 | "node_modules/socket.io-adapter": { 1533 | "version": "2.5.2", 1534 | "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.2.tgz", 1535 | "integrity": "sha512-87C3LO/NOMc+eMcpcxUBebGjkpMDkNBS9tf7KJqcDsmL936EChtVva71Dw2q4tQcuVC+hAUy4an2NO/sYXmwRA==", 1536 | "dev": true, 1537 | "dependencies": { 1538 | "ws": "~8.11.0" 1539 | } 1540 | }, 1541 | "node_modules/socket.io-client": { 1542 | "version": "4.6.0", 1543 | "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.6.0.tgz", 1544 | "integrity": "sha512-2XOp18xnGghUICSd5ziUIS4rB0dhr6S8OvAps8y+HhOjFQlqGcf+FIh6fCIsKKZyWFxJeFPrZRNPGsHDTsz1Ug==", 1545 | "dev": true, 1546 | "dependencies": { 1547 | "@socket.io/component-emitter": "~3.1.0", 1548 | "debug": "~4.3.2", 1549 | "engine.io-client": "~6.4.0", 1550 | "socket.io-parser": "~4.2.1" 1551 | }, 1552 | "engines": { 1553 | "node": ">=10.0.0" 1554 | } 1555 | }, 1556 | "node_modules/socket.io-client/node_modules/debug": { 1557 | "version": "4.3.4", 1558 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", 1559 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 1560 | "dev": true, 1561 | "dependencies": { 1562 | "ms": "2.1.2" 1563 | }, 1564 | "engines": { 1565 | "node": ">=6.0" 1566 | }, 1567 | "peerDependenciesMeta": { 1568 | "supports-color": { 1569 | "optional": true 1570 | } 1571 | } 1572 | }, 1573 | "node_modules/socket.io-client/node_modules/ms": { 1574 | "version": "2.1.2", 1575 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 1576 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 1577 | "dev": true 1578 | }, 1579 | "node_modules/socket.io-parser": { 1580 | "version": "4.2.2", 1581 | "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.2.tgz", 1582 | "integrity": "sha512-DJtziuKypFkMMHCm2uIshOYC7QaylbtzQwiMYDuCKy3OPkjLzu4B2vAhTlqipRHHzrI0NJeBAizTK7X+6m1jVw==", 1583 | "dev": true, 1584 | "dependencies": { 1585 | "@socket.io/component-emitter": "~3.1.0", 1586 | "debug": "~4.3.1" 1587 | }, 1588 | "engines": { 1589 | "node": ">=10.0.0" 1590 | } 1591 | }, 1592 | "node_modules/socket.io-parser/node_modules/debug": { 1593 | "version": "4.3.4", 1594 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", 1595 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 1596 | "dev": true, 1597 | "dependencies": { 1598 | "ms": "2.1.2" 1599 | }, 1600 | "engines": { 1601 | "node": ">=6.0" 1602 | }, 1603 | "peerDependenciesMeta": { 1604 | "supports-color": { 1605 | "optional": true 1606 | } 1607 | } 1608 | }, 1609 | "node_modules/socket.io-parser/node_modules/ms": { 1610 | "version": "2.1.2", 1611 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 1612 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 1613 | "dev": true 1614 | }, 1615 | "node_modules/socket.io/node_modules/debug": { 1616 | "version": "4.3.4", 1617 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", 1618 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 1619 | "dev": true, 1620 | "dependencies": { 1621 | "ms": "2.1.2" 1622 | }, 1623 | "engines": { 1624 | "node": ">=6.0" 1625 | }, 1626 | "peerDependenciesMeta": { 1627 | "supports-color": { 1628 | "optional": true 1629 | } 1630 | } 1631 | }, 1632 | "node_modules/socket.io/node_modules/ms": { 1633 | "version": "2.1.2", 1634 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 1635 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 1636 | "dev": true 1637 | }, 1638 | "node_modules/statuses": { 1639 | "version": "1.3.1", 1640 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", 1641 | "integrity": "sha512-wuTCPGlJONk/a1kqZ4fQM2+908lC7fa7nPYpTC1EhnvqLX/IICbeP1OZGDtA374trpSq68YubKUMo8oRhN46yg==", 1642 | "dev": true, 1643 | "engines": { 1644 | "node": ">= 0.6" 1645 | } 1646 | }, 1647 | "node_modules/stream-throttle": { 1648 | "version": "0.1.3", 1649 | "resolved": "https://registry.npmjs.org/stream-throttle/-/stream-throttle-0.1.3.tgz", 1650 | "integrity": "sha512-889+B9vN9dq7/vLbGyuHeZ6/ctf5sNuGWsDy89uNxkFTAgzy0eK7+w5fL3KLNRTkLle7EgZGvHUphZW0Q26MnQ==", 1651 | "dev": true, 1652 | "dependencies": { 1653 | "commander": "^2.2.0", 1654 | "limiter": "^1.0.5" 1655 | }, 1656 | "bin": { 1657 | "throttleproxy": "bin/throttleproxy.js" 1658 | }, 1659 | "engines": { 1660 | "node": ">= 0.10.0" 1661 | } 1662 | }, 1663 | "node_modules/string-width": { 1664 | "version": "4.2.3", 1665 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 1666 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 1667 | "dev": true, 1668 | "dependencies": { 1669 | "emoji-regex": "^8.0.0", 1670 | "is-fullwidth-code-point": "^3.0.0", 1671 | "strip-ansi": "^6.0.1" 1672 | }, 1673 | "engines": { 1674 | "node": ">=8" 1675 | } 1676 | }, 1677 | "node_modules/string-width/node_modules/ansi-regex": { 1678 | "version": "5.0.1", 1679 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 1680 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 1681 | "dev": true, 1682 | "engines": { 1683 | "node": ">=8" 1684 | } 1685 | }, 1686 | "node_modules/string-width/node_modules/strip-ansi": { 1687 | "version": "6.0.1", 1688 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 1689 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 1690 | "dev": true, 1691 | "dependencies": { 1692 | "ansi-regex": "^5.0.1" 1693 | }, 1694 | "engines": { 1695 | "node": ">=8" 1696 | } 1697 | }, 1698 | "node_modules/strip-ansi": { 1699 | "version": "3.0.1", 1700 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", 1701 | "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", 1702 | "dev": true, 1703 | "dependencies": { 1704 | "ansi-regex": "^2.0.0" 1705 | }, 1706 | "engines": { 1707 | "node": ">=0.10.0" 1708 | } 1709 | }, 1710 | "node_modules/supports-color": { 1711 | "version": "2.0.0", 1712 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", 1713 | "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", 1714 | "dev": true, 1715 | "engines": { 1716 | "node": ">=0.8.0" 1717 | } 1718 | }, 1719 | "node_modules/symbol-observable": { 1720 | "version": "1.0.1", 1721 | "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz", 1722 | "integrity": "sha512-Kb3PrPYz4HanVF1LVGuAdW6LoVgIwjUYJGzFe7NDrBLCN4lsV/5J0MFurV+ygS4bRVwrCEt2c7MQ1R2a72oJDw==", 1723 | "dev": true, 1724 | "engines": { 1725 | "node": ">=0.10.0" 1726 | } 1727 | }, 1728 | "node_modules/tfunk": { 1729 | "version": "4.0.0", 1730 | "resolved": "https://registry.npmjs.org/tfunk/-/tfunk-4.0.0.tgz", 1731 | "integrity": "sha512-eJQ0dGfDIzWNiFNYFVjJ+Ezl/GmwHaFTBTjrtqNPW0S7cuVDBrZrmzUz6VkMeCR4DZFqhd4YtLwsw3i2wYHswQ==", 1732 | "dev": true, 1733 | "dependencies": { 1734 | "chalk": "^1.1.3", 1735 | "dlv": "^1.1.3" 1736 | } 1737 | }, 1738 | "node_modules/to-regex-range": { 1739 | "version": "5.0.1", 1740 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 1741 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 1742 | "dev": true, 1743 | "dependencies": { 1744 | "is-number": "^7.0.0" 1745 | }, 1746 | "engines": { 1747 | "node": ">=8.0" 1748 | } 1749 | }, 1750 | "node_modules/toidentifier": { 1751 | "version": "1.0.1", 1752 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", 1753 | "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", 1754 | "dev": true, 1755 | "engines": { 1756 | "node": ">=0.6" 1757 | } 1758 | }, 1759 | "node_modules/typescript": { 1760 | "version": "4.9.5", 1761 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", 1762 | "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", 1763 | "dev": true, 1764 | "bin": { 1765 | "tsc": "bin/tsc", 1766 | "tsserver": "bin/tsserver" 1767 | }, 1768 | "engines": { 1769 | "node": ">=4.2.0" 1770 | } 1771 | }, 1772 | "node_modules/ua-parser-js": { 1773 | "version": "1.0.2", 1774 | "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.2.tgz", 1775 | "integrity": "sha512-00y/AXhx0/SsnI51fTc0rLRmafiGOM4/O+ny10Ps7f+j/b8p/ZY11ytMgznXkOVo4GQ+KwQG5UQLkLGirsACRg==", 1776 | "dev": true, 1777 | "funding": [ 1778 | { 1779 | "type": "opencollective", 1780 | "url": "https://opencollective.com/ua-parser-js" 1781 | }, 1782 | { 1783 | "type": "paypal", 1784 | "url": "https://paypal.me/faisalman" 1785 | } 1786 | ], 1787 | "engines": { 1788 | "node": "*" 1789 | } 1790 | }, 1791 | "node_modules/universalify": { 1792 | "version": "0.1.2", 1793 | "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", 1794 | "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", 1795 | "dev": true, 1796 | "engines": { 1797 | "node": ">= 4.0.0" 1798 | } 1799 | }, 1800 | "node_modules/unpipe": { 1801 | "version": "1.0.0", 1802 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 1803 | "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", 1804 | "dev": true, 1805 | "engines": { 1806 | "node": ">= 0.8" 1807 | } 1808 | }, 1809 | "node_modules/utils-merge": { 1810 | "version": "1.0.1", 1811 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 1812 | "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", 1813 | "dev": true, 1814 | "engines": { 1815 | "node": ">= 0.4.0" 1816 | } 1817 | }, 1818 | "node_modules/vary": { 1819 | "version": "1.1.2", 1820 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 1821 | "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", 1822 | "dev": true, 1823 | "engines": { 1824 | "node": ">= 0.8" 1825 | } 1826 | }, 1827 | "node_modules/wrap-ansi": { 1828 | "version": "7.0.0", 1829 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", 1830 | "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", 1831 | "dev": true, 1832 | "dependencies": { 1833 | "ansi-styles": "^4.0.0", 1834 | "string-width": "^4.1.0", 1835 | "strip-ansi": "^6.0.0" 1836 | }, 1837 | "engines": { 1838 | "node": ">=10" 1839 | }, 1840 | "funding": { 1841 | "url": "https://github.com/chalk/wrap-ansi?sponsor=1" 1842 | } 1843 | }, 1844 | "node_modules/wrap-ansi/node_modules/ansi-regex": { 1845 | "version": "5.0.1", 1846 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 1847 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 1848 | "dev": true, 1849 | "engines": { 1850 | "node": ">=8" 1851 | } 1852 | }, 1853 | "node_modules/wrap-ansi/node_modules/ansi-styles": { 1854 | "version": "4.3.0", 1855 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 1856 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 1857 | "dev": true, 1858 | "dependencies": { 1859 | "color-convert": "^2.0.1" 1860 | }, 1861 | "engines": { 1862 | "node": ">=8" 1863 | }, 1864 | "funding": { 1865 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 1866 | } 1867 | }, 1868 | "node_modules/wrap-ansi/node_modules/strip-ansi": { 1869 | "version": "6.0.1", 1870 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 1871 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 1872 | "dev": true, 1873 | "dependencies": { 1874 | "ansi-regex": "^5.0.1" 1875 | }, 1876 | "engines": { 1877 | "node": ">=8" 1878 | } 1879 | }, 1880 | "node_modules/ws": { 1881 | "version": "8.11.0", 1882 | "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", 1883 | "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", 1884 | "dev": true, 1885 | "engines": { 1886 | "node": ">=10.0.0" 1887 | }, 1888 | "peerDependencies": { 1889 | "bufferutil": "^4.0.1", 1890 | "utf-8-validate": "^5.0.2" 1891 | }, 1892 | "peerDependenciesMeta": { 1893 | "bufferutil": { 1894 | "optional": true 1895 | }, 1896 | "utf-8-validate": { 1897 | "optional": true 1898 | } 1899 | } 1900 | }, 1901 | "node_modules/xmlhttprequest-ssl": { 1902 | "version": "2.0.0", 1903 | "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.0.0.tgz", 1904 | "integrity": "sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A==", 1905 | "dev": true, 1906 | "engines": { 1907 | "node": ">=0.4.0" 1908 | } 1909 | }, 1910 | "node_modules/y18n": { 1911 | "version": "5.0.8", 1912 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", 1913 | "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", 1914 | "dev": true, 1915 | "engines": { 1916 | "node": ">=10" 1917 | } 1918 | }, 1919 | "node_modules/yargs": { 1920 | "version": "17.7.0", 1921 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.0.tgz", 1922 | "integrity": "sha512-dwqOPg5trmrre9+v8SUo2q/hAwyKoVfu8OC1xPHKJGNdxAvPl4sKxL4vBnh3bQz/ZvvGAFeA5H3ou2kcOY8sQQ==", 1923 | "dev": true, 1924 | "dependencies": { 1925 | "cliui": "^8.0.1", 1926 | "escalade": "^3.1.1", 1927 | "get-caller-file": "^2.0.5", 1928 | "require-directory": "^2.1.1", 1929 | "string-width": "^4.2.3", 1930 | "y18n": "^5.0.5", 1931 | "yargs-parser": "^21.1.1" 1932 | }, 1933 | "engines": { 1934 | "node": ">=12" 1935 | } 1936 | }, 1937 | "node_modules/yargs-parser": { 1938 | "version": "21.1.1", 1939 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", 1940 | "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", 1941 | "dev": true, 1942 | "engines": { 1943 | "node": ">=12" 1944 | } 1945 | } 1946 | } 1947 | } 1948 | -------------------------------------------------------------------------------- /recorded/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "recorded", 3 | "version": "0.0.1", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "start": "npx browser-sync start --server --files src/*.js", 8 | "test": "echo \"Error: no test specified\" && exit 1" 9 | }, 10 | "keywords": [], 11 | "author": "", 12 | "license": "ISC", 13 | "devDependencies": { 14 | "browser-sync": "^2.27.11" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /recorded/src/gestures.js: -------------------------------------------------------------------------------- 1 | const { GestureDescription, Finger, FingerCurl, FingerDirection } = window.fp; 2 | 3 | const rockGesture = new GestureDescription('rock'); // ✊️ 4 | const paperGesture = new GestureDescription('paper'); // 🖐 5 | const scissorsGesture = new GestureDescription('scissors'); // ✌️ 6 | const dontGesture = new GestureDescription('dont'); // 🙅 7 | 8 | 9 | // Rock 10 | // ----------------------------------------------------------------------------- 11 | 12 | // thumb: half curled 13 | // accept no curl with a bit lower confidence 14 | rockGesture.addCurl(Finger.Thumb, FingerCurl.HalfCurl, 1.0); 15 | rockGesture.addCurl(Finger.Thumb, FingerCurl.NoCurl, 0.5); 16 | 17 | // all other fingers: curled 18 | for(let finger of [Finger.Index, Finger.Middle, Finger.Ring, Finger.Pinky]) { 19 | rockGesture.addCurl(finger, FingerCurl.FullCurl, 1.0); 20 | rockGesture.addCurl(finger, FingerCurl.HalfCurl, 0.9); 21 | } 22 | 23 | 24 | // Paper 25 | // ----------------------------------------------------------------------------- 26 | 27 | // no finger should be curled 28 | for(let finger of Finger.all) { 29 | paperGesture.addCurl(finger, FingerCurl.NoCurl, 1.0); 30 | } 31 | 32 | 33 | // Scissors 34 | //------------------------------------------------------------------------------ 35 | 36 | // index and middle finger: stretched out 37 | scissorsGesture.addCurl(Finger.Index, FingerCurl.NoCurl, 1.0); 38 | scissorsGesture.addCurl(Finger.Middle, FingerCurl.NoCurl, 1.0); 39 | 40 | // ring: curled 41 | scissorsGesture.addCurl(Finger.Ring, FingerCurl.FullCurl, 1.0); 42 | scissorsGesture.addCurl(Finger.Ring, FingerCurl.HalfCurl, 0.9); 43 | 44 | // pinky: curled 45 | scissorsGesture.addCurl(Finger.Pinky, FingerCurl.FullCurl, 1.0); 46 | scissorsGesture.addCurl(Finger.Pinky, FingerCurl.HalfCurl, 0.9); 47 | 48 | // Dont 🙅 49 | //------------------------------------------------------------------------------ 50 | 51 | for(const finger of Finger.all) { 52 | dontGesture.addCurl(finger, FingerCurl.NoCurl, 1.0) 53 | dontGesture.addCurl(finger, FingerCurl.HalfCurl, 0.8) 54 | 55 | dontGesture.addDirection(finger, FingerDirection.DiagonalUpRight, 1.0) 56 | dontGesture.addDirection(finger, FingerDirection.DiagonalUpLeft, 1.0) 57 | 58 | dontGesture.addDirection(finger, FingerDirection.HorizontalRight, 1.0) 59 | dontGesture.addDirection(finger, FingerDirection.HorizontalLeft, 1.0) 60 | } 61 | 62 | 63 | const gestures = [ 64 | rockGesture, paperGesture, scissorsGesture, dontGesture 65 | ] 66 | 67 | export { 68 | gestures 69 | } -------------------------------------------------------------------------------- /recorded/src/index.js: -------------------------------------------------------------------------------- 1 | 2 | import { gestures } from "./gestures.js" 3 | const config = { 4 | video: { width: 640, height: 480, fps: 30 } 5 | } 6 | 7 | const landmarkColors = { 8 | thumb: 'red', 9 | index: 'blue', 10 | middle: 'yellow', 11 | ring: 'green', 12 | pinky: 'pink', 13 | wrist: 'white' 14 | } 15 | 16 | const gestureStrings = { 17 | 'thumbs_up': '👍', 18 | 'victory': '✌🏻', 19 | 'rock': '✊️', 20 | 'paper': '🖐', 21 | 'scissors': '✌️', 22 | 'dont': '🙅' 23 | } 24 | 25 | const base = ['Horizontal ', 'Diagonal Up '] 26 | const dont = { 27 | left: [...base].map(i => i.concat(`Right`)), 28 | right: [...base].map(i => i.concat(`Left`)) 29 | } 30 | 31 | async function createDetector() { 32 | return window.handPoseDetection.createDetector( 33 | window.handPoseDetection.SupportedModels.MediaPipeHands, 34 | { 35 | runtime: "mediapipe", 36 | modelType: "full", 37 | maxHands: 2, 38 | solutionPath: `https://cdn.jsdelivr.net/npm/@mediapipe/hands@0.4.1646424915`, 39 | } 40 | ) 41 | } 42 | 43 | async function main() { 44 | 45 | const video = document.querySelector("#pose-video") 46 | const canvas = document.querySelector("#pose-canvas") 47 | const ctx = canvas.getContext("2d") 48 | 49 | const resultLayer = { 50 | right: document.querySelector("#pose-result-right"), 51 | left: document.querySelector("#pose-result-left") 52 | } 53 | // configure gesture estimator 54 | // add "✌🏻" and "👍" as sample gestures 55 | const knownGestures = [ 56 | fp.Gestures.VictoryGesture, 57 | fp.Gestures.ThumbsUpGesture, 58 | ...gestures 59 | ] 60 | const GE = new fp.GestureEstimator(knownGestures) 61 | // load handpose model 62 | const detector = await createDetector() 63 | console.log("mediaPose model loaded") 64 | const pair = new Set() 65 | 66 | function checkGestureCombination(chosenHand, poseData) { 67 | const addToPairIfCorrect = (chosenHand) => { 68 | const containsHand = poseData.some(finger => dont[chosenHand].includes(finger[2])) 69 | if(!containsHand) return; 70 | pair.add(chosenHand) 71 | } 72 | 73 | addToPairIfCorrect(chosenHand) 74 | if(pair.size !== 2) return; 75 | resultLayer.left.innerText = resultLayer.right.innerText = gestureStrings.dont 76 | pair.clear() 77 | } 78 | // main estimation loop 79 | const estimateHands = async () => { 80 | 81 | // clear canvas overlay 82 | ctx.clearRect(0, 0, config.video.width, config.video.height) 83 | resultLayer.right.innerText = '' 84 | resultLayer.left.innerText = '' 85 | 86 | // get hand landmarks from video 87 | const hands = await detector.estimateHands(video, { 88 | flipHorizontal: true 89 | }) 90 | 91 | for (const hand of hands) { 92 | for (const keypoint of hand.keypoints) { 93 | const name = keypoint.name.split('_')[0].toString().toLowerCase() 94 | const color = landmarkColors[name] 95 | drawPoint(ctx, keypoint.x, keypoint.y, 3, color) 96 | } 97 | 98 | const keypoints3D = hand.keypoints3D.map(keypoint => [keypoint.x, keypoint.y, keypoint.z]) 99 | const predictions = GE.estimate(keypoints3D, 9) 100 | if(!predictions.gestures.length) { 101 | updateDebugInfo(predictions.poseData, 'left') 102 | } 103 | 104 | if (predictions.gestures.length > 0) { 105 | 106 | const result = predictions.gestures.reduce((p, c) => (p.score > c.score) ? p : c) 107 | const found = gestureStrings[result.name] 108 | // find gesture with highest match score 109 | const chosenHand = hand.handedness.toLowerCase() 110 | updateDebugInfo(predictions.poseData, chosenHand) 111 | 112 | if(found !== gestureStrings.dont) { 113 | resultLayer[chosenHand].innerText = found 114 | continue 115 | } 116 | checkGestureCombination(chosenHand, predictions.poseData) 117 | } 118 | 119 | } 120 | // ...and so on 121 | setTimeout(() => { estimateHands() }, 1000 / config.video.fps) 122 | } 123 | 124 | estimateHands() 125 | console.log("Starting predictions") 126 | } 127 | 128 | async function initCamera(width, height, fps) { 129 | 130 | const constraints = { 131 | audio: false, 132 | video: { 133 | facingMode: "user", 134 | width: width, 135 | height: height, 136 | frameRate: { max: fps } 137 | } 138 | } 139 | 140 | const video = document.querySelector("#pose-video") 141 | video.width = width 142 | video.height = height 143 | 144 | // get video stream 145 | const stream = await navigator.mediaDevices.getUserMedia(constraints) 146 | video.srcObject = stream 147 | 148 | return new Promise(resolve => { 149 | video.onloadedmetadata = () => { resolve(video) } 150 | }) 151 | } 152 | 153 | function drawPoint(ctx, x, y, r, color) { 154 | ctx.beginPath() 155 | ctx.arc(x, y, r, 0, 2 * Math.PI) 156 | ctx.fillStyle = color 157 | ctx.fill() 158 | } 159 | 160 | function updateDebugInfo(data, hand) { 161 | const summaryTable = `#summary-${hand}` 162 | for (let fingerIdx in data) { 163 | document.querySelector(`${summaryTable} span#curl-${fingerIdx}`).innerHTML = data[fingerIdx][1] 164 | document.querySelector(`${summaryTable} span#dir-${fingerIdx}`).innerHTML = data[fingerIdx][2] 165 | } 166 | } 167 | 168 | window.addEventListener("DOMContentLoaded", () => { 169 | 170 | initCamera( 171 | config.video.width, config.video.height, config.video.fps 172 | ).then(video => { 173 | video.play() 174 | video.addEventListener("loadeddata", event => { 175 | console.log("Camera is ready") 176 | main() 177 | }) 178 | }) 179 | 180 | const canvas = document.querySelector("#pose-canvas") 181 | canvas.width = config.video.width 182 | canvas.height = config.video.height 183 | console.log("Canvas initialized") 184 | }) 185 | --------------------------------------------------------------------------------