From 09e1b77b0752a31baa779e5cd01a48ddb5012b1b Mon Sep 17 00:00:00 2001 From: Tom Carmichael-Mhanna Date: Sat, 29 Apr 2023 19:04:34 +0100 Subject: [PATCH 01/13] Project setup --- package-lock.json | 3172 +++++++++++++++++++++++++++++++++++++++++++++ package.json | 18 + 2 files changed, 3190 insertions(+) create mode 100644 package-lock.json create mode 100644 package.json diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 000000000..53476d74e --- /dev/null +++ b/package-lock.json @@ -0,0 +1,3172 @@ +{ + "name": "bowling-challenge", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "bowling-challenge", + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "jest": "^29.5.0" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.21.4.tgz", + "integrity": "sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==", + "dependencies": { + "@babel/highlight": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.21.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.7.tgz", + "integrity": "sha512-KYMqFYTaenzMK4yUtf4EW9wc4N9ef80FsbMtkwool5zpwl4YrT1SdWYSTRcT94KO4hannogdS+LxY7L+arP3gA==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.21.5.tgz", + "integrity": "sha512-9M398B/QH5DlfCOTKDZT1ozXr0x8uBEeFd+dJraGUZGiaNpGCDVGCc14hZexsMblw3XxltJ+6kSvogp9J+5a9g==", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.21.4", + "@babel/generator": "^7.21.5", + "@babel/helper-compilation-targets": "^7.21.5", + "@babel/helper-module-transforms": "^7.21.5", + "@babel/helpers": "^7.21.5", + "@babel/parser": "^7.21.5", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.21.5", + "@babel/types": "^7.21.5", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.2", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" + }, + "node_modules/@babel/generator": { + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.5.tgz", + "integrity": "sha512-SrKK/sRv8GesIW1bDagf9cCG38IOMYZusoe1dfg0D8aiUe3Amvoj1QtjTPAWcfrZFvIwlleLb0gxzQidL9w14w==", + "dependencies": { + "@babel/types": "^7.21.5", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.21.5.tgz", + "integrity": "sha512-1RkbFGUKex4lvsB9yhIfWltJM5cZKUftB2eNajaDv3dCMEp49iBG0K14uH8NnX9IPux2+mK7JGEOB0jn48/J6w==", + "dependencies": { + "@babel/compat-data": "^7.21.5", + "@babel/helper-validator-option": "^7.21.0", + "browserslist": "^4.21.3", + "lru-cache": "^5.1.1", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.21.5.tgz", + "integrity": "sha512-IYl4gZ3ETsWocUWgsFZLM5i1BYx9SoemminVEXadgLBa9TdeorzgLKm8wWLA6J1N/kT3Kch8XIk1laNzYoHKvQ==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz", + "integrity": "sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==", + "dependencies": { + "@babel/template": "^7.20.7", + "@babel/types": "^7.21.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", + "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.21.4.tgz", + "integrity": "sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg==", + "dependencies": { + "@babel/types": "^7.21.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.21.5.tgz", + "integrity": "sha512-bI2Z9zBGY2q5yMHoBvJ2a9iX3ZOAzJPm7Q8Yz6YeoUjU/Cvhmi2G4QyTNyPBqqXSgTjUxRg3L0xV45HvkNWWBw==", + "dependencies": { + "@babel/helper-environment-visitor": "^7.21.5", + "@babel/helper-module-imports": "^7.21.4", + "@babel/helper-simple-access": "^7.21.5", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/helper-validator-identifier": "^7.19.1", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.21.5", + "@babel/types": "^7.21.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.21.5.tgz", + "integrity": "sha512-0WDaIlXKOX/3KfBK/dwP1oQGiPh6rjMkT7HIRv7i5RR2VUMwrx5ZL0dwBkKx7+SW1zwNdgjHd34IMk5ZjTeHVg==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.21.5.tgz", + "integrity": "sha512-ENPDAMC1wAjR0uaCUwliBdiSl1KBJAVnMTzXqi64c2MG8MPR6ii4qf7bSXDqSFbr4W6W028/rf5ivoHop5/mkg==", + "dependencies": { + "@babel/types": "^7.21.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", + "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.21.5.tgz", + "integrity": "sha512-5pTUx3hAJaZIdW99sJ6ZUUgWq/Y+Hja7TowEnLNMm1VivRgZQL3vpBY3qUACVsvw+yQU6+YgfBVmcbLaZtrA1w==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz", + "integrity": "sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.21.5.tgz", + "integrity": "sha512-BSY+JSlHxOmGsPTydUkPf1MdMQ3M81x5xGCOVgWM3G8XH77sJ292Y2oqcp0CbbgxhqBuI46iUz1tT7hqP7EfgA==", + "dependencies": { + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.21.5", + "@babel/types": "^7.21.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", + "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "dependencies": { + "@babel/helper-validator-identifier": "^7.18.6", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/parser": { + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.5.tgz", + "integrity": "sha512-J+IxH2IsxV4HbnTrSWgMAQj0UEo61hDA4Ny8h8PCX0MLXiibqHbqIOVneqdocemSBc22VpBKxt4J6FQzy9HarQ==", + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.21.4.tgz", + "integrity": "sha512-5hewiLct5OKyh6PLKEYaFclcqtIgCb6bmELouxjF6up5q3Sov7rOayW4RwhbaBL0dit8rA80GNfY+UuDp2mBbQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.21.4.tgz", + "integrity": "sha512-xz0D39NvhQn4t4RNsHmDnnsaQizIlUkdtYvLs8La1BlfjQ6JEwxkJGeqJMW2tAXx+q6H+WFuUTXNdYVpEya0YA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", + "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", + "dependencies": { + "@babel/code-frame": "^7.18.6", + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.5.tgz", + "integrity": "sha512-AhQoI3YjWi6u/y/ntv7k48mcrCXmus0t79J9qPNlk/lAsFlCiJ047RmbfMOawySTHtywXhbXgpx/8nXMYd+oFw==", + "dependencies": { + "@babel/code-frame": "^7.21.4", + "@babel/generator": "^7.21.5", + "@babel/helper-environment-visitor": "^7.21.5", + "@babel/helper-function-name": "^7.21.0", + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/parser": "^7.21.5", + "@babel/types": "^7.21.5", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.5.tgz", + "integrity": "sha512-m4AfNvVF2mVC/F7fDEdH2El3HzUg9It/XsCxZiOTTA3m3qYfcSVSbTfM6Q9xG+hYDniZssYhlXKKUMD5m8tF4Q==", + "dependencies": { + "@babel/helper-string-parser": "^7.21.5", + "@babel/helper-validator-identifier": "^7.19.1", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==" + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.5.0.tgz", + "integrity": "sha512-NEpkObxPwyw/XxZVLPmAGKE89IQRp4puc6IQRPru6JKd1M3fW9v1xM1AnzIJE65hbCkzQAdnL8P47e9hzhiYLQ==", + "dependencies": { + "@jest/types": "^29.5.0", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^29.5.0", + "jest-util": "^29.5.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/core": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.5.0.tgz", + "integrity": "sha512-28UzQc7ulUrOQw1IsN/kv1QES3q2kkbl/wGslyhAclqZ/8cMdB5M68BffkIdSJgKBUt50d3hbwJ92XESlE7LiQ==", + "dependencies": { + "@jest/console": "^29.5.0", + "@jest/reporters": "^29.5.0", + "@jest/test-result": "^29.5.0", + "@jest/transform": "^29.5.0", + "@jest/types": "^29.5.0", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^29.5.0", + "jest-config": "^29.5.0", + "jest-haste-map": "^29.5.0", + "jest-message-util": "^29.5.0", + "jest-regex-util": "^29.4.3", + "jest-resolve": "^29.5.0", + "jest-resolve-dependencies": "^29.5.0", + "jest-runner": "^29.5.0", + "jest-runtime": "^29.5.0", + "jest-snapshot": "^29.5.0", + "jest-util": "^29.5.0", + "jest-validate": "^29.5.0", + "jest-watcher": "^29.5.0", + "micromatch": "^4.0.4", + "pretty-format": "^29.5.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/environment": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.5.0.tgz", + "integrity": "sha512-5FXw2+wD29YU1d4I2htpRX7jYnAyTRjP2CsXQdo9SAM8g3ifxWPSV0HnClSn71xwctr0U3oZIIH+dtbfmnbXVQ==", + "dependencies": { + "@jest/fake-timers": "^29.5.0", + "@jest/types": "^29.5.0", + "@types/node": "*", + "jest-mock": "^29.5.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.5.0.tgz", + "integrity": "sha512-PueDR2HGihN3ciUNGr4uelropW7rqUfTiOn+8u0leg/42UhblPxHkfoh0Ruu3I9Y1962P3u2DY4+h7GVTSVU6g==", + "dependencies": { + "expect": "^29.5.0", + "jest-snapshot": "^29.5.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect-utils": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.5.0.tgz", + "integrity": "sha512-fmKzsidoXQT2KwnrwE0SQq3uj8Z763vzR8LnLBwC2qYWEFpjX8daRsk6rHUM1QvNlEW/UJXNXm59ztmJJWs2Mg==", + "dependencies": { + "jest-get-type": "^29.4.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/fake-timers": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.5.0.tgz", + "integrity": "sha512-9ARvuAAQcBwDAqOnglWq2zwNIRUDtk/SCkp/ToGEhFv5r86K21l+VEs0qNTaXtyiY0lEePl3kylijSYJQqdbDg==", + "dependencies": { + "@jest/types": "^29.5.0", + "@sinonjs/fake-timers": "^10.0.2", + "@types/node": "*", + "jest-message-util": "^29.5.0", + "jest-mock": "^29.5.0", + "jest-util": "^29.5.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/globals": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.5.0.tgz", + "integrity": "sha512-S02y0qMWGihdzNbUiqSAiKSpSozSuHX5UYc7QbnHP+D9Lyw8DgGGCinrN9uSuHPeKgSSzvPom2q1nAtBvUsvPQ==", + "dependencies": { + "@jest/environment": "^29.5.0", + "@jest/expect": "^29.5.0", + "@jest/types": "^29.5.0", + "jest-mock": "^29.5.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/reporters": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.5.0.tgz", + "integrity": "sha512-D05STXqj/M8bP9hQNSICtPqz97u7ffGzZu+9XLucXhkOFBqKcXe04JLZOgIekOxdb73MAoBUFnqvf7MCpKk5OA==", + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^29.5.0", + "@jest/test-result": "^29.5.0", + "@jest/transform": "^29.5.0", + "@jest/types": "^29.5.0", + "@jridgewell/trace-mapping": "^0.3.15", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^5.1.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "^29.5.0", + "jest-util": "^29.5.0", + "jest-worker": "^29.5.0", + "slash": "^3.0.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0", + "v8-to-istanbul": "^9.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/schemas": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.4.3.tgz", + "integrity": "sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg==", + "dependencies": { + "@sinclair/typebox": "^0.25.16" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/source-map": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.4.3.tgz", + "integrity": "sha512-qyt/mb6rLyd9j1jUts4EQncvS6Yy3PM9HghnNv86QBlV+zdL2inCdK1tuVlL+J+lpiw2BI67qXOrX3UurBqQ1w==", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.15", + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-result": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.5.0.tgz", + "integrity": "sha512-fGl4rfitnbfLsrfx1uUpDEESS7zM8JdgZgOCQuxQvL1Sn/I6ijeAVQWGfXI9zb1i9Mzo495cIpVZhA0yr60PkQ==", + "dependencies": { + "@jest/console": "^29.5.0", + "@jest/types": "^29.5.0", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-sequencer": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.5.0.tgz", + "integrity": "sha512-yPafQEcKjkSfDXyvtgiV4pevSeyuA6MQr6ZIdVkWJly9vkqjnFfcfhRQqpD5whjoU8EORki752xQmjaqoFjzMQ==", + "dependencies": { + "@jest/test-result": "^29.5.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.5.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/transform": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.5.0.tgz", + "integrity": "sha512-8vbeZWqLJOvHaDfeMuoHITGKSz5qWc9u04lnWrQE3VyuSw604PzQM824ZeX9XSjUCeDiE3GuxZe5UKa8J61NQw==", + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/types": "^29.5.0", + "@jridgewell/trace-mapping": "^0.3.15", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.5.0", + "jest-regex-util": "^29.4.3", + "jest-util": "^29.5.0", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/types": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.5.0.tgz", + "integrity": "sha512-qbu7kN6czmVRc3xWFQcAN03RAUamgppVUdXrvl1Wr3jlNF93o9mJbGcDWrwGB6ht44u7efB1qCFgVQmca24Uog==", + "dependencies": { + "@jest/schemas": "^29.4.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.18", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", + "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", + "dependencies": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + }, + "node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" + }, + "node_modules/@sinclair/typebox": { + "version": "0.25.24", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.24.tgz", + "integrity": "sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==" + }, + "node_modules/@sinonjs/commons": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz", + "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==", + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.0.2.tgz", + "integrity": "sha512-SwUDyjWnah1AaNl7kxsa7cfLhlTYoiyhDAIgyh+El30YvXs/o7OLXpYH88Zdhyx9JExKrmHDJ+10bwIcY80Jmw==", + "dependencies": { + "@sinonjs/commons": "^2.0.0" + } + }, + "node_modules/@types/babel__core": { + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.0.tgz", + "integrity": "sha512-+n8dL/9GWblDO0iU6eZAwEIJVr5DWigtle+Q6HLOrh/pdbXOhOtqzq8VPPE2zvNJzSKY4vH/z3iT3tn0A3ypiQ==", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.6.4", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", + "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", + "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.18.5", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.5.tgz", + "integrity": "sha512-enCvTL8m/EHS/zIvJno9nE+ndYPh1/oNFzRYRmtUqJICG2VnCSBzMLW5VN2KCQU91f23tsNKR8v7VJJQMatl7Q==", + "dependencies": { + "@babel/types": "^7.3.0" + } + }, + "node_modules/@types/graceful-fs": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.6.tgz", + "integrity": "sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", + "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==" + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", + "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/node": { + "version": "18.16.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.16.3.tgz", + "integrity": "sha512-OPs5WnnT1xkCBiuQrZA4+YAV4HEJejmHneyraIaxsbev5yCEr6KMwINNFP9wQeFIw8FWcoTqF3vQsa5CDaI+8Q==" + }, + "node_modules/@types/prettier": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.2.tgz", + "integrity": "sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg==" + }, + "node_modules/@types/stack-utils": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", + "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==" + }, + "node_modules/@types/yargs": { + "version": "17.0.24", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.24.tgz", + "integrity": "sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", + "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==" + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/babel-jest": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.5.0.tgz", + "integrity": "sha512-mA4eCDh5mSo2EcA9xQjVTpmbbNk32Zb3Q3QFQsNhaK56Q+yoXowzFodLux30HRgyOho5rsQ6B0P9QpMkvvnJ0Q==", + "dependencies": { + "@jest/transform": "^29.5.0", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^29.5.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.8.0" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-jest-hoist": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.5.0.tgz", + "integrity": "sha512-zSuuuAlTMT4mzLj2nPnUm6fsE6270vdOfnpbJ+RmruU75UhLFvL0N2NgI7xpeS7NaB6hGqmd5pVpGTDYvi4Q3w==", + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.1.14", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/babel-preset-current-node-syntax": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", + "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.8.3", + "@babel/plugin-syntax-import-meta": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-top-level-await": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/babel-preset-jest": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.5.0.tgz", + "integrity": "sha512-JOMloxOqdiBSxMAzjRaH023/vvcaSaec49zvg+2LmNsktC7ei39LTJGw02J+9uUtTZUq6xbLyJ4dxe9sSmIuAg==", + "dependencies": { + "babel-plugin-jest-hoist": "^29.5.0", + "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.21.5", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", + "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001449", + "electron-to-chromium": "^1.4.284", + "node-releases": "^2.0.8", + "update-browserslist-db": "^1.0.10" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001481", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001481.tgz", + "integrity": "sha512-KCqHwRnaa1InZBtqXzP98LPg0ajCVujMKjqKDhZEthIpAsJl/YEIa3YvXjGXPVqzZVguccuu7ga9KOE1J9rKPQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "engines": { + "node": ">=10" + } + }, + "node_modules/ci-info": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", + "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "engines": { + "node": ">=8" + } + }, + "node_modules/cjs-module-lexer": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz", + "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==" + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/collect-v8-coverage": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", + "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==" + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/dedent": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==" + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/diff-sequences": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.4.3.tgz", + "integrity": "sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.4.377", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.377.tgz", + "integrity": "sha512-H3BYG6DW5Z+l0xcfXaicJGxrpA4kMlCxnN71+iNX+dBLkRMOdVJqFJiAmbNZZKA1zISpRg17JR03qGifXNsJtw==" + }, + "node_modules/emittery": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expect": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.5.0.tgz", + "integrity": "sha512-yM7xqUrCO2JdpFo4XpM82t+PJBFybdqoQuJLDGeDX2ij8NZzqRHyu3Hp188/JX7SWqud+7t4MUdvcgGBICMHZg==", + "dependencies": { + "@jest/expect-utils": "^29.5.0", + "jest-get-type": "^29.4.3", + "jest-matcher-utils": "^29.5.0", + "jest-message-util": "^29.5.0", + "jest-util": "^29.5.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "node_modules/fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==" + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/import-local": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" + }, + "node_modules/is-core-module": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.0.tgz", + "integrity": "sha512-RECHCBCd/viahWmwj6enj19sKbHfJrddi/6cBDsNTKbNq0f7VeaUkBo60BqzvPqo/W54ChS62Z5qyun7cfOMqQ==", + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-reports": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", + "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.5.0.tgz", + "integrity": "sha512-juMg3he2uru1QoXX078zTa7pO85QyB9xajZc6bU+d9yEGwrKX6+vGmJQ3UdVZsvTEUARIdObzH68QItim6OSSQ==", + "dependencies": { + "@jest/core": "^29.5.0", + "@jest/types": "^29.5.0", + "import-local": "^3.0.2", + "jest-cli": "^29.5.0" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-changed-files": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.5.0.tgz", + "integrity": "sha512-IFG34IUMUaNBIxjQXF/iu7g6EcdMrGRRxaUSw92I/2g2YC6vCdTltl4nHvt7Ci5nSJwXIkCu8Ka1DKF+X7Z1Ag==", + "dependencies": { + "execa": "^5.0.0", + "p-limit": "^3.1.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-circus": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.5.0.tgz", + "integrity": "sha512-gq/ongqeQKAplVxqJmbeUOJJKkW3dDNPY8PjhJ5G0lBRvu0e3EWGxGy5cI4LAGA7gV2UHCtWBI4EMXK8c9nQKA==", + "dependencies": { + "@jest/environment": "^29.5.0", + "@jest/expect": "^29.5.0", + "@jest/test-result": "^29.5.0", + "@jest/types": "^29.5.0", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^0.7.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^29.5.0", + "jest-matcher-utils": "^29.5.0", + "jest-message-util": "^29.5.0", + "jest-runtime": "^29.5.0", + "jest-snapshot": "^29.5.0", + "jest-util": "^29.5.0", + "p-limit": "^3.1.0", + "pretty-format": "^29.5.0", + "pure-rand": "^6.0.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-cli": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.5.0.tgz", + "integrity": "sha512-L1KcP1l4HtfwdxXNFCL5bmUbLQiKrakMUriBEcc1Vfz6gx31ORKdreuWvmQVBit+1ss9NNR3yxjwfwzZNdQXJw==", + "dependencies": { + "@jest/core": "^29.5.0", + "@jest/test-result": "^29.5.0", + "@jest/types": "^29.5.0", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "import-local": "^3.0.2", + "jest-config": "^29.5.0", + "jest-util": "^29.5.0", + "jest-validate": "^29.5.0", + "prompts": "^2.0.1", + "yargs": "^17.3.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-config": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.5.0.tgz", + "integrity": "sha512-kvDUKBnNJPNBmFFOhDbm59iu1Fii1Q6SxyhXfvylq3UTHbg6o7j/g8k2dZyXWLvfdKB1vAPxNZnMgtKJcmu3kA==", + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/test-sequencer": "^29.5.0", + "@jest/types": "^29.5.0", + "babel-jest": "^29.5.0", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-circus": "^29.5.0", + "jest-environment-node": "^29.5.0", + "jest-get-type": "^29.4.3", + "jest-regex-util": "^29.4.3", + "jest-resolve": "^29.5.0", + "jest-runner": "^29.5.0", + "jest-util": "^29.5.0", + "jest-validate": "^29.5.0", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^29.5.0", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@types/node": "*", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/jest-diff": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.5.0.tgz", + "integrity": "sha512-LtxijLLZBduXnHSniy0WMdaHjmQnt3g5sa16W4p0HqukYTTsyTW3GD1q41TyGl5YFXj/5B2U6dlh5FM1LIMgxw==", + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^29.4.3", + "jest-get-type": "^29.4.3", + "pretty-format": "^29.5.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-docblock": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.4.3.tgz", + "integrity": "sha512-fzdTftThczeSD9nZ3fzA/4KkHtnmllawWrXO69vtI+L9WjEIuXWs4AmyME7lN5hU7dB0sHhuPfcKofRsUb/2Fg==", + "dependencies": { + "detect-newline": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-each": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.5.0.tgz", + "integrity": "sha512-HM5kIJ1BTnVt+DQZ2ALp3rzXEl+g726csObrW/jpEGl+CDSSQpOJJX2KE/vEg8cxcMXdyEPu6U4QX5eruQv5hA==", + "dependencies": { + "@jest/types": "^29.5.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.4.3", + "jest-util": "^29.5.0", + "pretty-format": "^29.5.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-environment-node": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.5.0.tgz", + "integrity": "sha512-ExxuIK/+yQ+6PRGaHkKewYtg6hto2uGCgvKdb2nfJfKXgZ17DfXjvbZ+jA1Qt9A8EQSfPnt5FKIfnOO3u1h9qw==", + "dependencies": { + "@jest/environment": "^29.5.0", + "@jest/fake-timers": "^29.5.0", + "@jest/types": "^29.5.0", + "@types/node": "*", + "jest-mock": "^29.5.0", + "jest-util": "^29.5.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-get-type": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.4.3.tgz", + "integrity": "sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg==", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-haste-map": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.5.0.tgz", + "integrity": "sha512-IspOPnnBro8YfVYSw6yDRKh/TiCdRngjxeacCps1cQ9cgVN6+10JUcuJ1EabrgYLOATsIAigxA0rLR9x/YlrSA==", + "dependencies": { + "@jest/types": "^29.5.0", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^29.4.3", + "jest-util": "^29.5.0", + "jest-worker": "^29.5.0", + "micromatch": "^4.0.4", + "walker": "^1.0.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/jest-leak-detector": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.5.0.tgz", + "integrity": "sha512-u9YdeeVnghBUtpN5mVxjID7KbkKE1QU4f6uUwuxiY0vYRi9BUCLKlPEZfDGR67ofdFmDz9oPAy2G92Ujrntmow==", + "dependencies": { + "jest-get-type": "^29.4.3", + "pretty-format": "^29.5.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-matcher-utils": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.5.0.tgz", + "integrity": "sha512-lecRtgm/rjIK0CQ7LPQwzCs2VwW6WAahA55YBuI+xqmhm7LAaxokSB8C97yJeYyT+HvQkH741StzpU41wohhWw==", + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^29.5.0", + "jest-get-type": "^29.4.3", + "pretty-format": "^29.5.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-message-util": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.5.0.tgz", + "integrity": "sha512-Kijeg9Dag6CKtIDA7O21zNTACqD5MD/8HfIV8pdD94vFyFuer52SigdC3IQMhab3vACxXMiFk+yMHNdbqtyTGA==", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.5.0", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.5.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-mock": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.5.0.tgz", + "integrity": "sha512-GqOzvdWDE4fAV2bWQLQCkujxYWL7RxjCnj71b5VhDAGOevB3qj3Ovg26A5NI84ZpODxyzaozXLOh2NCgkbvyaw==", + "dependencies": { + "@jest/types": "^29.5.0", + "@types/node": "*", + "jest-util": "^29.5.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-pnp-resolver": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } + }, + "node_modules/jest-regex-util": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.4.3.tgz", + "integrity": "sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg==", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.5.0.tgz", + "integrity": "sha512-1TzxJ37FQq7J10jPtQjcc+MkCkE3GBpBecsSUWJ0qZNJpmg6m0D9/7II03yJulm3H/fvVjgqLh/k2eYg+ui52w==", + "dependencies": { + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.5.0", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^29.5.0", + "jest-validate": "^29.5.0", + "resolve": "^1.20.0", + "resolve.exports": "^2.0.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve-dependencies": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.5.0.tgz", + "integrity": "sha512-sjV3GFr0hDJMBpYeUuGduP+YeCRbd7S/ck6IvL3kQ9cpySYKqcqhdLLC2rFwrcL7tz5vYibomBrsFYWkIGGjOg==", + "dependencies": { + "jest-regex-util": "^29.4.3", + "jest-snapshot": "^29.5.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runner": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.5.0.tgz", + "integrity": "sha512-m7b6ypERhFghJsslMLhydaXBiLf7+jXy8FwGRHO3BGV1mcQpPbwiqiKUR2zU2NJuNeMenJmlFZCsIqzJCTeGLQ==", + "dependencies": { + "@jest/console": "^29.5.0", + "@jest/environment": "^29.5.0", + "@jest/test-result": "^29.5.0", + "@jest/transform": "^29.5.0", + "@jest/types": "^29.5.0", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^29.4.3", + "jest-environment-node": "^29.5.0", + "jest-haste-map": "^29.5.0", + "jest-leak-detector": "^29.5.0", + "jest-message-util": "^29.5.0", + "jest-resolve": "^29.5.0", + "jest-runtime": "^29.5.0", + "jest-util": "^29.5.0", + "jest-watcher": "^29.5.0", + "jest-worker": "^29.5.0", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runtime": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.5.0.tgz", + "integrity": "sha512-1Hr6Hh7bAgXQP+pln3homOiEZtCDZFqwmle7Ew2j8OlbkIu6uE3Y/etJQG8MLQs3Zy90xrp2C0BRrtPHG4zryw==", + "dependencies": { + "@jest/environment": "^29.5.0", + "@jest/fake-timers": "^29.5.0", + "@jest/globals": "^29.5.0", + "@jest/source-map": "^29.4.3", + "@jest/test-result": "^29.5.0", + "@jest/transform": "^29.5.0", + "@jest/types": "^29.5.0", + "@types/node": "*", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.5.0", + "jest-message-util": "^29.5.0", + "jest-mock": "^29.5.0", + "jest-regex-util": "^29.4.3", + "jest-resolve": "^29.5.0", + "jest-snapshot": "^29.5.0", + "jest-util": "^29.5.0", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-snapshot": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.5.0.tgz", + "integrity": "sha512-x7Wolra5V0tt3wRs3/ts3S6ciSQVypgGQlJpz2rsdQYoUKxMxPNaoHMGJN6qAuPJqS+2iQ1ZUn5kl7HCyls84g==", + "dependencies": { + "@babel/core": "^7.11.6", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-jsx": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/traverse": "^7.7.2", + "@babel/types": "^7.3.3", + "@jest/expect-utils": "^29.5.0", + "@jest/transform": "^29.5.0", + "@jest/types": "^29.5.0", + "@types/babel__traverse": "^7.0.6", + "@types/prettier": "^2.1.5", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^29.5.0", + "graceful-fs": "^4.2.9", + "jest-diff": "^29.5.0", + "jest-get-type": "^29.4.3", + "jest-matcher-utils": "^29.5.0", + "jest-message-util": "^29.5.0", + "jest-util": "^29.5.0", + "natural-compare": "^1.4.0", + "pretty-format": "^29.5.0", + "semver": "^7.3.5" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-snapshot/node_modules/semver": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.0.tgz", + "integrity": "sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-snapshot/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/jest-util": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.5.0.tgz", + "integrity": "sha512-RYMgG/MTadOr5t8KdhejfvUU82MxsCu5MF6KuDUHl+NuwzUt+Sm6jJWxTJVrDR1j5M/gJVCPKQEpWXY+yIQ6lQ==", + "dependencies": { + "@jest/types": "^29.5.0", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.5.0.tgz", + "integrity": "sha512-pC26etNIi+y3HV8A+tUGr/lph9B18GnzSRAkPaaZJIE1eFdiYm6/CewuiJQ8/RlfHd1u/8Ioi8/sJ+CmbA+zAQ==", + "dependencies": { + "@jest/types": "^29.5.0", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.4.3", + "leven": "^3.1.0", + "pretty-format": "^29.5.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-watcher": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.5.0.tgz", + "integrity": "sha512-KmTojKcapuqYrKDpRwfqcQ3zjMlwu27SYext9pt4GlF5FUgB+7XE1mcCnSm6a4uUpFyQIkb6ZhzZvHl+jiBCiA==", + "dependencies": { + "@jest/test-result": "^29.5.0", + "@jest/types": "^29.5.0", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "jest-util": "^29.5.0", + "string-length": "^4.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.5.0.tgz", + "integrity": "sha512-NcrQnevGoSp4b5kg+akIpthoAFHxPBcb5P6mYPY0fUNT+sSvmtu6jlkEle3anczUKIKEbMxFimk9oTP/tpIPgA==", + "dependencies": { + "@types/node": "*", + "jest-util": "^29.5.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "engines": { + "node": ">=6" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "engines": { + "node": ">=6" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "dependencies": { + "tmpl": "1.0.5" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==" + }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==" + }, + "node_modules/node-releases": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz", + "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==" + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-locate/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pirates": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", + "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pretty-format": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz", + "integrity": "sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==", + "dependencies": { + "@jest/schemas": "^29.4.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/pure-rand": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.2.tgz", + "integrity": "sha512-6Yg0ekpKICSjPswYOuC5sku/TSWaRYlA0qsXqJgM/d/4pLPHPuTxK7Nbf7jFKzAeedUhR8C7K9Uv63FBsSo8xQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ] + }, + "node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", + "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", + "dependencies": { + "is-core-module": "^2.11.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve.exports": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", + "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", + "engines": { + "node": ">=10" + } + }, + "node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" + }, + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==" + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", + "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/v8-to-istanbul": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz", + "integrity": "sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/v8-to-istanbul/node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" + }, + "node_modules/walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "dependencies": { + "makeerror": "1.0.12" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "node_modules/write-file-atomic": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "engines": { + "node": ">=12" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 000000000..56a94404c --- /dev/null +++ b/package.json @@ -0,0 +1,18 @@ +{ + "name": "bowling-challenge", + "version": "1.0.0", + "description": "Bowling Challenge =================", + "main": "index.js", + "directories": { + "doc": "docs" + }, + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "keywords": [], + "author": "", + "license": "ISC", + "dependencies": { + "jest": "^29.5.0" + } +} From 542cc5349d7a59914ec353080e22881375877c78 Mon Sep 17 00:00:00 2001 From: Tom Carmichael-Mhanna Date: Sat, 29 Apr 2023 19:08:58 +0100 Subject: [PATCH 02/13] Test drive constructor method for Frame class --- frame.js | 7 +++++++ frame.test.js | 13 +++++++++++++ 2 files changed, 20 insertions(+) create mode 100644 frame.js create mode 100644 frame.test.js diff --git a/frame.js b/frame.js new file mode 100644 index 000000000..513fa9ce7 --- /dev/null +++ b/frame.js @@ -0,0 +1,7 @@ +class Frame { + constructor() { + this.rolls = []; + this.bonus_points = 0; + } +} +module.exports = Frame; diff --git a/frame.test.js b/frame.test.js new file mode 100644 index 000000000..4a1509c04 --- /dev/null +++ b/frame.test.js @@ -0,0 +1,13 @@ +const Frame = require('./frame'); + +describe('Frame', () => { + it('initliases with empty array this.rolls', () => { + frame = new Frame(); + expect(frame.rolls).toEqual([]); + }) + + it('initliases with a bonus points value of 0', () => { + frame = new Frame(); + expect(frame.bonus_points).toEqual(0); + }) +}) \ No newline at end of file From d5b2ab37332f7c5b47d427f3940c085e5f0300ca Mon Sep 17 00:00:00 2001 From: Tom Carmichael-Mhanna Date: Sat, 29 Apr 2023 21:15:21 +0100 Subject: [PATCH 03/13] Further test driving of Frame class --- frame.js | 29 +++++++++++++++++++++- frame.test.js | 67 ++++++++++++++++++++++++++++++++++++++++++--------- game.test.js | 6 +++++ 3 files changed, 90 insertions(+), 12 deletions(-) create mode 100644 game.test.js diff --git a/frame.js b/frame.js index 513fa9ce7..02bb3b72e 100644 --- a/frame.js +++ b/frame.js @@ -1,7 +1,34 @@ class Frame { - constructor() { + // default value of false given to indicate it is not the final frame + constructor(is_final_frame = false) { this.rolls = []; this.bonus_points = 0; + this.is_final_frame = is_final_frame; + } + + sum_rolls() { + let sum = 0; + for(let i = 0; i < this.roll.length; i++) { + sum += this.rolls[i]; + } + return sum + } + + roll(points) { + if(this.rolls.length == 2) { + return 'Frame has already been played'; + // check for invalid scores being inputted + } else if(points < 0 || points > 10 || (this.sum_rolls() + points) > 10) { + return 'Invalid roll score'; + } + else { + this.rolls.push(points); + // If player bowled a strike on first shot, set the 2nd roll to 0 so that the frame is ended early. + if(points == 10 && this.rolls.length == 1) { + this.rolls.push(0); + }; + } + } } module.exports = Frame; diff --git a/frame.test.js b/frame.test.js index 4a1509c04..ddfc7da75 100644 --- a/frame.test.js +++ b/frame.test.js @@ -1,13 +1,58 @@ const Frame = require('./frame'); -describe('Frame', () => { - it('initliases with empty array this.rolls', () => { - frame = new Frame(); - expect(frame.rolls).toEqual([]); - }) - - it('initliases with a bonus points value of 0', () => { - frame = new Frame(); - expect(frame.bonus_points).toEqual(0); - }) -}) \ No newline at end of file +describe('Frame class unit test', () => { + describe('constructor', () => { + it('initliases with empty array this.rolls', () => { + frame = new Frame(); + expect(frame.rolls).toEqual([]); + }) + + it('initliases with a bonus points value of 0', () => { + frame = new Frame(); + expect(frame.bonus_points).toEqual(0); + }) + + it('initliases with a boolean arg indicating whether it is the final frame', () => { + frame = new Frame(false); + expect(frame.is_final_frame).toEqual(false); + frame = new Frame(); + expect(frame.is_final_frame).toEqual(false); + frame = new Frame(true); + expect(frame.is_final_frame).toEqual(true); + }); + }); + + describe('.roll', () => { + describe('in non-final frame', () => { + it('adds roll score to this.rolls', () => { + frame = new Frame(); + frame.roll(5); + expect(frame.rolls[0]).toEqual(5); + expect(frame.rolls.length).toEqual(1); + }); + + it('refuses to add a roll if two have already been scored', () => { + frame = new Frame(); + frame.roll(5); + frame.roll(3); + expect(frame.roll(6)).toEqual('Frame has already been played'); + expect(frame.rolls).toEqual([5, 3]); + }); + + it('returns error message given an invalid roll score', () => { + frame = new Frame(); + expect(frame.roll(13)).toEqual('Invalid roll score'); + expect(frame.roll(-5)).toEqual('Invalid roll score'); + frame.roll(5); + expect(frame.roll(7)).toEqual('Invalid roll score'); + }); + + it('ends the frame early if player gets a strike on first shot', () => { + frame = new Frame(); + frame.roll(10); + expect(frame.roll(5)).toEqual('Frame has already been played'); + expect(frame.rolls).toEqual([10, 0]); + }); + }); + }); +}); diff --git a/game.test.js b/game.test.js new file mode 100644 index 000000000..2ee63ee34 --- /dev/null +++ b/game.test.js @@ -0,0 +1,6 @@ +const Game = require('./game'); +const Frame = require('/frame'); + +jest.mock('./frame.js'); + +describe('Game class unit test', ) \ No newline at end of file From 5fa09dbb3bb8256edb2f4824fc9f26df82af016c Mon Sep 17 00:00:00 2001 From: Tom Carmichael-Mhanna Date: Sat, 29 Apr 2023 21:53:47 +0100 Subject: [PATCH 04/13] Test drive Game class intialising with array of frames --- game.js | 16 ++++++++++++++++ game.test.js | 19 +++++++++++++++++-- 2 files changed, 33 insertions(+), 2 deletions(-) create mode 100644 game.js diff --git a/game.js b/game.js new file mode 100644 index 000000000..308731328 --- /dev/null +++ b/game.js @@ -0,0 +1,16 @@ +class Game { + constructor(frameClass) { + this.frames = []; + for(let i = 0; i < 9; i++) { + // Create 9 frames that are not the final frame + let frame = new frameClass(false); + this.frames.push(frame); + } + // create and push the final frame to the frames array + let final_frame = new frameClass(true); + this.frames.push(final_frame); + + } +} + +module.exports = Game; \ No newline at end of file diff --git a/game.test.js b/game.test.js index 2ee63ee34..fefcb6c38 100644 --- a/game.test.js +++ b/game.test.js @@ -1,6 +1,21 @@ const Game = require('./game'); -const Frame = require('/frame'); +const Frame = require('./frame'); jest.mock('./frame.js'); -describe('Game class unit test', ) \ No newline at end of file +describe('Game class unit test', () => { + beforeEach(() => { + Frame.mockClear(); + }) + describe('constructor', () => { + it('initializes with an array of 10 frames', () => { + const mockFrameClass = jest.fn(); + + let game = new Game(mockFrameClass); + expect(mockFrameClass).toHaveBeenCalledTimes(10); + expect(mockFrameClass.mock.calls[0][0]).toBe(false); + expect(mockFrameClass.mock.calls[9][0]).toBe(true); + expect(game.frames.length).toEqual(10); + }) + }) +} ) \ No newline at end of file From 43483ba4f9273f3b634c019ef2fdaa5c026dfbd0 Mon Sep 17 00:00:00 2001 From: Tom Carmichael-Mhanna Date: Sat, 29 Apr 2023 22:48:36 +0100 Subject: [PATCH 05/13] Continued test driving Game class and refactored Frame --- frame.js | 27 +++++++++++---------------- frame.test.js | 16 +++++++++------- game.js | 44 +++++++++++++++++++++++++++++++++++++++++++- game.test.js | 25 +++++++++++++++++++++---- 4 files changed, 84 insertions(+), 28 deletions(-) diff --git a/frame.js b/frame.js index 02bb3b72e..207a10c8d 100644 --- a/frame.js +++ b/frame.js @@ -1,32 +1,27 @@ class Frame { // default value of false given to indicate it is not the final frame - constructor(is_final_frame = false) { + constructor(isFinalFrame = false) { this.rolls = []; - this.bonus_points = 0; - this.is_final_frame = is_final_frame; - } - - sum_rolls() { - let sum = 0; - for(let i = 0; i < this.roll.length; i++) { - sum += this.rolls[i]; - } - return sum + this.regularPoints = 0; + this.bonusPoints = 0; + this.isFinalFrame = isFinalFrame; } roll(points) { - if(this.rolls.length == 2) { - return 'Frame has already been played'; + // check if frame has already ended (including by strike on first roll - see below) + if (this.rolls.length == 2) { + return 'Frame is over'; // check for invalid scores being inputted - } else if(points < 0 || points > 10 || (this.sum_rolls() + points) > 10) { + } else if(points < 0 || points > 10 || (this.regularPoints + points) > 10) { return 'Invalid roll score'; } else { this.rolls.push(points); + this.regularPoints += points; // If player bowled a strike on first shot, set the 2nd roll to 0 so that the frame is ended early. - if(points == 10 && this.rolls.length == 1) { + if (points == 10 && this.rolls.length == 1) { this.rolls.push(0); - }; + } } } diff --git a/frame.test.js b/frame.test.js index ddfc7da75..a3aaf7c4e 100644 --- a/frame.test.js +++ b/frame.test.js @@ -7,18 +7,20 @@ describe('Frame class unit test', () => { expect(frame.rolls).toEqual([]); }) - it('initliases with a bonus points value of 0', () => { + it('initliases with bonus points & regular points values of 0', () => { frame = new Frame(); - expect(frame.bonus_points).toEqual(0); + expect(frame.bonusPoints).toEqual(0); + expect(frame.regularPoints).toEqual(0); + }) it('initliases with a boolean arg indicating whether it is the final frame', () => { frame = new Frame(false); - expect(frame.is_final_frame).toEqual(false); + expect(frame.isFinalFrame).toEqual(false); frame = new Frame(); - expect(frame.is_final_frame).toEqual(false); + expect(frame.isFinalFrame).toEqual(false); frame = new Frame(true); - expect(frame.is_final_frame).toEqual(true); + expect(frame.isFinalFrame).toEqual(true); }); }); @@ -35,7 +37,7 @@ describe('Frame class unit test', () => { frame = new Frame(); frame.roll(5); frame.roll(3); - expect(frame.roll(6)).toEqual('Frame has already been played'); + expect(frame.roll(6)).toEqual('Frame is over'); expect(frame.rolls).toEqual([5, 3]); }); @@ -50,7 +52,7 @@ describe('Frame class unit test', () => { it('ends the frame early if player gets a strike on first shot', () => { frame = new Frame(); frame.roll(10); - expect(frame.roll(5)).toEqual('Frame has already been played'); + expect(frame.roll(5)).toEqual('Frame is over'); expect(frame.rolls).toEqual([10, 0]); }); }); diff --git a/game.js b/game.js index 308731328..55e2c4762 100644 --- a/game.js +++ b/game.js @@ -1,5 +1,6 @@ class Game { constructor(frameClass) { + this.grandTotal = 0; this.frames = []; for(let i = 0; i < 9; i++) { // Create 9 frames that are not the final frame @@ -11,6 +12,47 @@ class Game { this.frames.push(final_frame); } + + play() { + // for loop 10 times, frame.roll twice + // if the previous frame was a half strike, update the bonus points + // if the previous frame was a strike + // handle the final frame differently + // should this call a .play function in the frame class? + } + + scoreBoard() { + // look to refactor this function, creating small functions that return bools re: bonus points pending + // second arg to .map is the index of the iteration + this.frames.map((frame, index) => { + let frameInfo = `Frame ${index}: Shot 1 =>` + // concatenate the score from first roll if it has been scored, else default to 0 + frameInfo += frame.rolls.length ? frame.rolls[0] : 0; + frameInfo += 'Shot 2 => ' + // concatenate the score from 2nd roll if it has been scored, else default to 0 + frameInfo += frame.rolls.length === 2 ? frame.rolls[1] : 0; + frameInfo += 'FRAME TOTAL == ' + // if player rolled a strike + if(frame.rolls.includes(10)) { + // if the next frame hasn't had to rolls nor finished early because of a strike + if (this.frames[index + 1].rolls.length < 2 && !this.frames[index + 1].rolls.includes(10) ) { + frameInfo += '*pending*'; + // if the next frame finished early because of a strike but the subsequent roll hasnt yet beeen taken + // modify this to handle the penultimate frame + } else if (this.frames[index + 1].rolls.length == 1 && !this.frames[index + 2].rolls ) { + frameInfo += '*pending*'; + // else boinus points must havfe been allocated already + } else { + frameInfo += (frame.regularPoints + frame.bonusPoints); + } + // if they scored a half strike check if the next roll has been taken + } else if (frame.regularPoints == 10 && !this.frames[index + 1].rolls.length) { + frameInfo += '*pending*'; + } else { + frameInfo += (frame.regularPoints + frame.bonusPoints); + }; + }) + } } -module.exports = Game; \ No newline at end of file +module.exports = Game; diff --git a/game.test.js b/game.test.js index fefcb6c38..92870bb1a 100644 --- a/game.test.js +++ b/game.test.js @@ -7,15 +7,32 @@ describe('Game class unit test', () => { beforeEach(() => { Frame.mockClear(); }) + describe('constructor', () => { it('initializes with an array of 10 frames', () => { const mockFrameClass = jest.fn(); - let game = new Game(mockFrameClass); + expect(mockFrameClass).toHaveBeenCalledTimes(10); expect(mockFrameClass.mock.calls[0][0]).toBe(false); expect(mockFrameClass.mock.calls[9][0]).toBe(true); expect(game.frames.length).toEqual(10); - }) - }) -} ) \ No newline at end of file + }); + + it('initializes with a grand total score of 0', () => { + const mockFrameClass = jest.fn(); + let game = new Game(mockFrameClass); + expect(game.grandTotal).toEqual(0); + }); + + it('runs the game', () => { + + }); + + it('initializes with a grand total score of 0', () => { + const mockFrameClass = jest.fn(); + let game = new Game(mockFrameClass); + expect(game.grandTotal).toEqual(0); + }); + }); +}); From 7a4229a83d722c39ccb40a64fad5ac5ee00cd85f Mon Sep 17 00:00:00 2001 From: Tom Carmichael-Mhanna Date: Tue, 2 May 2023 09:49:05 +0100 Subject: [PATCH 06/13] Implemenet Game class with one failing unit test due to mock behaviour --- frame.js | 42 ++++++++++------- frame.test.js | 103 ++++++++++++++++++++++++++++-------------- game.js | 98 +++++++++++++++++++++------------------- game.test.js | 108 ++++++++++++++++++++++++++++++++++++++------ integration.test.js | 92 +++++++++++++++++++++++++++++++++++++ user_interface.js | 38 ++++++++++++++++ 6 files changed, 369 insertions(+), 112 deletions(-) create mode 100644 integration.test.js create mode 100644 user_interface.js diff --git a/frame.js b/frame.js index 207a10c8d..d77b52640 100644 --- a/frame.js +++ b/frame.js @@ -1,29 +1,37 @@ class Frame { - // default value of false given to indicate it is not the final frame - constructor(isFinalFrame = false) { + constructor() { this.rolls = []; this.regularPoints = 0; this.bonusPoints = 0; - this.isFinalFrame = isFinalFrame; - } + }; roll(points) { - // check if frame has already ended (including by strike on first roll - see below) - if (this.rolls.length == 2) { - return 'Frame is over'; + // check if frame has already ended + if (this.rolls.length == 2 || this.rolls.includes(10)) { + throw new Error('Tried to add points to a frame that is already over'); // check for invalid scores being inputted - } else if(points < 0 || points > 10 || (this.regularPoints + points) > 10) { - return 'Invalid roll score'; - } - else { + } else if(points < 0 || points > 10 ) { + throw new Error(`Tried to add an invalid roll score (${points})`); + } else if ((this.regularPoints + points) > 10) { + throw new Error(`Tried to add roll that would exceed max score in a frame (${this.regularPoints} + ${points})`); + } else { this.rolls.push(points); this.regularPoints += points; - // If player bowled a strike on first shot, set the 2nd roll to 0 so that the frame is ended early. - if (points == 10 && this.rolls.length == 1) { - this.rolls.push(0); - } - } - + }; + }; + // is this function necessary? This logic could be in Game + playFrame(points_array) { + points_array.forEach((points) => { + this.roll(points); + }); + } + + isStrike() { + return (this.rolls.includes(10) && this.rolls.length == 1 ? true : false); + } + + isSpare() { + return (this.regularPoints == 10 && this.rolls.length == 2 ? true : false); } } module.exports = Frame; diff --git a/frame.test.js b/frame.test.js index a3aaf7c4e..b9c417ee5 100644 --- a/frame.test.js +++ b/frame.test.js @@ -13,48 +13,85 @@ describe('Frame class unit test', () => { expect(frame.regularPoints).toEqual(0); }) - - it('initliases with a boolean arg indicating whether it is the final frame', () => { - frame = new Frame(false); - expect(frame.isFinalFrame).toEqual(false); - frame = new Frame(); - expect(frame.isFinalFrame).toEqual(false); - frame = new Frame(true); - expect(frame.isFinalFrame).toEqual(true); - }); }); describe('.roll', () => { - describe('in non-final frame', () => { - it('adds roll score to this.rolls', () => { - frame = new Frame(); - frame.roll(5); - expect(frame.rolls[0]).toEqual(5); - expect(frame.rolls.length).toEqual(1); - }); + it('adds roll score to this.rolls', () => { + frame = new Frame(); + frame.roll(5); + expect(frame.rolls[0]).toEqual(5); + expect(frame.rolls.length).toEqual(1); + frame.roll(5); + expect(frame.regularPoints).toEqual(10); + expect(frame.bonusPoints).toEqual(0); + }); - it('refuses to add a roll if two have already been scored', () => { + it('refuses to add a roll if two have already been scored', () => { + expect(() => { frame = new Frame(); frame.roll(5); frame.roll(3); - expect(frame.roll(6)).toEqual('Frame is over'); - expect(frame.rolls).toEqual([5, 3]); - }); + frame.roll(6) + }).toThrow('Tried to add points to a frame that is already over'); + }); - it('returns error message given an invalid roll score', () => { - frame = new Frame(); - expect(frame.roll(13)).toEqual('Invalid roll score'); - expect(frame.roll(-5)).toEqual('Invalid roll score'); - frame.roll(5); - expect(frame.roll(7)).toEqual('Invalid roll score'); - }); + it('refuses to add a roll if a strike was made on first roll=', () => { + frame = new Frame(); + frame.roll(10); + expect(() => frame.roll(6)).toThrow('Tried to add points to a frame that is already over'); + expect(frame.rolls).toEqual([10]); + }); - it('ends the frame early if player gets a strike on first shot', () => { - frame = new Frame(); - frame.roll(10); - expect(frame.roll(5)).toEqual('Frame is over'); - expect(frame.rolls).toEqual([10, 0]); - }); + it('returns error message given an invalid roll score', () => { + frame = new Frame(); + expect(() => frame.roll(13)).toThrow('Tried to add an invalid roll score (13)'); + expect(() => frame.roll(-5)).toThrow('Tried to add an invalid roll score (-5)'); + }); + + it('returns error message if roll would exceed max score in a frame', () => { + frame = new Frame(); + frame.roll(5); + expect(() => frame.roll(7)).toThrow('Tried to add roll that would exceed max score in a frame (5 + 7'); + }); + }); + + it('takes an array of points for .playFrame() and rolls for each one', () => { + frame = new Frame(); + frame.playFrame([5, 3]); + expect(frame.regularPoints).toEqual(8) + }); + + describe('.isSpare()', () => { + it('returns true when frame is a spare', () => { + frame = new Frame(); + frame.playFrame([5, 5]); + expect(frame.isSpare()).toEqual(true); + }); + + it('returns true when frame is a spare with a 10 on 2nd roll', () => { + frame = new Frame(); + frame.playFrame([0, 10]); + expect(frame.isSpare()).toEqual(true); + }); + + it('returns false when frame is a strike', () => { + frame = new Frame(); + frame.playFrame([10]); + expect(frame.isSpare()).toEqual(false); + }); + }); + + describe('.isStrike()', () => { + it('returns true when frame is a strike', () => { + frame = new Frame(); + frame.playFrame([10]); + expect(frame.isStrike()).toEqual(true); + }); + + it('returns false when frame is a spare', () => { + frame = new Frame(); + frame.playFrame([2, 8]); + expect(frame.isStrike()).toEqual(false); }); }); }); diff --git a/game.js b/game.js index 55e2c4762..f7a20e33a 100644 --- a/game.js +++ b/game.js @@ -2,57 +2,61 @@ class Game { constructor(frameClass) { this.grandTotal = 0; this.frames = []; - for(let i = 0; i < 9; i++) { - // Create 9 frames that are not the final frame - let frame = new frameClass(false); + for(let i = 0; i < 10; i++) { + let frame = new frameClass(); this.frames.push(frame); + }; + }; + + play(scoresArray) { // take a 2D array, 1 array for each frame. If strike, array length will be 1 + this.frames[0].playFrame(scoresArray[0]); + // no bonus points to allocate after first frame + for (let i = 1; i < 10; i++) { + this.frames[i].playFrame(scoresArray[i]); + this.allocateBonusPoints(i); + } + if (this.frames[9].isStrike() || this.frames[9].isSpare()) { + // Bonus rolls after the final frame provided from UI as addl array element + this.playFinalFrameBonusRolls(scoresArray[10]); } - // create and push the final frame to the frames array - let final_frame = new frameClass(true); - this.frames.push(final_frame); + this.calculateGrandTotal(); + }; + + allocateBonusPoints(index) { + if (this.frames[index-1].isSpare()) { + this.frames[index-1].bonusPoints += this.frames[index].rolls[0]; + } else if (this.frames[index-1].isStrike()) { + this.frames[index-1].bonusPoints += this.frames[index].regularPoints; + // if this is at least the 3rd frame & have been 2 consecutive strikes before this frame + if (index >= 2 && this.frames[index-2].isStrike()) { + this.frames[index-2].bonusPoints += this.frames[index].rolls[0] + }; + }; + }; - } + playFinalFrameBonusRolls(bonusRollsArray) { + bonusRollsArray.forEach((points) => { + this.frames[9].bonusPoints += points; + }); + // If player had a strike in frame 9 and 10, allocate the first bonus roll as bonus point to frame 9: + if (this.frames[9].isStrike() && this.frames[8].isStrike()) { + this.frames[8].bonusPoints += bonusRollsArray[0]; + }; + }; + + calculateGrandTotal() { + this.frames.forEach((frame) => { + this.grandTotal += (frame.regularPoints + frame.bonusPoints); + }); + }; - play() { - // for loop 10 times, frame.roll twice - // if the previous frame was a half strike, update the bonus points - // if the previous frame was a strike - // handle the final frame differently - // should this call a .play function in the frame class? - } + isGutterGame() { + return (this.grandTotal == 0 ? true : false); + }; - scoreBoard() { - // look to refactor this function, creating small functions that return bools re: bonus points pending - // second arg to .map is the index of the iteration - this.frames.map((frame, index) => { - let frameInfo = `Frame ${index}: Shot 1 =>` - // concatenate the score from first roll if it has been scored, else default to 0 - frameInfo += frame.rolls.length ? frame.rolls[0] : 0; - frameInfo += 'Shot 2 => ' - // concatenate the score from 2nd roll if it has been scored, else default to 0 - frameInfo += frame.rolls.length === 2 ? frame.rolls[1] : 0; - frameInfo += 'FRAME TOTAL == ' - // if player rolled a strike - if(frame.rolls.includes(10)) { - // if the next frame hasn't had to rolls nor finished early because of a strike - if (this.frames[index + 1].rolls.length < 2 && !this.frames[index + 1].rolls.includes(10) ) { - frameInfo += '*pending*'; - // if the next frame finished early because of a strike but the subsequent roll hasnt yet beeen taken - // modify this to handle the penultimate frame - } else if (this.frames[index + 1].rolls.length == 1 && !this.frames[index + 2].rolls ) { - frameInfo += '*pending*'; - // else boinus points must havfe been allocated already - } else { - frameInfo += (frame.regularPoints + frame.bonusPoints); - } - // if they scored a half strike check if the next roll has been taken - } else if (frame.regularPoints == 10 && !this.frames[index + 1].rolls.length) { - frameInfo += '*pending*'; - } else { - frameInfo += (frame.regularPoints + frame.bonusPoints); - }; - }) - } -} + isPerfectGame() { + return (this.grandTotal == 300 ? true : false); + }; +}; module.exports = Game; diff --git a/game.test.js b/game.test.js index 92870bb1a..a468c5174 100644 --- a/game.test.js +++ b/game.test.js @@ -6,33 +6,111 @@ jest.mock('./frame.js'); describe('Game class unit test', () => { beforeEach(() => { Frame.mockClear(); - }) + + mockFrame = { + playFrame: jest.fn(), + isSpare: jest.fn(), + isStrike: jest.fn(), + rolls: jest.fn(), + regularPoints: jest.fn(), + bonusPoints: 0, + }; + + Frame.mockImplementation(() => mockFrame); // mock the constructor of Frame to return our mockFrame + }); describe('constructor', () => { it('initializes with an array of 10 frames', () => { - const mockFrameClass = jest.fn(); - let game = new Game(mockFrameClass); - - expect(mockFrameClass).toHaveBeenCalledTimes(10); - expect(mockFrameClass.mock.calls[0][0]).toBe(false); - expect(mockFrameClass.mock.calls[9][0]).toBe(true); + let game = new Game(Frame); + expect(Frame).toHaveBeenCalledTimes(10); expect(game.frames.length).toEqual(10); }); it('initializes with a grand total score of 0', () => { - const mockFrameClass = jest.fn(); - let game = new Game(mockFrameClass); + let game = new Game(Frame); expect(game.grandTotal).toEqual(0); }); + }); - it('runs the game', () => { - + describe('.play()', () => { + it('calls .playFrame on each of the 10 frames without spare or strike in last frame', () => { + let game = new Game(Frame); + const scores = [[1, 4], [4, 5], [6, 4], [5, 5], [10], [0, 1], [7, 3], [6, 4], [10], [2, 7]]; + game.frames[3].rolls.mockImplementation(() => [5, 5]); + game.frames[4].rolls.mockImplementation(() => [10]); + game.frames[7].rolls.mockImplementation(() => [6, 4]); + game.frames[8].rolls.mockImplementation(() => [10]); + game.frames[9].rolls.mockImplementation(() => [2, 7]); + game.play(scores); + expect(mockFrame.playFrame).toHaveBeenCalledTimes(10); + expect(mockFrame.playFrame).toHaveBeenCalledWith(scores[0]); + expect(mockFrame.playFrame).toHaveBeenCalledWith(scores[1]); + expect(mockFrame.playFrame).toHaveBeenCalledWith(scores[9]); }); - it('initializes with a grand total score of 0', () => { - const mockFrameClass = jest.fn(); - let game = new Game(mockFrameClass); - expect(game.grandTotal).toEqual(0); + it('Score a complex game correctly', () => { + let game = new Game(Frame); + const scores = [[1, 4], [4, 5], [6, 4], [5, 5], [10], [0, 1], [7, 3], [6, 4], [10], [2, 8], [6]]; + game.frames[0].rolls.mockImplementation(() => [1, 4]); + game.frames[0].isSpare.mockImplementation(() => false); + game.frames[0].isStrike.mockImplementation(() => false); + game.frames[0].regularPoints.mockImplementation(() => 5); + + game.frames[1].rolls.mockImplementation(() => [4, 5]); + game.frames[1].isSpare.mockImplementation(() => false); + game.frames[1].isStrike.mockImplementation(() => false); + game.frames[1].regularPoints.mockImplementation(() => 9); + + game.frames[2].rolls.mockImplementation(() => [6, 4]); + game.frames[2].isSpare.mockImplementation(() => true); + game.frames[2].isStrike.mockImplementation(() => false); + game.frames[2].regularPoints.mockImplementation(() => 10); + + + game.frames[3].rolls.mockImplementation(() => [5, 5]); + game.frames[3].isSpare.mockImplementation(() => true); + game.frames[3].isStrike.mockImplementation(() => false); + game.frames[3].regularPoints.mockImplementation(() => 10); + + + game.frames[4].rolls.mockImplementation(() => [10]); + game.frames[4].isStrike.mockImplementation(() => true); + game.frames[4].isSpare.mockImplementation(() => false); + game.frames[4].regularPoints.mockImplementation(() => 10); + + + game.frames[5].rolls.mockImplementation(() => [0, 1]); + game.frames[5].isSpare.mockImplementation(() => false); + game.frames[5].isStrike.mockImplementation(() => false); + game.frames[5].regularPoints.mockImplementation(() => 10); + + game.frames[6].rolls.mockImplementation(() => [7, 3]); + game.frames[6].isSpare.mockImplementation(() => true); + game.frames[6].isStrike.mockImplementation(() => false); + game.frames[6].regularPoints.mockImplementation(() => 10); + + + game.frames[7].rolls.mockImplementation(() => [6, 4]); + game.frames[7].isSpare.mockImplementation(() => true); + game.frames[7].isStrike.mockImplementation(() => false); + game.frames[7].regularPoints.mockImplementation(() => 10); + + + game.frames[8].rolls.mockImplementation(() => [10]); + game.frames[8].isStrike.mockImplementation(() => true); + game.frames[8].isSpare.mockImplementation(() => false); + game.frames[8].regularPoints.mockImplementation(() => 10); + + + game.frames[9].rolls.mockImplementation(() => [2, 8]); + game.frames[9].isSpare.mockImplementation(() => true); + game.frames[9].isStrike.mockImplementation(() => false); + game.frames[9].regularPoints.mockImplementation(() => 10); + + game.play(scores); + + expect(game.grandTotal).toEqual(133); }); }); }); + diff --git a/integration.test.js b/integration.test.js new file mode 100644 index 000000000..71bef1b51 --- /dev/null +++ b/integration.test.js @@ -0,0 +1,92 @@ +const Frame = require('./frame'); +const Game = require('./game'); + +describe('integration test', () => { + describe('game.play()', () => { + it("takes an array of points and each to the frame's rolls array", () => { + let game = new Game(Frame); + const scores = [[1, 4], [4, 5], [6, 4], [5, 5], [10], [0, 1], [7, 3], [6, 4], [10], [2, 7]]; + game.play(scores); + expect(game.frames[9].rolls).toEqual([2, 7]); + }); + + it('Allocates bonus points for a spare in the final frame', () => { + let game = new Game(Frame); + const scores = [ [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [5, 5], [6]]; + game.play(scores); + expect(game.frames[9].regularPoints).toEqual(10); + expect(game.frames[9].bonusPoints).toEqual(6); + expect(game.grandTotal).toEqual(16); + }); + + it('Allocates bonus points for a strike in the final frame', () => { + let game = new Game(Frame); + const scores = [ [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [10], [6, 10]]; + game.play(scores); + expect(game.frames[9].regularPoints).toEqual(10); + expect(game.frames[9].bonusPoints).toEqual(16); + expect(game.grandTotal).toEqual(26); + }); + + it('Alloates bonus points for spares', () => { + let game = new Game(Frame); + const scores = [[5, 5], [6, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0]]; + game.play(scores); + expect(game.frames[0].bonusPoints).toEqual(6); + expect(game.grandTotal).toEqual(22); + }); + + it('Allocates bonus points for a single strike', () => { + let game = new Game(Frame); + const scores = [[10], [6, 3], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0]]; + game.play(scores); + expect(game.frames[0].bonusPoints).toEqual(9); + expect(game.grandTotal).toEqual(28); + }); + + it('Scores a complex game correctly', () => { + let game = new Game(Frame); + const scores = [[1, 4], [4, 5], [6, 4], [5, 5], [10], [0, 1], [7, 3], [6, 4], [10], [2, 8], [6]]; + game.play(scores); + expect(game.grandTotal).toEqual(133); + }); + + it('Scores succesive strikes', () => { + let game = new Game(Frame); + const scores = [[10], [10], [10], [10], [10], [10], [10], [10], [10], [0, 0]]; + game.play(scores); + expect(game.grandTotal).toEqual(240); + }); + + it('Scores succesive strikes + spare in last frame', () => { + let game = new Game(Frame); + const scores = [[10], [10], [10], [10], [10], [10], [10], [10], [10], [5, 5], [5]]; + game.play(scores); + expect(game.grandTotal).toEqual(270); + }); + + it('Score succesive strikes + strike in last frame', () => { + let game = new Game(Frame); + const scores = [[10], [10], [10], [10], [10], [10], [10], [10], [10], [10], [5, 5]]; + game.play(scores); + expect(game.grandTotal).toEqual(285); + }); + + it('Score a perfect game', () => { + let game = new Game(Frame); + const scores = [[10], [10], [10], [10], [10], [10], [10], [10], [10], [10], [10, 10]]; + game.play(scores); + expect(game.grandTotal).toEqual(300); + expect(game.isPerfectGame()).toEqual(true); + + }); + + it('Allocates a gutter game correctly', () => { + let game = new Game(Frame); + const scores = [[0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0]]; + game.play(scores); + expect(game.grandTotal).toEqual(0); + expect(game.isGutterGame()).toEqual(true); + }); + }) +}) \ No newline at end of file diff --git a/user_interface.js b/user_interface.js new file mode 100644 index 000000000..023eb2ba6 --- /dev/null +++ b/user_interface.js @@ -0,0 +1,38 @@ +// in user interface, add logic that ends frame early if player gets a strike + + +class UserInterface { + scoreBoard() { + // Test this function + // look to refactor this function, creating small functions that return bools re: bonus points pending + // second arg to .map is the index of the iteration + this.frames.map((frame, index) => { + let frameInfo = `Frame ${index}: Shot 1 =>` + // concatenate the score from first roll if it has been scored, else default to 0 + frameInfo += frame.rolls.length ? frame.rolls[0] : 0; + frameInfo += 'Shot 2 => ' + // concatenate the score from 2nd roll if it has been scored, else default to 0 + frameInfo += frame.rolls.length === 2 ? frame.rolls[1] : 0; + frameInfo += 'FRAME TOTAL == ' + // if player rolled a strike + if(frame.rolls.includes(10)) { + // if the next frame hasn't had to rolls nor finished early because of a strike + if (this.frames[index + 1].rolls.length < 2 && !this.frames[index + 1].rolls.includes(10) ) { + frameInfo += '*pending*'; + // if the next frame finished early because of a strike but the subsequent roll hasnt yet beeen taken + // modify this to handle the penultimate frame + } else if (this.frames[index + 1].rolls.length == 1 && !this.frames[index + 2].rolls ) { + frameInfo += '*pending*'; + // else boinus points must havfe been allocated already + } else { + frameInfo += (frame.regularPoints + frame.bonusPoints); + } + // if they scored a half strike check if the next roll has been taken + } else if (frame.regularPoints == 10 && !this.frames[index + 1].rolls.length) { + frameInfo += '*pending*'; + } else { + frameInfo += (frame.regularPoints + frame.bonusPoints); + }; + }) + } +} \ No newline at end of file From 405f86ac9738b57d6bf689e30d6448ec96463301 Mon Sep 17 00:00:00 2001 From: Tom Carmichael-Mhanna Date: Tue, 2 May 2023 11:31:52 +0100 Subject: [PATCH 07/13] Refactor after code review --- frame.js | 10 +++------- frame.test.js | 6 ------ game.js | 4 ++-- 3 files changed, 5 insertions(+), 15 deletions(-) diff --git a/frame.js b/frame.js index d77b52640..48239121f 100644 --- a/frame.js +++ b/frame.js @@ -6,12 +6,8 @@ class Frame { }; roll(points) { - // check if frame has already ended - if (this.rolls.length == 2 || this.rolls.includes(10)) { + if (this.rolls.length == 2 || this.rolls[0] == 10) { throw new Error('Tried to add points to a frame that is already over'); - // check for invalid scores being inputted - } else if(points < 0 || points > 10 ) { - throw new Error(`Tried to add an invalid roll score (${points})`); } else if ((this.regularPoints + points) > 10) { throw new Error(`Tried to add roll that would exceed max score in a frame (${this.regularPoints} + ${points})`); } else { @@ -27,11 +23,11 @@ class Frame { } isStrike() { - return (this.rolls.includes(10) && this.rolls.length == 1 ? true : false); + return this.rolls[0] == 10; } isSpare() { - return (this.regularPoints == 10 && this.rolls.length == 2 ? true : false); + return this.regularPoints == 10 && this.rolls.length == 2; } } module.exports = Frame; diff --git a/frame.test.js b/frame.test.js index b9c417ee5..093695ff3 100644 --- a/frame.test.js +++ b/frame.test.js @@ -42,12 +42,6 @@ describe('Frame class unit test', () => { expect(frame.rolls).toEqual([10]); }); - it('returns error message given an invalid roll score', () => { - frame = new Frame(); - expect(() => frame.roll(13)).toThrow('Tried to add an invalid roll score (13)'); - expect(() => frame.roll(-5)).toThrow('Tried to add an invalid roll score (-5)'); - }); - it('returns error message if roll would exceed max score in a frame', () => { frame = new Frame(); frame.roll(5); diff --git a/game.js b/game.js index f7a20e33a..3a79e912e 100644 --- a/game.js +++ b/game.js @@ -51,11 +51,11 @@ class Game { }; isGutterGame() { - return (this.grandTotal == 0 ? true : false); + return this.grandTotal == 0; }; isPerfectGame() { - return (this.grandTotal == 300 ? true : false); + return this.grandTotal == 300; }; }; From 30d3ce4e8851d6013c141d547fe4047048dba999 Mon Sep 17 00:00:00 2001 From: Tom Carmichael-Mhanna Date: Tue, 2 May 2023 13:03:18 +0100 Subject: [PATCH 08/13] Refactor for improved readability --- frame.js | 2 +- frame.test.js | 14 ++++----- game.js | 46 +++++++++++++++++++----------- game.test.js | 78 ++++++++++++++++++++++++--------------------------- 4 files changed, 74 insertions(+), 66 deletions(-) diff --git a/frame.js b/frame.js index 48239121f..928123548 100644 --- a/frame.js +++ b/frame.js @@ -16,7 +16,7 @@ class Frame { }; }; // is this function necessary? This logic could be in Game - playFrame(points_array) { + play(points_array) { points_array.forEach((points) => { this.roll(points); }); diff --git a/frame.test.js b/frame.test.js index 093695ff3..8855357b9 100644 --- a/frame.test.js +++ b/frame.test.js @@ -49,28 +49,28 @@ describe('Frame class unit test', () => { }); }); - it('takes an array of points for .playFrame() and rolls for each one', () => { + it('takes an array of points for .play() and rolls for each one', () => { frame = new Frame(); - frame.playFrame([5, 3]); + frame.play([5, 3]); expect(frame.regularPoints).toEqual(8) }); describe('.isSpare()', () => { it('returns true when frame is a spare', () => { frame = new Frame(); - frame.playFrame([5, 5]); + frame.play([5, 5]); expect(frame.isSpare()).toEqual(true); }); it('returns true when frame is a spare with a 10 on 2nd roll', () => { frame = new Frame(); - frame.playFrame([0, 10]); + frame.play([0, 10]); expect(frame.isSpare()).toEqual(true); }); it('returns false when frame is a strike', () => { frame = new Frame(); - frame.playFrame([10]); + frame.play([10]); expect(frame.isSpare()).toEqual(false); }); }); @@ -78,13 +78,13 @@ describe('Frame class unit test', () => { describe('.isStrike()', () => { it('returns true when frame is a strike', () => { frame = new Frame(); - frame.playFrame([10]); + frame.play([10]); expect(frame.isStrike()).toEqual(true); }); it('returns false when frame is a spare', () => { frame = new Frame(); - frame.playFrame([2, 8]); + frame.play([2, 8]); expect(frame.isStrike()).toEqual(false); }); }); diff --git a/game.js b/game.js index 3a79e912e..c85c5028d 100644 --- a/game.js +++ b/game.js @@ -2,20 +2,25 @@ class Game { constructor(frameClass) { this.grandTotal = 0; this.frames = []; + this.frameClass = frameClass; + this.initialiseFrames(); + }; + + initialiseFrames() { for(let i = 0; i < 10; i++) { - let frame = new frameClass(); + let frame = new this.frameClass(); this.frames.push(frame); }; }; play(scoresArray) { // take a 2D array, 1 array for each frame. If strike, array length will be 1 - this.frames[0].playFrame(scoresArray[0]); - // no bonus points to allocate after first frame - for (let i = 1; i < 10; i++) { - this.frames[i].playFrame(scoresArray[i]); - this.allocateBonusPoints(i); - } - if (this.frames[9].isStrike() || this.frames[9].isSpare()) { + this.frames.forEach((frame, i) => { + // no bonus points to allocate after first frame + frame.play(scoresArray[i]); + if (i > 0) { this.allocateBonusPoints(i) }; + }) + let finalFrame = this.frames[9]; + if (finalFrame.isStrike() || finalFrame.isSpare()) { // Bonus rolls after the final frame provided from UI as addl array element this.playFinalFrameBonusRolls(scoresArray[10]); } @@ -23,24 +28,31 @@ class Game { }; allocateBonusPoints(index) { - if (this.frames[index-1].isSpare()) { - this.frames[index-1].bonusPoints += this.frames[index].rolls[0]; - } else if (this.frames[index-1].isStrike()) { - this.frames[index-1].bonusPoints += this.frames[index].regularPoints; + let currentFrame = this.frames[index]; + let previousFrame = this.frames[index-1]; + let frameBeforeLast = this.frames[index-2]; + + if (previousFrame.isSpare()) { + previousFrame.bonusPoints += currentFrame.rolls[0]; + } else if (previousFrame.isStrike()) { + previousFrame.bonusPoints += currentFrame.regularPoints; // if this is at least the 3rd frame & have been 2 consecutive strikes before this frame - if (index >= 2 && this.frames[index-2].isStrike()) { - this.frames[index-2].bonusPoints += this.frames[index].rolls[0] + if (index >= 2 && frameBeforeLast.isStrike()) { + frameBeforeLast.bonusPoints += currentFrame.rolls[0] }; }; }; playFinalFrameBonusRolls(bonusRollsArray) { + let finalFrame = this.frames[9] + let penultimateFrame = this.frames[8] + bonusRollsArray.forEach((points) => { - this.frames[9].bonusPoints += points; + finalFrame.bonusPoints += points; }); // If player had a strike in frame 9 and 10, allocate the first bonus roll as bonus point to frame 9: - if (this.frames[9].isStrike() && this.frames[8].isStrike()) { - this.frames[8].bonusPoints += bonusRollsArray[0]; + if (finalFrame.isStrike() && penultimateFrame.isStrike()) { + penultimateFrame.bonusPoints += bonusRollsArray[0]; }; }; diff --git a/game.test.js b/game.test.js index a468c5174..29da866d5 100644 --- a/game.test.js +++ b/game.test.js @@ -7,16 +7,16 @@ describe('Game class unit test', () => { beforeEach(() => { Frame.mockClear(); - mockFrame = { - playFrame: jest.fn(), - isSpare: jest.fn(), - isStrike: jest.fn(), - rolls: jest.fn(), - regularPoints: jest.fn(), - bonusPoints: 0, - }; - - Frame.mockImplementation(() => mockFrame); // mock the constructor of Frame to return our mockFrame + Frame.mockImplementation(() => { // mock the constructor of Frame to return a mock frame object + return { + play: jest.fn(), + isSpare: jest.fn(), + isStrike: jest.fn(), + rolls: [], + regularPoints: 0, + bonusPoints: 0, + } + }); }); describe('constructor', () => { @@ -33,79 +33,75 @@ describe('Game class unit test', () => { }); describe('.play()', () => { - it('calls .playFrame on each of the 10 frames without spare or strike in last frame', () => { + it('calls .play on each of the 10 frames without spare or strike in last frame', () => { let game = new Game(Frame); const scores = [[1, 4], [4, 5], [6, 4], [5, 5], [10], [0, 1], [7, 3], [6, 4], [10], [2, 7]]; - game.frames[3].rolls.mockImplementation(() => [5, 5]); - game.frames[4].rolls.mockImplementation(() => [10]); - game.frames[7].rolls.mockImplementation(() => [6, 4]); - game.frames[8].rolls.mockImplementation(() => [10]); - game.frames[9].rolls.mockImplementation(() => [2, 7]); game.play(scores); - expect(mockFrame.playFrame).toHaveBeenCalledTimes(10); - expect(mockFrame.playFrame).toHaveBeenCalledWith(scores[0]); - expect(mockFrame.playFrame).toHaveBeenCalledWith(scores[1]); - expect(mockFrame.playFrame).toHaveBeenCalledWith(scores[9]); - }); + game.frames.forEach((frame) => { + expect(frame.play).toHaveBeenCalledTimes(1); + }); + expect(game.frames[0].play).toHaveBeenCalledWith(scores[0]); + expect(game.frames[9].play).toHaveBeenCalledWith(scores[9]); + }) it('Score a complex game correctly', () => { let game = new Game(Frame); const scores = [[1, 4], [4, 5], [6, 4], [5, 5], [10], [0, 1], [7, 3], [6, 4], [10], [2, 8], [6]]; - game.frames[0].rolls.mockImplementation(() => [1, 4]); + game.frames[0].rolls = [1, 4]; game.frames[0].isSpare.mockImplementation(() => false); game.frames[0].isStrike.mockImplementation(() => false); - game.frames[0].regularPoints.mockImplementation(() => 5); + game.frames[0].regularPoints = 5; - game.frames[1].rolls.mockImplementation(() => [4, 5]); + game.frames[1].rolls = [4, 5]; game.frames[1].isSpare.mockImplementation(() => false); game.frames[1].isStrike.mockImplementation(() => false); - game.frames[1].regularPoints.mockImplementation(() => 9); + game.frames[1].regularPoints = 9; - game.frames[2].rolls.mockImplementation(() => [6, 4]); + game.frames[2].rolls = [6, 4]; game.frames[2].isSpare.mockImplementation(() => true); game.frames[2].isStrike.mockImplementation(() => false); - game.frames[2].regularPoints.mockImplementation(() => 10); + game.frames[2].regularPoints = 10; - game.frames[3].rolls.mockImplementation(() => [5, 5]); + game.frames[3].rolls = [5, 5]; game.frames[3].isSpare.mockImplementation(() => true); game.frames[3].isStrike.mockImplementation(() => false); - game.frames[3].regularPoints.mockImplementation(() => 10); + game.frames[3].regularPoints = 10; - game.frames[4].rolls.mockImplementation(() => [10]); + game.frames[4].rolls = [10]; game.frames[4].isStrike.mockImplementation(() => true); game.frames[4].isSpare.mockImplementation(() => false); - game.frames[4].regularPoints.mockImplementation(() => 10); + game.frames[4].regularPoints = 10; - game.frames[5].rolls.mockImplementation(() => [0, 1]); + game.frames[5].rolls = [0, 1]; game.frames[5].isSpare.mockImplementation(() => false); game.frames[5].isStrike.mockImplementation(() => false); - game.frames[5].regularPoints.mockImplementation(() => 10); + game.frames[5].regularPoints = 1; - game.frames[6].rolls.mockImplementation(() => [7, 3]); + game.frames[6].rolls = [7, 3]; game.frames[6].isSpare.mockImplementation(() => true); game.frames[6].isStrike.mockImplementation(() => false); - game.frames[6].regularPoints.mockImplementation(() => 10); + game.frames[6].regularPoints = 10; - game.frames[7].rolls.mockImplementation(() => [6, 4]); + game.frames[7].rolls = [6, 4]; game.frames[7].isSpare.mockImplementation(() => true); game.frames[7].isStrike.mockImplementation(() => false); - game.frames[7].regularPoints.mockImplementation(() => 10); + game.frames[7].regularPoints = 10; - game.frames[8].rolls.mockImplementation(() => [10]); + game.frames[8].rolls = [10]; game.frames[8].isStrike.mockImplementation(() => true); game.frames[8].isSpare.mockImplementation(() => false); - game.frames[8].regularPoints.mockImplementation(() => 10); + game.frames[8].regularPoints = 10; - game.frames[9].rolls.mockImplementation(() => [2, 8]); + game.frames[9].rolls = [2, 8]; game.frames[9].isSpare.mockImplementation(() => true); game.frames[9].isStrike.mockImplementation(() => false); - game.frames[9].regularPoints.mockImplementation(() => 10); + game.frames[9].regularPoints = 10; game.play(scores); From febd1f12a2b43caf5ab645b7107b7d32b33515f6 Mon Sep 17 00:00:00 2001 From: Tom Carmichael-Mhanna Date: Wed, 24 May 2023 14:16:08 +0100 Subject: [PATCH 09/13] Create README w screenshots. Added node via npm. Frame class... ... supplied as default paramter to Game constructor. --- README.md | 80 +++--- coverage/clover.xml | 61 ++++ coverage/coverage-final.json | 3 + coverage/lcov-report/base.css | 224 +++++++++++++++ coverage/lcov-report/block-navigation.js | 87 ++++++ coverage/lcov-report/favicon.png | Bin 0 -> 445 bytes coverage/lcov-report/frame.js.html | 184 ++++++++++++ coverage/lcov-report/game.js.html | 313 +++++++++++++++++++++ coverage/lcov-report/index.html | 131 +++++++++ coverage/lcov-report/prettify.css | 1 + coverage/lcov-report/prettify.js | 2 + coverage/lcov-report/sort-arrow-sprite.png | Bin 0 -> 138 bytes coverage/lcov-report/sorter.js | 196 +++++++++++++ coverage/lcov.info | 128 +++++++++ game.js | 4 +- package-lock.json | 23 +- package.json | 3 +- screenshots/bowling-challenge-jest.png | Bin 0 -> 90280 bytes screenshots/bowling-challenge-node.png | Bin 0 -> 88013 bytes 19 files changed, 1389 insertions(+), 51 deletions(-) create mode 100644 coverage/clover.xml create mode 100644 coverage/coverage-final.json create mode 100644 coverage/lcov-report/base.css create mode 100644 coverage/lcov-report/block-navigation.js create mode 100644 coverage/lcov-report/favicon.png create mode 100644 coverage/lcov-report/frame.js.html create mode 100644 coverage/lcov-report/game.js.html create mode 100644 coverage/lcov-report/index.html create mode 100644 coverage/lcov-report/prettify.css create mode 100644 coverage/lcov-report/prettify.js create mode 100644 coverage/lcov-report/sort-arrow-sprite.png create mode 100644 coverage/lcov-report/sorter.js create mode 100644 coverage/lcov.info create mode 100644 screenshots/bowling-challenge-jest.png create mode 100644 screenshots/bowling-challenge-node.png diff --git a/README.md b/README.md index ae8571b52..a52dd1d7e 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,4 @@ - -Bowling Challenge -================= - -* Feel free to use google, your notes, books, etc. but work on your own -* If you refer to the solution of another coach or student, please put a link to that in your README -* If you have a partial solution, **still check in a partial solution** -* You must submit a pull request to this repo with your code by 9am Monday week +# Makers Academy Bowling Challenge (Javascript) ## The Task @@ -15,41 +8,6 @@ Count and sum the scores of a bowling game for one player (in JavaScript). A bowling game consists of 10 frames in which the player tries to knock down the 10 pins. In every frame the player can roll one or two times. The actual number depends on strikes and spares. The score of a frame is the number of knocked down pins plus bonuses for strikes and spares. After every frame the 10 pins are reset. -Start by looking in detail at the rules and the example of scoring for a complete game given below. - -An example of how your code might be used could be: - -```javaScript -let scorecard = new Scorecard() -scorecard.calculateScore() // returns 0 -scorecard.addFrame(2, 5) -scorecard.addFrame(3, 5) -scorecard.calculateScore() // returns 15 -``` - -But feel free to add other methods if you think they are useful. - -As usual please start by - -* Forking this repo - -* Using test-driven development (if you decide to write a user interface, then make sure you have looked at the chapters on mocking). - -* Finally submit a pull request before Monday week at 9am with your solution or partial solution. However much or little amount of code you wrote please please please submit a pull request before Monday week at 9am. - -___STRONG HINT, IGNORE AT YOUR PERIL:___ Bowling is a deceptively complex game. Careful thought and thorough diagramming — both before and throughout — will save you literal hours of your life. - -### Optional Extras - -In any order you like: - -* Set up [Travis CI](https://travis-ci.org) to run your tests. -* Add [ESLint](http://eslint.org/) to your codebase and make your code conform. -* Create a UserInterface class, allowing you to run a game from the command line. - -You might even want to start with ESLint early on in your work — to help you -learn Javascript conventions as you go along. - ## Bowling — how does it work? ### Strikes @@ -81,11 +39,37 @@ More about ten pin bowling here: http://en.wikipedia.org/wiki/Ten-pin_bowling ![Ten Pin Score Example](images/example_ten_pin_scoring.png) -## Code Review +## Getting started + +`git clone https://github.com/tomcarmichael/bowling-challenge.git` + +`npm install` + +## Usage + +`node` + +`const Game = require('./game')` + +`const game = new Game()` + +Define a 2D array of valid scores for a bowling game (each frame is an array) e.g. + +`const scores = [[1, 4], [4, 5], [6, 4], [5, 5], [10], [0, 1], [7, 3], [6, 4], [10], [2, 7]]` + +`game.play(scores)` + +See the total score for the game: + +`game.grandTotal` + +Check if the game is a perfect game or gutter game: + +`game.isGutterGame()` , `game.isPerfectGame()` -In code review we'll be hoping to see: +## Running Tests -* All tests passing -* The code is elegant: every class has a clear responsibility, methods are short etc. +`jest` -Reviewers will potentially be using this [code review rubric](docs/review.md). Note that referring to this rubric in advance may make the challenge somewhat easier. You should be the judge of how much challenge you want. +![bowling-challenge-jest](./screenshots/bowling-challenge-jest.png) +![bowling-challenge-node](./screenshots/bowling-challenge-node.png) diff --git a/coverage/clover.xml b/coverage/clover.xml new file mode 100644 index 000000000..92db28cf5 --- /dev/null +++ b/coverage/clover.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/coverage/coverage-final.json b/coverage/coverage-final.json new file mode 100644 index 000000000..a591f860a --- /dev/null +++ b/coverage/coverage-final.json @@ -0,0 +1,3 @@ +{"/Users/tomcarmichael/Documents/code/js/bowling-challenge/frame.js": {"path":"/Users/tomcarmichael/Documents/code/js/bowling-challenge/frame.js","statementMap":{"0":{"start":{"line":3,"column":4},"end":{"line":3,"column":20}},"1":{"start":{"line":4,"column":4},"end":{"line":4,"column":27}},"2":{"start":{"line":5,"column":4},"end":{"line":5,"column":25}},"3":{"start":{"line":9,"column":4},"end":{"line":16,"column":5}},"4":{"start":{"line":10,"column":6},"end":{"line":10,"column":77}},"5":{"start":{"line":11,"column":11},"end":{"line":16,"column":5}},"6":{"start":{"line":12,"column":6},"end":{"line":12,"column":118}},"7":{"start":{"line":14,"column":6},"end":{"line":14,"column":30}},"8":{"start":{"line":15,"column":6},"end":{"line":15,"column":35}},"9":{"start":{"line":20,"column":4},"end":{"line":22,"column":7}},"10":{"start":{"line":21,"column":6},"end":{"line":21,"column":24}},"11":{"start":{"line":26,"column":4},"end":{"line":26,"column":31}},"12":{"start":{"line":30,"column":4},"end":{"line":30,"column":62}},"13":{"start":{"line":33,"column":0},"end":{"line":33,"column":23}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":2,"column":2},"end":{"line":2,"column":3}},"loc":{"start":{"line":2,"column":16},"end":{"line":6,"column":3}},"line":2},"1":{"name":"(anonymous_1)","decl":{"start":{"line":8,"column":2},"end":{"line":8,"column":3}},"loc":{"start":{"line":8,"column":15},"end":{"line":17,"column":3}},"line":8},"2":{"name":"(anonymous_2)","decl":{"start":{"line":19,"column":2},"end":{"line":19,"column":3}},"loc":{"start":{"line":19,"column":21},"end":{"line":23,"column":3}},"line":19},"3":{"name":"(anonymous_3)","decl":{"start":{"line":20,"column":25},"end":{"line":20,"column":26}},"loc":{"start":{"line":20,"column":37},"end":{"line":22,"column":5}},"line":20},"4":{"name":"(anonymous_4)","decl":{"start":{"line":25,"column":2},"end":{"line":25,"column":3}},"loc":{"start":{"line":25,"column":13},"end":{"line":27,"column":3}},"line":25},"5":{"name":"(anonymous_5)","decl":{"start":{"line":29,"column":2},"end":{"line":29,"column":3}},"loc":{"start":{"line":29,"column":12},"end":{"line":31,"column":3}},"line":29}},"branchMap":{"0":{"loc":{"start":{"line":9,"column":4},"end":{"line":16,"column":5}},"type":"if","locations":[{"start":{"line":9,"column":4},"end":{"line":16,"column":5}},{"start":{"line":11,"column":11},"end":{"line":16,"column":5}}],"line":9},"1":{"loc":{"start":{"line":9,"column":8},"end":{"line":9,"column":53}},"type":"binary-expr","locations":[{"start":{"line":9,"column":8},"end":{"line":9,"column":30}},{"start":{"line":9,"column":34},"end":{"line":9,"column":53}}],"line":9},"2":{"loc":{"start":{"line":11,"column":11},"end":{"line":16,"column":5}},"type":"if","locations":[{"start":{"line":11,"column":11},"end":{"line":16,"column":5}},{"start":{"line":13,"column":11},"end":{"line":16,"column":5}}],"line":11},"3":{"loc":{"start":{"line":30,"column":11},"end":{"line":30,"column":61}},"type":"binary-expr","locations":[{"start":{"line":30,"column":11},"end":{"line":30,"column":35}},{"start":{"line":30,"column":39},"end":{"line":30,"column":61}}],"line":30}},"s":{"0":122,"1":122,"2":122,"3":195,"4":2,"5":193,"6":1,"7":192,"8":192,"9":116,"10":186,"11":148,"12":110,"13":3},"f":{"0":122,"1":195,"2":116,"3":186,"4":148,"5":110},"b":{"0":[2,193],"1":[195,194],"2":[1,192],"3":[110,56]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"6e62ee9ac60cb9c104cd0f69ac7db85ec9446659"} +,"/Users/tomcarmichael/Documents/code/js/bowling-challenge/game.js": {"path":"/Users/tomcarmichael/Documents/code/js/bowling-challenge/game.js","statementMap":{"0":{"start":{"line":1,"column":14},"end":{"line":1,"column":32}},"1":{"start":{"line":5,"column":4},"end":{"line":5,"column":24}},"2":{"start":{"line":6,"column":4},"end":{"line":6,"column":21}},"3":{"start":{"line":7,"column":4},"end":{"line":7,"column":33}},"4":{"start":{"line":8,"column":4},"end":{"line":8,"column":28}},"5":{"start":{"line":12,"column":4},"end":{"line":15,"column":5}},"6":{"start":{"line":12,"column":16},"end":{"line":12,"column":17}},"7":{"start":{"line":13,"column":18},"end":{"line":13,"column":39}},"8":{"start":{"line":14,"column":6},"end":{"line":14,"column":30}},"9":{"start":{"line":19,"column":4},"end":{"line":23,"column":6}},"10":{"start":{"line":21,"column":6},"end":{"line":21,"column":33}},"11":{"start":{"line":22,"column":6},"end":{"line":22,"column":48}},"12":{"start":{"line":22,"column":19},"end":{"line":22,"column":46}},"13":{"start":{"line":24,"column":21},"end":{"line":24,"column":35}},"14":{"start":{"line":25,"column":4},"end":{"line":28,"column":5}},"15":{"start":{"line":27,"column":6},"end":{"line":27,"column":53}},"16":{"start":{"line":29,"column":4},"end":{"line":29,"column":31}},"17":{"start":{"line":33,"column":23},"end":{"line":33,"column":41}},"18":{"start":{"line":34,"column":24},"end":{"line":34,"column":44}},"19":{"start":{"line":35,"column":26},"end":{"line":35,"column":46}},"20":{"start":{"line":37,"column":4},"end":{"line":45,"column":5}},"21":{"start":{"line":38,"column":6},"end":{"line":38,"column":57}},"22":{"start":{"line":39,"column":11},"end":{"line":45,"column":5}},"23":{"start":{"line":40,"column":6},"end":{"line":40,"column":62}},"24":{"start":{"line":42,"column":6},"end":{"line":44,"column":7}},"25":{"start":{"line":43,"column":8},"end":{"line":43,"column":60}},"26":{"start":{"line":49,"column":21},"end":{"line":49,"column":35}},"27":{"start":{"line":50,"column":27},"end":{"line":50,"column":41}},"28":{"start":{"line":52,"column":4},"end":{"line":54,"column":7}},"29":{"start":{"line":53,"column":6},"end":{"line":53,"column":39}},"30":{"start":{"line":56,"column":4},"end":{"line":58,"column":5}},"31":{"start":{"line":57,"column":6},"end":{"line":57,"column":57}},"32":{"start":{"line":62,"column":4},"end":{"line":64,"column":7}},"33":{"start":{"line":63,"column":6},"end":{"line":63,"column":67}},"34":{"start":{"line":68,"column":4},"end":{"line":68,"column":32}},"35":{"start":{"line":72,"column":4},"end":{"line":72,"column":34}},"36":{"start":{"line":76,"column":0},"end":{"line":76,"column":22}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":4,"column":2},"end":{"line":4,"column":3}},"loc":{"start":{"line":4,"column":34},"end":{"line":9,"column":3}},"line":4},"1":{"name":"(anonymous_1)","decl":{"start":{"line":11,"column":2},"end":{"line":11,"column":3}},"loc":{"start":{"line":11,"column":21},"end":{"line":16,"column":3}},"line":11},"2":{"name":"(anonymous_2)","decl":{"start":{"line":18,"column":2},"end":{"line":18,"column":3}},"loc":{"start":{"line":18,"column":20},"end":{"line":30,"column":3}},"line":18},"3":{"name":"(anonymous_3)","decl":{"start":{"line":19,"column":24},"end":{"line":19,"column":25}},"loc":{"start":{"line":19,"column":38},"end":{"line":23,"column":5}},"line":19},"4":{"name":"(anonymous_4)","decl":{"start":{"line":32,"column":2},"end":{"line":32,"column":3}},"loc":{"start":{"line":32,"column":29},"end":{"line":46,"column":3}},"line":32},"5":{"name":"(anonymous_5)","decl":{"start":{"line":48,"column":2},"end":{"line":48,"column":3}},"loc":{"start":{"line":48,"column":44},"end":{"line":59,"column":3}},"line":48},"6":{"name":"(anonymous_6)","decl":{"start":{"line":52,"column":28},"end":{"line":52,"column":29}},"loc":{"start":{"line":52,"column":40},"end":{"line":54,"column":5}},"line":52},"7":{"name":"(anonymous_7)","decl":{"start":{"line":61,"column":2},"end":{"line":61,"column":3}},"loc":{"start":{"line":61,"column":24},"end":{"line":65,"column":3}},"line":61},"8":{"name":"(anonymous_8)","decl":{"start":{"line":62,"column":24},"end":{"line":62,"column":25}},"loc":{"start":{"line":62,"column":35},"end":{"line":64,"column":5}},"line":62},"9":{"name":"(anonymous_9)","decl":{"start":{"line":67,"column":2},"end":{"line":67,"column":3}},"loc":{"start":{"line":67,"column":17},"end":{"line":69,"column":3}},"line":67},"10":{"name":"(anonymous_10)","decl":{"start":{"line":71,"column":2},"end":{"line":71,"column":3}},"loc":{"start":{"line":71,"column":18},"end":{"line":73,"column":3}},"line":71}},"branchMap":{"0":{"loc":{"start":{"line":4,"column":14},"end":{"line":4,"column":32}},"type":"default-arg","locations":[{"start":{"line":4,"column":27},"end":{"line":4,"column":32}}],"line":4},"1":{"loc":{"start":{"line":22,"column":6},"end":{"line":22,"column":48}},"type":"if","locations":[{"start":{"line":22,"column":6},"end":{"line":22,"column":48}},{"start":{},"end":{}}],"line":22},"2":{"loc":{"start":{"line":25,"column":4},"end":{"line":28,"column":5}},"type":"if","locations":[{"start":{"line":25,"column":4},"end":{"line":28,"column":5}},{"start":{},"end":{}}],"line":25},"3":{"loc":{"start":{"line":25,"column":8},"end":{"line":25,"column":53}},"type":"binary-expr","locations":[{"start":{"line":25,"column":8},"end":{"line":25,"column":29}},{"start":{"line":25,"column":33},"end":{"line":25,"column":53}}],"line":25},"4":{"loc":{"start":{"line":37,"column":4},"end":{"line":45,"column":5}},"type":"if","locations":[{"start":{"line":37,"column":4},"end":{"line":45,"column":5}},{"start":{"line":39,"column":11},"end":{"line":45,"column":5}}],"line":37},"5":{"loc":{"start":{"line":39,"column":11},"end":{"line":45,"column":5}},"type":"if","locations":[{"start":{"line":39,"column":11},"end":{"line":45,"column":5}},{"start":{},"end":{}}],"line":39},"6":{"loc":{"start":{"line":42,"column":6},"end":{"line":44,"column":7}},"type":"if","locations":[{"start":{"line":42,"column":6},"end":{"line":44,"column":7}},{"start":{},"end":{}}],"line":42},"7":{"loc":{"start":{"line":42,"column":10},"end":{"line":42,"column":50}},"type":"binary-expr","locations":[{"start":{"line":42,"column":10},"end":{"line":42,"column":20}},{"start":{"line":42,"column":24},"end":{"line":42,"column":50}}],"line":42},"8":{"loc":{"start":{"line":56,"column":4},"end":{"line":58,"column":5}},"type":"if","locations":[{"start":{"line":56,"column":4},"end":{"line":58,"column":5}},{"start":{},"end":{}}],"line":56},"9":{"loc":{"start":{"line":56,"column":8},"end":{"line":56,"column":60}},"type":"binary-expr","locations":[{"start":{"line":56,"column":8},"end":{"line":56,"column":29}},{"start":{"line":56,"column":33},"end":{"line":56,"column":60}}],"line":56}},"s":{"0":2,"1":15,"2":15,"3":15,"4":15,"5":15,"6":15,"7":150,"8":150,"9":13,"10":130,"11":130,"12":117,"13":13,"14":13,"15":7,"16":13,"17":117,"18":117,"19":117,"20":117,"21":13,"22":104,"23":43,"24":43,"25":32,"26":7,"27":7,"28":7,"29":10,"30":7,"31":2,"32":13,"33":130,"34":1,"35":1,"36":2},"f":{"0":15,"1":15,"2":13,"3":130,"4":117,"5":7,"6":10,"7":13,"8":130,"9":1,"10":1},"b":{"0":[0],"1":[117,13],"2":[7,6],"3":[13,10],"4":[13,104],"5":[43,61],"6":[32,11],"7":[43,38],"8":[2,5],"9":[7,3]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"e8b55ad8edaaf2ed4b56c67297f3758718e332cf"} +} diff --git a/coverage/lcov-report/base.css b/coverage/lcov-report/base.css new file mode 100644 index 000000000..f418035b4 --- /dev/null +++ b/coverage/lcov-report/base.css @@ -0,0 +1,224 @@ +body, html { + margin:0; padding: 0; + height: 100%; +} +body { + font-family: Helvetica Neue, Helvetica, Arial; + font-size: 14px; + color:#333; +} +.small { font-size: 12px; } +*, *:after, *:before { + -webkit-box-sizing:border-box; + -moz-box-sizing:border-box; + box-sizing:border-box; + } +h1 { font-size: 20px; margin: 0;} +h2 { font-size: 14px; } +pre { + font: 12px/1.4 Consolas, "Liberation Mono", Menlo, Courier, monospace; + margin: 0; + padding: 0; + -moz-tab-size: 2; + -o-tab-size: 2; + tab-size: 2; +} +a { color:#0074D9; text-decoration:none; } +a:hover { text-decoration:underline; } +.strong { font-weight: bold; } +.space-top1 { padding: 10px 0 0 0; } +.pad2y { padding: 20px 0; } +.pad1y { padding: 10px 0; } +.pad2x { padding: 0 20px; } +.pad2 { padding: 20px; } +.pad1 { padding: 10px; } +.space-left2 { padding-left:55px; } +.space-right2 { padding-right:20px; } +.center { text-align:center; } +.clearfix { display:block; } +.clearfix:after { + content:''; + display:block; + height:0; + clear:both; + visibility:hidden; + } +.fl { float: left; } +@media only screen and (max-width:640px) { + .col3 { width:100%; max-width:100%; } + .hide-mobile { display:none!important; } +} + +.quiet { + color: #7f7f7f; + color: rgba(0,0,0,0.5); +} +.quiet a { opacity: 0.7; } + +.fraction { + font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; + font-size: 10px; + color: #555; + background: #E8E8E8; + padding: 4px 5px; + border-radius: 3px; + vertical-align: middle; +} + +div.path a:link, div.path a:visited { color: #333; } +table.coverage { + border-collapse: collapse; + margin: 10px 0 0 0; + padding: 0; +} + +table.coverage td { + margin: 0; + padding: 0; + vertical-align: top; +} +table.coverage td.line-count { + text-align: right; + padding: 0 5px 0 20px; +} +table.coverage td.line-coverage { + text-align: right; + padding-right: 10px; + min-width:20px; +} + +table.coverage td span.cline-any { + display: inline-block; + padding: 0 5px; + width: 100%; +} +.missing-if-branch { + display: inline-block; + margin-right: 5px; + border-radius: 3px; + position: relative; + padding: 0 4px; + background: #333; + color: yellow; +} + +.skip-if-branch { + display: none; + margin-right: 10px; + position: relative; + padding: 0 4px; + background: #ccc; + color: white; +} +.missing-if-branch .typ, .skip-if-branch .typ { + color: inherit !important; +} +.coverage-summary { + border-collapse: collapse; + width: 100%; +} +.coverage-summary tr { border-bottom: 1px solid #bbb; } +.keyline-all { border: 1px solid #ddd; } +.coverage-summary td, .coverage-summary th { padding: 10px; } +.coverage-summary tbody { border: 1px solid #bbb; } +.coverage-summary td { border-right: 1px solid #bbb; } +.coverage-summary td:last-child { border-right: none; } +.coverage-summary th { + text-align: left; + font-weight: normal; + white-space: nowrap; +} +.coverage-summary th.file { border-right: none !important; } +.coverage-summary th.pct { } +.coverage-summary th.pic, +.coverage-summary th.abs, +.coverage-summary td.pct, +.coverage-summary td.abs { text-align: right; } +.coverage-summary td.file { white-space: nowrap; } +.coverage-summary td.pic { min-width: 120px !important; } +.coverage-summary tfoot td { } + +.coverage-summary .sorter { + height: 10px; + width: 7px; + display: inline-block; + margin-left: 0.5em; + background: url(sort-arrow-sprite.png) no-repeat scroll 0 0 transparent; +} +.coverage-summary .sorted .sorter { + background-position: 0 -20px; +} +.coverage-summary .sorted-desc .sorter { + background-position: 0 -10px; +} +.status-line { height: 10px; } +/* yellow */ +.cbranch-no { background: yellow !important; color: #111; } +/* dark red */ +.red.solid, .status-line.low, .low .cover-fill { background:#C21F39 } +.low .chart { border:1px solid #C21F39 } +.highlighted, +.highlighted .cstat-no, .highlighted .fstat-no, .highlighted .cbranch-no{ + background: #C21F39 !important; +} +/* medium red */ +.cstat-no, .fstat-no, .cbranch-no, .cbranch-no { background:#F6C6CE } +/* light red */ +.low, .cline-no { background:#FCE1E5 } +/* light green */ +.high, .cline-yes { background:rgb(230,245,208) } +/* medium green */ +.cstat-yes { background:rgb(161,215,106) } +/* dark green */ +.status-line.high, .high .cover-fill { background:rgb(77,146,33) } +.high .chart { border:1px solid rgb(77,146,33) } +/* dark yellow (gold) */ +.status-line.medium, .medium .cover-fill { background: #f9cd0b; } +.medium .chart { border:1px solid #f9cd0b; } +/* light yellow */ +.medium { background: #fff4c2; } + +.cstat-skip { background: #ddd; color: #111; } +.fstat-skip { background: #ddd; color: #111 !important; } +.cbranch-skip { background: #ddd !important; color: #111; } + +span.cline-neutral { background: #eaeaea; } + +.coverage-summary td.empty { + opacity: .5; + padding-top: 4px; + padding-bottom: 4px; + line-height: 1; + color: #888; +} + +.cover-fill, .cover-empty { + display:inline-block; + height: 12px; +} +.chart { + line-height: 0; +} +.cover-empty { + background: white; +} +.cover-full { + border-right: none !important; +} +pre.prettyprint { + border: none !important; + padding: 0 !important; + margin: 0 !important; +} +.com { color: #999 !important; } +.ignore-none { color: #999; font-weight: normal; } + +.wrapper { + min-height: 100%; + height: auto !important; + height: 100%; + margin: 0 auto -48px; +} +.footer, .push { + height: 48px; +} diff --git a/coverage/lcov-report/block-navigation.js b/coverage/lcov-report/block-navigation.js new file mode 100644 index 000000000..cc1213023 --- /dev/null +++ b/coverage/lcov-report/block-navigation.js @@ -0,0 +1,87 @@ +/* eslint-disable */ +var jumpToCode = (function init() { + // Classes of code we would like to highlight in the file view + var missingCoverageClasses = ['.cbranch-no', '.cstat-no', '.fstat-no']; + + // Elements to highlight in the file listing view + var fileListingElements = ['td.pct.low']; + + // We don't want to select elements that are direct descendants of another match + var notSelector = ':not(' + missingCoverageClasses.join('):not(') + ') > '; // becomes `:not(a):not(b) > ` + + // Selecter that finds elements on the page to which we can jump + var selector = + fileListingElements.join(', ') + + ', ' + + notSelector + + missingCoverageClasses.join(', ' + notSelector); // becomes `:not(a):not(b) > a, :not(a):not(b) > b` + + // The NodeList of matching elements + var missingCoverageElements = document.querySelectorAll(selector); + + var currentIndex; + + function toggleClass(index) { + missingCoverageElements + .item(currentIndex) + .classList.remove('highlighted'); + missingCoverageElements.item(index).classList.add('highlighted'); + } + + function makeCurrent(index) { + toggleClass(index); + currentIndex = index; + missingCoverageElements.item(index).scrollIntoView({ + behavior: 'smooth', + block: 'center', + inline: 'center' + }); + } + + function goToPrevious() { + var nextIndex = 0; + if (typeof currentIndex !== 'number' || currentIndex === 0) { + nextIndex = missingCoverageElements.length - 1; + } else if (missingCoverageElements.length > 1) { + nextIndex = currentIndex - 1; + } + + makeCurrent(nextIndex); + } + + function goToNext() { + var nextIndex = 0; + + if ( + typeof currentIndex === 'number' && + currentIndex < missingCoverageElements.length - 1 + ) { + nextIndex = currentIndex + 1; + } + + makeCurrent(nextIndex); + } + + return function jump(event) { + if ( + document.getElementById('fileSearch') === document.activeElement && + document.activeElement != null + ) { + // if we're currently focused on the search input, we don't want to navigate + return; + } + + switch (event.which) { + case 78: // n + case 74: // j + goToNext(); + break; + case 66: // b + case 75: // k + case 80: // p + goToPrevious(); + break; + } + }; +})(); +window.addEventListener('keydown', jumpToCode); diff --git a/coverage/lcov-report/favicon.png b/coverage/lcov-report/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..c1525b811a167671e9de1fa78aab9f5c0b61cef7 GIT binary patch literal 445 zcmV;u0Yd(XP))rP{nL}Ln%S7`m{0DjX9TLF* zFCb$4Oi7vyLOydb!7n&^ItCzb-%BoB`=x@N2jll2Nj`kauio%aw_@fe&*}LqlFT43 z8doAAe))z_%=P%v^@JHp3Hjhj^6*Kr_h|g_Gr?ZAa&y>wxHE99Gk>A)2MplWz2xdG zy8VD2J|Uf#EAw*bo5O*PO_}X2Tob{%bUoO2G~T`@%S6qPyc}VkhV}UifBuRk>%5v( z)x7B{I~z*k<7dv#5tC+m{km(D087J4O%+<<;K|qwefb6@GSX45wCK}Sn*> + + + + Code coverage report for frame.js + + + + + + + + + +
+
+

All files frame.js

+
+ +
+ 100% + Statements + 14/14 +
+ + +
+ 100% + Branches + 8/8 +
+ + +
+ 100% + Functions + 6/6 +
+ + +
+ 100% + Lines + 14/14 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34  +  +122x +122x +122x +  +  +  +195x +2x +193x +1x +  +192x +192x +  +  +  +  +116x +186x +  +  +  +  +148x +  +  +  +110x +  +  +3x + 
class Frame {
+  constructor() {
+    this.rolls = [];
+    this.regularPoints = 0;
+    this.bonusPoints = 0;
+  };
+ 
+  roll(points) {
+    if (this.rolls.length == 2 || this.rolls[0] == 10) {
+      throw new Error('Tried to add points to a frame that is already over');
+    } else if ((this.regularPoints + points) > 10) {
+      throw new Error(`Tried to add roll that would exceed max score in a frame (${this.regularPoints} + ${points})`);
+    } else {
+      this.rolls.push(points);
+      this.regularPoints += points;
+    };
+  };
+  // is this function necessary? This logic could be in Game
+  play(points_array) {
+    points_array.forEach((points) => {
+      this.roll(points);
+    });
+  }
+ 
+  isStrike() {
+    return this.rolls[0] == 10;
+  }
+ 
+  isSpare() {
+    return this.regularPoints == 10 && this.rolls.length == 2;
+  }
+}
+module.exports = Frame;
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/game.js.html b/coverage/lcov-report/game.js.html new file mode 100644 index 000000000..0a607ab78 --- /dev/null +++ b/coverage/lcov-report/game.js.html @@ -0,0 +1,313 @@ + + + + + + Code coverage report for game.js + + + + + + + + + +
+
+

All files game.js

+
+ +
+ 100% + Statements + 37/37 +
+ + +
+ 94.73% + Branches + 18/19 +
+ + +
+ 100% + Functions + 11/11 +
+ + +
+ 100% + Lines + 35/35 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +772x +  +  +  +15x +15x +15x +15x +  +  +  +15x +150x +150x +  +  +  +  +13x +  +130x +130x +  +13x +13x +  +7x +  +13x +  +  +  +117x +117x +117x +  +117x +13x +104x +43x +  +43x +32x +  +  +  +  +  +7x +7x +  +7x +10x +  +  +7x +2x +  +  +  +  +13x +130x +  +  +  +  +1x +  +  +  +1x +  +  +  +2x + 
const Frame = require("./frame");
+ 
+class Game {
+  constructor(frameClass = Frame) {
+    this.grandTotal = 0;
+    this.frames = [];
+    this.frameClass = frameClass;
+    this.initialiseFrames();
+  };
+ 
+  initialiseFrames() {
+    for(let i = 0; i < 10; i++) {
+      let frame = new this.frameClass();
+      this.frames.push(frame);
+    };
+  };
+ 
+  play(scoresArray) { // take a 2D array, 1 array for each frame. If strike, array length will be 1
+    this.frames.forEach((frame, i) => {
+      // no bonus points to allocate after first frame
+      frame.play(scoresArray[i]);
+      if (i > 0) { this.allocateBonusPoints(i) };
+    })
+    let finalFrame = this.frames[9];
+    if (finalFrame.isStrike() || finalFrame.isSpare()) {
+      // Bonus rolls after the final frame provided from UI as addl array element
+      this.playFinalFrameBonusRolls(scoresArray[10]);
+    }
+    this.calculateGrandTotal();
+  };
+  
+  allocateBonusPoints(index) {
+    let currentFrame = this.frames[index];
+    let previousFrame = this.frames[index-1];
+    let frameBeforeLast = this.frames[index-2];
+ 
+    if (previousFrame.isSpare()) {
+      previousFrame.bonusPoints += currentFrame.rolls[0]; 
+    } else if (previousFrame.isStrike()) {
+      previousFrame.bonusPoints += currentFrame.regularPoints;
+      // if this is at least the 3rd frame & have been 2 consecutive strikes before this frame
+      if (index >= 2 && frameBeforeLast.isStrike()) {
+        frameBeforeLast.bonusPoints += currentFrame.rolls[0]
+      };
+    };
+  };
+ 
+  playFinalFrameBonusRolls(bonusRollsArray) {
+    let finalFrame = this.frames[9]
+    let penultimateFrame = this.frames[8]
+ 
+    bonusRollsArray.forEach((points) => {
+      finalFrame.bonusPoints += points;
+    });
+    // If player had a strike in frame 9 and 10, allocate the first bonus roll as bonus point to frame 9:
+    if (finalFrame.isStrike() && penultimateFrame.isStrike()) {
+      penultimateFrame.bonusPoints += bonusRollsArray[0];
+    };
+  };
+  
+  calculateGrandTotal() {
+    this.frames.forEach((frame) => {
+      this.grandTotal += (frame.regularPoints + frame.bonusPoints);
+    });
+  };
+ 
+  isGutterGame() {
+    return this.grandTotal == 0;
+  };
+ 
+  isPerfectGame() {
+    return this.grandTotal == 300;
+  };
+};
+ 
+module.exports = Game;
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/index.html b/coverage/lcov-report/index.html new file mode 100644 index 000000000..4df13c242 --- /dev/null +++ b/coverage/lcov-report/index.html @@ -0,0 +1,131 @@ + + + + + + Code coverage report for All files + + + + + + + + + +
+
+

All files

+
+ +
+ 100% + Statements + 51/51 +
+ + +
+ 96.29% + Branches + 26/27 +
+ + +
+ 100% + Functions + 17/17 +
+ + +
+ 100% + Lines + 49/49 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
frame.js +
+
100%14/14100%8/8100%6/6100%14/14
game.js +
+
100%37/3794.73%18/19100%11/11100%35/35
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/prettify.css b/coverage/lcov-report/prettify.css new file mode 100644 index 000000000..b317a7cda --- /dev/null +++ b/coverage/lcov-report/prettify.css @@ -0,0 +1 @@ +.pln{color:#000}@media screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.pun,.opn,.clo{color:#660}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec,.var{color:#606}.fun{color:red}}@media print,projection{.str{color:#060}.kwd{color:#006;font-weight:bold}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:bold}.lit{color:#044}.pun,.opn,.clo{color:#440}.tag{color:#006;font-weight:bold}.atn{color:#404}.atv{color:#060}}pre.prettyprint{padding:2px;border:1px solid #888}ol.linenums{margin-top:0;margin-bottom:0}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}li.L1,li.L3,li.L5,li.L7,li.L9{background:#eee} diff --git a/coverage/lcov-report/prettify.js b/coverage/lcov-report/prettify.js new file mode 100644 index 000000000..b3225238f --- /dev/null +++ b/coverage/lcov-report/prettify.js @@ -0,0 +1,2 @@ +/* eslint-disable */ +window.PR_SHOULD_USE_CONTINUATION=true;(function(){var h=["break,continue,do,else,for,if,return,while"];var u=[h,"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"];var p=[u,"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"];var l=[p,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"];var x=[p,"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient"];var R=[x,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var"];var r="all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,true,try,unless,until,when,while,yes";var w=[p,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"];var s="caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END";var I=[h,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"];var f=[h,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"];var H=[h,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"];var A=[l,R,w,s+I,f,H];var e=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)/;var C="str";var z="kwd";var j="com";var O="typ";var G="lit";var L="pun";var F="pln";var m="tag";var E="dec";var J="src";var P="atn";var n="atv";var N="nocode";var M="(?:^^\\.?|[+-]|\\!|\\!=|\\!==|\\#|\\%|\\%=|&|&&|&&=|&=|\\(|\\*|\\*=|\\+=|\\,|\\-=|\\->|\\/|\\/=|:|::|\\;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|\\?|\\@|\\[|\\^|\\^=|\\^\\^|\\^\\^=|\\{|\\||\\|=|\\|\\||\\|\\|=|\\~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*";function k(Z){var ad=0;var S=false;var ac=false;for(var V=0,U=Z.length;V122)){if(!(al<65||ag>90)){af.push([Math.max(65,ag)|32,Math.min(al,90)|32])}if(!(al<97||ag>122)){af.push([Math.max(97,ag)&~32,Math.min(al,122)&~32])}}}}af.sort(function(av,au){return(av[0]-au[0])||(au[1]-av[1])});var ai=[];var ap=[NaN,NaN];for(var ar=0;arat[0]){if(at[1]+1>at[0]){an.push("-")}an.push(T(at[1]))}}an.push("]");return an.join("")}function W(al){var aj=al.source.match(new RegExp("(?:\\[(?:[^\\x5C\\x5D]|\\\\[\\s\\S])*\\]|\\\\u[A-Fa-f0-9]{4}|\\\\x[A-Fa-f0-9]{2}|\\\\[0-9]+|\\\\[^ux0-9]|\\(\\?[:!=]|[\\(\\)\\^]|[^\\x5B\\x5C\\(\\)\\^]+)","g"));var ah=aj.length;var an=[];for(var ak=0,am=0;ak=2&&ai==="["){aj[ak]=X(ag)}else{if(ai!=="\\"){aj[ak]=ag.replace(/[a-zA-Z]/g,function(ao){var ap=ao.charCodeAt(0);return"["+String.fromCharCode(ap&~32,ap|32)+"]"})}}}}return aj.join("")}var aa=[];for(var V=0,U=Z.length;V=0;){S[ac.charAt(ae)]=Y}}var af=Y[1];var aa=""+af;if(!ag.hasOwnProperty(aa)){ah.push(af);ag[aa]=null}}ah.push(/[\0-\uffff]/);V=k(ah)})();var X=T.length;var W=function(ah){var Z=ah.sourceCode,Y=ah.basePos;var ad=[Y,F];var af=0;var an=Z.match(V)||[];var aj={};for(var ae=0,aq=an.length;ae=5&&"lang-"===ap.substring(0,5);if(am&&!(ai&&typeof ai[1]==="string")){am=false;ap=J}if(!am){aj[ag]=ap}}var ab=af;af+=ag.length;if(!am){ad.push(Y+ab,ap)}else{var al=ai[1];var ak=ag.indexOf(al);var ac=ak+al.length;if(ai[2]){ac=ag.length-ai[2].length;ak=ac-al.length}var ar=ap.substring(5);B(Y+ab,ag.substring(0,ak),W,ad);B(Y+ab+ak,al,q(ar,al),ad);B(Y+ab+ac,ag.substring(ac),W,ad)}}ah.decorations=ad};return W}function i(T){var W=[],S=[];if(T.tripleQuotedStrings){W.push([C,/^(?:\'\'\'(?:[^\'\\]|\\[\s\S]|\'{1,2}(?=[^\']))*(?:\'\'\'|$)|\"\"\"(?:[^\"\\]|\\[\s\S]|\"{1,2}(?=[^\"]))*(?:\"\"\"|$)|\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$))/,null,"'\""])}else{if(T.multiLineStrings){W.push([C,/^(?:\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$)|\`(?:[^\\\`]|\\[\s\S])*(?:\`|$))/,null,"'\"`"])}else{W.push([C,/^(?:\'(?:[^\\\'\r\n]|\\.)*(?:\'|$)|\"(?:[^\\\"\r\n]|\\.)*(?:\"|$))/,null,"\"'"])}}if(T.verbatimStrings){S.push([C,/^@\"(?:[^\"]|\"\")*(?:\"|$)/,null])}var Y=T.hashComments;if(Y){if(T.cStyleComments){if(Y>1){W.push([j,/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,null,"#"])}else{W.push([j,/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\r\n]*)/,null,"#"])}S.push([C,/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,null])}else{W.push([j,/^#[^\r\n]*/,null,"#"])}}if(T.cStyleComments){S.push([j,/^\/\/[^\r\n]*/,null]);S.push([j,/^\/\*[\s\S]*?(?:\*\/|$)/,null])}if(T.regexLiterals){var X=("/(?=[^/*])(?:[^/\\x5B\\x5C]|\\x5C[\\s\\S]|\\x5B(?:[^\\x5C\\x5D]|\\x5C[\\s\\S])*(?:\\x5D|$))+/");S.push(["lang-regex",new RegExp("^"+M+"("+X+")")])}var V=T.types;if(V){S.push([O,V])}var U=(""+T.keywords).replace(/^ | $/g,"");if(U.length){S.push([z,new RegExp("^(?:"+U.replace(/[\s,]+/g,"|")+")\\b"),null])}W.push([F,/^\s+/,null," \r\n\t\xA0"]);S.push([G,/^@[a-z_$][a-z_$@0-9]*/i,null],[O,/^(?:[@_]?[A-Z]+[a-z][A-Za-z_$@0-9]*|\w+_t\b)/,null],[F,/^[a-z_$][a-z_$@0-9]*/i,null],[G,new RegExp("^(?:0x[a-f0-9]+|(?:\\d(?:_\\d+)*\\d*(?:\\.\\d*)?|\\.\\d\\+)(?:e[+\\-]?\\d+)?)[a-z]*","i"),null,"0123456789"],[F,/^\\[\s\S]?/,null],[L,/^.[^\s\w\.$@\'\"\`\/\#\\]*/,null]);return g(W,S)}var K=i({keywords:A,hashComments:true,cStyleComments:true,multiLineStrings:true,regexLiterals:true});function Q(V,ag){var U=/(?:^|\s)nocode(?:\s|$)/;var ab=/\r\n?|\n/;var ac=V.ownerDocument;var S;if(V.currentStyle){S=V.currentStyle.whiteSpace}else{if(window.getComputedStyle){S=ac.defaultView.getComputedStyle(V,null).getPropertyValue("white-space")}}var Z=S&&"pre"===S.substring(0,3);var af=ac.createElement("LI");while(V.firstChild){af.appendChild(V.firstChild)}var W=[af];function ae(al){switch(al.nodeType){case 1:if(U.test(al.className)){break}if("BR"===al.nodeName){ad(al);if(al.parentNode){al.parentNode.removeChild(al)}}else{for(var an=al.firstChild;an;an=an.nextSibling){ae(an)}}break;case 3:case 4:if(Z){var am=al.nodeValue;var aj=am.match(ab);if(aj){var ai=am.substring(0,aj.index);al.nodeValue=ai;var ah=am.substring(aj.index+aj[0].length);if(ah){var ak=al.parentNode;ak.insertBefore(ac.createTextNode(ah),al.nextSibling)}ad(al);if(!ai){al.parentNode.removeChild(al)}}}break}}function ad(ak){while(!ak.nextSibling){ak=ak.parentNode;if(!ak){return}}function ai(al,ar){var aq=ar?al.cloneNode(false):al;var ao=al.parentNode;if(ao){var ap=ai(ao,1);var an=al.nextSibling;ap.appendChild(aq);for(var am=an;am;am=an){an=am.nextSibling;ap.appendChild(am)}}return aq}var ah=ai(ak.nextSibling,0);for(var aj;(aj=ah.parentNode)&&aj.nodeType===1;){ah=aj}W.push(ah)}for(var Y=0;Y=S){ah+=2}if(V>=ap){Z+=2}}}var t={};function c(U,V){for(var S=V.length;--S>=0;){var T=V[S];if(!t.hasOwnProperty(T)){t[T]=U}else{if(window.console){console.warn("cannot override language handler %s",T)}}}}function q(T,S){if(!(T&&t.hasOwnProperty(T))){T=/^\s*]*(?:>|$)/],[j,/^<\!--[\s\S]*?(?:-\->|$)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],[L,/^(?:<[%?]|[%?]>)/],["lang-",/^]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-js",/^]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]),["default-markup","htm","html","mxml","xhtml","xml","xsl"]);c(g([[F,/^[\s]+/,null," \t\r\n"],[n,/^(?:\"[^\"]*\"?|\'[^\']*\'?)/,null,"\"'"]],[[m,/^^<\/?[a-z](?:[\w.:-]*\w)?|\/?>$/i],[P,/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^>\'\"\s]*(?:[^>\'\"\s\/]|\/(?=\s)))/],[L,/^[=<>\/]+/],["lang-js",/^on\w+\s*=\s*\"([^\"]+)\"/i],["lang-js",/^on\w+\s*=\s*\'([^\']+)\'/i],["lang-js",/^on\w+\s*=\s*([^\"\'>\s]+)/i],["lang-css",/^style\s*=\s*\"([^\"]+)\"/i],["lang-css",/^style\s*=\s*\'([^\']+)\'/i],["lang-css",/^style\s*=\s*([^\"\'>\s]+)/i]]),["in.tag"]);c(g([],[[n,/^[\s\S]+/]]),["uq.val"]);c(i({keywords:l,hashComments:true,cStyleComments:true,types:e}),["c","cc","cpp","cxx","cyc","m"]);c(i({keywords:"null,true,false"}),["json"]);c(i({keywords:R,hashComments:true,cStyleComments:true,verbatimStrings:true,types:e}),["cs"]);c(i({keywords:x,cStyleComments:true}),["java"]);c(i({keywords:H,hashComments:true,multiLineStrings:true}),["bsh","csh","sh"]);c(i({keywords:I,hashComments:true,multiLineStrings:true,tripleQuotedStrings:true}),["cv","py"]);c(i({keywords:s,hashComments:true,multiLineStrings:true,regexLiterals:true}),["perl","pl","pm"]);c(i({keywords:f,hashComments:true,multiLineStrings:true,regexLiterals:true}),["rb"]);c(i({keywords:w,cStyleComments:true,regexLiterals:true}),["js"]);c(i({keywords:r,hashComments:3,cStyleComments:true,multilineStrings:true,tripleQuotedStrings:true,regexLiterals:true}),["coffee"]);c(g([],[[C,/^[\s\S]+/]]),["regex"]);function d(V){var U=V.langExtension;try{var S=a(V.sourceNode);var T=S.sourceCode;V.sourceCode=T;V.spans=S.spans;V.basePos=0;q(U,T)(V);D(V)}catch(W){if("console" in window){console.log(W&&W.stack?W.stack:W)}}}function y(W,V,U){var S=document.createElement("PRE");S.innerHTML=W;if(U){Q(S,U)}var T={langExtension:V,numberLines:U,sourceNode:S};d(T);return S.innerHTML}function b(ad){function Y(af){return document.getElementsByTagName(af)}var ac=[Y("pre"),Y("code"),Y("xmp")];var T=[];for(var aa=0;aa=0){var ah=ai.match(ab);var am;if(!ah&&(am=o(aj))&&"CODE"===am.tagName){ah=am.className.match(ab)}if(ah){ah=ah[1]}var al=false;for(var ak=aj.parentNode;ak;ak=ak.parentNode){if((ak.tagName==="pre"||ak.tagName==="code"||ak.tagName==="xmp")&&ak.className&&ak.className.indexOf("prettyprint")>=0){al=true;break}}if(!al){var af=aj.className.match(/\blinenums\b(?::(\d+))?/);af=af?af[1]&&af[1].length?+af[1]:true:false;if(af){Q(aj,af)}S={langExtension:ah,sourceNode:aj,numberLines:af};d(S)}}}if(X]*(?:>|$)/],[PR.PR_COMMENT,/^<\!--[\s\S]*?(?:-\->|$)/],[PR.PR_PUNCTUATION,/^(?:<[%?]|[%?]>)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],["lang-",/^]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-handlebars",/^]*type\s*=\s*['"]?text\/x-handlebars-template['"]?\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-js",/^]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i],[PR.PR_DECLARATION,/^{{[#^>/]?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{&?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{{>?\s*[\w.][^}]*}}}/],[PR.PR_COMMENT,/^{{![^}]*}}/]]),["handlebars","hbs"]);PR.registerLangHandler(PR.createSimpleLexer([[PR.PR_PLAIN,/^[ \t\r\n\f]+/,null," \t\r\n\f"]],[[PR.PR_STRING,/^\"(?:[^\n\r\f\\\"]|\\(?:\r\n?|\n|\f)|\\[\s\S])*\"/,null],[PR.PR_STRING,/^\'(?:[^\n\r\f\\\']|\\(?:\r\n?|\n|\f)|\\[\s\S])*\'/,null],["lang-css-str",/^url\(([^\)\"\']*)\)/i],[PR.PR_KEYWORD,/^(?:url|rgb|\!important|@import|@page|@media|@charset|inherit)(?=[^\-\w]|$)/i,null],["lang-css-kw",/^(-?(?:[_a-z]|(?:\\[0-9a-f]+ ?))(?:[_a-z0-9\-]|\\(?:\\[0-9a-f]+ ?))*)\s*:/i],[PR.PR_COMMENT,/^\/\*[^*]*\*+(?:[^\/*][^*]*\*+)*\//],[PR.PR_COMMENT,/^(?:)/],[PR.PR_LITERAL,/^(?:\d+|\d*\.\d+)(?:%|[a-z]+)?/i],[PR.PR_LITERAL,/^#(?:[0-9a-f]{3}){1,2}/i],[PR.PR_PLAIN,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i],[PR.PR_PUNCTUATION,/^[^\s\w\'\"]+/]]),["css"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_KEYWORD,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i]]),["css-kw"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_STRING,/^[^\)\"\']+/]]),["css-str"]); diff --git a/coverage/lcov-report/sort-arrow-sprite.png b/coverage/lcov-report/sort-arrow-sprite.png new file mode 100644 index 0000000000000000000000000000000000000000..6ed68316eb3f65dec9063332d2f69bf3093bbfab GIT binary patch literal 138 zcmeAS@N?(olHy`uVBq!ia0vp^>_9Bd!3HEZxJ@+%Qh}Z>jv*C{$p!i!8j}?a+@3A= zIAGwzjijN=FBi!|L1t?LM;Q;gkwn>2cAy-KV{dn nf0J1DIvEHQu*n~6U}x}qyky7vi4|9XhBJ7&`njxgN@xNA8m%nc literal 0 HcmV?d00001 diff --git a/coverage/lcov-report/sorter.js b/coverage/lcov-report/sorter.js new file mode 100644 index 000000000..2bb296a8c --- /dev/null +++ b/coverage/lcov-report/sorter.js @@ -0,0 +1,196 @@ +/* eslint-disable */ +var addSorting = (function() { + 'use strict'; + var cols, + currentSort = { + index: 0, + desc: false + }; + + // returns the summary table element + function getTable() { + return document.querySelector('.coverage-summary'); + } + // returns the thead element of the summary table + function getTableHeader() { + return getTable().querySelector('thead tr'); + } + // returns the tbody element of the summary table + function getTableBody() { + return getTable().querySelector('tbody'); + } + // returns the th element for nth column + function getNthColumn(n) { + return getTableHeader().querySelectorAll('th')[n]; + } + + function onFilterInput() { + const searchValue = document.getElementById('fileSearch').value; + const rows = document.getElementsByTagName('tbody')[0].children; + for (let i = 0; i < rows.length; i++) { + const row = rows[i]; + if ( + row.textContent + .toLowerCase() + .includes(searchValue.toLowerCase()) + ) { + row.style.display = ''; + } else { + row.style.display = 'none'; + } + } + } + + // loads the search box + function addSearchBox() { + var template = document.getElementById('filterTemplate'); + var templateClone = template.content.cloneNode(true); + templateClone.getElementById('fileSearch').oninput = onFilterInput; + template.parentElement.appendChild(templateClone); + } + + // loads all columns + function loadColumns() { + var colNodes = getTableHeader().querySelectorAll('th'), + colNode, + cols = [], + col, + i; + + for (i = 0; i < colNodes.length; i += 1) { + colNode = colNodes[i]; + col = { + key: colNode.getAttribute('data-col'), + sortable: !colNode.getAttribute('data-nosort'), + type: colNode.getAttribute('data-type') || 'string' + }; + cols.push(col); + if (col.sortable) { + col.defaultDescSort = col.type === 'number'; + colNode.innerHTML = + colNode.innerHTML + ''; + } + } + return cols; + } + // attaches a data attribute to every tr element with an object + // of data values keyed by column name + function loadRowData(tableRow) { + var tableCols = tableRow.querySelectorAll('td'), + colNode, + col, + data = {}, + i, + val; + for (i = 0; i < tableCols.length; i += 1) { + colNode = tableCols[i]; + col = cols[i]; + val = colNode.getAttribute('data-value'); + if (col.type === 'number') { + val = Number(val); + } + data[col.key] = val; + } + return data; + } + // loads all row data + function loadData() { + var rows = getTableBody().querySelectorAll('tr'), + i; + + for (i = 0; i < rows.length; i += 1) { + rows[i].data = loadRowData(rows[i]); + } + } + // sorts the table using the data for the ith column + function sortByIndex(index, desc) { + var key = cols[index].key, + sorter = function(a, b) { + a = a.data[key]; + b = b.data[key]; + return a < b ? -1 : a > b ? 1 : 0; + }, + finalSorter = sorter, + tableBody = document.querySelector('.coverage-summary tbody'), + rowNodes = tableBody.querySelectorAll('tr'), + rows = [], + i; + + if (desc) { + finalSorter = function(a, b) { + return -1 * sorter(a, b); + }; + } + + for (i = 0; i < rowNodes.length; i += 1) { + rows.push(rowNodes[i]); + tableBody.removeChild(rowNodes[i]); + } + + rows.sort(finalSorter); + + for (i = 0; i < rows.length; i += 1) { + tableBody.appendChild(rows[i]); + } + } + // removes sort indicators for current column being sorted + function removeSortIndicators() { + var col = getNthColumn(currentSort.index), + cls = col.className; + + cls = cls.replace(/ sorted$/, '').replace(/ sorted-desc$/, ''); + col.className = cls; + } + // adds sort indicators for current column being sorted + function addSortIndicators() { + getNthColumn(currentSort.index).className += currentSort.desc + ? ' sorted-desc' + : ' sorted'; + } + // adds event listeners for all sorter widgets + function enableUI() { + var i, + el, + ithSorter = function ithSorter(i) { + var col = cols[i]; + + return function() { + var desc = col.defaultDescSort; + + if (currentSort.index === i) { + desc = !currentSort.desc; + } + sortByIndex(i, desc); + removeSortIndicators(); + currentSort.index = i; + currentSort.desc = desc; + addSortIndicators(); + }; + }; + for (i = 0; i < cols.length; i += 1) { + if (cols[i].sortable) { + // add the click event handler on the th so users + // dont have to click on those tiny arrows + el = getNthColumn(i).querySelector('.sorter').parentElement; + if (el.addEventListener) { + el.addEventListener('click', ithSorter(i)); + } else { + el.attachEvent('onclick', ithSorter(i)); + } + } + } + } + // adds sorting functionality to the UI + return function() { + if (!getTable()) { + return; + } + cols = loadColumns(); + loadData(); + addSearchBox(); + addSortIndicators(); + enableUI(); + }; +})(); + +window.addEventListener('load', addSorting); diff --git a/coverage/lcov.info b/coverage/lcov.info new file mode 100644 index 000000000..0f5b29dbc --- /dev/null +++ b/coverage/lcov.info @@ -0,0 +1,128 @@ +TN: +SF:frame.js +FN:2,(anonymous_0) +FN:8,(anonymous_1) +FN:19,(anonymous_2) +FN:20,(anonymous_3) +FN:25,(anonymous_4) +FN:29,(anonymous_5) +FNF:6 +FNH:6 +FNDA:122,(anonymous_0) +FNDA:195,(anonymous_1) +FNDA:116,(anonymous_2) +FNDA:186,(anonymous_3) +FNDA:148,(anonymous_4) +FNDA:110,(anonymous_5) +DA:3,122 +DA:4,122 +DA:5,122 +DA:9,195 +DA:10,2 +DA:11,193 +DA:12,1 +DA:14,192 +DA:15,192 +DA:20,116 +DA:21,186 +DA:26,148 +DA:30,110 +DA:33,3 +LF:14 +LH:14 +BRDA:9,0,0,2 +BRDA:9,0,1,193 +BRDA:9,1,0,195 +BRDA:9,1,1,194 +BRDA:11,2,0,1 +BRDA:11,2,1,192 +BRDA:30,3,0,110 +BRDA:30,3,1,56 +BRF:8 +BRH:8 +end_of_record +TN: +SF:game.js +FN:4,(anonymous_0) +FN:11,(anonymous_1) +FN:18,(anonymous_2) +FN:19,(anonymous_3) +FN:32,(anonymous_4) +FN:48,(anonymous_5) +FN:52,(anonymous_6) +FN:61,(anonymous_7) +FN:62,(anonymous_8) +FN:67,(anonymous_9) +FN:71,(anonymous_10) +FNF:11 +FNH:11 +FNDA:15,(anonymous_0) +FNDA:15,(anonymous_1) +FNDA:13,(anonymous_2) +FNDA:130,(anonymous_3) +FNDA:117,(anonymous_4) +FNDA:7,(anonymous_5) +FNDA:10,(anonymous_6) +FNDA:13,(anonymous_7) +FNDA:130,(anonymous_8) +FNDA:1,(anonymous_9) +FNDA:1,(anonymous_10) +DA:1,2 +DA:5,15 +DA:6,15 +DA:7,15 +DA:8,15 +DA:12,15 +DA:13,150 +DA:14,150 +DA:19,13 +DA:21,130 +DA:22,130 +DA:24,13 +DA:25,13 +DA:27,7 +DA:29,13 +DA:33,117 +DA:34,117 +DA:35,117 +DA:37,117 +DA:38,13 +DA:39,104 +DA:40,43 +DA:42,43 +DA:43,32 +DA:49,7 +DA:50,7 +DA:52,7 +DA:53,10 +DA:56,7 +DA:57,2 +DA:62,13 +DA:63,130 +DA:68,1 +DA:72,1 +DA:76,2 +LF:35 +LH:35 +BRDA:4,0,0,0 +BRDA:22,1,0,117 +BRDA:22,1,1,13 +BRDA:25,2,0,7 +BRDA:25,2,1,6 +BRDA:25,3,0,13 +BRDA:25,3,1,10 +BRDA:37,4,0,13 +BRDA:37,4,1,104 +BRDA:39,5,0,43 +BRDA:39,5,1,61 +BRDA:42,6,0,32 +BRDA:42,6,1,11 +BRDA:42,7,0,43 +BRDA:42,7,1,38 +BRDA:56,8,0,2 +BRDA:56,8,1,5 +BRDA:56,9,0,7 +BRDA:56,9,1,3 +BRF:19 +BRH:18 +end_of_record diff --git a/game.js b/game.js index c85c5028d..7708e45c1 100644 --- a/game.js +++ b/game.js @@ -1,5 +1,7 @@ +const Frame = require("./frame"); + class Game { - constructor(frameClass) { + constructor(frameClass = Frame) { this.grandTotal = 0; this.frames = []; this.frameClass = frameClass; diff --git a/package-lock.json b/package-lock.json index 53476d74e..b04f0ae12 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,7 +9,8 @@ "version": "1.0.0", "license": "ISC", "dependencies": { - "jest": "^29.5.0" + "jest": "^29.5.0", + "node": "^20.2.0" } }, "node_modules/@ampproject/remapping": { @@ -2512,6 +2513,26 @@ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==" }, + "node_modules/node": { + "version": "20.2.0", + "resolved": "https://registry.npmjs.org/node/-/node-20.2.0.tgz", + "integrity": "sha512-oF1+u42FT/nFtRFdcsUNdexVCWQKAHB7LtKHOk/9o0cQBq19leB/0awrB3ZdzHU/Pz9tC9RHwgd52PK9bON30A==", + "hasInstallScript": true, + "dependencies": { + "node-bin-setup": "^1.0.0" + }, + "bin": { + "node": "bin/node" + }, + "engines": { + "npm": ">=5.0.0" + } + }, + "node_modules/node-bin-setup": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/node-bin-setup/-/node-bin-setup-1.1.3.tgz", + "integrity": "sha512-opgw9iSCAzT2+6wJOETCpeRYAQxSopqQ2z+N6BXwIMsQQ7Zj5M8MaafQY8JMlolRR6R1UXg2WmhKp0p9lSOivg==" + }, "node_modules/node-int64": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", diff --git a/package.json b/package.json index 56a94404c..6d4b99c31 100644 --- a/package.json +++ b/package.json @@ -13,6 +13,7 @@ "author": "", "license": "ISC", "dependencies": { - "jest": "^29.5.0" + "jest": "^29.5.0", + "node": "^20.2.0" } } diff --git a/screenshots/bowling-challenge-jest.png b/screenshots/bowling-challenge-jest.png new file mode 100644 index 0000000000000000000000000000000000000000..dacf4604096d005f2c64f82c2505036f2fa5e3b6 GIT binary patch literal 90280 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 tE$1%waC9?59;?>w``-_`K-_nCzx0$z4@dw2 literal 0 HcmV?d00001 diff --git a/screenshots/bowling-challenge-node.png b/screenshots/bowling-challenge-node.png new file mode 100644 index 0000000000000000000000000000000000000000..f6902373663a0d8e9f7e837cab3e1d7d0935c78a GIT binary patch literal 88013 zcmafa1y~$Swl;wP0fNI2oZvPP+#$i;b+F*>?vUW_?(PJ4NN{)8;10nV^q+jYcX#i- z`R+eY_tQPyWnFdZ)H&~YD@0ya3>gs*5ef8scI{%fye@IFeu0s3B%21|-V z`(qf86feYxz|MaOeX}s3g5HY~3@dU>AKK0cP>y%1{;al^?_2pWbi4boJLdDkb(zJo zH@4yd4^_WK5JL^G0#Blr%ovGqQxqj9Ss0fI4NU^gJORfUlt!g5DiQ#r9=Oz*FISpGZJY>L2Ff^FiV zEZa?@q0`&0Q6rQLfv|QwP?EF+k(@A4vr^GTIJPX=f#w1|k%E~Y-}vGY>SwL2(C`K; zy>AF)Ck-yR53eJ3WPUD8VJ{!tFnntO)-n{K`4~+#v@vogFn!)BWgTfa5JXW7n6& zBp@FNd878r?BELtdyj2E_B1T`m^0Yvy-v?KQn<>3C6-)>!kr-gbT5737lC2);YUfY z)g;4y7VP^f7O-Uie<3ItH|Y%%to|kRC&AY}rD#0cM*V>_mVE%@8qz?^p4fM0kGp97 zzXE;_>r|RwTVQC(bd3?m#&4)W%)} zDsd`O6fqig7SByMV|bLxz9-twL;pbkCYFM1d>0YN&faS&H>F_h3q*ZvgL8k+CX$_d z*A{94T3I40o#bAGh}izGjPM)2u+UJ1;-6(;ls*E`9B9#$VdG~h%z58GJ_W%| zA{3F3=r7bW0`=w(YXs^APcNCo`kgG&1O9aH2BXDVmZB+`qThXd`yLM6%GPTI{;_l-;)Guxm-on_9CFky3J_FBE6 zC9th`U~@2#`-{&VzI)A-^e)#N&keVC%TK@Ek00IZ%@e9nH!a;KKKnc-qrO=vMo?o! zo02`S_9#g@Z+-!D;9OFPK0q6P#~bTMXnMu?6CU~#b?|FD5(McllO|nG3~zjj!ij z^~Ym0Du2H_5c;WoL|d9r+vtb{*)|A{azWZ0Rsg?_DB1SkgFIuhEuSr zuuBt8T(Cw@N)JVkQ_pJ8Ru97_*(Owo@D$l%Oq)auISNgdvLHxmNy3~$oANrEpPGga zmyU}DmWF~3At5xLHr|<1?D`Xc9r zJqk6{moy3Sa6>dh+C%t8Mn+0Ts5_=ceiytuk~@4uCJDsUKFX8I)hc==`NiVOiKUiG zT$T1xJID!=_4)S-aV6lHf*I~Zi9@eLc$L)Bue6#8Mciujpn8StnnNkJn$!S1C97Ca z4k%#ByFSd^>(J0i$|;ds%q!Bp{{H}2Y2=5T&)#(7e9BC}Gv!b`bT z6MnjSM(=2QpMH9=$U%E=`b{_b2>K&>m>6q#6YpmGskpX)c87Jzsr9NwOV-uCyPx}_ zJKa_4)#<_3eZ&3a{q)uRQP$KMehJ%@1-Xmi!GIT;4SqIU0~`|^3o<*tMee3tHqIEO(43i@WuIv`oaAH9)%la14RTy28B^9ElQTCUH>X&a-Be%(1DT83`(Lh~=}xz-iOg62pE?fs?Q``OV| znd7;ib4S*vnTI-C-d}TigZ1h4(yvKe?>t7XIXBNIr$<@V9kTXxb#8PPb$Hq`BkJ*n ziCc}1$!wHtB5x_rtchFXO2_@Ip05k%5yb0W5+;_z4*scNttkh)1{KWzbY_7(?&d~(L)dxbO@hyeeleGI! zQJqjT2$zToF#!0g*f$?m*tH1Om{ACExUF}ZTG0XMUBQLoXoHbjxNeL?wC3hB8>ae> z%8pJ~amh?fwfbW{Q~Ff>r@>x0d&G_Or?PEMZR8!mPr&ySISdY&WfI$9S0$Z|GVTe;+{!Y_`6O;+R5RysOmozd*2;ay zP)5)(3NW-9aL*!4X$N|Ipkgv{sZ_K!KYgE5_(5}lzt?o=ibk81M_Afn9SKZSzTOm@B%gDEkYS+H$uI#RL<4u-k zmSy9VkyL@BAC|kvG7iyPW)4fcsiVNmWfn%)wHt6ec=6JQ(Vm``(Y=+#?vqrt-g(=m zSm)~(McrHwDMNGhgvCan$Q|jA+_B!Vuz7}O)gd}Q-CcE6g&QLTmqD;@|04)|^mFQ} zAY*tXu|ii?i$TlVE8r~jWCw32U?)m7Qgg8>w4>BGc9ihRSywCIn%w6rfAY;&MFRZB{1 zhJ{B%sjftpPA2cN<N`qsT+B_M;6|*d_dD@Ee-u7Lb+H&49k6b_o zw+HwB)ga3VONB}MI1$&L+v$W`AGi?78V8R@iwEWT^#0+8Y~xs8*eOmLqnnob0p7CH zan0EdrW$l*ddEXXV+`WKFwkb;{%Lmi82X zrRu4BH)?g&dR2`0HSfObyN6$6WT$yJQI|wM2Q=P-UW(^4cV??BMJ8hIU)>q`vVOJg z1?>0kb;Js=J(s(gJzad)_4aYPiaI-Uqwr?Cb05TS=U85AX|uu)#%p?ExLw`5Eg-() zw|p76bKO@_O%8@@RfpzoWU(*!s2k>sQjqWU>eB@1I4cr(e0YBSV>EK(V^= z=SfFry%@sAWN8?^d8DEjAR7wBheH1K!qx2|f8I=4-BDden%ls}ib2oNM&F3R)ynpFIZ(W=+>l!;^M;K!opxNL{jY2YhijH?>B(K^Ts`Iy>zS0XG>S9fFfdIm+zPJCnn@el}j*I zTV0~YvIOKz#?o^J2E@}Y85MG0C(tMbB4X1DudS`+$_NYlb1qqK_rSWWkB8*snz6r^ zFH|CPFYeE~w{-DrNF1wLm1!2dP!wOa$8x#ASmkv7)M*WjE7C_tq}B|!7SSy#Tb5HV z)2|;Xk|zOUBawD~0S^rG!1w9~7u-#&?aR(Mm0cU8;_`l8pbx7wXT4Aq_MdsAk4q zpP3}u`!z{jKJl_jnQBZ@Qc}~8>`z~(X75R#jQuh{LB0O?$AiQJ!*?QBxtg4C;ygeoZ5t(=v z6IrFN%^tT56qJ-xCz_4a@8ADWCN_Qjryl?B!+amopU!)7i2$jyRt8IBsr{NdM>Mkf7G-jhEgs>-fw3kAmvhAMDHz|j&R%;DET}JQvrM`vrLMl7jfL}Si1#Rnu@-+{tXy*~b_}Ojsg}fL8bvx3XPnL|DLY4kJzyqAn z&IrI`26_@*{>Dh=(;qMGN6rAKeJ4_l=sl@%3A(5eyWuU?~lpG2V zP~At5t$d224IfZ@Uq79JwT0IJ<_Q%=9ocS?TFf4D5p6dcm z>9nSPp!K7~PzqJ>>3XNwZKZBO4_y(>#@x&X=Nkh-pzTiNz?SNt~E+>8X0g)w7f6$en?i*q&Xd7e_8=i z=J_X1R9;eNo3b(G`&;0c?afuv4 zTwW$3HW`T~$7Ad=q5J`RxVi9uk`uoxvgpEzSjG?0_70Fq3hV4cbc4Ef6F=*QPd|ry7kf|mmv4g&I7kocXH!?|8_ARi7vGOK(pnVJk)wLJTHe3t)+YB~{2@zVuRW92&LQZP05kv_)c! zy%envrB2vi>~T4dk2eat(W;lBgK=m-@%#N)Dy%?VZL{~=tV+)tUVbU`cPP5@z-5W7 z%(Ap;$fz=Yihs#*kFRp1xIkjaZ!Wu+tL@+v#o;JV)Yc?mF<&JlEb7fB> z&-t#X2O56B@_Hn0Y1rOAPH0lMf*&yTw9>&CeXAPv3XoIw=as1&7RhseQ@IY9&?58Fi&qzNVSP?k7jc znj0{0Bn$%pcKU64l)Ql+onumLu63RDS+mZfuh@~ zcb!T=r^}l=%T*Ln;O2*BP7s^5S>H*cnO8Y=7?xDgkPuLihMKeKq#Iv!b(SP&UJa@| z+^ZasPF4O2YGn9?&#sltu`b;}v{GAyy)&97wNmN{)=lp)ny=KRf!HWFXX{m~7BEi7 z3o(cDRdTRMfc(q7@##=(I@5=n6ZSJqJUmGts4n|rXE+R%y$SiY-tj;&&FW4N^0wD2 z6abXm8_US^c?JhLpRS}BhXaV{8Y>hF5UW36VqyyQM-t}shT%-lmL1drN@QQ-{L##) zLH1(}Nc<9jSb)%t9wXwMXnU;N(){9cF|&JqQ6R-$HHZYU>ZZ2VJH|ZHu5Q19v3wqL z+v4AgEV_&~=R%`JBr&BlHC|TS&TE(%ODY5I%-a6jzHM_Gx<_4W3zHmXRKt-b(OVRT; zqP$*eVXcL8jsWF~JS)6Cl{CyG;z#>B5slL>isH3_@c}9lv#%ODhD7;RI%U@5&s8Q4 zZi@#70hKT%GX^JCH{BKw>lgV@qhljgebF>alzcW5%d#;q<#}Wd{57B-lh<(>$!2PY zDQYEx%Snbffd1A-o5>EYIBJkbgOPn;7|YS=KIe|>D1pNsqexDMN!&QhE8!b-;_EEi ztmLAP8XCfBMRU`aMxgL){rb%5@mcBZ$lj~<`>0vcn5tzH;LeyPiAZz(mxY0L$Il9K z7D>g54}%~93H>)}oaa7D2Yp~K)uYmY(w)8pgQJ7}A;_$aF^Sm@f~yzdSHPrgV~Y_k zyz3EeiM9G2`BuzauFvJ(&;v6$yNUSQ zT48;`5-#eauZ+y9=TOLN| z{H7SyU&}V5#rnM;PZnF`uxZONR2nSZz93>>V1mJyQPcaAgMuyf{Kqr~?1 z1Z@!}H|ueyZ`XZnR5%ajtFkEJ>e*Fs_9iDMSuGbnw74?u_>>jNWmS%r2!=XC@`p>JlmdJOr915|I zZ(tj~b;KkclGG#TCa;?m;MVpMy0Hth6OqEk>O=O?mNqvw@=+ z96Be}Kw3SY8xZ8A?a=OICdZjzy%uS|dov&8p?{*!eZ56*M?`Q#J$q`_9{pxBbU zY}Sgq&*5WJbU>mf#qe~q&%DLyG^<5b*phL!F)SJeD2ul4sIqbE`PqvDtfgb?_%u>? z3Dk+ii;}8Y+qk)9YgE{4cotzoe<=CZAPQSLo3N@Vc#OTod*^0nEn_M%?!>_(>-7u8 z_(IM6lS)>Drz)un1Nyj0^%7(LzD&I-0{!xxUl~*G3OH2$$B^9qwUtI4R>^XL=LMw( zV4HC|`U0!GxUt#(_$7EXU=Yh^hf|yDn`kD8VDt?zpdK9WqF%zINLag6V`5N265uW?uhdGfLoDyrZL|YjbziWxb%?<90~u zY9~oou|%<;hilL0iR}Q4Fthn%G)q8t|KfN!{1&a+Kq`ngr(0o^mDW&$oHf7Gb zb>*^2Q$?iNMwtWSR(|cOV@FVVQVqHC9(ib5L#3`3@1bx7O5`!E2X}z`(Q`yXN!^B2 z3*hoPW*+2MOK0CP&+22o{EB5fSUDROUfrzF$sZbThe&Mr@pSIQk2rS&6Q%E8UD;Qz zwp)xG?aeOkn!>kc?r>;6C2>$$S%NUJw$(4uDs6Omzn+=mV75jg?X-+l?K3gIEvzb?F4Rc}z{KfJcOIo+BAeU-$60F5 zu^UhZS+dTH+^*wZ(tZX{bZzY@%Q)Dux9R}fUj!i1eO9o^U*0E$L~XN?&t*@hX;I;_ zFKm2$C{}DfYp53La=J3Rne$knVXxlTVz&usnXs4Jdc2yJ({xm+0I{X=at)?N8DxJG z?<#@70as%@XTiL!4|rVm`2)km01fre8$GI2mPTDA5Ix;uG?FV4X8PkxzKgilj5j}c z8&hwwYp---s#2TB{pmXY1+HA9HqdxX+DwnlWQ<_60`&fUkF6K^pZvvFXtr#xiUJa| z8(;wxutOiHdQukR!J9JBN;3l|$YHM)M9T z_r*!j{fT7Vfn-AFNkP^y^3eyG@`0id0P~=XI|RU#NDhsP;gvLW{}B5=8RZH2!Y zS9*h6p^?l>n})FQUcHvHWR~inY|X-i)bt^F{^}^*&aitmH^*6D)ik6NOJakp^9}RT8qu-X*eq?QFa>l8W8M%Gbb`wUK z4wy}|d}!fYZBE3Z8>A|J9dHfGfkxfU}$$Mq4*M9|$BqKpFo4Vi9wN3x5^R%V&>4A1z4LNGT36IHk@*h}6Y14?;I zaF#do)NDzo%hYgXdWv&yKUl920j&pp?wjeDr*bK1X+zzw_G5B~XUo*WYC50q!yrZ< z<;5|IbjxcNP|E;{dh%cz2jgm!-PeWDcSTGFee&w+$pej6%c=yk#47R-<0taE>s*7g zx>r(5E8QAQx*CDasH4@Byup2}fBgN`vc-T?^dGU8kKYxbWs!h>R`*Jg@Rf=L?agF@ zVRAVi-5=8+m}OGqY9rVAG6Of~7Dww*YiX{6DOcT{19uf{a1zb0oO@-L334|{W?89P z#`*ozT5D0=TwphSK!Ko)=ClwaRqM&(!zjEXP@kABrB3~d0`^s2??~i}mpmKNXPi7%n5Y>ZDn5M z&fz&s-BEYl>gc-wfX80{EemMEHl@PQ@uBZ}q%w=_M47UouP`x7=LJb*Br6eOvnGYL zc$bFpxuI$vSv#lK=!!)l!&~JLaK$|{tj_jqRj|ZXxHmDfx$6-T~`y&%mA?9IB_vxy_OtnEQMP!(Dj%FQ!fOk6FTk)D$<%dMU;l2ob zv#I?2mqKJ>{&XTY@&iKGql(6T$ZBkk8IuJ8|ANnRK||t6`UFzFsk0Ip+)n-vA5K4F zgZQ7WlxTJN4{#;z$mn3Re4e?UZqgoJI=>Ie%l{FEjt+Rk39Ng~dL+8`qgVR9-HemE zIme(bSI8MJ3b% zoVpHHb>0OcgktO~Ks<9Q$Rxux5xpt0jxG}n1C3Q%vm<+ovZITsWN$*7o#$NCnSS09 zMg%q^CFKVRJnB?AnT;DS32bRUt*G`<*Dde}t?s?Y;8-Z{8 zF;1hu#b(AS`W7N%+KVYWxe%kwNo~1+o!?C+QYn+iT^S}@Gi*4g@8oBPRS0G#NnN}J zS7@kz!#uiG+HBxykM`8KQD68(jS40R&Rj68!uQ4!7t`mKVQ0F>*#_txBRy`tCc9Vv z{h-fK)l>u5&5xhkUF&QNJ*VKJcA6$%s|Gf_qJEBtBPE5S>J^(=tYrjwtJ&&3Be(r_ zAg|LsH4wy^{Pgq3SEVZx8B+zArOt~XI!Exu4%SJ2aTiYhb*ST6K`5hnHv}pn{R>_p%PI4yMiL2fqF>DB?T)IvoIdEEN#!NWe?Q6YrX|ZE^c~ro1dU zuUDdSfifl~=RMD;6im-63xPPci)^Sb<^%4rF6P~YU2b~=n0JHCL-ef-n#IFRN$d}4JkfrxserdR{&7zU+(9{QDc%IB95yCLjw_*d=V5pyzS(ivwPxu^sQ+c-SM!f zsu>9>3}BI)RBU+1L`PkGG^VYy)EaQ(lZv(FJ5KB_F0LTgG zc1PAbhu&-OiCWkNPx;pP4{(6*~ zd~o!qABCU30p;pWkp;R+5HQYzxDlR6G-kwx6r+44IR6i<5`67nBhWjLw zD>1k6CCVH*OZG>C#o^9N+jNGtHg8^5QQLE@^Ao*_yV2_e(~J1xe&`6fk7(6L)tIUK zitP_*`oqBlTn>k-=!(G;Jaf!Ob-ounb>AL|!&JnFuAgp;hU7(l+V z?vUCmnXg}c;n3ZptRA*Zs$`4-Qs%JdsLIUIuFXp5b{wp>)DRdo&x73=h`Cx{M!>w8 zIGo)xoi0q=KFKiL*^(>+umFH3%Z)|zI#TYG8uA(~j%K0F!`=q^`o)@!`JCFN!_|H; z@QRQqwFpl`p!AZns3BmQJb7-_^SNfx*mYn*kU{R84eJvsjc7ro>)FVe~(uRloQ z@ZF_iDgVxhb&)avi*v zsk?ATBNjp##uh}6B8s!UhGC>Ts4B3VpIX|$b-y&z)m>_>1MJ-$j# zK!wIaX~1*}i%D<*&fhsS9Iukz04+x`ChoW{7?kHK&#C^3Ce>GEvy~;*#kLDdfu5Q! zTi9{}&KN6XW~zHKxdnOpZYRT1y&FR9!BjThH9Oxk@a+JVwM`ctT*Q+*KC$e)m!@+> z$gE|kY=cLo_!J%9ZtJQ`9II2%{=;5~fILcK;LmcA&4=~rP0|&qwmc*rku29SK{Uk* zBSQm#kYOl~N4m53uRyc+Umlpogl?=(_7QV>H67~bl*611uKSz8cv8^qE9o&EcfLI3u9Eon$?F)c=3^-b**fC2Wh?r$e}aFo6-X-) z**S!M#YzJ>z@ESK)L*plbDqvLW%!|Svcs%d-~2mfm9S|=wW?tzE!nE%ysWa6Qm?i7a?aE;5rA8BjP}LBsd9DuPGFUYNVmje zfjA=Z;wViH1;o@v#Al{}#W5Zxjjl)b?*2f)4}3J`DSeK;mN8#Uq4Q7lm1HYk3zjoV zG9%hq!lPSi^&YEZ0jc6XD30%3ZiYj&&gy8m5@Bl|*cZd8AYNVoApwLwc^*3*q?hem$QT%bC}oIBS+7wG)Uo+@(*Ovn3$9mTDaT-n?QzjHuG+!PI@Pj>8+P&f$ z#$0Jw|9G%ajYO(9qwqD&^QhJ#(=_SkX9&H8g| z>Ssn+K*xL}A&=?R{v@E$25gGz65M>gXbuHAxqrv~A>GBLRL#wXY%`GR zIunOMD_f`CJ;eU;-&B?Vv`>BM5SnC7-9FGpE^cZz0Nik>MYt{~o54*kPqY*|Trvn$ zE=9O;y_{TfSRh2RbG3zn1ZfZBh@wpyP0cq%j{#4W<7;`zUK=&3-Xq#guV+0S+K5nv zbbhi2C5`4@`k2mr49xGtYWASZWWSQS(9msj!YN&08r0?ISiJ5vZE3l*5jxtQ)|Ye2 z#gJK+&-@|+6h`i73?EdevEnGb3%?#+-p-75_#MvkSwE3&7DQB-9+bL5Dq<^(2qrE( z*fTGWrGs~wSc{6owWnz4pq|Xl1N0XLHk>DZ&5b%O7r5LZ+k$OZLGvsE;{DB=&V!yg(r3*n(mEtyX&cd))a-XJW{-MAPbd8WNBF~{IXgc?bFdt=Fn^qgM+8|qxT7g>r-c^YuC&8&FKc>KIM@;8>5a$2@_?@&j_)8djKNBql? zrqnQCMMWr#QK6InSgBPbWoI~?n7&l#;W6qiQizh)I4LrESP(>6cV+j{6fEZ;c9XlC zSZ-@geBWGsA}rU*VBJH;XP=0t zNo3fTOrWLEa)*V31JxN!20TFQ@Jf+pUbn~d{t};;X8<%p80B%KbPIuIn=8|ApqqU% zihjjEAfN!vxJgi18SClsa=d2~9pleNc~h$IZ~#CJbpkUWapv82)v7;6ohvajoS3;2 z7*CVObq_iBs3>YGgAQk^H1nkL0l+90(LXx32dpr;g2pj^99Dj>E92Wjh*?mv!S$PS z6wprPw4+(a3O0K=H9hUF6gzfsd#OB~Xf&m;+Fx`-d4kb+;g`mX&Vo zj6`#GUkJ{Nc$k^V+tmeK|M{%C@?FjH{ToEY+@*R8C0pAMC#$VV5G7$e-(IF#AxYp9 zuuQ=3xlqYoqu6Y}Bdpm_%;j}o_boGK-uCq$d3AnQBoIaoMtSr0=XpZhn1xyKx*Kd- zj5oHn_r9A(`<@veM{7eRAHQ>g)A=2rH9VE|-YoSXx0?62fBZbMHfV|~Om zAn;XCr}y~>inZ{9@5~X!O~xCW#IeU?w1;=1X-rDIRs}Ontmr<{`BEN<9!pqS>^cd( zgUDHvV5{}kavR4#VkHpDTQnFUpQdhmdc}Kt?hCAmaEsFsKs)TZyvl{;i;{B_l}!^) z#jR9Neq+Wq9 zj0RXYArVP`fB(159M-ALZx(7dy#Eo6D<5IA4ez6Y&a63wgbq!fpEAcDpHh@~nKcd8 zqwV#@Z_g;ED$0sjmVd3V6AivUF9bx<^FL|tHCyR7q5nQ&t43a-?7MVjvHAy z=<{f7JCX1R;Lqm7zkpHR7+-BcBsqGUk5FJRxY;Q3pL9vj3%lzMejS&`r zb-$2T-Zy+SWNM8!h5!F$`DqP}f&k>@bSB%)qC(vnNtrG%*h!{8=dhL+6#OFfAY$^r zEBT*KqIF&q06^Ox)osrQGt%1H+hxKS=qt(pK{92o_>KVph-$YwCrr;pZES4R84hAR z5#XYU%Rz7TMUXKvGJ-lhxlWeq>G*7RY}dE?qj0Pe8MGxK+ysXvFJo)@Z=XN4c!KSX ziAekYjvxG6^nbjThOj+}ZZ~_wdV%v*x^lI~qmq|5HO~-cgIQlVuGw6pN{&<#L(fb2 z!LN;OR>ysL1Ew)T68UO<5rv0^Y6Fxy$@NlQuWM{D#8ym87x2jx4S%P19XMSiSM>Ae z=l56;6QWG@sHyau?M4@?$BpIWYK_sb=~|mx<>AtSH$*dw=z4<-_Dwdr0(xF}x!6o6 zd?8e4@txtMqLtKW`e~rd+qG5~#t1?lRe%Pc{jzEWNWl*p*8dHJvz5y2{m2=C$2Mf{ zWr9?D|CGM-_2z%}^S=iFCkiwXSzWnKJLuO>nc-J3aQQ=p?$?K`W>e$}K>;a{I4I}r zeTg=`S|tJBc@L(0LW9*Z;xP0ZAUB2*uG3fV$y|}T&p)7*o|;-F89N^Zx$L(mS_xT< z-&(DAXbU8zWO?69tOxIzkn&;rCtl^Jt+-4V%2**<)BrSpA`@^%%Vuy>gk5bNRdvcj z#tp)<8L79JFSc3lz{1Bb1Mnn_AKp43qTu}*?}HdwzW4~P;S;1B4S9KaB_6k@C8Xxl zg%Jxg+mh>^m&g@b&CIj+ky?)ss6eat55`hJs0U+1s zJh7fb7^*4T=XV&9wu=Sr8$Zj(#uHLleei zF<)7Lgu{UL0;E+fPp00xgqVSYl(K}sd;QDTzQ6BvB<$L1ReJSiu=tlMrvke=HB!L ztF)}FENY+IRTs1IOg?u)=d8YQR;q@={Upb+!g6l`6L2=)-)K0f zH%)QA{cnJnRIsT=Wi?1?Vl0A4>qSmSb3IHFp;$D6jW+9mw2GCa7LBsC_`RiE5hOm<*EVAi4r~_Z z&n6~F!U$*>7#d#QbWnq(1U9X5b{v)5)V!__kUdb>Z3mlHqlP?#-zzmaqJEnm$HEJ5 z_>S%ovbiBdpU4I>)kQKZ;KK#`en;tX7>J0WLispO|8RR| zGYMMd<={8anvA(t;@LH+^?tfnt}|88w@CdDW}QoU76Fx}gRLi?0jSZMP()bxT^Mi- zytsYyC<~#!$a{M7Rwv+%UqV_}Uu@LdYG|OTCGwGJuR~hJSgEbdi3XDESAI7hN@#vf3-mCom)xu7yXQvo-?-<6Zx)r*F|Ndt-#|yD28+&gXNQ zHj{C3{4|vj!~&TO)~n|AnV{llWc?qP4`-b?Nt*TMA{S>95Hwi^B0_U%xEhOF_wqKD zWO1`+CI(B?ecKkSQ907g7V!B$Lx}0>BFh zX_M-?3lam9x;iYY3T56(+OZU|yE)d-)9cb*bkL^@ZYno(Q7IGNYBJB1sz}ZJtQMaP;K+(NjW-@m6`_(% zpYUMm7O^@0D2feQfL%RatQE0nXwvhOqI81Mt~X`kkzG4Z%0+4IH$X!2@$rG|E{XkC z8gmO_X`N~baKSnE_m97$A~IO4F%sct%PD}s7_8xRU70nVin> zRL&9A4CXIP5c+dBsy1IHZlfL8Iw}E+1+#i+ChY}ozc_kKs-Y+>EA^kI z^OYI)z07oHZg;=*Hj(8t%?6_1Lli#e`7U3-lmwmK2*v^T;L`llVIjL_<+p2ODw;Z5 zC~K6SQHdJ;B=I)zutcPG3*V+&OK4b=AB@1E761qmK0X~(WghNT^(jff4*)o&w>qEX z-mZDbu{J`2U4&FfoKw9CY=A7!i;!=Y8~9~{QlgbvhQ${#XIX89M2py35S1koQwH5t z_Jn_V;nhHC`R!L%;>Yxb4BUQGNjfGMGjw+ME7PTFgP^tTZd8GMJT~)ShehJBa)N$Q z(Cpy3EyXOfLsO7Q$UN~W2MPY!{Nj|HI&T=2}obir(j@^ZA6PsgoY5caZdZ1P;7cGl79U^?%q1C%6#hswNL>? z8Wa>oI;B%Uln$k91JVuB4T7Q)f^>s)cef&&PNhp4=@MzYYtNZE=Y7vR%;(;J?|;k) zJATi4R(xYUgCY3zUvbr)NLS@)8K*_-uGCx%W%|thobyUIXFB{QrlS;><#_KaXQ`xl zP~HwT^heIlaZ}f}b(sK1IyXCeA3;*&e_zFhC6F!8*8bIGOy$RNt`3p4FO#)$#?ubV z>JBS|GODqvca@g|nIVO|*-($F;ZGSlRDdCRIVW<3rj z7Ka(lO`4VUMf?c~>~r&qMzz%say=SK7lKyKE@>lIox*w>^S=!H3`1>fqGGg4wRz#_ zkk~{LLt67%(^SGy$9(H^1Q~RVwBgL!la{|2rjCIKREC-FK4X#(SN!ew=ULqLU%1Q# zi#55Yk+9F+9i}9%xvb|U(VQAA>~G4Whp$vgwlpZ|$DBW>OKPOPxO~}NUD#iZ$>ja# zQF}9C%o;4cY5&l1<3GYH!w%g@DlA7KBk%=T^PURaqzJ(~nAG;S74X!z7ki%CE_M?{ z7)daOdK|NrJu*0Or_w?nA_o-`VK z9Q}Pm@K~r*$lYo{fV9nM_lT$Qg8kph^ic!bT{i4Znj|01U;Q~MLBlb#pucX^ywPI! zT!r_mCb5QFYe8EY<^x*U2QMa%rRj^J8nu%&q<&#A+T5QcuAEd)ESA3hF8^|Ffv;dLUf~MN zxX;x-f4I$2g=N@6J0aOtU-gtDYfIo?5fk|IkDQg?LwK9PyEu)gg-IT-W`D*gQuC;a zu5D_UPUV2>^+r`6j(5<&m!xXA4wl_L#b^ zd2{GXF6um*t<&xEEqgO4OQYsP28nYuD?pNK#_X_#T!P*bJ3fFpcW z%I3#XoRq-Dm&Hr37EKI_cdoYrklvI zFoWe^O3QFhADS~#```}9kZH3~dE8JdmBZ7BU!AB?VGik0l9s+!bj0)jDs_vYGXjK{ zDwiUv_9BGj+p-~t%Cm{%Ozrd?L!K5pme^FvSJ!MTa>%eGdo2C9p_l7P_X!w<>+-9~ ztC6SZW25$Gl2Cl5{_7fQ3z;JR^i{+y(StlSFZEPj#0`Ia<3p>_#z3TTlBUeW)s$y( zm@{*;=0LXtO?LYxJDkG&@F%Z}zM7g@zIm~!1h45zD|Jr-He`f_FFf2Ew_RRS=!zv! z@0U$;Y6WrL0*o%p1{vG(#0KXhhBi+2z7w6K{p!qGX(gmFf7Hl?VUY$=u~ZaX*$rc* z@#=7q%kJgtw|ZSS>ZrSK+~F6moot?K<<;Lkx;ZjMdUj&wL&e9ix4~y`G~RC@S$CQC zA!_3Bq|CouuFSbgH6Ca8#lefNzMm1V>qHoi1avkeG(c`$yJArzbaP- zsH)5crLUfE{v{86S2ysD-j}Zt->trW<30SYd%hHip6ByC-_y1qUQvCo zYiNME8H~ns-u@*@@1&0j1U=ijnOa=-)*1a3NO_ts)!59~t&j6;h1UiwHY&55#t3=} zprN7plFvr2@@qLT!-y^gCgr}^EEd&r^ATY(w@t4~Wnj!$459C{&R1`XB2cfquVRh! z%4Sn6FjmjlZ3{_MYB|9h`!H%+x1>aosdcd#=EMN z=AV%f2-d2@DhIn)+JTSntU;5DB&$)Mbi?L1&x|5o5Oci zvdkgWzzw9T>DX1ZwY5*SvXydP8^o!LE%1o;Pk(tkpM|ZIHh|OcZS^qdH&gBLc1N|( zGt)ug!2DOH^I-%V8LvdnFepHl=70IJ1)XtOw1TDltsP#|xZv^T@ZBbN^7z@HV-VKt^`6(ZwezTlu!z>F$uWLXj?# zo8DV(Cvvj6=>pmnPA<#mwso1AG`cuGKK}jk0CxFcegqw|`qjIG;}?oVIx4Maf3oD9 z6t9#(BK`{C`+)9Dm)T@kc>cRNk;&Zo=ab{2GV;dLX0{8RIFWM;+c6wwuYE2NZBsqO zl<_>-B?32!%$o33u5O#6AHCgpr!&8^G7`vP7Scq_q>Co`bdb(BT9C@X;f*Jny6bjf zd|BlNDU$Vcwj{xV>I)r58`2t|Z-4{(GNuKzt=i_Pvs))-sc8~#v@K@Wl=@&2;r=d( z7}g}Knb*xB)SKZcZfzVCS_)Roxm%v#a=4U{H<=DV!B3z{H0lf)#w)B63)NX7JmFsy z>)o9FbqT}w-DMd$!$#~|m-kA}`JSO+fq}I(^%B3Vu{D91!vvC$dbRkS=5b-TxJw2A zFbdGgFTn^)t_8YDYWX@!e|A98(gA54t#K?68Goxt!fVZPzml7GJYZ_(2XR&Xi1jvG zV-Hn9)pA060!yXqN&h};IfF>Qb%}Tzi;illK9~D3R-wJPvebJLE~*52jY0&lKoc2} z0~?X+=d3TDfl-6<+gqrdKt1mHn{>!WH?C$5l9SrLL*6?>R`IW`1Ff>KKS4iZpc(P# zlf;Ep!uOi7*2hs;w|Sqzu;!zrYRXgw>`==K~rE*y40Iv0)Qm@Z@|4%OY?|#-- zMy-KZX@8D5vj+Ty_x|-!e_h`!8`8S3t*u?{e#F@o!y#qWpDsf}r;;DXtzB(Lt6A$L z*RUXM*!%GjJ}Id*=&Lfq=~Z~Yg=<=TX>7~{EQxmc&D*!%z~v$z#-}l5nK0O_0d{?t z8DHv5yQQzX7FFH(nl;8SvkYdZF!*B=3%GGRJ3IFkG@PQ~c&Rr)J1m3SkmUl(whNiZPwfP36)pmG>As5$lp~-_^=s5?2~4Yv z67{VaVtzk8#d^k-e;Iof;AvL(L%Zx}N#0*n75hF-}Le%y~!*5wO!_Eh?WQ%H1pCH8`SBH~*GO7Xaa{k{GHI(U54C&)cdr&U{dCy1hsb3AW?i!I`jvGrPZWo!oTA4MSLD6+ST;(035%<-DkrE?cMzcFEKkilAE<%d2d*=a!x8lXlE6~_* zDrGC)!{WUS4(rt;&#f7x-R`oI#$)TsakyT6_Nve-W&woUly8gLr{ngptY9mCUbjHR ze`ME|s|Vs8mkm5M>b27yCXl)CiHNATk8L-n9;r8Y)Oj$mB_$>GLrY1gUC%$?9j}r5 z`Sj$-Wa(>KvERTf3gC6#o=XC&ncx1ya5|;rj06`y)BenR3D$w1*(^rcb1c>vR|oS* zfUuW$a^fyCACa#-$M3vN;eN6^G`F}YRx3&=6_E-Q)3+!Vy|By`1cQEOe4J&xnF99Nxt3XIL@yU;6wgQt_RYJwvfDLrKfL9rpt$s1y4lm)M! z_fQuJ&K@)Pm8LJ$rfxck$#cL4G*m((&3gzK_LI{{Z4aCo%$C-vkK3%4Z&oQ-Sc01a zZ_~dfR-+1n43+Ze)#WtfFGE!m{aFe~(dyid&OW#-`09aVf=rxjfSk!+`wftAMRnf> z1{2JHhC|FLPU$a=Y2Lki_Ys{N4iZjBy~gujLMshdv;izxAisI<C#AXMfq(gN4UX;EHJb2g<)66q^$@A< z!;+&LBBG+pyPbxsIF|(uf838m=d=0pG%(V6i`1Whp6UrBlTl8hQG&CmGLD#vb?}8p z>P)j>N~v+K2Y@$B(9`2{rg2{~lm~|G+G%%~=;NomzfJLYZJ`TnrADWw#au^M-(g;o@u!&@85o& zLtS1S?2C5i4!uUji$B5e+M311>_vrZlig&5&H(#Unz9j3jV71OxTR$ z*{O9qJy=vsm%gckY@Ff#J=?T#5pzCn-(45;ZZxmsdTz__8KY-@Ove=oBBC4+R`fpM z!O^>HM~EDAC&aJ(8r~~swzY_-cQvju2FO^_v@|#4)@ZX(RTXuw`|nHXMfbmVIbGH! zcsl8_!sr6?orux^#v4p0wm41JtpzTP+DyyRVdNl0C-Z0#z@@QPeznvmnIs-#;b@-iE0qvKb{ru20lp zZh8GqAi>ip7WZd#&}i`-d*3!f%=jxmaRkD4+B#O#aW>8x>x_P8ir>rperdp+hcQrd zsNWUwF$ac{<5?L>b@)RBu5798SA+F3f~h!fJkyZgn@G#)5q^nlF>q~~b3^}vp~D7t z?`sTf5)Ecmv3;XAY77|P1U~)?3+AxT4eCGLo$mo?*=&aD{g^*T_M-c0o&;F=#Q-+)-4ow4YS6X3}{fhD} zL62IRP`&9&)>Vh@i5=Vdoh6$4YTqZ{yR`KO?>(J-e1~ntmTGa~#}4^o_^6zpGXVGL zfb=~OQQD1HD>cSpR4u$K65o%pswQZZVAj?gZU5BbxbiHu!Sg_&a#U${`-SZB&6Dc? zI940o{OChoRdom;mB!QWUGxs2^$ zNW)1!gv3KmPOgchyqSWF{rBMt^TViW`l?nLXPEiK279=P923WC&UdeWN|kz$GXH^; z4O4UVLV)J0q8f5I5#W>pcH?*=d)lGe=Qq6Ct_Kp3I?(mA@5JH3{(djaUQ7PW_1Lzy zi^qrqx0rc@9?^$;jM2Q?r#D+rvBJY8mPlmpftovb?U%7@re_=0wl^%Hl07MV==uv= zKminU+KOZQnv9DJs zthcAcFc`}bZbi@W0NpnI!#S9?pZqISJz*9Dg%@Wjwb>2Ly&=0|aOc5uA-^q&B#{%k ziEzZ6XkDGK|NWInT~nkFuK{4ONv^76;RWt|dUoN(Xq?A~z z%8#qke(1qykXkMF4V6=zW?hn%@MB(2NTg4Enh+E{mkGk@BO}tMhVI>+0?hn^r>@3_$KZ*37o$7ZSb?~&kUwn7-k}UD{N_Ld(SgGUU{a=(sEHk!gAkwa~HbY3}Vor z15A}F^t=G2=}wCZh{ar;IA;{8aXc?T&GE997r`OxkAGoc<(G}(7cp}5vfXh!j{%e%(A-4)OSC_LuWxVy zfV?mj5-xLL>k%kpKzRx`llwukrJl}AiZlZat9N;n$zt+aSnHAJgy=n8txDw1oRVB;9!qT6o!8JQC%~)FL>XGjzpzyN1 zYWlhvS~{h>AbTbCoX<3q4QU|i>J}D8QBHmy3*wk=|S6}zP{_+B_tmC zGux1f6ri?Ty5q3Ytew!o&1D*QyJTgNX?<{AZ{sp|g_2&O`AD&k!2Z<5K1vOXEw)7% z|GEv1?^-7x>l-Hdyj}XEHY;NDg_Xg9@Ub7AX1!|5?TLkE)dJko`h385ksKXtn}4vn?yA>9Yv3fi_CbQq5nOAJ}!D!1A`H?Tg5&k4>YzI zod}?rsiGs@AcvlJyFZ)byoN?0<}E=%!MZy&M6(oJ4LqLHjc8ELiHz9Tt6+U5B@rzy z@#ig-AIBWL)FmrMtKZ@m1I=HmWXbzbJx!1XNf`EHeayrf#|?FUJwAukk9{d(8u8xx zQKQWz18=bK+q-ncxVjGr|CLo;v7t@$*-w191SA;y^H1mGlvp`xptaN=T$Jwa>f9mM z#E?vYiJgj!jLf=Sn5TwhE^KtCJ6V5aFi+&+>%&ff5;8&CvrOqsUB@TdJ^=a9kAXDd3gc!AI3nH z)4pLo*iKLFQzB7uKqJ!f4D5IYVkAr*uMT|#snHNKvT6L;ry@lyw=EHC>cD$;Fn}s< zw4bj%@OK}O^d~9&(YVsI_12t{wsdo+%UjQdqKc`(iBi~727d&y8G#1BVJEBW z%FusdHvj(55Ok-~-VpxlEjD1MNrhS0UvyctpiB#j@Um9G#fhDvzU-U_W)=g*fYRW! zynNnqaq@*8{Y8r8p9?eDyF0JTF#e;s-r8v=f37TflcnLOhrmN?cUIlor1MQ%>8f_V zf9`zkTd>UAKm4;K&YConj!-?XtrE+$4 z1zB4OYGIz5nN8I7GqU)7)FR$KU89ApH?LnmQ&dz$$$J;3FTrgrtEHv&6YhntK!38X znLB-}bK07*J2|v>0U~Pc7Rm)kv*0k_PH?zC8?Id(ix=f0uQh;=-J%oOo zVcZh>#0bE3C0dEmc&aYaPxm9>LsEO^!44F4`Nkb-6dLpL<+&mWH-IgxVf+O(Y6!@Y zW7hRPT`#`j<&B2<6^L=!7)E{_RyK zzuv~!HCVhH78NB9$XTITpdsh}+VXI>B&=mfj?{9I=s%r)OJ)oRfJ1qw`aoy?mp}I? zg?;!S)bnr;G3f0*^7jab5a&GzwO9r_^>22Oz4A2<7N|)~Anx6}t3a`_#lzZ9;m41c z;N=NPx1T&l~j5u-KZV2+$9&9_5ZuJ1=Hte8Ja$FTdtAQ;7QUPt-AyP|(}OCNkt zaD1cxN^Ac(WvLrLZi>08EG+DS;rH^4`-`A?LygMR7oOzIx4sfmrrHFd)-!+?koX|v zHkfgu|3y(ka{TLOymCCa3*~>Go`{sezG#CL$H8d(eP9}B0IalI?x%Hu{ZQW;1J4xE zLCv=uvmR3#N9zST}3LIFIV-62C9f@gHP=yTV65_W0&O#R;g{H|g4<3BD#bpWD&xqrX-g{+qMXs^_M9k`8JT8q4sY;(= z`HQ{d<6plNU@f=Ha#qF@1d(Brc5fo!iUIaO3(!_C0hqZ}JIwor>veQjTPU?J@(wf^ zE&$a&(S}Yd9Tvl+8uy^Nk)4j#0_g2+0wM|PYb1e*pKUjP0zLB=T*|yeuar$eJd`Q- zYJI%wF~I!;c?|tkG4m+1K#;&;rV|;HcD=Mlxp@*yr}B|ZnoUPVu6vfynnrr$0OH`a zKOyL}`Eh{x1SI=PAoq*>@pkbel}9-VyYWXtU;YLaQYnhEIZGyf!X;rkPR~*FbV`sCa%3H zSbv|wz}iAS#RBRj>(3;?s0LHxqPi{Vg~{W&g1|gVv;2GjBB@{BG}~1>em>nwqgD8! zk))+1h>R%q_};yHv@v5CG5pY~x&V@`&>x9bi<5UbJAp;-GK?LvTC%(QTP>eRMrBvCS#RBaHCgPG!N<57lo9P8H z&{~Lg_Nz183`}CNUslv5dYTZYN-=j(ppdVc#at!_`yN116^WpleaC-8Wn_Ll3*S>HlR5#SfHfZ7UU))rvFn*0$daUHvBcJ94yIg?Hf zMmhVm-P$O}7G;C^7qO}$hK^xVZ$|0i2|~81rijZu{5t`F#r~<=@#Xg<=+b__qjF>u zP>bFg>saecji*tMlK93I`@F^1RJ}CQW&Z~_DMNp*tiJ3RDv}Qxy7o$6$`uh25w#q{ zvelg)!3S#VPWEo%k?6SJ0(-%-|lx>1=hE{4-W z5*F!WJD*N-ObP7!yVX-uYYl;T`RZWur=}YkX2fXTrPVt0A4*?)mmYo?O8fX?w)r|N z0h_nBwr*5^n|K?mvs?E$Boq<65=8%=SK?C-&V$yTI6D0*d1D>=bd=1>dZ#*)K}~+{ zHjet&SbyRVzrHA614e@|Be2P6`Z7baWN_m?);p|kOJeFeo36dETP(*>r!OEcihJuj zW4ZLquAv!$QYj|}W5RwtUkTQ+M_a?vs%XFn`B_Wwov={E62(^(OsRsXJ)cWeF8|yg zlkgHEdRPQkOR&i=s_k$rU4F-P@4Ne+=5&li`E(_PdD0i( z9nzd9R7#}7^n{;PS^XVmR8%>PE7*{cE&9? ztdwt%35*BEn5YB`V-A)6ax1}ZB)?N|o4N#{|H+O}WnXQc=f%vaAWY<%=GJMwP^JDV64~eXx+Tdnza;#UhDa*~ z^8Dln&ckJ+A+=hbwzeNG{+h0+y)cMb8I2SXzse8oLA>cdanPbN~s7?djH8TvODm;^~y^WTP&68WEJ$le+{sHN>RfvVgT!QITh z_BMsTn%c~^?CpnGqhJCD3dtavHl>gE3D?54V{1uVBBpU5DR z$(gVntv|oSrU-r_hkf7s?gcvX^I`5v5idi&7f8S7a5q}${>k8IxUSJ-n^BXKQ=K!p zyw0bfooGuXT^PacJGpRU(6@~7UJubX-Ej1UtToyFtLswsW4oHW-pSgVsybEsjbXYs zC7gbSK1qR)9?NyZS1(2)jqa|{s$tS<0y!mWS+>n{u>MK^J&v7MX8Dowt*-92~ys?fO$|KrDl#~+{j5RxTL zUOt_^;c1NWzBoTtKYB%Y&m&%c$l!MJY&vUF{-?=91q}6s${o`gx%}w47;!=tCLU`c z%d$Bw`l#_sv(TU?GZ-K5Gh`nv3jXFvi=wN-R;N&GW2K2$VH;v@Xegq3LC_*(trf#= zqI+?ohHGZ`O=Ms;?476la)8VAREXi@aYoXCc3S>bHh_FZiAz$@GK^k z$6Yk&h&ZU(G1VNZFCjgidUeB`G)47#*vlWfg-ylJLp3TAkLRe%O?#7(w+qN8Hr8*_ zI7ZczNVa%W{>@2YzZ5#frGecV(@LE$xKg`Nkz*!jptx4bWLY=;)dn%j*M{|6;WadVk{o|F3t`|&&9~L$X#$H z^^w~5%a!xsI#HH4NxCfjsKQ zKVs(t+XXb{QsYJ|;6De^-jgBJl<{o5(%Me!LS}eqJ~-rl+T9AIk5qKQ(`dUk z`k{U2`!9!?Pr!azF*O|9H27&c;(dLTB*JGfpR`X@{Ao+gIC0#b_OdTR2Pp~B6IYqK zbL9SOY_=t4%ZHHqO=j-Qma&aW1m7(qN}`|Rjy1EYbnAYH`E#!ckx1*AP(FZXj~&`? zrRP!<30psJq%wLRYJLK&wV19Zg$A`24|OS6;m5_XCBhnQwl=PKN}t$Pt?+(-9bs;> zb;O**StYFKvXmAXfUup{3(2VwBXjRpcXEer3WvzGX!H=GCkC*-NZe3OweJMF&y212 zQrii~PSy`MnB8-jzhCHK{=$1^*oY^Ic;#`h43wFvC;)FoQ;o7R*x#7H5*0-EVdf3u z1(-WOVGw+-B;UfKbmX?2@dO?0U^}_0a*>dJJdRz;e3RD$VSi7os#VkyZUVP#X!8fhTp1eja>blyq|3z z>r}X}x81pq7oon6fbglRa{p|g%2eEm+D`H?F1N1VL$K|ZROp`Mqa-A{-WEc!$~uUW z|8TLF?J=RYB<|CRYVBt29yFrgZuLi{`c1bRESZK*juZ%qZxuMTHGJ2b5cBIuS$Wh( zr0#d%5!52dQine#B|#qB#EJX&r!$RBLz5(8tvaVA##C`!3QQfF)g=GU=9e4rsE*Z0 z8T*MuhA`JeeFmaKF!SMm(30?$WXQQiooW8Pe&QMlC&O2U$i)0!T%M`lqf-b=r2p^U zT4!5ZDD5MrF0qIU3hALe21q}Gh2jn-dV35{@*y=rV_}ti`!HRZ;e;2B=nFAs`9(+W zpFb5z4K8vWxkctfQTlp5`A9iJQ?i)htJA&&UT2K4G6n`?%*z6~ zlsCaIdBH5z5M!@R$)zkgPYb_{I}pvx6<1jT{phoa7vLx3cy;-@ zpLvUhwRJ>@NeUU4q_T`v?Urc24s+EUE~qxhViz$Pk!}rQ=Qla$JPKhr!xp~ z`}@PYgG)o4L^=5SC-mp5V@o4$M?;AefqTkz%}Q4DR%7K|SVdHw?AGa}*0Z8)x=mMW z)&)S~M1XVCO-JY`p8Eq3OQU8594%y?wGZ7H{4WeK8QuPfE+-RUc>lm!oxLhQiq6B2 zvUL2#m+K4g7^ZThF1m=HNnfdnLe2NZCDnA;G8!W?NFrI?%pRQ31?sU_`TR-T_^0__ zD0&UZtJ>TXHEL(y%%c{_+8(V{jD3;J412zmpB!z?g z(JJDyTGSGti${Yt!D$kL@csBn(@ zfYpSKY<`p}ZBkW3HWGsuaGCK-D7BuMstm?!;MJjuSTv7q`dD~T+6JNcVjs68&9_S_ zP3$toyelL|edHB7*%=hmkICPaFlSt z;;1alm7_{c0VT;>O`K?L6e9*s>?!ClSp8^2rDMPZN=r*yBtpcfu5Wi+F-N)UR|%j% z!H@Tco`}?Zcb|T!G58v%H}`)x4S)3y`aVLRuQD#zJ$VKCI7752$*-2*+t)>Frb&j2 zvmliZnz`z6ik>)ufGioZG@>{5kcp=5Ng#9mKKU}SRo!kxaG7u7xV~Ywu>ZJ6+exGp zZYq0{8mQtU4cak^R~w4%Wc_R)ka=O2%!k+JNIMruE#RT?YD<5dTC18Kh?<*pKW zsC@eC2pDWNR7`C&=0iqP=d`Z?JIO_ac;Q7a|Dr?DC!!EBcPKMdO`=!SA62ve2n+Gd zIQWC}kfvkRM0p^m9cfifwpLyB1QEXa@zhLkyS1{w@#dFzpQioh{QUV6HLAf``&5u) zG0rxyqkErKDG9lFv*)&Mu4udbQhKbVU$qf}XLkz=a%zq+n}A7F&gBXq{-H5XH{P!a#!TkKmT(!h|Ee=alXjKV3CBD_^x34Rg> z#d@kJf;m2AAxolTKAQ2$i`;u!r(-9h)O*Sq2pU7Bb=Gq;)h`~!9=r#o zNso6&g#7&sK`Z4TsJh?l*6Gu8nD)0eYZ-q{^|d!kD{pJRpQy06J|Xkv&GkHua%dwd z&9i4D-_b9z6gdQOiLUs8A(xZWI=q+v{7)hRG|JMKe8xjBV`PUJR#MJ8OUddD+;Q3bl z=W4qT8k@m-V{uGv<=CyF8IUdQe_mGq*;`q@wbHmfdNNsVz;Wm&+v#Mt%*6kFUjHjh zeI(8$r9EhQul)F9CLH73#tT%v97KMHz>rZRH2SOsPzVxX(?&UXXbx5coIVtWZ#ebI ztGtro7{9{z(%*KE=e&d|U-rsp-WRL6_w30fY;`~52X*=T>z~8&UT)YlEQaLjiw51X z;4~keDpvjb8%OBl6nr53@eh5^ui}%Pr!K|DuB~h?hg-!E8Yj-n3Xp=x<3m3s6F+P? z=&~YLW(tl!BZ&!p{DgX`;g@{~)NJG<{t;|k>ENs~1Q6U15GdM;idpW3ylG z&*b+^0r$Ki1OlfS$U6)H4LMz}Mf9Nc)UI;B_x|^H{XZe+lyzso=T`8hAAOBk}o!TZnZTu`UYy*86G> zCtw|C1xY`1c)>MC0moX!svpEzKcCKrf1N%Uz}bI&_H{acHB8XU8&4f|kD|s9!2ArL z@l*Dj0?Dy?!ngsgP@PnM!X;ugSunEptobqg-U{-Jf;|YLoi3&7I5)4Ji~h&!U_?qe+8A9v|%74s21@|-lKt;Hx)Z}15?gNn-HV6%qolTsd#&O3t( zxzi}oosf2@&ef6r676Hc2XqA#IwEVf5@RTR=2&S5+;CC%1GyXXrN&{=xv%C^QDf^X zk`YqFr#|ybqb+}5y8cWbAD&*KOYJR&rysJJ4d%9Tw=OrSrPsm@GFTQh<_r|3hKj!H zuT_>C4}X5>;H0FaMENxw5?Nmfcfk4pX^6G=O<};SXvnoFMer4}b#s5Qlziz7T+T#( zW*Wi<=9I1lnKY04KN`eHWl8hm_y&)Kpg(sLDY;xKoSN?M|{2vSnn}+!U zfvoWXtfT1!vsSWGN3sC`1DsY+208Eean8MwTCWV#f{iXaKvfRg?^%zUWJE*QjL2vk zo4`H+xY$8mDhv^-TdHra-PE0klz3MKTBeD6DG^op>hjaL<(@juqK|Yg{!^O$Aa;o^ zt{0{M*=fRi8g}af(HP1LY6x_YgC`)?GH}h;4&g~In%RNO-21{EzSIfEfdYrd8d`+( z#c!-(6Qra=8SrTfA0A^Btvr3W8#V&IK6+fW1$ko$pFghE&GU^I|Co1rt}4Pz@#uSo zbhNxFaa?cm%U`%MVRMsGmi04g@vvBr)oscnZD~tW z8!63yH*Pbay}9;ZFx~$OYM}(|%ooBP;C<;VHTfnv9Yk5$8Xq<8hqTE_y9i>jp=-B! z`|orRsUse)MG1P=PbB`(1BZbjuz6{IbMnUMUqr6Urg;WRW%EmU-TUW5rA8&Ln;fQL zS;~1a*HsHX?S96WdLS1K>YZ5l05OV}&;&0_F%0Pd(!zD|^0h*l%|Es>$DnTPW7XZ& zKnj6vC1dolhC=>OArYK^{9aYqFp(KR3@d}jr3QJsH$XXuaP zdRg^bu@wrm9+m(GVGB>{5lcdWA|~JK>$*B#_kOLmH~UtgE$CVcoPHGe6nK{1K<}5I z1%B_Y9UnrpYQdw`5{vpLguaYA^7R;uI!8niM#K*NUjLLz=e&hJqcgf6{$yDjEh{mf z^f0>!*MS!8#4 zV9g;NhBkFMY1~MG-^aEowo5%v0k2!{(sxfulS1*wIerAQsAsu#rb>j48}_pjB&7ij zwU8Pr>z7Str3abE5Sl^y!XPY1HVedE zEi02JGzJS*iwPyMOE3D)H~wV4osfTn;okqvd;e*i4unvTRJ)Q7lLCqZQ|1SoOHfDm zXfZg2P`xB)W!;ky#SjK-NlD3E%1%%Utg*;vC2kmeLB0Ax_p4uz{?je~caJZGy!)(I zSPDr@?t=bLY51j3Juc`IhJuqc|5v{FKk+yB5XOaCGV)tj|9|sx@^^c|y2$3Rs;V&y z<19NU4Bu(E!gILNK{a4_yuW1#%$9XW(V5xq&z_nF0B?MBFTfLGL9m7|VU=8SuP+sv z$c2&~0XCRh11E0|{{@@qcEW&l(RJj^W=Z}YbhH?G~+Bz4>ToDS7z0k&}$j8xfXz)mkeXAltcH z2RiL#1E!i)R*i*Vu{*T4u+aIsWY4(I^?hMdi1QkpQ9YoEhmlwKf9!^xV}{S%EMU7u)JHLF(R zkcV2Rw=`OoLqG*P^^7blr{9QI2_u3jN7pL8TgIM3GK~IyvhFBhKieXBTC@aqF~*~# z@4qK&LEDARc!g`yDTQY_GsV2*?F}+ZPOHf{JEC;icvF!1nWMT~u(F5RJ;XR;Bt3UQ z8xPRfG#DQjfCa0vH`xX8wa3IO(tO&0hkV8=seMg1;gtP;qocIr0V zd-Bb`+QWe1A$OnaF$jR(wM!X2w)&a~6Mn=j0K(>Dd(hC`lEJ4Bd~;Y2>dZ_9P`vj2 zTpJr|9>c!BrCnn9-eLuI6{NJA>OuVwJqZ~QP84uwhy}S#t1)gpg!lruSu0x9!D<9U zxQ9Y^J*(ZFvNAB;Ml3-Je6Kr9gVhWbTz8Q6b*EiHiGCIEae_tMr@ty1)GQ5(cs6Qx zI=LDSWJ*A>*GouPy@(<+TubD${i_&J!tJhGOzyj6a$8VRz&{L7#;X<)pq&O(oE@N49?w%YooIc>N$Zx|%0I70c*0|iIx8AZEMiYO*?OWtdB`pQ#F{;h2EXm6GQ~@T zHIhJ%|F%>?l;#P19tJ&hZKgI1A@ZO^S>7dz`|03J-6~nD*3}tz7_$(~kHKK!;nc}5 zQLKbF?V6DoObe&~z1_jAQLi(s1#Ykfa3+>1g`!{ENKEO?FG0{57GPG5`M5tHIIF_S2|jAk%Fm3ej@D~rU}1AEK?fv4=ocvxU}kcFM_e5Qm7Oal(e~J9;4m!4*hYo} zq%vCc?0dNWGzbc*YCwI-WjmmxGGgy;e9i8f8tYP=Fdm|-$UL+r`Ls7?pCK;LKJ_18&E3wo9G&S z>58;64In4Q?&8Xw+kE_BU2ZLTV%elWEqo?sB7grGkb*0NK^{NvulVJ_-chCwCWExQ z{+Q?&qNQzuDKK$;&lT(TUMkF0Ii`>k5q^g$p6A{jA4E0#d*k(UnjW>;&~aiO-+H;|P!!Z}2~dEt$GIR5CI8 z;72h);=lLW$d}0<_W+<{%m(-QS6_>1+lnjFGmmHbnLW1rDI}YjXNEJM&<&|&BM`^f z6MQg`y!-xV(czMchY9jEO^&CJso>Z9fg-FR*y z%}4aOWnU5zk>Rg%$q_bqQ$@N|t@aU3SJOU9QB?f`POxqwqiyJ;h~Gr;)E6s-^4EmF z*AAW^4X~>@fC#j$oRy}O!nk^3z6sZ}c(}-IcR=O7@_k%WiiIDeAI2ysk;B2Rg&Bz+ zqkg7>`=4**UQKle29c}y!_{=uvLUHk=q7YzoD!`&$Wr~llyWI)acUmUEQFCxW$U)& zY(B*!$;Pk{s-Fg$KgVr*M$kRx+jM0JAM5D8&#afS3i}HhyU=SqnuT(7yXal- z=~V3D{}7ijIX>^ERPEhvidPYSHSPjqP)93yGbPt~CPy(FSA1#9WJh2h&p_>-&J?ga?-45NZZNTwu-GYThklDmWlEhJ zPPK_YAf#@yQETvUrx*-ux_8p%BC+Qag80qjsAFkPK`73CHJ0LC`vt}b|A&r1Q$}Fp z2ZSrq3`LKlwOf1)X*NRD*P#$~N9p4t@oaLR|Es_GGtEkUq=CSS@Z({HHPRI(v!1Cd zx@}eWFq(hAi=$}v>mC7Usb(=l@WiBZn94>ct)lG}A)4g{gfb5(u1&I1Y9!>oOFs6& zU(uUs@|Ck%q1U#4j$iYLsU0^BaTVM|>im7nU~vqnWCH5i#+}Mh^HHSrXMqF4CxK~J zzWDe`ir=f8ZD%^-9Vbn&_*M(2l4dRG^IO2|N$lt;u>QhazN)*?CV0RvS0#c$O?Pfa zcE}!jKt>Q|uv<-zk2`*M=X^@|q?iIDRzF%16b?}{nKhordPl-iNt#ABzK$UN9bMnI z+&Mm_R9C5`K+4FszkXnGqv&eXg#Jr(OO@TO4Z1s>ViaYE-XA%hPj)LK~hTdHCMui27b zfhsxqYavc}!zg`;S?0&e)L*m*`F-BP{&%*{lhdipi1En#Mx`y;ZkB#GyE#3vw7pbpBsCoQzo))U`6$XY#zV*s4 z;-6mZeaOv&1scx_B&xPTI3m`GkYaKns&sogI-%cXe@|`)Ew-?4`w%)ZW}4qa7!|(> z#S}?{%h~qMp02H;euuF^p69Z`8Dr~XkTmYo&l{gJmLGfy5H1@a{Ut?ry^9EsZFB}tBs8j)B${oK0KgSJzZ6c9*;Jfu zjW+@CHy5Bx{_I`z8M-FeS)@itU*6H%%z>{qswJ#;rJlFjZO^v0E{i>yII(M^jEn-M z>@b72aj@C_DsFi{O1HRw%SYJml_Fr6P)_}N-hLf~`D1!Uvnd~51NE%mHN(J25w`oI z?@P1cP4F`u%#!^!2BU$orvCtpg>;5es*|TD6}m_a+Yy7va9%|?i)RIFL}P~FWy5(? ztoU|TzjaL$dY08m)jj1nQ~k$hVFh=*ym8cZWyA~AN}5~CR5-skMpUM7ZHLe0OX@z# z1!FTXLnSrr)>-J%lrrQL^ZH9^oeh){XDgCL~jUMWo>N+@pil-VCg?MahlH{Jh3 z-dl%NwMKiR1}K7xl&FX(jle=cL1__CT0**{yE`QeLZrKuQbIytfqv0;( ze~Lo%bU+j$`JbYYSuTk#ru?DDZFgurZ^ULI;S*}*G+c>lFGZ8YkuwO#dB)O8``PHK z{CoM@QtS4TyNc#HEC}N21QLt^{pr-Q2wOg7Gpy`7?K8~Jo#XFu`Yfxh(0EO&QJumb z7P9L(5{?!kLPQ<+XGjLr6|O+f>$@l!QFMD*6`CiPwWNMp$q*AtMOK=el2N}$cmw0< zY)~lM*^IsB>~q82a{muy$5)AGb6@f=J^o@Pd8^*|3k@2(?Onch(RVz-rMglZldl^I zE{m*?j%!=SRuuQQh~lRzNPuN{UPGW$*il@=g`F=6WdbT!94% zznOo8QGBKdBc^PmKLZReBj~S9 zH(*`Q9K26>uL7ip89JZWyHrKGXx(wSkGq4=>M|N*E$S79bygX_L|);eiKKP?9n~yb zXm(;imq^o<6ShM9`v8$jjEH$GpF`HrAJ8z^dWvIeR%J;Y`~dz~tAh8dt+ zPHhzk5Oh&Y}Xwdd^*SMe^R@)>*K`P<>_7W={q925`zdU=7fYCg0MUs+y zB37=FDHqnfzkiXbst^!JcE}ZF*ZC2Uq3&#>ago%I_ZOYyMx9>BELNyZDlxIS+P$eE z@syX}@gv8F#4IwntEwhUGHZ2xney`)7|(%L8)=z4Aex<$FjERJRq_u2Cn;#PQRgz5 zb?_;_=lT8Rq=Jvk<-FGMJaGieRn&B|V~B`RQaEO*Jo4yRuzv>Z-hIYW5*Or@+vw3} zW)N}=EF8T&zFdUzppeiruiUqfo#LbRVc-j3Q9`@rXM~6|#izH(_RKY`vp+#;XI!Ee zyI-~RoK)kZYr(HH$?klgk6_;Ix7npQ_%ynLx6ZXXHdUkYko5y04e!sz(m9ms_}|hB z^_0;TB4VeC=F zcAJ&Cp7zWGYgJkk>X5vzI?0v@WDCJP$**M!!RqSsP4QKCG!cQFTOAj(j5TW0>msl3 z>__~g$f8#WFvLM>UGMoUcCRy2{p=fS!&B)#0{020L0TEC=ii3NCI&Jb$)maK-jkfu zd!2e$l==vOP2f5YV5z_7GcJ1xfT^f~CQ?m1TL$_T!sxRK0xOU>)JNqGJ}{BxJ4c8t z{)WC?5u$yGN?vzib#Ckh!&-UGn)T#E#65_wUm!r{N>ag|nh7F;G$?D*02q^b2}kHBSS-f! z36%i$pJNBZQS2RqrmF>zyyM}Zku&9GpkW^;@~7Kh1$ReOXWIJ4SvALB&k@wRC>#u9 znFt4|j@hilm_gx9SiFwIY}NYlNE91kB!XCBGK*1CLs3f`Y&z@^t2{DT#dm~2>=^PX1bHxG_Z0c_-<@h%|Nb%>9~{$ z)L|m##ay=2T1Yt8Y*)4kq{(VuWYLIgnH>W$aPb6)`YZ+=z(3m-Ax$e%FY}OG54?w_ z@-QYMzDOMdn6B6-^~*W&Di%YZ(MElRnF?mR8;gS`-Rr-02x_;iQz1Jn4Wu&e5$YJw zvLYmm_yps(_-1mJCnzqFoBMK3skV;pc36CWT5DhwuaLT*-4VPl+ z9F%b%FNJ)dJ1!DI1RR=88D+i4-WY{G(67N}#nyo7$AT88w6Vq-6v=6jT4=92)pl>+ z7J#xV=p|VfZzC{;>hG-0=tCbYQ>MoKmQBYL2J`eu#B<#-mhR3`f9;c|6~k^2s0=}i zxBAV?R-gYOO!MF}Qc7Uu7WkuZDCz1MAg8PIh9CtWI@S1w)6R1RuK#=pMQJVF;Ch8hw=?C^EiHN zjD@lFuU~?i;#UYaDizA0Y6M}mA9Rbe?=wn+Wn&LYWpJMwz{A#ACGn?G;EA~L;Dyqr z9-%gZ$vMJ0tNpT`sv+4e>M)lk`QCWYgZUju ze9!~>W8P2bzX~v(eLQg#GKO4A4LhO&k!jfkzg*arQ*?#&N##OBH0aHc*jz^iItb2T zgCMyy<~clOzs8hHw6$q4PbLa-RX)lutKl+dS{{l7{x1{>h|B|0S|JayPaxq%n4*reN0Dz(i7TFoGn64WGLEoHprW)jCjZZ^wm z)%^LUo;j2`{Y^Qa>|(TZ1B-=(ygrNtO@k_*mgIibn<~P3J0<8g8=oCNX-edpoC=8! z$cxRvufSVI<@*M>_^%r*OwH7fWw4H_NRX>|j5<_Wfbu32d$Jn>bHKPuFYPn%0zroen{vd&>i_xV zuq2sFfBNL02Pd%U3eR3<`;N%9=KG7A2RtzQG8srW0mgWXRkj<2kk{R}1}XB_EWp=4 z2~PDuu3_L{OpLp8%vN2&+_DIROiW{0f`zrkqr!3p|5D4mAh$ab@j~h;^mU;7#ep-D zfY*;H7GkFRKX3Gz*zd!3aSPCSYaeA=sFxd*TMYMM6vb_DrnkK3jcl3;0sTy~LnukT zx-zJG8i8FgfSq2oj_oHoyXNx<+a1z~be*sNo2&|yEg<6xyv$*$^bZ3%l~L;Y=IEm@K^4t}X%f4J|tiNh`kmNkZ5V zAu{jHybDd4{n@Vs7VZMu@g>6Nw@U!)v5o_{5ntSGl(`f4e)iDR3wic!81fA zusOeW;ay7y<;}9cCX%ErWH<4ebLbXKM0`_MpMLJg(p;<7UWLBQE0X}t8-ab@X8Q1N z!M=AK^}V#W$-S2u`8T5PvX4cc@tbfs`-7!m{#Uee0-8^yXBkhGrF(zO^+Jszl$zUI zY=wBR!3cz4{p~fI%4h@Vg%v`yG~_ibsZ7g9to)wt{%wc|oUMb=4h9GUlkwTL53bTR|JpeKKZ`PIP&Xer|pki;*dhNk?4yR*0~K^;ky^Yj0J!rYk-DG zY~p8K#;dWPo4!hlf{QCF+q*-bc7hG-x$V>({-lK`3&@g&=JRc|Y8tc#DNox?hKX zt>wWaV3MMa2`dAcyT5nlaydbvoZnaiE>E3<9=^#a9SKBTa43xfk3p;;fr>1-gB_bP z>f)n7KKISCVMOyt!_$vY_Rs;#zn2icR0&EGvht_)2vcg|z8Xt#3e4rv+tB-(+pU`*jbqizoo3?oANC^=*JxKMG=AJ8DLe;ba^5&yk7`o3Y$zG8sGv- zr-@G?i#D9|ThFrTgo(Pe2w&p zMZBGdUi{iXW6G!vmy;tTHg;^>=$6%jDI7b7K8c? zskEzrhpOBX6n{UKBlYqZA(6rV9P+q-D(@6+^cD%#8`TyLLl#kQl*PkH)N5S!?L{S;8ElNbUgDf z2BbdLR12C8p(knILc6cHeGRTj)I+(y(HljpN^E+onTrQWhOO<+f-#XD86hms^kJ86 zd*B?m`_nl+lC!5@3M3FgSHF5Z#p!P+M)qUX_&QSC$~U!LWdOk;lGgqA!RxLURfxX{ zS=`*tq?B6Q+3$8%LRF3FI`>Pi&Aw~|a$e_}Mg$p1^IoHy^)A-od+9FmE5G60nSR?< zC+4OGt$-8Y`HiqkJU4!T$yI0d+{obt}P#FO-I>CKilZ6xW#4dQTriowh@ zdQ3UXHWxw(*W*$Qk_du1(ZPCW&l@r~ITE5rLtZJHGxTel3F z0g(toF*v7gd+f9)Qtn!pQzi>jP9k&vkgy)AUsF)oaOO+Bhw&X|O)#FbG3mZHAxC!9 z4{7p=U7@ePP{r}J?i6Qt)#^HIilY`!0~{ZeZ#yGvVg}5L^ZgW978}k%B(tD|ku&cW zp-n7%`jf@9+}itx?~S0-$Qhw^!BB7+K|3l~8>g<(>|*owywsiB-){COGM64tnFZld z(Zw5}LN9(vqZEkQtG-Iy3coM109wLZ|@+!v*%+L`azp! z-bql+qU?_ItTwQ3(9kYyRbqDe5#f=n-pUQC@G0}d&7ESa^0;&Nq#fdlM{Hm}rKP;xM-LdjAq2Y=%q@;VtNHpe-PZ+ayJ#_P@1IT8cS~#_$A3V|v3@C& zmi#>bo@INnh34*yUZ~L;5wkf0jVkiwcU&^ou7uV=WT7+G$j@yRQPaWa3)f*Qw*4aH zQQ)(n`+FT2NvwGzshLIdh%FT{&AOC8DLwGUPnvK0`za0{L?GtESlSYDK5}F|bjFO< zS%;_-BUEkwm?;9nSAU|y4A3)b2G3W#QN2?JX*qMI_*Q9s%BEwa8<<2J^><736`!Ip z7qfrJ4@<5`Sbvr`(`!@agx=w(UE~L>iPo&XnhN{J&F{wM` z%OL5gHZ#t9O)*S2dfpDb_-JESsAozxEupO1o}c>48j@(hQ4v!&J@E=6v1o58js0{Fq;Sy^t!(x0`lK+=&{s}7NNr+kY9o_MbWU}K9ZTcn zQRjlHIbbKl_lH&pcOYOIjnm9aT4FE7e=BWQ#LttiY4LyUs&_~hZa%}yqU-sVrEaI{ zO^f#YDmyux2DH5wrb-(sU)>rx80fydu4d0ed&@q2$eLx z+bK+{#vTw9Y-5(ftk#&K(LR$W_+NL_t4`~idLq+FcIA0}#`weUmw{I=Gjrx_0sSR;&d4%;6 z;MBKUJoh<)-jQ$P39g`;P!(H8lWjOf7?;Ba)f>r9o{NE7ld9%a=Eij6aTXS?h+(Vh zJfaZIgt<_4AX7*SXXF;;;wZ0UHSG@ZKb6BVw634;{Pg z{R|qM63!EM7V}+$?0lIn>KdiI`;r1Lon%V?Q($dcS^{~iEgoBi~t9tIXZ@v?9?p0_QpIU%N#`)=+RNPPm>b|qi> z^BRUwQg`2dWr)vTtZ*=oFb5yJPXvo+T0KoXt7uwI z>~tr)V)Ju^rI`9WdZ}i(OylDtTD1GcZ$eAT2Js|TZ#O`R)NvJ%M3H9UYW-G>z`jMB zINeTS6ie;$)WNQ?5SyL4fr~49rxfQwwI!xnJD~x?ue?;+gKsUKvc)8ZY+8+o3uG;z zJyGL2BH6wN+oDc<-Q-`Z0FOzWJLK}FQaUPa*}s!Nl1|)hzqt$VG02K6d!33q@N5ZH z)>0DP`KMzf#z(WFkgbx|NLArGFxBb+F0*gElv1@+NXx6i)QnU zkfz@Rom>|+>K-XgUsvf;Tm8OH3m-Oq1=L`L#-XvgT`vYWYTUfV7k_>%B59Bbb#-r} z_7D{n9Y|`Z!0tlIuWErx_q48WMeN;UBRg|G7tMZN@$i)+6dex~18B-Lu?*Fb*oVH~+wb6nTBm1d10Ghr)w1qd$Cb6QVpFo93y|`wCUW z_6JxW1l1cV|6u(1$-Nj&%3(Lmi`4eOjXmo5s(ppOLRwxTnI^P(P`i|ZaByqID`}}f zOt1WG@bul@0n$k{nf;z@_RE%##^9-*=YohL?6d+=T)yQNs8-E@bC}Fu=x4AdO06~9 z|9E49)RQr%gmM%mme$ACi(+Kx^0jGQ2OHF-VLu_e{aSNn?wZmnc(V5`&LamVsvkun zU5&QE*_jSE$pwhI-&zm*=4-BL496aao*Woyn$+HS>x|-*Og zv8u*Ts2HcnOsM15S9eO=GgQ@)E`?;KPlXVLgfJvZM1S-W?QwoecQs^2oJ%i|d-3jS z?C{=?YhNAIf6;n;dP|AR96hRCrN8`usJt|N?P{dS{qlwEFQparKb0^iy(F!h_q8vm z?3pO;cN8pU7Z2qtg!ny~9Q88NbgHz9%$$SuFFh8LIj8coPQUK3&hcsp-NrbyOLF%1 z*t}=tO!H%y@?qlb*Oi&CsLW_EN{>$yZjhJYVXvj3&0^B0Wnavbf})!AgGXH%V5MgB z64{WOIN_xC)Cq|BSa4S>NcvOnQ*@~6(v+mC;3uc@Dr6aLkc0)erjjXoUH@-K>ONjE9fEp z*V`Tzv8U*sI_xb1g}Bn6t!~U(W7HZN4)ST(^oyz6og=wl^Uf$L17!DD?|}d zAgJPT+?Y3Y*EBJDl2a#&=T*=w1n>fFI9*Ijut{cN%g4nnZEfad zZNl*!ILubM(XQ)_!L|Upgti^!Jb+euL6yY0P2x=x?Q8FF>h)9bi(xr9$+b$nRm__OdPevE4Ya9py&`*)cSVm%iryiZ`)$MHsu zo?*V3&UtRaM(N_+9nX2X?TyaK)h|rGVEU6-AxE^G<%Q7HV3sa2jdwG#x|Ljq9(;_Nm6Mm03Gqd`T&y+H#+H^wWbJO+1y6J*D)RE4T3{ApIWNrf_% z{L=1SO?_{$g1iol*f)cM>+HxgV%i(!`;_O$BH@`}Dms@4BxmbDIGkwodu><9qC0YZ zREBlAfjTm7=$K{#Q?%8a&NS^Sl}h_I5djn17&?VA!ijBE<~ARJq~8)zE06W3@Wx>s zWG7l(Z6IYqM${9Na%sx-{M}J$ZnvUv!0dM)7a81InDY*4i1kh|X(2&Stv(+pF7T3G zzxU7@YuxJt@RWL|Fl%pUIq}ltto<7OHYbBu-LfePp==9~cfefwio+c2?TSuO62Miv zS@p9VJDmQR5s*cGhwH1F-zyNzeAi>1%FeO+j3FC zQ==&*no?SwPjrV1KCdq*lgB_Xetvlz_wnSfybu@ju=SHX3WI8sH0K{OexX_%N@HvP_oQdTM$z|Vcqps$WyCg>jqnLasY1JzVZ|!b%b|1XxfD1y z)7zS~DJpdjFf%TOEyju#bvr2h_`3|hJis(!^)ffgQ9ndnO-s2i7#2I19sKA=4?njQ z5UeaSp}g%@^!oRkAxbg!_4buqb@)`*#0;>o|F!3j46jy@4JDB|SE})4rLX=4olKl$ z={x4RLizZypnt{nILJTi5)Q)$A%ok-g0AG(8X5uyk28BvcNBL$G=9pKM<}23Uvz=8 z)|g{n{7UNXrGoyv+ZevMjJJ~21j3cTEvi5#C&>9QK1y<3)wDI;i1=Wihq)ztv0fzH2hrxf=mDJ zo2}@H_rm=7V}p^4=wQE=kc9*6-FFMRFiX&i;myIeTg2|8DO_8K9i4nZX8zmZVK!;| zR;`L+vq>tP3Rkf2oJ#{vcAx`(8Jw{)cxsieW8ZrFP);{Y_W<9X^RVM$R@l}WBx3bHHVV0Q3Yz&2JaN17-XjDAa{yov1`lr~U z_#UY7gO^1ol&0_|X^fHm{}VF_uvAX#)pD6xoIQifp~|$QArkvqm)$(il}6x2EElg& zNP20}%Jr~JKb@mlt>)|Dci=DCQ>$=F^uNSB(OUU&Z0g5#64XR1f43B~o2UGVXsmh1 zTHZ}Lg1Wl59<_m*l%x+TG7_g72UeyN$r9yr*gF}DmTj(TGl!Pv)Z6TJEb8`W=2!E% z*B)SOPGm&U|9D-oS~^}iFWco$UHyZdNUd(n{gM5^;H5IXyw{0ykr7Qdsi!5sun?K> z_K&5L;zMK)!CVJNvqLI1BfD}eyn-C?GQ8q!)0{Hc-Pzlb(9EUTb^AScMKhZQ(6R3} ziUv$YyH$w~+Wh0ezGN-x?nY89Of;vrO=UmT)xU~6z+*Eh;Sd$T+-_um`dMXn7oLjU zcpsvsDJuQ(7=`N^tPQ@x4aqPtRz(5fg>H|sEfG2|E5P`)GAUhFT2myx`jwaO>}xfo zoWC>}Dz=kHF1>|nW>J$^>-)v99*i4l`X({qLurmah>nN-!VPmeQpHJaU>bA`@K0s& z5?>rP=b0}i3s+45?7!51u)C;y<&Lp#V(=oyh;l9;e%eee?hQOY@|36_EPx^u{bZ3_ zV1j2EX&Z&{u-;COR0)F&?;Hz~hvq=ei43cU-5gzIB2vqD&iO;waOV~&QBA>qa7D#_o{9A>6;3&#vt%ow^i(m5_l-TUHt?Z z0{E{->wk!$KWnr(ExuoP`U6l;HEZ8HsPX$rpAUtek7LFo=FZAKB??OQ8aQ>&N~pXQ zYk{+3`SmM30ZT85w3*@oYjNGm|1+V>D{+87O#b;r^nP3HSCr_;>L5OYrsj}a_l2A+ zRk5|;4`oU-5czxuw=UisEH>z?r@NcsuWvtBq%i5o_;vp2;F#gJO82f@O$$`Xh}Wa& zzn^C&4y}8!Y$oa6*KvxUnr{p;39~42<2 zgsUI^w7=NDg*LfcGdyuRvI=8@04)%mV)Zdo4Fa4Chy2m;0&4R8T8(;BOBU-kxlU0Ti$KO#eRjHE9+YWe!Ek1&)6VnT( znu)CjyT**+OWsu*)m#ZHUYk!!o7Kq+5TM#sc9<|V=_hfesU?rsz<&Nr4jfsX=x+f) zQ=!L0P>Qn;u9G23_S#d&0+so&)=uSQ5$RSDB9UMmh)4zIZ@%iI*|gfBqztv>pZPfp z?n^Ure$BbMNC85NuZ{aeLDM&uztL2mZY85SO>P@h@5gkfiY8cCfkTg`9Nh!RD3U(; z>d`x{XhM}XD2#tpSwUfpfbYYLw%dBlG)XgN4x3%Rni>&iTsajyC1EI1hd4pyv=!{Z zCApjH1LdRL_&GldRzjY9&Gp!yd$bIoD0STlhI}eZ6@M`MTkUmlR!El+1Zqr< z?ga3SDXM0=CQ47Ci8s)5eQK}}EXYT9NG&c~3{ggQi*q%rcjw9ji@?i&K0YvbZg@Xu z5J0;GAQS3B`KF4nh~uPbhd{%S|5v(LNbubx(RQFcE=%6pcF!eJIGZPzqkITXLytwZ zDQ_HWV?;D+sr(_t*M4&K?p;g5NnKy6ZnGH6&VEB*S=th6F87Lg8_kye4XkX}JvVb+ zQ(i^>Uf>oqjHF=J(xc@MIi)w37T%Mct3Skt% z@~PB{gkN^?ss}k)mQlVQhNyKDD5p#?6g2EIsv6w}mH~ujq`On_;&YOhI@+CMbsHK-a-eFn>!dEJ>E@>~;t#8e2rexLW5|o+` za#7)*)~nXac!ca-)AhHzyVJQ{aw?k3R#R67vL9`FkA=?Xf6j^2?N7HxC>h>(Io1GJ z+Br{RSC$kphQqfH81AO}w&m7HS)u^n?jyNx(dEi5+e?*Orft2U zAEpeVIIQ`|-lb#L0BG;aM82FbA$_j`6OOnklz~B2!9~2C&VuCtNcOsvBR_4Du7HRig znfLhE;lDZNz0vGCeoE@`JkN}#))zd}&}GJt$MJ4QF5?}0%6{W`PNa{cpS?le8<*De zSIO(?L2Vf@I<9pnY8W8`uJQr(L9iMJVh%o7^wLcCc+Tq+Krt5Cj8($7>SVi;Yo^As z%}JYC_-a}FxxzuX-rkCZgshPaeC$moHkqOxr;9F_HuNcCjEE8Ndx*Ml=Bi)m1$reQ z@3FaUZ(seBItVIhS_o?!qWZG^M_J_mo4+n(5@&6;vmSAiFsT&Qm=2V%HomRS(E#~h zdy$zcLUbb&C{ztWRH+Y^ygbG|mSRv#*qcFXst=_7nfl54Cbi!Ukri#{j}m%=!j0Y) zQPu`Lg{rgx25VTn`3;P_N*>MYZ`D~KtaWJzrJWp1vdP&0pqR@62~n@>Rykp)(o;lJ zSOAlmkW9bnrKb9I_^kTCcKZMPEC(Xq@MFi$d=M47FaJM8c85>O=&U-*#}ly|13yq* zw1PxZf?%R(4g;-BBh26)ExMLWgSuk>k8#7f*GMfmfU(SW~UQ~fbP9H|a7^>cd z*_jZz`#DSn{7{;z8s?2%*{YGUgDdoLW(gCmbWKONB@QpM8WGdKUT!S9)siVk*Z%e) ze*ag|P+Ag+xbTmU3L4o>%QBAi>L3^T>LCK4`r^Z+kYdj%81^amUi0Twn}F8_DQ@nT zJK!-RL$~*V8ZNj$8zd}IaA~n{V8no=APOd5(iQI9h04cl8)Ou!o9c{;IfWCUzOB|B zG7qC+=OF7Ggg6be?#hGpTv;>47bfXlaLdeL48r>-{S`2jpwG^ fH3Ld~cp$rB8t z&lB~!`GJN8klo7Ns|31<&#e?Pmz`!}*{;J;n?44-xUERTfOrc#4#2*%G>EQmB`8AUP%H zl{$#)`XQNlC}#<@A~js&fDq+>6$iB(m7cetKa)5lGgI_ppuicYUl;M;qQY&VBtcweV20VDsPPN%&XS7LtAiIrOWhwG4`E4pcEUvl&DU02 z9^j)*SWzHI8CvjDsiRSZ z>=n}?7_iisqh6M>LDv@)TL?qk`Y3DvL##@)9{wlo+93+@3rMYst*-%OoG8CyCKVV8 zWx9&ACS%EKw@7GRolp zB2Xr{epI~XUtW%t07NBCyygapP^m8<@(S0GrBz6Dv3z`zF`-iw5p_Yx$nz|ghN0Kh4TAH2!N*6F(SV+Rr0Q`fcO&33jCjM_R@_9NUoU7Drm}gs=&LY=R=@^ zSX`*>>3JdDM<1-7pf=yC8gxsB=tY!>hZsn7vk>9`hmbb5e?FPUkod)ae5ZerVU7nO z`DDN(vx1$09dXtI=j}oK9)vlu2s`yz0*4uNr5vC+F8HYmvrC+|CnDcAIe>O32GPy& zXd22S?Lu}^|D?EXa1SBv#D|tc<^PMP56SZy2PtbBhDlXpSHPpTg3xX5F7nS7z>S?Q*BCt8>?F#)UCD#*k0$M4T!;_VW*GC zZ?O8=pqNY(k7O=Jef-~S2Y`rx%|Qo|bUk$(`EtArakVk3ASM=b12IFHERt$!s~M2; zadJf->=6^Ij1Nh4ajKLSdSKkk-Yc=9K%HI-BgJaXM406WRAB13DTKJZ%h*}wfH(sk zB-z5@rB!Ac2qPgT?sG*D{vQ_G1$t>jqm82g2Ar&n5r1-|BSawk%Y3dS6Emu1^g10G zGLZIZOdDb6yYc2Sy9gdpR{Cd<8Yt&M6zy%n500&c7 zeDttFG0a!W)<@zJp&~*t8Y7{WG05yg8$@ITQ6~42r!GZkt=p`OQia*GC<CQYHzu zysDx3ig%w_CWQ%g9T#;jmY~j|Cb;6(#lDK1aH^qMHoH9{phg$2@V4pI|1q zK2Le{?>TlNn&f&*h%!UdgQG4Q`8JeTIE6ybKKdVdJ@7wt72vY4yw<8_fW^Ki;QG9BRoV*x;*?oZaWRB)E1%;M6jMD?ruL+_`f{zWLN2 zzZBUCQ6j_TOPm9i-k;3+yXqoYmOczjAvOnCJ_T@aJ?|{={?q*(4-;s^R^jnUBP=`E znaf5@%P{Rw)2z-K{_!<{DYb|h{4p=t5liOqcMI6#QJW>v;Iu+|W*L&=1QsluSe1Fm zzAH?A@bZ+j9@(EBUk!(+D}mwi6{LVfG-m3cE00EGjLB{se_V<4#E*6a#G$o=!^yl0 ze8-GxC6+al;HEX-`3MFjpV^)x-x}n9TdO6F!H zvh}00{hu%4;-mKh{#{RJdh*_;zI*3$@9I74??~YVBF+NP9zG}6IsM1)&fxj(Od$+} ztA}}@1d|`F#zbPlkldKS%bk@#{>Qb-i4}rsSplUdjLlp%g&MvHbYlazMlb*IQOP5p zm$6Q&ZX4W~$j?9P|Je7B>!V0O7F)%d?B&#rKfUjH@G5_A`*rD0i}k_-c$LpyJ^%mv zUv%6P5z7YMc%aq@a}v#fv-EsxI{EHPO)ypVqhLx77&fB{#!o3eKNqSaZo1W(3x>Y_ z{-FgokvTYXu-(M;Gbw%i0#mr-()d`O7zQB$lJ-#2z>%-2VXRVNQ4b2QEHE;oN=O!V zLzj*_-v9U2Ra0;ROJ&8hd%XDt5@)iesjCc~DuXz6ZUiD~g!%JxF`K{z^!l73S}~Se z)hk1gMnr75!~qh*ST;Se3Rh_j+<#y7A=0o2R@RkeiK>i;3o!LZb=Isaja!J(%f{GZ(p6!R}yzOxhu#Z^2LH%$` ztX1Qto}Zz9kaU>#28p<(_M3o5L0fTo`YN^j4 z+kUDV+S(r6n*GpyF2q_?h)&sA=cssydQ@SPD#4~S4`)yTVoXEAAFeodcPK*4V;w37oNJ(07skqb7S@-`2gsR+ zO|l7bwlgZ{zgvf1e-N=_Z$MzwJG2Igb6}q{BmgOkiTN!ImUSa?Ar(bk@RiBrioTOI zV|emDEHy2y55D#Qd-J`itK80O87};itA((~owXpBPNLChMh1_;;ECJ);ASs}1iqP~ ziK2dU8}Cg7v4JI;ey>?t`4c#g>*odMXUm|pDdVG8FD--#!!`CxLkkt05We^{#sG`4 z!vcxO&}*CCOT*Gsh zZhax&1!8;wm>QEFCy3iGgoM*?oea|x&F8oov>&=z!oV|;j)UPGuPe~jVK7gyigL;~ zR7e|SxJ0Er2l<45g2)gtaV|J34Z4_!${uI)Z5Q;n6UKF z^aYf3eryk8I4u^+sQ*tGKQd&>`z z>SD0S9qS}>9U(}lL+Yh|(-~e@>m{f&myuDZg<(zu_JhMpXM!wjS%$+nHJ_?lrmh9Rf5%@Wsgi^c{0PDah4SKsAbEB4a;^k z7$SC0aSDf=dgd*xOo6z~z?pqhDL&Oqa_kNa)FvH}dHfCxJ<03$hz(^To~NCY^F3Rb z5g+q@4rY-`x1Tx}w%c(09I?q4rRvivx9>#d6BDb+D!dT8^#Mj8@mbm-UAkl<-=LXv z0#EO`Fq4n!(bRaPDBJZNcq{N+fR`GmIB}~tuSob-ON!|$t)MA25S3rCyI24bbv>O7 z+#*X9OnfaI9tV3`pJM$?pyWY0rkf_ECpgzh-XP@>y-y+;d&hO__v25AT@w2Tkfc{D zd3+N8l=q{)Kn}g=&DJ}u2}nqkTo96bV_Ph_<`R+N??H;mG`*rXol#>6Vx@x%iAU5= zUqlHWl?wPP%3kz32+@>tfLEgi0AIMwIHFuX(==8qbA|M%coaI+&=O-ty=cNBRxQNIUrf2 zn0znU^t@i1p#WdGQK8qAK_U6sLZN!BWixsEY8V_8y120C1b45kyo%*?iqmWhplGHD z0zRl5Qz|ysxkWgyDTz;N=5`S~D6Bd;#l@(!L}>z|Y73Adgz+iYU!Ty8W~drb)n~th zDxFSgA=Yip*Y#>&fVbdapF`*GR8hfTtE4>|zbUh*oNv0erJSDN0bK$jSy_6L{T4IBonUVe~fX-Qe9 zMzn_?08LY!9y0i1nCDEwY@Q>5MM7Z+qb{ZALA+^e=ML{U*Oe@V*4s+BC@?NO+<*w& zvdZ6)o_=f!x7R~G0x=MvQCc6)? zQW;&AcL@vr#T-8IHgm*P=7nE=#BG|m#K1a=)x?-n5|_zu*1c1za7FVIud|n&uLW3m zUm6U^5#VR)eV4XeuBb$Ni+u2qt4rYAZx zlvgbQYVMPU@;h5-=tnQvO>(bVS(nNy8i%iiu)*-v+4s}V{OV!&6w~(UfP_c$xGI;mK~l-10mKIKk}exMM&+_i#TcGcV`!ikM>dE`z@?O;;ad z)$>X3_Rna%w|n$(_#kn?*<(aJS$48(SKZQ6NF*Cm?n6QRe5EQs>y+$1@3znpRa-t~(3)oi95WCK zGdMu3QB^$?o|?3N`*yiP3PQ7(vu>}Q%0#jUilzJ)DJ~l>S6v`)-(ii(7rT7kIMOfw zsk~P^#Wu8I>a9DBH~C;q-PyZdURjJ^xK(8vpKBTw;CHI~6RoI%AAaGx$R|lm@rbi# zkpNfW-6juzOQK9tb!CBhl(IC&y$X9Q{P;VG>)2I=_OJcYI@&r^TE%{=NHR})v$r;_ z+tq2b#ZcEhKI2Yjr&e`sJv+@2F9PxfRA2~!4oZ!JN3%ahOzJY_RC<{omct`GZVjJ zn0wLGsYiSkx9oQ$xg@Uxv`se591H?pll2S`{0h?k135^#S*k3R?`voEIMIBX|v4 z)Jd<7NZo!b?0NFsLbWWl?rVImJs``CSu}GUp)6ko0zwD!Z<=mdj>)UVg!5S``1@C|$t8MS28ixso#r_VDPr?|YBOv@y{6rRm8&6Q=1?p}x|yarsV_ zKt0rN=E#haGL*G|dbrBmTR?~x9W9^ry2_7a;(UN(f7&mg z3wPP`qI!~1Nd=TtEuZQd9=~`YmUYZ8knyfUvf%S5|1Wg2nY+74_-MP=a#hGsm}Qks z;X?Xw-TZcN_wGK#n)e_X&1LF(f=1_VXc7x`tZCki(U-bkVJK`84+92%lFNR%?|C}h zunG2sPk>34j#Vv1f7qIM$m1C?zm{L zY&~n>9Lj9&oQpnj`+(1VFiePdQ1T={f(t@xb*2+0m3_ZW@7IzjwdT<_kcY<8G`3W7fW3Ey9-ZQ)3zmTymZK>jA@3oSINe)<+_P1k(B#vJp z!KS@^DK|vj^P=AK&ntC|3NVzwL36)F<@(L4A`9?9Bf$@f6nnwp0{)e6x{fc;1!bUA zBA)YeZq1zD^|tFfFV!9K%3ypSkOvYDauw&f7$J>xH;n7L6F55F#*fZ+oQ8S`hg?zf z!!RDnP2%_B76cA@0n_o``!wxxQunH{4Q;*QWqg6HQuqR*^LdE4a;`T)2Yl834Kn>M zUnGUZf@1HQ2zPTg%?@w9pTEZjV13y@eMEFNPvJb!s^>|G3@pagvU!I%a)u}ty_N6p|NZBhI zmn&kZkMV$u-!7^zS1VML^BcvRJNx1MKRqA;q2!Yuj90sI@j6ZpXXvZ+N{`>GNPS&) z8vj}$TpEWX{iMC68=<6L+8xgnlKAunJc>tn32&EPdok4sissV46^^E_)AD5ki-q-Y z0R#ck&j+P-%B9KQQhi8AKb^7^QV}}?rPLYNg}6DDD3&&vKA=_{VO^^eRqU;ZlX2M^ ze!ORT6wX8^32;r^8Z==1dde{LK(H5EWq=QW>BhmrMPDzhE7TZBu}GM7lzL*QrE-}N z_pH%Pl-?a(gJsW%ku}vwb^GZ0uG-8yHXR39jzu6YfE0+4OJ1HI8cMg4B6;qRC}yRM z1oyok2~IOn1&wRHhM%3}cpglZKraP)3D)Vh@@kV{8x`g}2FgluKSfJXD$)@S(b6r3 zP2#LlSfw^QpGx?TXoiA}5X?VK%q4|luQM1_&Z)dND7uC43dh&GJ7cav0Wab3IxL_s zS0IFqT^`9UR$+M_!hPakH_bE)$@q7;Rws7^{Oc(JSX1q>OjwvGJi%Ui=+yAfFF9w7EkIV_Z!)hHL`nkuv&*v!YHRvip zPHfZZBWqe*Pw=cvxKNt6!(|}E8RmbORlFB)r4>)A&aEBgo&eMk#R%n6q=&~*>mQJA zMR<;<5|Fey|4zmC@(iY)PS{ESK}=n=VtFO^Xj`}gv!3hG3terH=V&eW{7L57T#(JVL#^)CN72gq(~SY!aX%A^RB~=XcZ>13+_I1}?^Z{>jjpBY*F4 zENfx-OF6ezFC2j@Ahl%88w9G<$z72;qGdxaB8UZ6gN1WGyYGjh2)b7r20pV;4mB&-Ns(8?J zsX#cES|^f`l9`!V_07qeo0DgC+`pavsITt%4x!hc=hVOc@&!Da#=?HYR@nof8(J7Z zx0@kvWKnMA0oPy`k)dehi<3uQFph5QG0zC5$CI{6sjz8xfrP#rl0-=Rys+^`jm=!H1bXkgr=%}Z5-2)F^2|>)HtyU6HPXHW|b$^ASgmjHujJ_e0 zg$5}Lqg+RQr{h>{L`Zw>g-;_EW{KBqf#~~O4nZbfB62*G)G#Fbw%e+}@@JPUvjeQM z_p(9UQ-rI7)3+CHqqe?VN3P~@yk@c>Hm6%R2onakqm|#Lf~!p-Rg9$l6M$b3?}0g3 z!lW6M-E`&tqz(ZnfELAYsP96)#C*~Ex5|eZqu)iKq{s%)wd!VZIVfIXwx&gl^OLQq z?cM6R6qoO-?p&HQj0qU@N&X|w8@NGtw@-+Y8qPr0EV8f=u@w?VbfpRsE6TVeBU7B{ZLBl#vMa&d8{76Z zbz=+Ndw{<-!VombK_a%VDQ3@Nt84maRXs#_c--5<5eRrJDwh|dJQ?dZ3UsV1B z1cN=n0xRZxJlSPK8GTU*(s}T+a(9tC@}3+-dp>TN1f&(A1-K!hbo#S63jH11OFsGR zrTE;GFMfSf{u`CslVp{1d~+bfKxS|ED_EujXlu^R?s?JUZ9^&bj=Qh(&c>0Y;q_+% z8ie#go)HN24RbQC%%0YZ-)aa0q;nXWHhh@1w_tuVAIiKcBm`X33>kd~J$P!y3`OvL9Ugr9e4lGFD@!G za#6*1HVdAgxXk-mi;fF)O7@P(%==z9*6t>L?T8n0Mt~+DSZd*n7cvy<%Q|u`@NM`L_HX?hEsM`j3r}-}K<60>Cew7}_>W6l)Jq z4dKb;o88=csFh&g00&N1K)O{HPzu%?Fq%NtUg7-U(L-o$2;Ou87@}k;I4|DvH$5_H z_7OqEj`AJOT-CBEGlEpt<&=kF_I&u`0dnzkp{XVZA5!f8fG>tgc$32{G&m$vQYJ_k zO`CjH$s$rs-FOt1f_2+(0QZ1o>!8q6z25Sh)fw=K$gh%DvfB;R zg)@^ynrVUv86lYmI~@>iJ=36-I(#)lyEtFRzFr`k`x0>&`*Bh<+PtlnYFa7$l3n}^ zv|v^njFlhyU=@LXAZ%ON71G))ff3ve1Xa0t?4L`Qn_p387i8wB1QRVWu*}UM`9%)N zlR$1GF6{H^(7(S@@Gx+$(wL|n)jS&KM;9}IWDlwS|F9$Rvom}xXwN*(zY>Ap6ho6D++>Fr^$SwiF&QB^D$_nU&jc+hdhWF!?0(LE#-quhdM`JEXsYZOrD)m2sr~(Z&3$_5z23Cg09!5WBy9n7$wE&#?i zBrtG@rcnLm+30xrHxNvQlMe&rq{RKbJxW*n;wwU(pNTFZ7PV{nLVT4eZ66nLg1?L0 z?#t+Cbp}!-nm6LPfAyjz zY?G7Xp1qJfda6SpPcd6PCtA1^p5r?yMiY172$SED4uSTo6Asif8C}$ z_)x0vL=IgWG7lTd^}Zs;Hh^4j{U66>@i3j%5~dsOZKbA8r10IPaL&+tS%H9aR!Pys z1OBpo-|ln(&r5#q5YTEAJD%rfzHMkM(ZCnZcJB*EHx2*^uA?R!$cV0l(C=5(b$#X03D{_;wv!*cg@018a6+bnfZ#qlwZkxp z_ZY3{O>3av(zyT$L!{;~*TY#2sQ0{tYXRL5lVb_iSpx*;A+j%0H~@l5xiz)F-MD0-8P@-)5wUxB&Xa!nxOt zD9FJS;%ueT16dhEHVo^CzaR>=+GVXb5b4idQf&p(8~ah8uCPRRx*!K0v<#K(a_{-3 zNm!h!O`lTjddngZ9iNX^UIl0rzDIkX6c$up=O|mb2*)Rt=AJ$tzgdQ5K&Bp&RHAg| zmG{1c6o*F?o)-8D2-mA@>0JesQ@f0$AB7BfC0F}~LP17EH+WjPF9s{;>h{3c%GWTE z%pMN1((0?Eb1Xwcj9(9oQ}g$fqi}4dM>VJp7LSH#X*-^dF2P4;!+;-RZFZH^qier0 zhYTqnR*>WJvI_fdXW2L;ZlV)1EjO^(% zj9!~fMt6#$D8)ULBsKs;y01Z7Ip{}p90co5U0g!f=(u5yFFqL>o?0Xmy)cWh)*LSy zwVN^sO^b)K{jhB0IPkTdcHyOIFRT%4mp(87o>H(4#~b!yItD$X#w;8c_O z=#@wYAESPLbg;61*Jz%+|Bm8fQCcwnQAW<%b-dp6hQI}%PsjV(9pov`$=mLm zqPLubZjtS^lr#Xa#NQ+d)q9;W%D(IHB|IZOalHOuVr#0I3sIa!_HZGUec5oo7tvfl zj~hnt!m$eY0fMM?heA;(IcRh7Ok1EFd6)dIxm6vRxF~#6@-fnS&PaI~e)u5Xas+Ro z*CmJyV~XUhXH>@zLW&z284Ib(Jd{RWmWHhWY|tdZDi{K~d4s|iVGWg}eNbWas6aX? z1PE593HI~h(R?db=IP9`wRk34!asSH{Z{7-)>q3vS9qk zBQak(Jz(|kSAN1*vNAk%lj*M|obe91PPYpU6dQZ+tWN9)=Vv4#!F%zbw1H^wupFm- zZ4u{Wee3l+7Nk?fUQrk+f0I9uWfvbSmy0B6BQj8RYC2QWXj-eD19C_@Jjk5vQ@+JM zXy996iY@P#)}UecwAGq&GVRVlCNvX!J6Qh3yjwjEhA6Zmd3uVGsm;uwY1@Ul zSf@l0R$TuAG)YPvP8QD964G=W5k7SQ zPn+ZQ{Hrod{VrrZ4>YYgOuM7|swKs!HQ7bPk;kS4w0pRPj|?rn{RgPTww9F>Vh?~Z%NsQn9suJxhm6j<#e-j0R=u9jpG#P_fvFh+5-XmHBTFL z{`~y+_BoBP;^hTsV`&hgZDnhz4}&j(bmkN8ONyl|4>_Fq=i)4b;5o_4ikm1oopQI({hI=yMww_D@nsk0g{K(?ZM6vIqnX3@8ewY_d! zv$Gur3!maq=Z4ZYT$GJ2_rXSCW<9fytCBPRS^rIMJ_W|)<6U!=2Mh)A@pI!a{%44L z>mB3vQEZ4`#Q=mI&L#)?hlD5C4^g1cPEPa;i=)Jkn=YL8___95LXz@dx@Bv!oWY@G z%|UHtRx`IOsXAaZ`tB}HP*@*GiS|2TOQ<|5sx|cq84nVq8t0V8${-^h&g^;2oskM( z!lCIU4N34hP4wXk5!lm(p>W1my!&a0 z5v5Hm^R33}#~*qEUUd}g)~cMvN!%vUgc4;WS<@UcMnJ{Lo_PcrGLhWlht+rKd>Yz5f_TGlyh@B49T z`d{n1Mb^6J=<74~p3=0&&tyIv*{fyb5)Wzv0A z`VuV|qmePrP6&6tG0_DIsY8N%$~~2XKHQf)zU4a3bPG&ko|f#lfhxdvj#1=PuVSk* zVLo}m5WPQTk^YixED8?z%CAM4lqgzNpRH3)%}=91#DX}DAjiWWr@c4WRO8OJ==T{o zI?g&H37G)Zt=4kn6uB8?l)?jQ*04YgZ5m-d2E;cQnA6n*maZ9?)3(^Q%lh0yL@a|; z0hJYpo)|8JUIxccEKW@+%Ock7Ej?Ydvn(R`jAFZ}QpxRq|^dWyK zxni>;g5|Q#rrSxk2DnxVQ*l%v^P+eUre(h6Z-WnT$rLTi^6X?DtOtiWq(~K)l7=h2 z?HQ^5xQLJ6*w1&HN(Fy+rq**_x{Iy$4P^T=X2PhDa-n5_0HkS|hmN~-K79^UF05tO zettMJv&l)C5aT#xWvgIBVMv@4hzm=swhpekr!Iy*hgsV)W{? zbniAGK&RHZi~Zgn*~!+_LI!qV1H`v4*)H!077VRD;MBRQhfMAdYr&iv&3)?P2rN=~(sBd%rJ1jhHix5zFMi({hhk{qGIW5> za>`@=_kK7X?vfjm)GQ)7y?_TyVB=tyjoZf}I7Etm15L*&Y}t3dR6XkB3i^E!jspS-lEFK0JaqRBVms z2P?UUCH5ZW^2jE}t9mHuBdGB`DMwEUZ93}OOr@s5aw2wQpcgU`ux*Xe+yua7W`wx0k2gZEo<^rTQQCrHNV-KACtNO_i0 zJ@?Fq+wBPI6E8cs&-0-ZEMlASz{_+1LUnxQ*{VlbN;?XytL9pH=GM4XS+jQe@WYZJqm!OB_O0v1w~sr5V1P?up*GTeSGRUx=|Ar!=ej@E+2bj z8h%~`?A^bZ4_||GS<$vE7#LimFN$kZx3w45y%q(3zJ~+qGyy!+je(CR5wCxwm~0oT zW}+t`WZC66W5f`Wt1#=CFK)Jk!&i7T=UvfA&i07aE-dff{l_VRYV+2zbvqyB2C{Ly z&uDi?#7V>n3#t~g!nah~Wb*1u@wBS!=0Y9h0zAYu<1Q6EV|G@@l z=ppOioWsL`IVG<{ceVLlR{}2dge}5#1qD&{lsIO9M*rdqjwM1`(a7BP=*+I)zL^%j zeL2OoU0(qI;2j3o*WE?iqdx~p{`}MHdhiw21yAhy9T6edT{5ap3BXPsDQ05si<~=r zV0V5DKK2gLjgzL(O@>j>t9%0I+Sh)&Z}S3z7VVX(bMPB)Ky^vq9xG|aacd|DfBDIg z9ZPcB**xJnZQ68l>(W(CoeV7kT3 zdtG<7xWF+Hd3txu3b~*j+z5W0cW+AT^*N(>Cplvxt^rT?x1i1~!`}TMnQ=QQ45+mh zMd7SJaIh|~&4B1gy|WAzJ38KU534V^oEc2Vhwbv(A;jfQb^hX#dvEd}p9IohOExy< z>2FU*Rm;EK4b9SVuLgc_!i~KQvByb+zRw(nO-)(8dwkE#&2hGO35;$#@+?r9$W6ni ze8OKA!{^(N1+*N-!P^ITyM0`M{S>}B6IrAy?l5j*(KeZpYxCd;`k^X` zlUi1{O&>1jU~BGfDlCMkB9@MQdqDGRgXn;4u+WDU!h^kXR@v|wjd6X6J9dfZh)#f=vsGTU-t_5*~ zehM?UGL3>EtZ7q#*(48cnx8=k9Y@W+9CLMRoeTSjJRtFMz%Picqtz8e#DaKe`cryr zytKMjrYm+(`0NsMjova52U7~*YSVGnldTGnQ4mrzS4q6<<_GGFQX*nr{QUux>I|VG z=Zl-wSOa4gYJ-_{1ssynGtV!AQ3@zdhy6U&L_gzWXS6!WeRwCd;p@qTj{!O?PCIiP4A=FoJa2yF%Is zL%FA}eG8O)0Td^STEEr{pI8z({PRBeJKrU-O<7&&O+zdZad8JKf3F?ccAWE!{L0@C zKwt62{yPnD*Ixi%aA^_)K}eDeA}&c;Ive(_!z#agXPWD^5^~ngH2@jkb)2Ls3;v_!*3p@B?1QZ^n?Pt*cHt>=xSwG&hM=TwQaQg2Z43vR0ve|)} zLV6cI16eAi=RhQsvvP3eSKE5xF*vsQb)>KU;s9mJ0S{=6h3FOcKTqhN?qf`5P=1_M zP;XND@0b18A5~i*mju$^bAtsndIn}3AI=$&5s9o zZ6>rq{E%!Y_e}rItp)H^^(;@cSON7CUaqbymWPZ71(#~cxpJUX1P!VlhSft!X_cz? zDS$D?=EU7{{-4)Rtb=g7$iC4s;dI4Q_HmK*Q}O7E7~8|Fk{Oa6(4x~VmG+8!>vx|k zPD@;tSGbG;GKKIB;da4B5)`TMbRDvD%)20OulEAR1W2=6jpS-@R#ZXI-ZtKyIACoC z;fRsu>sw#qmP&5ozdX6&X#|8*(f-=}<=vAkxDDYYk6-_5E&Xd1GPwd#c-CfMv^Yc@ zoIKeIWPXN(bt*CZ{prpNkubE>{YCPZ<{(8x6RhC@Mp#fuRp7U4dLclRd>X_X4hrA? zG60E$*FRmKcG<@T9~~_Uk+pH|YWCreWVHC+$zbs!y#JM7mRq*5R^D>&LWxn>)D^L_v=E)QtvP#E~o^D4VN4uX0tx3 zJ@qbC1ZGGiKYR6B2Qg40feAW%=rA{3?ZR{Y5_JfLhOiEEi5M3TL3#W-xGMOF-=ncN zctcsDU8*3EY*IH4x*nRF$*un}3-j{foqqmhswEI8Ml)u37B}al%z%O+UUa2utBmb> zsT^11VDTnrK1Fn1-%Y{~+V+b|%tdthdkAXS zH0xS)1sjy`>*`49f-i%6PL}fQ!DS2jvYFge>bUN+u4j_p4!`^))`}J7fSt;Zso3*PfnhPpF z=BXt8dAarSd%(qb&I;IEXY#LYMk2ZZwQTK)d~J{>q8zcF?DmN;wR|?ZR$uAd6*xfT zy`mUTw7ximM${>4kb(z}En@uE>G9f;RM^^a1MrBOs_UT~Q_CtP-LhQch`;()Qd2B* zY+UW)Vz0IBg3;GK)=0h@q^MbIi3df+y0aEYHmbb(i%ry)rtxB(`U)fPqHzA*aK{u1 zPjcY@udBC3Z-Ybldbk9V(-wsU_U*M+$V;l6_SQ3n&j zbd3E^#eSwTa!9S$WYwW#1gVx?V>wJylkZYzhppc66DI4e-+B+Ng4K6bkcEcXn8L+A zLr@#4j_Xc38!5WB=xt4^&l04(MX8OBN5QB#YpnrhMu%H6uY6=G<0mRSlG{P-eHG;a zlRvvb!|0Rpu~!j0aKI>Td8VhMOj%^Az-2#*5z(JJ2|N$u)n?u0mWY4%2(JZW@bEz3 z_h56>+drAaplImz2`d_Ft!P<x@51 zsQ~J=ABn!e(Tt&eToLrsh<#jHvJAGw**oVghJN%2Ti|t-wb{aW9meswAI7!NreE5* znx2xq9eE#djEroJGvp2wfTy{kb?x|ycvz7bbDY)Ay94p)w{E%b$Tbo0Zf;zvsR(6&7gg1oMp! zo=0GU=m`aa+O1fb$~S`!cRc64pg^#Gxdr}K zXGx|gafnh^{wiq*yzjHR#9K@xw-6t%s4na=bW{_Vx&xY2@-7e^+-n9& zVE4O(H1A1i$gtOn+|rk17S=As%%(h$La*F&;M9b_X6BeVL^5-{=FLIHnoux5YNZ|l zD`;)5y4rjT!Ta#II}M!_IgaTrOU{-UtFS!05i-ErEaI(;AMd=!OO=)e;)432;v-`} zuf8SvX|H!n$h}na63u2S0(IasrN>WSc!2|o8+XRVTBN7;(1Jy-)CReyLZsuTlg>q2 z$+V_TLKK=ES6Z&KEmi$x0=}L7s8`h^b`<7WUC2s^8#+)JoRz@zs1`)}+O`vr2%aCR z=h?M2T6#z&C@(%OYtw$y1T;2R{m~Y9b>E6E4Up%OW;e#Cr35{VcdkqQCLx!(1SYa> z?udQ`X*yyJ$A#@zEu|mKpNNNaNyw>nr)4ss<|rv*KTw+9V!GBcYDOk1&K2UN&d9p3 zvHmRN!)wlpBN6?I;j-+LG01r385d6%N(Gzo6f6HRw}zh={oW%-t7*MyZf0Rv&`d=< z^tKhCFxs^4jj7egOE|dsc7j-jRDqO=&a{c@4lwmf5o`^o8IEZOyg#7n6HfX{l3Hiy zuK*P72UjXXk#S~DkTfsTFVu(13Pq?)hX9uQObF$y7ti+5r|XDYKZu`gG|AuHyhq*j zc$tXn+KUqx6c`E(YmUR7GFHW1cbFCoLD}z)ufF_E7)Ue2q$p3J94R76b2kyt9w@Q- zvv$w<9%0{q8RV*l8z_7$3XWNa9LhKSJl{O?u$b)E?asGr%-?qOJ!ITvi!mV%6vH>8 z&6EM?jEt<}D7sX(J*lhwyP55!CSFK_C=4s5vFaG=d^HNv0;ef-su(YR$oF@lWQn)P z@YkU);Oo_s61$Z35>jFMsIw~Kk$on=_Q3C(WvCGUWY%UCY4+O3HL0vFv5xxr1qd^1 z!j8LUfnlXQ(`h1m0_`8KYizHFQciwo(R zy1Yv|S>QE9{Yc;1!DI{`iax#01H~|01mQwWxSkKLRL%_2b2gEL@IWrS(ntC8-;eV! znjJMDLkCfq8NNLra9xBFSQEme`p(2-_!he^=P^Ro$~O;%dW2I9PYzo2@4BY7@BINP z;7kmk_#Z*<-(c(9zSHyP4~uZiy8FS8TY|dSS~e5Ac5eanO%+GF+cmGeV%Cghrt@Ot z$HX+gls#LW%r=d7dg zt>~*yr`$htU1ux>h-+UabcNaMzX78x86k9?S#xmsZ)@(!BZmiBBAV{^SQQrQKeA3W z;n6O__X$TcR!UDg>WJ*6h>9@klQpCUt!K07?;tNWR-1!*%^y<7Ns-Y7mw z9?Jj*QJ8*a;DG~o0{t#qy3${T9-#q}b@(aXj8uk;j;MNc(6J@i}ZZ3{6NLtKBd@r8sxcyFoWPE%6!e$x8KdYkXkv042>qVDg& z1|0@8_Jv-nE;Vr5`R_g)!5-LPdl*zHW6YgW?2+E@w&G?B4suR!D(1Hz6cgLS3 zGg3!^g)eT-y_NE&%KBVsyVS0^f*$yiIlq=^&^Pfi}0-Ji0zWo=zlC02PrfcPr43L9wFaqn}Q z0-sgDa9q%=7Z2E5f#W1{R@}-&1!VLLwW~F(a;ypNb|-$m3>Lp<`$?r$euF64vGjDB zQbs|`Flx5jXY1_=a|1Srh;0ST1neIAZ}k!<>ZxLH-O9aQNrF(KDyd493VT)mw$ZZu zXrny_ii)C6=XtRvERf5T^ttW)su9_>v>Me(N^w`pYvZ|2&58nX4p*a)h)csPh4*fd zEA{jkqO4>~c{4<$?xO>@rvxtMBM>|DOx;s@J{ZLGaX$ETj2hk zsyI>}Ro=I*1MM3w=fxVhhfINm@M8`nrCj>B8%QF;_EN<=LsL>c>YU zuY%JSyDf5xnVxkEI8EQ7)n2f&ghmsgt`WJv-l&*>zOc)@e(2>`Z##uDe#7dc&Yw+a z{_)Pb?dqL%GDn3C#ukbvA7Uaty!@v6_~%r7-ZLWlh{I`s?Yt^{T9RXV3e5bbntWRy zDvt0I^SsRP;f%;<%XfM5tee_3YT#xo6o)=rBXi+RCirR-XF~^t_!$)$|NO9^%HtZq zg^rZRFrt=kjl|(S0jJ4?QNiH;NmH_wIgmgMsjv3bxg4Nib9yJsp8@CIJP(z&_%*1d z$l29i?LY?2I1rb0JXVm_pQkvsOV-`UJ^&BwoZ@+pYz7$tW<_d5YHGL9+S9xW4)%!POsKVM^pt?tMo@xI3sWr;EL=Xn!Y z%9hf8POEy4AjIG!v1Q-%5^2br&9`OYmIiQ=-4;=*$a7+HK;oOcV%^LE<49~P6^x#n ziL&fsPZ{xoUre`b=TF0B`S!tHZU!S5J`g9Vra;^VTq`1b&QO?A+vQOCj+DmgBT!~+ zg>Q@RgbJ5!)uVHRM~N<0 zpNT{G)eiBI7&qE5vw{6#z}~Rra}E9mVj0 z#i!v#>S3-2fAzJmA>eGDx+}}Ct{OGGsJQC$)n9#W@$Uf^{|ULP2|!f}?-qjtS4tv~ z^sm?pK^V&Y3HL80c1@AluM%EISdhGf#Kgo-BohF((BF5Epfu1R>x9UGY9TfH7uGZ| zIzgN!1ZQ19g0n0jy*rpkuV1~m5wP7(*jSAryPPb;Ij;PYN8Cfy#rCfZo=gBd)rxGtysSse zOv?t!$?~LadEUFg`QQ0T!<4_2e}>2eQ-I<$({3kKi6Ao{0ppHF!TE2nGW`oG6TSi$ z95*ys@0uadTkggUQu|8)S^iyN0x(W4{PFNF7B16EWkhJ5rkWA*{I?6IKN~>NEa*6? z0z!VLJEFqBcnTj#SR+E?QJArZ1|+Hr5Cf}@Y@K3*_k6!t-+R1MkVX}?W{fY!02GG z&XW&&R#ngnRDHKX-&iW^7CWEbDIW>Oj$xe6Lgb1~g%=XsHnDSLUV4WFi5u7wM&BQm zjl681EUpqOZl5qf&Tq?I>T!C<^IY>B@LAu3e=gFCdzLDM^D@)+zqt0}CQ!oz8xPG^ zz+3RaLPx%C54y{h@!21I`u zPlPkMiwfKc*1$ksNJdlxSbuWYZzsuWz-gl0 z2PV#G@M4n+XFm(M#)#t2%x0Pq0itZyF}NwPX|q>jjd78DUQ*qVm2H5ExOuakJ%*sLv8|i3Gs9$MUW3^Wp=kL#tQ6j%~SYqiPxtKP}f%D>q@8 z8kl;sxkXN*i8ul7z?c;6WF4R)u6{;rwKI?)b$Et0@%ihvIpUg2h5Z82Ug8DKbBMrr zV#iC(b$uemYPPqyc*RfT#}n|nrg!3Dw8+AH%65Qyo(zB=^`g#oW49|)#ily6!Ea8u z)XQrHZoSFeJhEo!Meym|29_x@d04qg&u;*n`B)$=&-;N-tQ%CmJ*iy^EK?hS!QQ$Q z-PS!=uIZC!obxA-yNa(K`{UfpwmA*Y?>~XRuL)RJhIscu?*r4|TXEP}Pw=zIE2NuT{^*TC0qY*kDnnXE)jDDX`Wl_vteI*`r#}aFGVI}AY&2n;_F#-vzY!94a zO?88=vRBWcHW$hQ>va0Qd(d*nWu^~uyl?TUoZ_#KYCmv0CX`#JoBvX(S&`VzraeNk z`$D!Giv7oWNX2nH)AV;oaFW0RkKrnp*wVPKdg;owTCeeZ3#|-GPG; zVlS;sYeq&Lj94N8!|HW1_IwYf2)!8?nRH_o_qh8dF<+|cc15W*5}K;V&+!LvNy`Jr^?F-1CE4E zOVr#{`HPq-I~{`K0IEO6m+bAk#O*27-;xs54mL?vJ{Lj#*9)uVv^@i%-P|x8p9=kSmi*{t*#8;-cv=@sjn8l|Mg#(B^Xw5S^BLBH zoJM7y*r@C^AOfvyw942!?V+SCjEHf@sR^fFxLO(W`zwR>sr;&%1t6gk2sPpg*vXog-YKqJd9POz zAyS_ib*!A=nOc%QpvolOCk95=_5<2LW8JRtS704i8eytm5gD7=u3dbSyL5dcf*@wG z+NhT$Q3sI?bBGtMF|+X<6#XrM>N;}+o)sfyvu+=!bd_n-VRb(hfHkZ%dNH)*o^qk3 z?25<0*RB3%_4*7ApCcN1cf?vcWndBJbjWMv#Zydl3H(rD&gamw!kWNLL0HeQ_v?=) zH<}xdn_iyEEa(L$ZYx`5K9=T?xlt_5esjB6D%#R{^81^Yr*q%+LPD!@*X=B+*5g+N z8Xe`CM~7jfS{7)slBQOIFtnZuRW2!NmpixLN@dx$4oUZkd%zxxt*%JNj{ulRXwkeW zFcKU{#AR-0Fx+ohw$dKlT}39uHh%P+V-rmW`#J3tu9U37PcPy`Ch1opg?y*QqxfuF zJDR8!e8F9XmQCwqys4_M%(oz(yo=UY>x)kRRLZPXYyI=U#RN5y`z;ro`dv-L&&g^Z z<(hNamY~~79StOQL(KpCRLq=iz26F45t3Rm>M4{4wUQivfJT3h{cPy!&6xYOY@Q|k;wxfsS7kTeRKFf5C1@0QZJQHo8kU(hogTPt0aG1jVT?re zyMeoryuCcGIXF$6#)rL_XHaSw``dR!g6~bpQ7$QQ;97gF;2goKe@-FBn`FBtvN3;K ztYwbg{o`c!WFhl^GNza`V$t3qwy_PFecpzo=sN^MGV5O3cNFF1Y{Q4h8TfUwELeJy z+oxcpf`@nci6F;X3Q)^ ziQEw&r^okd=A9+htUB4+bHJr22OD;n+*74Tgp22jK0LlIh^`4^Jl6V{@J7t~FqI4~^$a@`RQx#DR zrRf_aXupj>wY1jhdoD+`27b`geI%*w zxI}=@Un4RhHu(7Bq!wL=tTzot^H!mOY?Fjs^sw|&62UBn#~_xOzO_XkKbe2S42rCB ziwir+FaEq!w`rP1SQZU2e{5vZiF<)6#lXlnG1e`_;`ZYWW|5f8j=tHkL~9K$+ay_r z^(+InKW~b#b%O3xjR~DsOxnte=QYU#r`mZ-ZuOt|v65holrY=J#eQCW=1LM$ucq}x zqS?Uum??RpBZ7&uR7vS-mi*+6$>gh#Vq_admgJ{hIMQ{}>8HrvOW{`VF5K)cDh6pK zhi@DFf%$l2(uqA{08Jc+)iI4NpQB!0znGLe$dc)5;ff|oO7sr2DsIoAmd_Yle^}Kx@yslJ03a}{p8u=A&lOp_v187? z=1YDq4Lw^)!>w+LDs^%gBk5j~`fqD;l#q!NNc3D5R6=(JzDCs5-miGb61Y+_bx{?3 zR$JVy0!bgA6i|s>Yo&;L-WWgXT5dD7){hnu7{c^>ge(v=I&}=t@v>(=U;c4gjFO-? zWHPtb2WlQ?P5Y?haCFt2_Vo9Q`bNcGlNdGGe?#YEs_-kfz=o>=2ZLMhO6#a-P}sYx z_5-gU=%cXSXcNZ&2fE}CsdC5ye>2U)?(G7a!A_^=ZWtd%N2|M%Df6A6+lm1qr|<4Q zb+T^MPVfT z#p<-IFslCbg`Ic(Yuzy_2VeVy)9)`k7;0Ogk=*9B4Ta(ug!4_12hLoMyCRwdr}$ck zON1KvWd>j7>|Bk$1Beq)6W)SGd}(Lf@N%>jWqC5H{7$TN3^7H+Nd=ltWMEkzq&6_< zyqQ29Yjnj`z*6Ql;=WV-&tit`#8gl=zwT%?Sw+fn!vcknQBTrF_9;hoIfds7@rh~} z!H>`Tweak4B#R6bu6Wq6i$9l@9w~TM(KxMv1CU32Rz0Eg@{cHmk_>Vas=Q6#&Du3< zKZM;Umn5$w+>gQHJ;{sb8Lm<1c)kd!jWaf62xi$)0!_50mhsS6Cu6h@MhbWgCb#)r z;6pBbvIe=WB~GSHv+}04x<#!o*-OjMennL#91;qAf7}=CxcTV8WIh*Xr}{SkcECrb z+gxi!LC&}$R9gfzEn})5H#mU7%kJw*M3qY(zV(~#D!JtUA0@vq*gh`ZMTsl zcvGh)jY0DHF%_;yTni3IYQ(bz-mK<98>(LN_$k)3#=f-3BMG^%MxZd8&9CFOz;JME zxvNV;Jaiw**pr>JgTlVVD8J#$7!0NimVTIi|w-OkKCKQXE0}{ z6=nA_Js&+@sN1_2xwcqWGF!_YnNqm6x2@!#BvT_;9BTEo6^34$vKTUXeY>l_aTn6#K- z#bGQ2YKp%{CdYg<&Mtso&0F*4!yA|(M=$Cx$7e6rqp43=^g+JGdN!(c{VL{jaF9(> zE-n=D`U5Nd?ZTU(k7);SBYq^BizgaQm=;;S?=280=Zyog+G%&Y>}mcs_`Mo?}X5h*{smS9$75Z`XwypZT4{T`}Dvsgw=j3`xYGDgw;@X;Bk(!{-1R<7S7uuQGk8s!J~dIX2s$UKqsNvNw@ zCSPJcXYCQ-%(ce6_A+kmR&RE)TWb5zLdx=Ha34y`x;ROXIaA|A;q$MfecWbVUp8}v z!%GDSOZ_|=*;m6%BC#_CVjP^8Ua8ooZqa_ZyC%Ps{@^7^iu!HBefA>%bL3JF309X# zLq#)XP!uw0`-06P*<^x`C~pt5>6Ax0N}z z#@RDh0Iu+UGx^iZs>WoWhS^?*===zJE1Xg42KVO!YHP5gI0yTD;#WTh3mM3MC;BjL zHnVvfj-#zE6wvl5M!aLmPVhNIoz0PkBUyPK%{&7m5v-x|@YJS#PPYVB-%C^HjF6O$ zs)wWk&Y^IXom!z2C%~kJ^}_U(ZD{*?;v;hC?PH-;^b{pdS5Yn+HzXFX*j~>-G}c-( zp1>PsLsP(2a*b3y-g&cWkHh#)e1UnE4q^G}XeJ9K!aq0>4Q0IaK?zmLAuh9f(qjH_E8dSXFGT2ESG6U1{^vAXAzu z^9+6_ea^aM;#>zv3&hpA4#NbVlNx8Xt@>w%2&)9`w!305x@e1`PmjGcKra6ei@nK? zGbJX)-}my(&(WeijuXwyb{>I6R{T6xu}KF*6Gf!P2EgHE4chgEf?*9MKMdF?r9+7^VVtQ-DFnCCFwq-@Vsv9dmSb*BcC zs79B53kNP|8Xbd2Jrm-~=Jon8$G7EKM<6^Dt63ekJCk)=k7#ud(y}OORR(0?+r4S1 z<5|z^59f+N28N<<4F|KM|0~QMfzrbo*)cD2XlP5ECJ)yJmdxObkSw|YisK`F4XZI@ zZP|rbRqrj(qOnU-WB#}V*I?_;@9kx(%fDgEWIJc9n#`=f3gFIo9p1 zK5vO$>k^%{ddPr@fpmOkR&as#zV;urZ4o!%Hqq!D%&;p2004l_d6f=`BbL5b*$a7j z!Id?t3=1Gh&)k2<;ca2RTV2|U#IYNg**5A>l0j@@-sK?9)PxC;d*dK1LE<&{iCh(8 z8zgHk#>VTg&^S|ybx9E7Ag?IrA}_?a-pB!$LDqh3l_QlQy@-qLr3~Jz?p&BZqdAJY z)HE*Pe^RS2sH=!2BD6I^x-Oq4_G_`H(2MNi66d_cE9}${GR|R>iYiT)tW7pPFQrSi zwDDf?{#|Ze`=M)Adz4-@(mdsQJj%fa*hVK0mo()&w)#jk?r|JWA<8#T(+xG>c)?vT z7F`c%E(73ypXkrCprk;v2C#=6j$y_g5xrX2Wz4W62qA|u{llYB8^zfs5OE=$ZNHye zq}8jOm41`@)iv1Y>>9{eVWe{7fkQ(fW8vz_8y^~Y8XY^ZWN)7IS)Y5Zp5pjU!oQy* zX|23|qil_EY;mWa-n8a*<2>D+yAZqc21jukWbIf(W# z73jYXJd4(TdVZcMm+N0V6Ixb^qzJ*wx;pEuF7&8#Y_O&+9M?UhGxt3&WbAP0ap|WzIAZdy12Q&@s9n_#(Il!Kz1WSpl@YAmkUDl*@BLOd zZ)9-WWN~A}#8Qe{G6>kRicGKEv+{tOub9=gycOoinMNZl=c0_=kWP8EQqq&wGp2B_ z!c2mYr~=(?`&@mZM`9EsmcL1`?V~9vAzU!VXbY80V*rZG3h`0E@QXlK{5YkN{|A`q zfrJlo3x#+xtaP}JzO>yAH?}G4b5a~W;Q;WBb4=Wob*$q0k(_lB_4zAfDeZjqFRR`L zG>k=9WH0ocphj7%%~Lu#$9rz5PIKVjyFh?Rii~^36W2ElM{{G3@i{2NK46F)vjLU(yq@fxGbBNVMLp zidsT3n4f?CBR!s53_NaEZ}zu}K@WkKxz96VE3=0`>a(&(Qf*Q(*LX%qGEJY7A4~9l z@$N!!tLkU4p!FEa`y0;>pE%liV!x$4jj;N2T$0*5%*T>18}091e%yoMH6R_ae4&ow z6Ea~)Tn7kZ!S{)cOiDxAX}qk&u&cInpJO)coWV3knm6`_+!R}TkC@hi)wr_+jR7XG zq#=T2T>CE|YqFhGQ_}Hhm-QHEKYsV}e^w?RWGR?^&8RCz>Q_=C;9T!do;C$-&Mbf= z*YEgu{Xl>Ha}AW_zzfOsd&q7%bKn1p6tp+T^~3&i<-Q9U{`p_)aVGq2xj#mK{xN^P zOu`4~@cq9T|MJ5yprUF0AHVOPFZ}(TUNV6|X7A%&e$!tc#s%6J%)>h`e*DvazVLT? z^DL;6ZagsfrB*{pE|%Xr1Trm(!8z7lAI|p)019_Zga5C8Yb1HlIeb2Z2NVMW>h=ZllF`FMM>;Jr)H}*IyM7lAx z26qC0t^@N7v>{^C606J+ipbqSfzb;|m8HBfq(3~p|MAntnj(6z`KM8-cLy*ye>^l7=!2RQ3?6P`4-!C;TRBTEx zZW!dJeGrPHjfD1t=zv2I(vP0ZiCKahG1yi9M{@f=i&mN}h!@|Cu~2sg*BtKZ5z$sh z;O!rMf?VKUm|r;>4I!2^ORl@8c*EVL;!=Wv!ygUkU_J>l+m-wY#M<{A@ep@kwIm=B zKzBYe{PNmm?U$uA?SkOM-XJz*%}XBJYh%{Xz*)n=!S!|NN37+4-hQyTK<5(a4i==| zGXWw)kh^PAnFUwtH#8Z300(e0O458DBh{ao~z@sAbEe=gH=8dlZVq^3(Jc9GTp zxxiAvNSzdMxbBzBjU9HF^ugR;#R?q#|N4#Q^%~fpRLhSSeBJ~9-H=w4%D$rS^M3#b C&M!Ow literal 0 HcmV?d00001 From b9c6a6cf64566fd8f4681302cd6dcc3b45dd4d58 Mon Sep 17 00:00:00 2001 From: Tom Carmichael-Mhanna Date: Wed, 24 May 2023 14:27:29 +0100 Subject: [PATCH 10/13] Ammend README and refactor code based on eslint airbnb rules --- .eslintrc.js | 15 + README.md | 2 + frame.js | 17 +- game.js | 66 +- package-lock.json | 1874 +++++++++++++++++++++++++++++++++++++++++++-- package.json | 5 + 6 files changed, 1867 insertions(+), 112 deletions(-) create mode 100644 .eslintrc.js diff --git a/.eslintrc.js b/.eslintrc.js new file mode 100644 index 000000000..940e2c2d8 --- /dev/null +++ b/.eslintrc.js @@ -0,0 +1,15 @@ +module.exports = { + env: { + browser: true, + commonjs: true, + es2021: true, + }, + extends: 'airbnb-base', + overrides: [ + ], + parserOptions: { + ecmaVersion: 'latest', + }, + rules: { + }, +}; diff --git a/README.md b/README.md index a52dd1d7e..be708cdbe 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,7 @@ # Makers Academy Bowling Challenge (Javascript) +A weekend challenge as part of the Makers Academy bootcamp. + ## The Task **THIS IS NOT A BOWLING GAME, IT IS A BOWLING SCORECARD. DO NOT GENERATE RANDOM ROLLS. AN ACTUAL USER INTERFACE IS OPTIONAL** diff --git a/frame.js b/frame.js index 928123548..39f070c7a 100644 --- a/frame.js +++ b/frame.js @@ -3,31 +3,32 @@ class Frame { this.rolls = []; this.regularPoints = 0; this.bonusPoints = 0; - }; + } roll(points) { - if (this.rolls.length == 2 || this.rolls[0] == 10) { + if (this.rolls.length === 2 || this.rolls[0] === 10) { throw new Error('Tried to add points to a frame that is already over'); } else if ((this.regularPoints + points) > 10) { throw new Error(`Tried to add roll that would exceed max score in a frame (${this.regularPoints} + ${points})`); } else { this.rolls.push(points); this.regularPoints += points; - }; - }; + } + } + // is this function necessary? This logic could be in Game - play(points_array) { - points_array.forEach((points) => { + play(pointsArray) { + pointsArray.forEach((points) => { this.roll(points); }); } isStrike() { - return this.rolls[0] == 10; + return this.rolls[0] === 10; } isSpare() { - return this.regularPoints == 10 && this.rolls.length == 2; + return this.regularPoints === 10 && this.rolls.length === 2; } } module.exports = Frame; diff --git a/game.js b/game.js index 7708e45c1..4608b1c3b 100644 --- a/game.js +++ b/game.js @@ -1,76 +1,76 @@ -const Frame = require("./frame"); +const Frame = require('./frame'); class Game { - constructor(frameClass = Frame) { + constructor(FrameClass = Frame) { this.grandTotal = 0; this.frames = []; - this.frameClass = frameClass; + this.FrameClass = FrameClass; this.initialiseFrames(); - }; + } initialiseFrames() { - for(let i = 0; i < 10; i++) { - let frame = new this.frameClass(); + for (let i = 0; i < 10; i++) { + const frame = new this.FrameClass(); this.frames.push(frame); - }; - }; + } + } play(scoresArray) { // take a 2D array, 1 array for each frame. If strike, array length will be 1 this.frames.forEach((frame, i) => { // no bonus points to allocate after first frame frame.play(scoresArray[i]); - if (i > 0) { this.allocateBonusPoints(i) }; - }) - let finalFrame = this.frames[9]; + if (i > 0) { this.allocateBonusPoints(i); } + }); + const finalFrame = this.frames[9]; if (finalFrame.isStrike() || finalFrame.isSpare()) { // Bonus rolls after the final frame provided from UI as addl array element this.playFinalFrameBonusRolls(scoresArray[10]); } this.calculateGrandTotal(); - }; - + } + allocateBonusPoints(index) { - let currentFrame = this.frames[index]; - let previousFrame = this.frames[index-1]; - let frameBeforeLast = this.frames[index-2]; + const currentFrame = this.frames[index]; + const previousFrame = this.frames[index - 1]; + const frameBeforeLast = this.frames[index - 2]; if (previousFrame.isSpare()) { - previousFrame.bonusPoints += currentFrame.rolls[0]; + previousFrame.bonusPoints += currentFrame.rolls[0]; } else if (previousFrame.isStrike()) { previousFrame.bonusPoints += currentFrame.regularPoints; // if this is at least the 3rd frame & have been 2 consecutive strikes before this frame if (index >= 2 && frameBeforeLast.isStrike()) { - frameBeforeLast.bonusPoints += currentFrame.rolls[0] - }; - }; - }; + frameBeforeLast.bonusPoints += currentFrame.rolls[0]; + } + } + } playFinalFrameBonusRolls(bonusRollsArray) { - let finalFrame = this.frames[9] - let penultimateFrame = this.frames[8] + const finalFrame = this.frames[9]; + const penultimateFrame = this.frames[8]; bonusRollsArray.forEach((points) => { finalFrame.bonusPoints += points; }); - // If player had a strike in frame 9 and 10, allocate the first bonus roll as bonus point to frame 9: + // If strike in frame 9 and 10, allocate the first bonus roll as bonus point to frame 9: if (finalFrame.isStrike() && penultimateFrame.isStrike()) { penultimateFrame.bonusPoints += bonusRollsArray[0]; - }; - }; - + } + } + calculateGrandTotal() { this.frames.forEach((frame) => { this.grandTotal += (frame.regularPoints + frame.bonusPoints); }); - }; + } isGutterGame() { - return this.grandTotal == 0; - }; + return this.grandTotal === 0; + } isPerfectGame() { - return this.grandTotal == 300; - }; -}; + return this.grandTotal === 300; + } +} module.exports = Game; diff --git a/package-lock.json b/package-lock.json index b04f0ae12..060eddb24 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,6 +11,11 @@ "dependencies": { "jest": "^29.5.0", "node": "^20.2.0" + }, + "devDependencies": { + "eslint": "^8.41.0", + "eslint-config-airbnb-base": "^15.0.0", + "eslint-plugin-import": "^2.27.5" } }, "node_modules/@ampproject/remapping": { @@ -539,6 +544,140 @@ "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==" }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.1.tgz", + "integrity": "sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.3.tgz", + "integrity": "sha512-+5gy6OQfk+xx3q0d6jGZZC3f3KzAkXc/IanVxd1is/VIIziRqqt3ongQz0FiTUXqTk0c7aDB3OaFuKnuSoJicQ==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.5.2", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/eslintrc/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@eslint/eslintrc/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "8.41.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.41.0.tgz", + "integrity": "sha512-LxcyMGxwmTh2lY9FwHPGWOHmYFCZvbrFCBZL4FzSSsxsRPuhrYUg/49/0KDfW8tnIEaEHtfmn6+NPN+1DqaNmA==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.8", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", + "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true + }, "node_modules/@istanbuljs/load-nyc-config": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", @@ -874,6 +1013,41 @@ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/@sinclair/typebox": { "version": "0.25.24", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.24.tgz", @@ -961,6 +1135,12 @@ "@types/istanbul-lib-report": "*" } }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true + }, "node_modules/@types/node": { "version": "18.16.3", "resolved": "https://registry.npmjs.org/@types/node/-/node-18.16.3.tgz", @@ -989,6 +1169,43 @@ "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==" }, + "node_modules/acorn": { + "version": "8.8.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", + "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, "node_modules/ansi-escapes": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", @@ -1045,6 +1262,86 @@ "sprintf-js": "~1.0.2" } }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", + "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "is-array-buffer": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-includes": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", + "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "get-intrinsic": "^1.1.3", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", + "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", + "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/babel-jest": { "version": "29.5.0", "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.5.0.tgz", @@ -1196,6 +1493,19 @@ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -1321,6 +1631,12 @@ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, + "node_modules/confusing-browser-globals": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz", + "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==", + "dev": true + }, "node_modules/convert-source-map": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", @@ -1360,6 +1676,12 @@ "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==" }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, "node_modules/deepmerge": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", @@ -1368,6 +1690,22 @@ "node": ">=0.10.0" } }, + "node_modules/define-properties": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", + "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", + "dev": true, + "dependencies": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/detect-newline": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", @@ -1384,6 +1722,18 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/electron-to-chromium": { "version": "1.4.377", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.377.tgz", @@ -1413,6 +1763,94 @@ "is-arrayish": "^0.2.1" } }, + "node_modules/es-abstract": { + "version": "1.21.2", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.2.tgz", + "integrity": "sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "es-set-tostringtag": "^2.0.1", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.5", + "get-intrinsic": "^1.2.0", + "get-symbol-description": "^1.0.0", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.5", + "is-array-buffer": "^3.0.2", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.10", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.3", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.4.3", + "safe-regex-test": "^1.0.0", + "string.prototype.trim": "^1.2.7", + "string.prototype.trimend": "^1.0.6", + "string.prototype.trimstart": "^1.0.6", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", + "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3", + "has": "^1.0.3", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", + "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", @@ -1429,76 +1867,470 @@ "node": ">=8" } }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "node_modules/eslint": { + "version": "8.41.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.41.0.tgz", + "integrity": "sha512-WQDQpzGBOP5IrXPo4Hc0814r4/v2rrIsB0rhT7jtunIalgg6gYXWhRMOejVO8yH21T/FGaxjmFjBMNqcIlmH1Q==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.4.0", + "@eslint/eslintrc": "^2.0.3", + "@eslint/js": "8.41.0", + "@humanwhocodes/config-array": "^0.11.8", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.0", + "eslint-visitor-keys": "^3.4.1", + "espree": "^9.5.2", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "strip-ansi": "^6.0.1", + "strip-json-comments": "^3.1.0", + "text-table": "^0.2.0" + }, "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" + "eslint": "bin/eslint.js" }, "engines": { - "node": ">=4" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "node_modules/eslint-config-airbnb-base": { + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-15.0.0.tgz", + "integrity": "sha512-xaX3z4ZZIcFLvh2oUNvcX5oEofXda7giYmuplVxoOg5A7EXJMrUyqRgR+mhDhPK8LZ4PttFOBvCYDbX3sUoUig==", + "dev": true, "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" + "confusing-browser-globals": "^1.0.10", + "object.assign": "^4.1.2", + "object.entries": "^1.1.5", + "semver": "^6.3.0" }, "engines": { - "node": ">=10" + "node": "^10.12.0 || >=12.0.0" }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" + "peerDependencies": { + "eslint": "^7.32.0 || ^8.2.0", + "eslint-plugin-import": "^2.25.2" } }, - "node_modules/exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", - "engines": { - "node": ">= 0.8.0" + "node_modules/eslint-import-resolver-node": { + "version": "0.3.7", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz", + "integrity": "sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==", + "dev": true, + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.11.0", + "resolve": "^1.22.1" } }, - "node_modules/expect": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.5.0.tgz", - "integrity": "sha512-yM7xqUrCO2JdpFo4XpM82t+PJBFybdqoQuJLDGeDX2ij8NZzqRHyu3Hp188/JX7SWqud+7t4MUdvcgGBICMHZg==", + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, "dependencies": { - "@jest/expect-utils": "^29.5.0", - "jest-get-type": "^29.4.3", - "jest-matcher-utils": "^29.5.0", - "jest-message-util": "^29.5.0", - "jest-util": "^29.5.0" + "ms": "^2.1.1" + } + }, + "node_modules/eslint-module-utils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", + "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", + "dev": true, + "dependencies": { + "debug": "^3.2.7" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } } }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" - }, - "node_modules/fb-watchman": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", - "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.27.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz", + "integrity": "sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "array.prototype.flatmap": "^1.3.1", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.7", + "eslint-module-utils": "^2.7.4", + "has": "^1.0.3", + "is-core-module": "^2.11.0", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.values": "^1.1.6", + "resolve": "^1.22.1", + "semver": "^6.3.0", + "tsconfig-paths": "^3.14.1" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-scope": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.0.tgz", + "integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", + "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/eslint/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/globals": { + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/eslint/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/espree": { + "version": "9.5.2", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.2.tgz", + "integrity": "sha512-7OASN1Wma5fum5SrNhFMAMJxOUAbhyfQ8dQ//PJaJbNw0URTPWqIghHWt1MmAANKhHZIYOHruW4Kw4ruUWOdGw==", + "dev": true, + "dependencies": { + "acorn": "^8.8.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expect": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.5.0.tgz", + "integrity": "sha512-yM7xqUrCO2JdpFo4XpM82t+PJBFybdqoQuJLDGeDX2ij8NZzqRHyu3Hp188/JX7SWqud+7t4MUdvcgGBICMHZg==", + "dependencies": { + "@jest/expect-utils": "^29.5.0", + "jest-get-type": "^29.4.3", + "jest-matcher-utils": "^29.5.0", + "jest-message-util": "^29.5.0", + "jest-util": "^29.5.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", "dependencies": { "bser": "2.1.1" } }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, "node_modules/fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -1522,6 +2354,34 @@ "node": ">=8" } }, + "node_modules/flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "dependencies": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", + "dev": true + }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.3" + } + }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -1545,6 +2405,33 @@ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, + "node_modules/function.prototype.name": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", + "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0", + "functions-have-names": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -1561,6 +2448,21 @@ "node": "6.* || 8.* || >= 10.*" } }, + "node_modules/get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/get-package-type": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", @@ -1580,6 +2482,22 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", @@ -1599,6 +2517,18 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, "node_modules/globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", @@ -1607,11 +2537,44 @@ "node": ">=4" } }, + "node_modules/globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, "node_modules/has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -1623,6 +2586,15 @@ "node": ">= 0.4.0" } }, + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -1631,6 +2603,57 @@ "node": ">=8" } }, + "node_modules/has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/html-escaper": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", @@ -1644,6 +2667,40 @@ "node": ">=10.17.0" } }, + "node_modules/ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-fresh/node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/import-local": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", @@ -1684,11 +2741,79 @@ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, + "node_modules/internal-slot": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", + "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", + "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "is-typed-array": "^1.1.10" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-core-module": { "version": "2.12.0", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.0.tgz", @@ -1697,42 +2822,203 @@ "has": "^1.0.3" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, "engines": { - "node": ">=8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-generator-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", - "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, "engines": { - "node": ">=6" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "node_modules/is-typed-array": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", + "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + }, "engines": { - "node": ">=0.12.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "engines": { - "node": ">=8" + "node_modules/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/isexe": { @@ -2394,6 +3680,18 @@ "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", @@ -2421,6 +3719,19 @@ "node": ">=6" } }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", @@ -2437,6 +3748,12 @@ "node": ">=8" } }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, "node_modules/lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", @@ -2503,6 +3820,15 @@ "node": "*" } }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -2562,6 +3888,73 @@ "node": ">=8" } }, + "node_modules/object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.entries": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.6.tgz", + "integrity": "sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.values": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", + "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -2584,6 +3977,23 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", @@ -2631,6 +4041,18 @@ "node": ">=6" } }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/parse-json": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", @@ -2712,6 +4134,15 @@ "node": ">=8" } }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/pretty-format": { "version": "29.5.0", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz", @@ -2748,6 +4179,15 @@ "node": ">= 6" } }, + "node_modules/punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/pure-rand": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.2.tgz", @@ -2763,11 +4203,48 @@ } ] }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, "node_modules/react-is": { "version": "18.2.0", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", + "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "functions-have-names": "^1.2.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -2819,6 +4296,68 @@ "node": ">=10" } }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-regex-test": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", + "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-regex": "^1.1.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", @@ -2846,6 +4385,20 @@ "node": ">=8" } }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/signal-exit": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", @@ -2922,6 +4475,51 @@ "node": ">=8" } }, + "node_modules/string.prototype.trim": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", + "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", + "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", + "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -2995,6 +4593,12 @@ "node": ">=8" } }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, "node_modules/tmpl": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", @@ -3019,6 +4623,51 @@ "node": ">=8.0" } }, + "node_modules/tsconfig-paths": { + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", + "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==", + "dev": true, + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tsconfig-paths/node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/tsconfig-paths/node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/type-detect": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", @@ -3038,6 +4687,35 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/typed-array-length": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", + "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "is-typed-array": "^1.1.9" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/update-browserslist-db": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", @@ -3067,6 +4745,15 @@ "browserslist": ">= 4.21.0" } }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, "node_modules/v8-to-istanbul": { "version": "9.1.0", "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz", @@ -3107,6 +4794,51 @@ "node": ">= 8" } }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", + "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", diff --git a/package.json b/package.json index 6d4b99c31..8c024f366 100644 --- a/package.json +++ b/package.json @@ -15,5 +15,10 @@ "dependencies": { "jest": "^29.5.0", "node": "^20.2.0" + }, + "devDependencies": { + "eslint": "^8.41.0", + "eslint-config-airbnb-base": "^15.0.0", + "eslint-plugin-import": "^2.27.5" } } From f8eba9ec9d41a80f592d52694c5a1bc0bc6922f8 Mon Sep 17 00:00:00 2001 From: Tom Carmichael-Mhanna Date: Tue, 13 Jun 2023 21:58:58 +0100 Subject: [PATCH 11/13] Removed redundant instructions from README --- README.md | 47 ++++++++++++----------------------------------- 1 file changed, 12 insertions(+), 35 deletions(-) diff --git a/README.md b/README.md index be708cdbe..52b4c6ae0 100644 --- a/README.md +++ b/README.md @@ -1,55 +1,32 @@ # Makers Academy Bowling Challenge (Javascript) -A weekend challenge as part of the Makers Academy bootcamp. +A weekend challenge as part of the Makers Academy bootcamp, undertaken in Javascript after [attempting the same problem in Ruby](https://github.com/tomcarmichael/bowling-challenge-ruby.git) first. ## The Task -**THIS IS NOT A BOWLING GAME, IT IS A BOWLING SCORECARD. DO NOT GENERATE RANDOM ROLLS. AN ACTUAL USER INTERFACE IS OPTIONAL** +The brief was defined in the README of the [Makers Academy repo](https://github.com/makersacademy/bowling-challenge) that I forked to begin this challenge. -Count and sum the scores of a bowling game for one player (in JavaScript). +Key points: -A bowling game consists of 10 frames in which the player tries to knock down the 10 pins. In every frame the player can roll one or two times. The actual number depends on strikes and spares. The score of a frame is the number of knocked down pins plus bonuses for strikes and spares. After every frame the 10 pins are reset. +>**THIS IS NOT A BOWLING GAME, IT IS A BOWLING SCORECARD. DO NOT GENERATE RANDOM ROLLS. AN ACTUAL USER INTERFACE IS OPTIONAL** -## Bowling — how does it work? +>Count and sum the scores of a bowling game for one player (in JavaScript). -### Strikes - -The player has a strike if he knocks down all 10 pins with the first roll in a frame. The frame ends immediately (since there are no pins left for a second roll). The bonus for that frame is the number of pins knocked down by the next two rolls. That would be the next frame, unless the player rolls another strike. - -### Spares - -The player has a spare if the knocks down all 10 pins with the two rolls of a frame. The bonus for that frame is the number of pins knocked down by the next roll (first roll of next frame). - -### 10th frame - -If the player rolls a strike or spare in the 10th frame they can roll the additional balls for the bonus. But they can never roll more than 3 balls in the 10th frame. The additional rolls only count for the bonus not for the regular frame count. - - 10, 10, 10 in the 10th frame gives 30 points (10 points for the regular first strike and 20 points for the bonus). - 1, 9, 10 in the 10th frame gives 20 points (10 points for the regular spare and 10 points for the bonus). - -### Gutter Game - -A Gutter Game is when the player never hits a pin (20 zero scores). - -### Perfect Game - -A Perfect Game is when the player rolls 12 strikes (10 regular strikes and 2 strikes for the bonus in the 10th frame). The Perfect Game scores 300 points. - -In the image below you can find some score examples. - -More about ten pin bowling here: http://en.wikipedia.org/wiki/Ten-pin_bowling - -![Ten Pin Score Example](images/example_ten_pin_scoring.png) +>More about ten pin bowling here: http://en.wikipedia.org/wiki/Ten-pin_bowling ## Getting started `git clone https://github.com/tomcarmichael/bowling-challenge.git` -`npm install` +Install dependencies: `npm install` ## Usage -`node` +The program is designed to be used in the context of the Node REPL, having been created solely as a learning exercise. + +In the terminal, run: + +`node` `const Game = require('./game')` From 14af73886e208c41db5cda77b3ddee3ef0aa4e0c Mon Sep 17 00:00:00 2001 From: Tom Carmichael-Mhanna Date: Tue, 13 Jun 2023 22:03:04 +0100 Subject: [PATCH 12/13] Removed unused and unfisnished user interface class file --- user_interface.js | 38 -------------------------------------- 1 file changed, 38 deletions(-) delete mode 100644 user_interface.js diff --git a/user_interface.js b/user_interface.js deleted file mode 100644 index 023eb2ba6..000000000 --- a/user_interface.js +++ /dev/null @@ -1,38 +0,0 @@ -// in user interface, add logic that ends frame early if player gets a strike - - -class UserInterface { - scoreBoard() { - // Test this function - // look to refactor this function, creating small functions that return bools re: bonus points pending - // second arg to .map is the index of the iteration - this.frames.map((frame, index) => { - let frameInfo = `Frame ${index}: Shot 1 =>` - // concatenate the score from first roll if it has been scored, else default to 0 - frameInfo += frame.rolls.length ? frame.rolls[0] : 0; - frameInfo += 'Shot 2 => ' - // concatenate the score from 2nd roll if it has been scored, else default to 0 - frameInfo += frame.rolls.length === 2 ? frame.rolls[1] : 0; - frameInfo += 'FRAME TOTAL == ' - // if player rolled a strike - if(frame.rolls.includes(10)) { - // if the next frame hasn't had to rolls nor finished early because of a strike - if (this.frames[index + 1].rolls.length < 2 && !this.frames[index + 1].rolls.includes(10) ) { - frameInfo += '*pending*'; - // if the next frame finished early because of a strike but the subsequent roll hasnt yet beeen taken - // modify this to handle the penultimate frame - } else if (this.frames[index + 1].rolls.length == 1 && !this.frames[index + 2].rolls ) { - frameInfo += '*pending*'; - // else boinus points must havfe been allocated already - } else { - frameInfo += (frame.regularPoints + frame.bonusPoints); - } - // if they scored a half strike check if the next roll has been taken - } else if (frame.regularPoints == 10 && !this.frames[index + 1].rolls.length) { - frameInfo += '*pending*'; - } else { - frameInfo += (frame.regularPoints + frame.bonusPoints); - }; - }) - } -} \ No newline at end of file From 7eaaf9e0009424f336854ecf7caddfe4b989da0f Mon Sep 17 00:00:00 2001 From: Tom Carmichael-Mhanna Date: Fri, 16 Jun 2023 13:29:12 +0100 Subject: [PATCH 13/13] Updated README --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index 52b4c6ae0..08e8f1be9 100644 --- a/README.md +++ b/README.md @@ -52,3 +52,7 @@ Check if the game is a perfect game or gutter game: ![bowling-challenge-jest](./screenshots/bowling-challenge-jest.png) ![bowling-challenge-node](./screenshots/bowling-challenge-node.png) + +## Reflections + +This challenge was completed after one week of learning Javascript, following on from completing [the same challenge in Ruby](https://github.com/tomcarmichael/bowling-challenge-ruby). Although I did not implement a UI via the command line in this Javascript version, I tried to design and write the program in a way that would make it easily extendable for such a feature. A key goal for me was to write the program in such a way that scores were updated as soon as possible, during the game (as they would be in a bowling alley) something made more complex by the rules around bonus points for strikes and spares which are based on the scores in the subsequent frames. In the Ruby version of the challenge, scores were calculated at the end of the game only, and the user interface code was not sufficiently separated from the rest of the game logic. In this version of the program, I feel I was able to improve on both of those problems.