diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml new file mode 100644 index 0000000..53d7123 --- /dev/null +++ b/.github/workflows/build.yaml @@ -0,0 +1,42 @@ +# build extension and publish on merges to main + +name: Build and Publish + +on: + push: + branches: + - main + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - name: Set Up node + uses: actions/setup-node@v4 + with: + node-version-file: .nvmrc + cache: 'yarn' + + - name: Install dependencies + run: yarn --immutable --immutable-cache + + - name: Build + run: yarn build + + - name: Zip + run: zip -r dist.zip dist + + - name: Publish + if: github.ref == 'refs/heads/main' + uses: Klemensas/chrome-extension-upload-action + with: + refresh-token: ${{ secrets.REFRESH_TOKEN }} + client-id: ${{ secrets.CLIENT_ID }} + client-secret: ${{ secrets.CLIENT_SECRET }} + file-name: './dist.zip' + app-id: ${{ secrets.APP_ID }} + publish: true + + diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b3cbb1e --- /dev/null +++ b/.gitignore @@ -0,0 +1,39 @@ +# Ignore node_modules directory +node_modules/ + +# Ignore TypeScript build output +dist/ + +# Ignore logs +logs/ +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# Ignore environment variable files +.env +.env.local +.env.*.local + +# Ignore macOS system files +.DS_Store + +# Ignore Linux system files +*.swp + +# Ignore temporary files +tmp/ +temp/ + +# Ignore IDE and editor specific files +.vscode/ +.idea/ +*.sublime-project +*.sublime-workspace + +# Ignore TypeScript cache +*.tsbuildinfo + +# Ignore Chrome extension files that shouldn't be committed +chrome-profile/ diff --git a/README.md b/README.md index 46082f8..e6413e6 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,14 @@ # What is it? + WayFinder (alpha) is a simple, open source, Google Chrome extension that intelligently routes users to optimal AR.IO gateways, ensuring streamlined access to the permaweb on Arweave. # Who is it built for? -- Anyone who wants to browse the Permaweb. Since no wallet is needed, the user does not have to have ever touched tokens or even uploaded data. -- Developers who want to integrate ar:// protocol. Wayfinder shows how the ar:// protocol could be leveraged along with how to discover gateways on the ar.io network. + +- Anyone who wants to browse the Permaweb. Since no wallet is needed, the user does not have to have ever touched tokens or even uploaded data. +- Developers who want to integrate ar:// protocol. Wayfinder shows how the ar:// protocol could be leveraged along with how to discover gateways on the ar.io network. # MVP Features + - ar:// routing in the browser search bar and within pages that use ar:// hyperlinks, images, video, audio and embedded iframes, objects - Automatically routes ArNS names and Arweave Transaction IDs to an available gateway. - DNS TXT Record Redirection: Uses DNS TXT records to link Arweave transaction IDs with domains, thus offering a gasless, secure, and user-friendly method to navigate the permaweb with familiar URLs. @@ -19,4 +22,37 @@ WayFinder (alpha) is a simple, open source, Google Chrome extension that intelli - Open Source: The community can verify the code and contribute to the extension’s success. # Want to learn more? + Join our discord for more information about WayFinder or how to contribute. https://discord.gg/zAZ8p9ARqC + +## Developers + +### Requirements + +- `node` - v18+ +- `yarn` - v1.4 + +### Dependencies + +Dependencies should be installed using [Yarn] + +```bash +yarn +``` + +### Build + +The extension uses [Webpack] to bundle extension files into minimized javascript. + +```bash +yarn build +``` + +### Loading into Chrome + +To load the bundled app as an extension in Chrome: + +1. Run `yarn build` to create a fresh `dist` directory +1. Navigate to `Manage Extensions` +1. Click `Load unpacked` +1. Select the `dist` directory and hit `Load` diff --git a/ar.io wayfinder.code-workspace b/ar.io wayfinder.code-workspace index 8f00039..2112877 100644 --- a/ar.io wayfinder.code-workspace +++ b/ar.io wayfinder.code-workspace @@ -1,14 +1,14 @@ { - "folders": [ - { - "path": "." - } - ], - "settings": { - "eslint.nodePath": ".yarn/sdks", - "eslint.packageManager": "yarn", - "prettier.prettierPath": ".yarn/sdks/prettier/index.js", - "typescript.tsdk": ".yarn/sdks/typescript/lib", - "typescript.enablePromptUseWorkspaceTsdk": true + "folders": [ + { + "path": ".", + }, + ], + "settings": { + "eslint.nodePath": ".yarn/sdks", + "eslint.packageManager": "yarn", + "prettier.prettierPath": ".yarn/sdks/prettier/index.js", + "typescript.tsdk": ".yarn/sdks/typescript/lib", + "typescript.enablePromptUseWorkspaceTsdk": true, + }, } -} \ No newline at end of file diff --git a/assets/css/styles.css b/assets/css/styles.css index 1e1a59f..7b36404 100644 --- a/assets/css/styles.css +++ b/assets/css/styles.css @@ -1,534 +1,552 @@ -body { - font-family: 'Rubik', sans-serif; - background-color: #010905; - color: #E0E0E0; - padding: 20px; - width: 325px; - max-height: calc(100vh - 40px); /* 100vh is the full viewport height. We subtract some pixels to give a little room. */ - overflow: hidden; - margin: 1px; -} -/* Styling for the links in the body */ -p a { - color: #EDEDED; /* Initial color */ - text-decoration: none; /* Removes underline */ - transition: color 0.3s; /* Smooth transition for hover effect */ -} - -p a:hover { - color: #FAFAFA; /* Lighter color when hovering over the link */ -} - -h2 { - color: #EDEDED; - font-size: 24px; - border-bottom: 1px solid #323232; - padding-bottom: 15px; - margin-bottom: 15px; - margin-top: 15px -} - -p { - color: #9E9E9E; - font-size: 14px; - margin-bottom: 15px; - line-height: 1.6; -} - -button { - display: block; - width: 100%; - background-color: #010905; - border: 2px solid #EDEDED; - color: #EDEDED; - padding: 12px; - text-align: center; - font-size: 16px; - cursor: pointer; - transition: background-color 0.3s, color 0.3s; - border-radius: 4px; - margin-bottom: 20px; -} - -button:hover { - background-color: #1F1F1F; - color: #FAFAFA; -} - -button:active { - transform: scale(0.98); -} - -ul { - display: flex; - flex-direction: column; - list-style-type: none; - padding: 0; - border: 1px solid #323232; - border-radius: 4px; - margin-top: 15px; - overflow: hidden; - transition: all 0.3s ease-in-out; - border-radius: 5px; - max-height: 300px; - overflow-y: auto; -} - -.status-icon { - width: 24px; - height: 24px; - margin-left: 10px; /* Adds some spacing between the gateway name and the icon */ -} -.online { - color: green; -} - -.offline { - color: red; -} - -.blacklisted .offline, -.blacklisted .online { - color: grey; /* or any shade of grey you prefer */ -} - -ul::-webkit-scrollbar { - width: 10px; -} - -ul::-webkit-scrollbar-thumb { - background-color: #9E9E9E; - border-radius: 5px; -} - -ul::-webkit-scrollbar-track { - background-color: #171717; -} - -li { - padding: 8px 16px; - border-bottom: 1px solid #9E9E9E; - background-color: #1F1F1F; - transition: background-color 0.3s; - display: flex; - justify-content: space-between; - align-items: center; -} - -li:hover { - box-shadow: 0 4px 15px rgba(0, 0, 0, 0.1); - background-color: #323232; -} - -li:last-child { - border-bottom: none; -} - -li a { - text-decoration: none; - color: inherit; /* This makes the link have the same color as the list item */ - display: block; /* Makes the entire list item area clickable */ - padding: 8px 16px; - transition: background-color 0.3s; -} - -li a:hover { - background-color: #323232; -} - -button, li { - box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); -} - -button:hover { - box-shadow: 0 6px 12px rgba(0, 0, 0, 0.15); - transform: scale(1.025); /* Slight zoom effect on hover */ -} - -#gatewayList { - transition: opacity 0.4s cubic-bezier(0.4, 0, 0.2, 1), transform 0.4s cubic-bezier(0.4, 0, 0.2, 1); - transform: translateY(0); - opacity: 1; - max-height: 300px; /* The subtracted value here depends on the combined height of your other elements (like headers, paragraphs, buttons). You might need to adjust this value to fit your content perfectly. */ - overflow-y: auto; - margin-bottom: 20px; /* Adjust value as necessary */ - border-radius: 5px; -} - -.gatewayListHeader { - list-style-type: none; - padding: 0; - border: 1px solid #323232; - border-radius: 5px; - margin-top: 15px; - overflow: hidden; - transition: all 0.3s ease-in-out; - border-radius: 5px; - max-height: 300px; - overflow-y: auto; -} - -.gateway { - display: flex; - flex-direction: column; - padding: 10px; - border-bottom: 1px solid #9E9E9E; - background-color:#1F1F1F; - cursor: pointer; - transition: background-color 0.3s ease; -} - -.gateway:hover, -.gateway.blacklisted:hover { - box-shadow: 0 4px 15px rgba(0, 0, 0, 0.1); - background-color: #323232; -} - -.light-mode .gateway.blacklisted:hover{ - box-shadow: 0 4px 15px rgba(0, 0, 0, 0.1); - background-color: #E0E0E0; -} - -.gateway-header { - display: flex; - justify-content: space-between; - align-items: center; - margin-bottom: 5px; -} - -.gateway-url { - font-size: 1.1em; -} - -.gateway-info { - display: flex; - justify-content: space-between; - align-items: center; -} - -.gateway-address { - color: #0077b6; - text-decoration: none; -} - -.operator-stake, -.online-status { - font-size: 0.9em; - color: #666; -} - -.modal { - display: none; - position: fixed; - z-index: 1; - left: 0; - top: 0; - width: 100%; - height: 100%; - overflow: auto; - background-color: rgba(0,0,0,0.4); -} - -.modal-content { - background-color: #1F1F1F; - margin: 15% auto; - padding: 20px; - border: 1px solid #888; - width: 80%; - max-width: 400px; -} - -.close-btn { - color: #aaaaaa; - float: right; - font-size: 28px; - font-weight: bold; -} - -.close-btn:hover, .close-btn:focus { - color: #FAFAFA; - text-decoration: none; - cursor: pointer; -} - -#historyList { - transition: opacity 0.4s cubic-bezier(0.4, 0, 0.2, 1), transform 0.4s cubic-bezier(0.4, 0, 0.2, 1); - transform: translateY(0); - opacity: 1; - max-height: 310px; /* The subtracted value here depends on the combined height of your other elements (like headers, paragraphs, buttons). You might need to adjust this value to fit your content perfectly. */ - overflow-y: auto; - margin-bottom: 20px; /* Adjust value as necessary */ -} -#aboutSection{ - transition: opacity 0.4s cubic-bezier(0.4, 0, 0.2, 1), transform 0.4s cubic-bezier(0.4, 0, 0.2, 1); - transform: translateY(0); - opacity: 1; - max-height: 400px; /* You can adjust this based on your needs */ - overflow: hidden; -} -.setting { - padding: 16px; - border: 1px solid #e0e0e0; - border-radius: 4px; - margin-bottom: 12px; - display: flex; - align-items: center; -} - -.setting button { - display: block; - width: 30px; - background-color: #010905; - border: 2px solid #EDEDED; - color: #EDEDED; - padding: 8px; - text-align: center; - font-size: 12px; - cursor: pointer; - transition: background-color 0.3s, color 0.3s; - border-radius: 4px; - margin-bottom: 0px; -} - -.setting label { - flex: 1; - font-weight: bold; -} - -.setting input { - flex: 2; - padding: 8px; - border: 1px solid #ccc; - border-radius: 4px; - margin-right: 12px; - width: 160px; -} - -select { - width: 75%; - padding: 8px 10px; - border: 1px solid #ccc; - border-radius: 5px; - font-size: 14px; -} -.setting label { - margin-right: 14px; - color: #E0E0E0; -} -.icon { - width: 24px; - height: 24px; - vertical-align: middle; - margin: 0 10px; -} - -footer { - display: flex; - justify-content: space-between; - padding-top: 20px; - border-top: 2px solid #323232; /* Thin line separator */ - margin-top: 15px; -} -footer a { - color: #9E9E9E; /* Lighter grey color for footer text */ - text-decoration: none; - font-size: 16px; - font-weight: 500; /* Slightly bolder font */ - transition: color 0.3s, transform 0.3s; /* Added transform for hover effect */ - padding: 5px; /* Padding for a larger clickable area and spacing */ - border-radius: 4px; /* For the hover effect */ - position: relative; /* To place the icons if added later */ -} -footer a:hover { - color: #EDEDED; /* Change color on hover */ - background-color: #323232; /* Background change on hover */ - transform: scale(1.05); /* Slight zoom effect on hover */ -} -.footer-icon { - position: absolute; - left: -30px; /* Adjust based on actual icon size */ - top: 50%; - transform: translateY(-50%); - width: 20px; /* Adjust based on actual icon size */ - height: auto; -} - -.light-mode { - /* Explicit custom properties for light mode */ - color: #333333; - background-color: #FAFAFA; - box-shadow: 0 4px 15px rgba(0, 0, 0, 0.1); - --primary-bg: #FAFAFA; - --primary-text-color: #333333; - --secondary-text-color: #7D7D7D; - --link-color: #007BFF; - --link-hover-color: #0056b3; - --border-color: #EAEAEA; - --button-bg: #F7F7F7; - --button-border-color: #CCCCCC; - --button-hover-bg: #EAEAEA; - --button-hover-color: #333333; - --list-bg: #FAFAFA; - --list-hover-bg: #F7F7F7; - --scrollbar-thumb: #7D7D7D; - --scrollbar-track: #F7F7F7; - --modal-bg: #FAFAFA; -} - -.light-mode p a { - color: #555555; - transition: color 0.3s; -} - -.light-mode p a:hover { - color: #7D7D7D; -} - -.light-mode h2 { - color: #555555; - border-bottom: 1px solid #DDDDDD; -} - -.light-mode p { - color: #777777; -} - -.light-mode button { - background-color: #EDEDED; - border: 2px solid #555555; - color: #333333; -} - -.light-mode button:hover { - background-color: #DDDDDD; - color: #111111; -} - -.light-mode ul { - border: 1px solid #DDDDDD; -} - -.light-mode #gatewayList { - border: 1px solid #DDDDDD; -} - -.light-mode ul::-webkit-scrollbar-thumb { - background-color: #CCCCCC; -} - -.light-mode ul::-webkit-scrollbar-track { - background-color: #EFEFEF; -} - -.light-mode li { - background-color: #EFEFEF; -} - -.light-mode .gateway { - background-color: #EFEFEF; -} - -.light-mode a:hover { - background-color: #E0E0E0; -} - -.light-mode li:hover { - background-color: #E0E0E0; -} - -.light-mode .gateway:hover { - background-color: #E0E0E0; -} - -.light-mode button, .light-mode li { - box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05); -} - -.light-mode button:hover, .light-mode li:hover { - box-shadow: 0 3px 6px rgba(0, 0, 0, 0.08); -} - -.light-mode .setting label { - color: #333333; -} - -.light-mode footer a { - color: #777777; -} - -.light-mode footer a:hover { - color: #555555; - background-color: #EFEFEF; -} - -.light-mode .modal-content { - background-color:#EAEAEA; - border: 1px solid #333333; -} - -.refreshGateways { - position: absolute; - top: 10px; - right: 10px; - z-index: 1000; -} - -#refreshIcon { - font-size: 18px; /* Adjust based on your design needs */ - font-weight: bold; - color: #EDEDED; /* Choose a suitable color */ - text-decoration: none; - cursor: pointer; - padding-left: 180px; -} - -@keyframes ellipsis { - 0% { - content: "Refreshing "; - } - 20% { - content: "Refreshing . "; - } - 40% { - content: "Refreshing .."; - } - 60% { - content: "Refreshing ... "; - } - 80% { - content: "Refreshing .... "; - } -} - -.refreshing-text::after { - content: "Refreshing"; - animation: ellipsis 2s infinite; -} - -#refreshIcon:hover { - color: #555; /* Darker shade for hover effect, adjust as needed */ -} - -.light-mode #refreshIcon { - font-size: 18px; /* Adjust based on your design needs */ - font-weight: bold; - color: #333333; /* Choose a suitable color */ - text-decoration: none; - cursor: pointer; - padding-left: 180px; -} - -.light-mode #refreshIcon:hover { - background-color: #FAFAFA; - color: #777777; /* Darker shade for hover effect, adjust as needed */ -} - -.light-mode .gateway.blacklisted { - background-color: white; /* Light gray for blacklisted gateways */ - /* color: white; /* Dark gray text for readability */ -} - -.gateway.blacklisted { - background-color: #010905; - /*color: white; /* Setting text color to white for readability */ -} +body { + font-family: "Rubik", sans-serif; + background-color: #010905; + color: #e0e0e0; + padding: 20px; + width: 325px; + max-height: calc( + 100vh - 40px + ); /* 100vh is the full viewport height. We subtract some pixels to give a little room. */ + overflow: hidden; + margin: 1px; +} +/* Styling for the links in the body */ +p a { + color: #ededed; /* Initial color */ + text-decoration: none; /* Removes underline */ + transition: color 0.3s; /* Smooth transition for hover effect */ +} + +p a:hover { + color: #fafafa; /* Lighter color when hovering over the link */ +} + +h2 { + color: #ededed; + font-size: 24px; + border-bottom: 1px solid #323232; + padding-bottom: 15px; + margin-bottom: 15px; + margin-top: 15px; +} + +p { + color: #9e9e9e; + font-size: 14px; + margin-bottom: 15px; + line-height: 1.6; +} + +button { + display: block; + width: 100%; + background-color: #010905; + border: 2px solid #ededed; + color: #ededed; + padding: 12px; + text-align: center; + font-size: 16px; + cursor: pointer; + transition: + background-color 0.3s, + color 0.3s; + border-radius: 4px; + margin-bottom: 20px; +} + +button:hover { + background-color: #1f1f1f; + color: #fafafa; +} + +button:active { + transform: scale(0.98); +} + +ul { + display: flex; + flex-direction: column; + list-style-type: none; + padding: 0; + border: 1px solid #323232; + border-radius: 4px; + margin-top: 15px; + overflow: hidden; + transition: all 0.3s ease-in-out; + border-radius: 5px; + max-height: 300px; + overflow-y: auto; +} + +.status-icon { + width: 24px; + height: 24px; + margin-left: 10px; /* Adds some spacing between the gateway name and the icon */ +} +.online { + color: green; +} + +.offline { + color: red; +} + +.blacklisted .offline, +.blacklisted .online { + color: grey; /* or any shade of grey you prefer */ +} + +ul::-webkit-scrollbar { + width: 10px; +} + +ul::-webkit-scrollbar-thumb { + background-color: #9e9e9e; + border-radius: 5px; +} + +ul::-webkit-scrollbar-track { + background-color: #171717; +} + +li { + padding: 8px 16px; + border-bottom: 1px solid #9e9e9e; + background-color: #1f1f1f; + transition: background-color 0.3s; + display: flex; + justify-content: space-between; + align-items: center; +} + +li:hover { + box-shadow: 0 4px 15px rgba(0, 0, 0, 0.1); + background-color: #323232; +} + +li:last-child { + border-bottom: none; +} + +li a { + text-decoration: none; + color: inherit; /* This makes the link have the same color as the list item */ + display: block; /* Makes the entire list item area clickable */ + padding: 8px 16px; + transition: background-color 0.3s; +} + +li a:hover { + background-color: #323232; +} + +button, +li { + box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); +} + +button:hover { + box-shadow: 0 6px 12px rgba(0, 0, 0, 0.15); + transform: scale(1.025); /* Slight zoom effect on hover */ +} + +#gatewayList { + transition: + opacity 0.4s cubic-bezier(0.4, 0, 0.2, 1), + transform 0.4s cubic-bezier(0.4, 0, 0.2, 1); + transform: translateY(0); + opacity: 1; + max-height: 300px; /* The subtracted value here depends on the combined height of your other elements (like headers, paragraphs, buttons). You might need to adjust this value to fit your content perfectly. */ + overflow-y: auto; + margin-bottom: 20px; /* Adjust value as necessary */ + border-radius: 5px; +} + +.gatewayListHeader { + list-style-type: none; + padding: 0; + border: 1px solid #323232; + border-radius: 5px; + margin-top: 15px; + overflow: hidden; + transition: all 0.3s ease-in-out; + border-radius: 5px; + max-height: 300px; + overflow-y: auto; +} + +.gateway { + display: flex; + flex-direction: column; + padding: 10px; + border-bottom: 1px solid #9e9e9e; + background-color: #1f1f1f; + cursor: pointer; + transition: background-color 0.3s ease; +} + +.gateway:hover, +.gateway.blacklisted:hover { + box-shadow: 0 4px 15px rgba(0, 0, 0, 0.1); + background-color: #323232; +} + +.light-mode .gateway.blacklisted:hover { + box-shadow: 0 4px 15px rgba(0, 0, 0, 0.1); + background-color: #e0e0e0; +} + +.gateway-header { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 5px; +} + +.gateway-url { + font-size: 1.1em; +} + +.gateway-info { + display: flex; + justify-content: space-between; + align-items: center; +} + +.gateway-address { + color: #0077b6; + text-decoration: none; +} + +.operator-stake, +.online-status { + font-size: 0.9em; + color: #666; +} + +.modal { + display: none; + position: fixed; + z-index: 1; + left: 0; + top: 0; + width: 100%; + height: 100%; + overflow: auto; + background-color: rgba(0, 0, 0, 0.4); +} + +.modal-content { + background-color: #1f1f1f; + margin: 15% auto; + padding: 20px; + border: 1px solid #888; + width: 80%; + max-width: 400px; +} + +.close-btn { + color: #aaaaaa; + float: right; + font-size: 28px; + font-weight: bold; +} + +.close-btn:hover, +.close-btn:focus { + color: #fafafa; + text-decoration: none; + cursor: pointer; +} + +#historyList { + transition: + opacity 0.4s cubic-bezier(0.4, 0, 0.2, 1), + transform 0.4s cubic-bezier(0.4, 0, 0.2, 1); + transform: translateY(0); + opacity: 1; + max-height: 310px; /* The subtracted value here depends on the combined height of your other elements (like headers, paragraphs, buttons). You might need to adjust this value to fit your content perfectly. */ + overflow-y: auto; + margin-bottom: 20px; /* Adjust value as necessary */ +} +#aboutSection { + transition: + opacity 0.4s cubic-bezier(0.4, 0, 0.2, 1), + transform 0.4s cubic-bezier(0.4, 0, 0.2, 1); + transform: translateY(0); + opacity: 1; + max-height: 400px; /* You can adjust this based on your needs */ + overflow: hidden; +} +.setting { + padding: 16px; + border: 1px solid #e0e0e0; + border-radius: 4px; + margin-bottom: 12px; + display: flex; + align-items: center; +} + +.setting button { + display: block; + width: 30px; + background-color: #010905; + border: 2px solid #ededed; + color: #ededed; + padding: 8px; + text-align: center; + font-size: 12px; + cursor: pointer; + transition: + background-color 0.3s, + color 0.3s; + border-radius: 4px; + margin-bottom: 0px; +} + +.setting label { + flex: 1; + font-weight: bold; +} + +.setting input { + flex: 2; + padding: 8px; + border: 1px solid #ccc; + border-radius: 4px; + margin-right: 12px; + width: 160px; +} + +select { + width: 75%; + padding: 8px 10px; + border: 1px solid #ccc; + border-radius: 5px; + font-size: 14px; +} +.setting label { + margin-right: 14px; + color: #e0e0e0; +} +.icon { + width: 24px; + height: 24px; + vertical-align: middle; + margin: 0 10px; +} + +footer { + display: flex; + justify-content: space-between; + padding-top: 20px; + border-top: 2px solid #323232; /* Thin line separator */ + margin-top: 15px; +} +footer a { + color: #9e9e9e; /* Lighter grey color for footer text */ + text-decoration: none; + font-size: 16px; + font-weight: 500; /* Slightly bolder font */ + transition: + color 0.3s, + transform 0.3s; /* Added transform for hover effect */ + padding: 5px; /* Padding for a larger clickable area and spacing */ + border-radius: 4px; /* For the hover effect */ + position: relative; /* To place the icons if added later */ +} +footer a:hover { + color: #ededed; /* Change color on hover */ + background-color: #323232; /* Background change on hover */ + transform: scale(1.05); /* Slight zoom effect on hover */ +} +.footer-icon { + position: absolute; + left: -30px; /* Adjust based on actual icon size */ + top: 50%; + transform: translateY(-50%); + width: 20px; /* Adjust based on actual icon size */ + height: auto; +} + +.light-mode { + /* Explicit custom properties for light mode */ + color: #333333; + background-color: #fafafa; + box-shadow: 0 4px 15px rgba(0, 0, 0, 0.1); + --primary-bg: #fafafa; + --primary-text-color: #333333; + --secondary-text-color: #7d7d7d; + --link-color: #007bff; + --link-hover-color: #0056b3; + --border-color: #eaeaea; + --button-bg: #f7f7f7; + --button-border-color: #cccccc; + --button-hover-bg: #eaeaea; + --button-hover-color: #333333; + --list-bg: #fafafa; + --list-hover-bg: #f7f7f7; + --scrollbar-thumb: #7d7d7d; + --scrollbar-track: #f7f7f7; + --modal-bg: #fafafa; +} + +.light-mode p a { + color: #555555; + transition: color 0.3s; +} + +.light-mode p a:hover { + color: #7d7d7d; +} + +.light-mode h2 { + color: #555555; + border-bottom: 1px solid #dddddd; +} + +.light-mode p { + color: #777777; +} + +.light-mode button { + background-color: #ededed; + border: 2px solid #555555; + color: #333333; +} + +.light-mode button:hover { + background-color: #dddddd; + color: #111111; +} + +.light-mode ul { + border: 1px solid #dddddd; +} + +.light-mode #gatewayList { + border: 1px solid #dddddd; +} + +.light-mode ul::-webkit-scrollbar-thumb { + background-color: #cccccc; +} + +.light-mode ul::-webkit-scrollbar-track { + background-color: #efefef; +} + +.light-mode li { + background-color: #efefef; +} + +.light-mode .gateway { + background-color: #efefef; +} + +.light-mode a:hover { + background-color: #e0e0e0; +} + +.light-mode li:hover { + background-color: #e0e0e0; +} + +.light-mode .gateway:hover { + background-color: #e0e0e0; +} + +.light-mode button, +.light-mode li { + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05); +} + +.light-mode button:hover, +.light-mode li:hover { + box-shadow: 0 3px 6px rgba(0, 0, 0, 0.08); +} + +.light-mode .setting label { + color: #333333; +} + +.light-mode footer a { + color: #777777; +} + +.light-mode footer a:hover { + color: #555555; + background-color: #efefef; +} + +.light-mode .modal-content { + background-color: #eaeaea; + border: 1px solid #333333; +} + +.refreshGateways { + position: absolute; + top: 10px; + right: 10px; + z-index: 1000; +} + +#refreshIcon { + font-size: 18px; /* Adjust based on your design needs */ + font-weight: bold; + color: #ededed; /* Choose a suitable color */ + text-decoration: none; + cursor: pointer; + padding-left: 180px; +} + +@keyframes ellipsis { + 0% { + content: "Refreshing "; + } + 20% { + content: "Refreshing . "; + } + 40% { + content: "Refreshing .."; + } + 60% { + content: "Refreshing ... "; + } + 80% { + content: "Refreshing .... "; + } +} + +.refreshing-text::after { + content: "Refreshing"; + animation: ellipsis 2s infinite; +} + +#refreshIcon:hover { + color: #555; /* Darker shade for hover effect, adjust as needed */ +} + +.light-mode #refreshIcon { + font-size: 18px; /* Adjust based on your design needs */ + font-weight: bold; + color: #333333; /* Choose a suitable color */ + text-decoration: none; + cursor: pointer; + padding-left: 180px; +} + +.light-mode #refreshIcon:hover { + background-color: #fafafa; + color: #777777; /* Darker shade for hover effect, adjust as needed */ +} + +.light-mode .gateway.blacklisted { + background-color: white; /* Light gray for blacklisted gateways */ + /* color: white; /* Dark gray text for readability */ +} + +.gateway.blacklisted { + background-color: #010905; + /*color: white; /* Setting text color to white for readability */ +} diff --git a/icon128.png b/assets/icon128.png similarity index 100% rename from icon128.png rename to assets/icon128.png diff --git a/icon16.png b/assets/icon16.png similarity index 100% rename from icon16.png rename to assets/icon16.png diff --git a/icon48.png b/assets/icon48.png similarity index 100% rename from icon48.png rename to assets/icon48.png diff --git a/background.js b/background.js deleted file mode 100644 index 7da42fd..0000000 --- a/background.js +++ /dev/null @@ -1,445 +0,0 @@ -let gar = {}; -let sortedGar = {}; -let redirectedTabs = {}; // A dictionary to keep track of redirected tabs -const RANDOM_ROUTE_METHOD = 'random'; -const STAKE_RANDOM_ROUTE_METHOD = 'stakeRandom'; -const HIGHEST_STAKE_ROUTE_METHOD = 'highestStake'; -const RANDOM_TOP_FIVE_STAKED_ROUTE_METHOD = 'topFiveStake' -const MAX_HISTORY_ITEMS = 20; -const CONCURRENT_REQUESTS = 10; // number of gateways to check concurrently - -const defaultTestGARCacheURL = "https://dev.arns.app/v1/contract/_NctcA2sRy1-J4OmIQZbYFPM17piNcbdBPH2ncX2RL8/read/gateways"; -const defaultGARCacheURL = "https://api.arns.app/v1/contract/bLAgYxAdX2Ry-nt6aH2ixgvJXbpsEYm28NgJgyqfs-U/read/gateways"; - -const defaultGateway = { - "end": 0, - "observerWallet": "IPdwa3Mb_9pDD8c2IaJx6aad51Ss-_TfStVwBuhtXMs", - "operatorStake": 250000, - "settings": { - "fqdn": "ar-io.dev", - "label": "AR.IO Test", - "note": "Test Gateway operated by PDS for the AR.IO ecosystem.", - "port": 443, - "properties": "raJgvbFU-YAnku-WsupIdbTsqqGLQiYpGzoqk9SCVgY", - "protocol": "https" - }, - "start": 1256694, - "stats": { - "failedConsecutiveEpochs": 0, - "passedEpochCount": 0, - "submittedEpochCount": 0, - "totalEpochParticipationCount": 0, - "totalEpochsPrescribedCount": 0 - }, - "status": "joined", - "vaults": {}, - "weights": { - "stakeWeight": 25, - "tenureWeight": 0.7253549382716049, - "gatewayRewardRatioWeight": 1, - "observerRewardRatioWeight": 1, - "compositeWeight": 18.133873456790123, - "normalizedCompositeWeight": 0.08297298112085387 - } -} - -chrome.storage.local.set({routingMethod: RANDOM_TOP_FIVE_STAKED_ROUTE_METHOD }); // sets the default route method -chrome.storage.local.set({garCache: {}}); -chrome.storage.local.set({garLocal: {}}); -chrome.storage.local.set({blacklistedGateways: []}); - -// Run the check initially when the background script starts -syncGatewayAddressRegistry(); - -// Finds requests for ar:// in the browser address bar -chrome.webNavigation.onBeforeNavigate.addListener(async function(details) { - const url = new URL(details.url); - const arUrl = url.searchParams.get("q") - if (arUrl && arUrl.startsWith("ar://")) { - // Remove 'ar://' and split the URL into parts - const arUrlParts = arUrl.slice(5).split('/'); - const baseName = arUrlParts[0]; // The first part is the baseName - const path = '/' + arUrlParts.slice(1).join('/'); // The rest is the path - const gateway = await getOnlineGateway(); - - let redirectTo; - - if (/[a-z0-9_-]{43}/i.test(baseName)) { - // If baseName is a 43 character Arweave ID, construct redirect URL to Arweave gateway - redirectTo = `${gateway.settings.protocol}://${gateway.settings.fqdn}:${gateway.settings.port}/${baseName}${path}`; - chrome.tabs.update(details.tabId, {url: redirectTo}); - } else if (!baseName.includes('.')) { - // If baseName does not look like a domain and is not a 43 character Arweave ID, redirect to arns name - redirectTo = `${gateway.settings.protocol}://${baseName}.${gateway.settings.fqdn}${gateway.settings.port ? `:${gateway.settings.port}` : ''}${path}`; - redirectedTabs[details.tabId] = true; - chrome.tabs.update(details.tabId, {url: redirectTo}); - } else { - // BaseName contains a dot, indicating it's a domain, attempt to lookup TXT record - const txId = await lookupArweaveTxIdForDomain(baseName); - if (txId) { - // If a TX ID is found, redirect to the Arweave TX via a gateway - redirectTo = `${gateway.settings.protocol}://${gateway.settings.fqdn}:${gateway.settings.port}/${txId}${path}`; - chrome.tabs.update(details.tabId, {url: redirectTo}); - } else { - // If no TX ID found, halt without redirection - console.error(`No Arweave TX ID found for domain: ${baseName}`); - // No redirection is performed if TXT record is not found - } - } -} -}, {urls: [""]}); - -// To handle getting the X-Arns-Resolved-Id -chrome.webRequest.onHeadersReceived.addListener( - function(details) { - if (redirectedTabs[details.tabId]) { // Check if this tab was redirected due to ar:// - const timestamp = new Date().toISOString(); // Current timestamp - // Get ArNS Name - const url = new URL(details.url); - for (let i = 0; i < details.responseHeaders.length; i++) { - if (details.responseHeaders[i].name.toLowerCase() === "x-arns-resolved-id") { - let headerValue = details.responseHeaders[i].value; - console.log("X-Arns-Resolved-Id:", headerValue); - // Save to history - saveToHistory(url.origin, headerValue, timestamp); - - // Cleanup: Remove the tabId from redirectedTabs as we've captured the header - delete redirectedTabs[details.tabId]; - break; - } - } - } - }, - { - urls: [""] - }, - ["responseHeaders"] -); - -// Used if someone clicks the refresh gateways button -chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) { - if(request.message === "syncGatewayAddressRegistry") { - syncGatewayAddressRegistry().then(() => { - // send a response after async operation is done - sendResponse({}); - }).catch(error => { - // handle error if you need to send error info to popup.js - console.error(error); - sendResponse({error: "Failed to sync gateway address registry."}); - }); - - return true; // this keeps the message channel open until `sendResponse` is invoked - } -}); - -// Used if someone clicks on an ar:// link in a page -chrome.runtime.onMessage.addListener(async (message, sender, sendResponse) => { - if (message.type === 'arUrlClicked') { - const arUrl = message.arUrl; - const url = await getRoutableGatewayUrl(arUrl) - if (message.target === "_blank") { - // Open in a new tab - const tab = await chrome.tabs.create({url}); - redirectedTabs[tab.id] = true; - } else { - // Open in the current tab - const tab = await chrome.tabs.update(sender.tab.id, {url}); - redirectedTabs[tab.id] = true; - } - return true; - } -}); - -// Used if someone requests an ar:// image on a page -chrome.runtime.onMessage.addListener((message, sender, sendResponse) => { - if (message.type === 'convertArUrlToHttpUrl') { - const arUrl = message.arUrl; - - getRoutableGatewayUrl(arUrl) - .then(url => { - if (!url) throw new Error('URL is undefined'); - sendResponse({ url }); - }) - .catch(error => { - console.error('Error in message listener:', error); - sendResponse({ error: error.message }); - }); - - // indicate that the response will be sent asynchronously - return true; -} -}); - -async function isGatewayOnline(gateway) { - const url = `${gateway.settings.protocol}://${gateway.settings.fqdn}:${gateway.settings.port}/`; - - const timeoutPromise = new Promise((_, reject) => - setTimeout(() => reject(new Error(`Request for ${url} timed out after 5 seconds`)), 5 * 1000) // 5 seconds - ); - - try { - const response = await Promise.race([ - fetch(url, { - method: 'HEAD', - mode: 'no-cors' - }), - timeoutPromise - ]); - return response.ok; - } catch (error) { - console.log(error.message); // Log the error - return false; - } -} - -async function refreshOnlineGateways() { - const { garCache } = await chrome.storage.local.get(["garCache"]); - const promises = []; - - for (const address in garCache) { - promises.push((async () => { - const gateway = garCache[address]; - gateway.online = await isGatewayOnline(gateway); - return { address, gateway }; - })()); - } - - const results = await Promise.allSettled(promises); - - results.forEach(result => { - if (result.status === 'fulfilled') { - garCache[result.value.address] = result.value.gateway; - } - }); - - return garCache; -} - -async function fetchGatewayAddressRegistryCache(garCacheURL) { - return fetch(garCacheURL) - .then(response => response.json()) - .then(data => (data.result ?? data.gateways ?? data.state.gateways)); -} - -async function syncGatewayAddressRegistry() { - try { - const { garCacheURL } = await chrome.storage.local.get(["garCacheURL"]); - let garCache = {}; - - if (garCacheURL) { - console.log("Fetching User-defined GAR Cache from ", garCacheURL); - garCache = await fetchGatewayAddressRegistryCache(garCacheURL); - } else { - console.log("Fetching Default GAR Cache from ", defaultGARCacheURL); - garCache = await fetchGatewayAddressRegistryCache(defaultGARCacheURL); - } - - console.log () - await chrome.storage.local.set({garCache: garCache}); - console.log("Found %s gateways cached. Syncing availability...", Object.keys(garCache).length); - - const garLocal = await refreshOnlineGateways(); - await chrome.storage.local.set({garLocal: garLocal}); - console.log("Finished syncing gateway availability. Found %s gateways online.", (Object.values(garLocal).filter(gateway => gateway.online)).length); - - } catch (error) { - console.error("An error occurred while syncing the Gateway Address Registry:", error.message); - } -} - -// Get a random online gateway or use the one selected via settings. -async function getOnlineGateway() { - const { staticGateway } = await chrome.storage.local.get(["staticGateway"]); - if (staticGateway) { - console.log ("Static gateway being used: ", staticGateway.settings.fqdn) - return staticGateway - } - - const { routingMethod } = await chrome.storage.local.get(["routingMethod"]); - const { garLocal } = await chrome.storage.local.get(["garLocal"]); - const { blacklistedGateways = {} } = await chrome.storage.local.get(["blacklistedGateways"]); - - const filteredGar = {}; - for (const [address, gatewayData] of Object.entries(garLocal)) { - if (!blacklistedGateways.includes(address)) { - filteredGar[address] = gatewayData; - } - } - - let gateway = {} - if (routingMethod === RANDOM_TOP_FIVE_STAKED_ROUTE_METHOD) { - gateway = selectRandomTopFiveStakedGateway(filteredGar); - console.log ("Random Top 5 staked gateway being used: ", gateway.settings.fqdn); - return gateway; - } - else if (routingMethod === STAKE_RANDOM_ROUTE_METHOD) { - gateway = selectWeightedGateway(filteredGar); - console.log ("Stake-weighted random gateway being used: ", gateway.settings.fqdn) - return gateway; - } else if (routingMethod === RANDOM_ROUTE_METHOD) { - gateway = selectRandomGateway(filteredGar); - console.log ("Random gateway being used: ", gateway.settings.fqdn) - return gateway; - } else if (routingMethod === HIGHEST_STAKE_ROUTE_METHOD) { - gateway = selectHighestStakeGateway(filteredGar); - console.log ("Highest staked gateway being used: ", gateway.settings.fqdn) - return gateway; - } - - if (!gateway) { - console.error('There is no valid gateway to use.', gateway); - return null; // Or return a default gateway or handle this situation as appropriate - } -} - -function saveToHistory(url, resolvedId, timestamp) { - chrome.storage.local.get("history", function(data) { - let history = data.history || []; - history.unshift({ url, resolvedId: resolvedId, timestamp }); // Adds to the start - history = history.slice(0, MAX_HISTORY_ITEMS); // Keep only the last amount of items - chrome.storage.local.set({ history }); - }); -} - -/** - * Selects a random gateway from the GAR JSON. - * - * @param {Object} gar- The GAR JSON object. - * @returns {Gateway | null} - A random Gateway object or null if there are no gateways. - */ -function selectRandomGateway(gar) { - // Filter out gateways that are offline - const onlineGateways = Object.values(gar).filter(gateway => gateway.online); - - // If there are no online gateways, handle this case appropriately - if (onlineGateways.length === 0) { - console.log('No online random gateways available. Using default'); - return defaultGateway; - } - - // Select a random online gateway - const randomIndex = Math.floor(Math.random() * onlineGateways.length); - return onlineGateways[randomIndex]; -} - -function selectWeightedGateway(gar) { - const onlineGateways = Object.values(gar).filter(gateway => gateway.online); - - // Calculate the total stake among online gateways - const totalStake = onlineGateways.reduce((accum, gateway) => accum + gateway.operatorStake, 0); - - // Generate a random number between 0 and totalStake - let randomNum = Math.random() * totalStake; - - // Find the gateway that this random number falls into - for (const gateway of onlineGateways) { - randomNum -= gateway.operatorStake; - if (randomNum <= 0) { - return gateway; // This is the selected gateway based on its weight - } - } - - // This point should never be reached if there's at least one online gateway, but just in case: - console.log('No gateways available. Using default.'); - return defaultGateway; -} - -function selectHighestStakeGateway(gar) { - // Get the maximum stake value - const maxStake = Math.max(...Object.values(gar).map(gateway => gateway.operatorStake)); - - // Filter out all the gateways with this maximum stake value - const maxStakeGateways = Object.values(gar) - .filter(gateway => gateway.operatorStake === maxStake && gateway.online); - - // If there's no online gateway with the maximum stake, handle this case - if (maxStakeGateways.length === 0) { - console.log('No online gateways available. Using default.'); - return defaultGateway; - } - - // If there's only one online gateway with the maximum stake, return it - if (maxStakeGateways.length === 1) { - return maxStakeGateways[0]; - } - - // If there are multiple online gateways with the same highest stake, pick a random one and return it - const randomIndex = Math.floor(Math.random() * maxStakeGateways.length); - return maxStakeGateways[randomIndex]; -} - -function selectRandomTopFiveStakedGateway(gar) { - // 1. Sort the gateways based on their stake in descending order and filter online gateways - const sortedGateways = Object.values(gar) - .filter(gateway => gateway.online) - .sort((gatewayA, gatewayB) => gatewayB.operatorStake - gatewayA.operatorStake); - - // If there's no online gateway, handle this case - if (sortedGateways.length === 0) { - console.log('No online gateways available. Using default'); - return defaultGateway; - } - - // 2. Take the top 5 or as many as are available (in cases where there are less than 5 online gateways) - const top5 = sortedGateways.slice(0, Math.min(5, sortedGateways.length)); - - // 3. Randomly select one from the top 5 - const randomIndex = Math.floor(Math.random() * top5.length); - return top5[randomIndex]; -} - -// This method takes an ar:// URL and converts it to a routable URL -// Uses an online gateway frmo the GAR, using the configured routing settings -async function getRoutableGatewayUrl(arUrl) { - //const name = arUrl.replace("ar://", ""); - // Extract the base name and the path (if any) from the arUrl - const arUrlParts = arUrl.slice(5).split('/'); - const baseName = arUrlParts[0]; // The first part is the baseName - const path = '/' + arUrlParts.slice(1).join('/'); // The rest is the path - const gateway = await getOnlineGateway(); - let redirectTo; - // Check if the baseName is an Arweave transaction ID (43 characters) - // Expanded logic for handling domain-like baseName - // Check if the baseName is an Arweave transaction ID (43 characters) - if (/[a-z0-9_-]{43}/i.test(baseName)) { - // Handle arweave transaction id - redirectTo = `${gateway.settings.protocol}://${gateway.settings.fqdn}:${gateway.settings.port}/${baseName}${path}`; - } else if (baseName.includes('.')) { - // Handle domain-like baseName - txId = await lookupArweaveTxIdForDomain(baseName) - if (txId) { - // If a TX ID is found, redirect to the Arweave TX via a gateway - redirectTo = `${gateway.settings.protocol}://${gateway.settings.fqdn}:${gateway.settings.port}/${txId}${path}`; - } - } - else { - // Handle ArNS name - redirectTo = `${gateway.settings.protocol}://${baseName}.${gateway.settings.fqdn}${gateway.settings.port ? `:${gateway.settings.port}` : ''}${path}`; - } - return redirectTo; -} - -// Fetches the TXT record matching ARTX for a given domain and returns the ID -async function lookupArweaveTxIdForDomain(domain) { - // This example uses Google's DoH (DNS-over-HTTPS) service. - // Make sure to find a DNS lookup API that suits your needs and supports CORS. - const apiUrl = `https://dns.google/resolve?name=${domain}&type=TXT`; - - try { - const response = await fetch(apiUrl); - const data = await response.json(); - if (data.Answer) { - for (const record of data.Answer) { - const txtRecord = record.data; - // Assuming the TXT record is formatted as "arweave-tx=" - const match = txtRecord.match(/ARTX ([a-zA-Z0-9_-]{43})/); - if (match) { - return match[1]; // Return the Arweave TX ID - } - } - } - } catch (error) { - console.error("Failed to lookup DNS TXT records:", error); - } - return null; // Return null if no matching TXT record is found -} diff --git a/content.js b/content.js deleted file mode 100644 index f233df1..0000000 --- a/content.js +++ /dev/null @@ -1,116 +0,0 @@ -if(document.readyState === 'loading') { - document.addEventListener('DOMContentLoaded',afterDOMLoaded); -} else { - afterDOMLoaded(); -} - -async function afterDOMLoaded(){ - - // Gather all elements with `ar://` protocol - const arElements = document.querySelectorAll( - 'a[href^="ar://"], img[src^="ar://"], iframe[src^="ar://"], ' + - 'audio > source[src^="ar://"], video > source[src^="ar://"], ' + - 'link[href^="ar://"], embed[src^="ar://"], object[data^="ar://"]' - ); - - arElements.forEach(element => { - let arUrl; - switch(element.tagName) { - case 'A': - arUrl = element.href; - chrome.runtime.sendMessage({ type: 'convertArUrlToHttpUrl', arUrl }, response => { - if (response && response.url) { - element.href = response.url; - } else { - console.error(`Failed to load image: ${response.error}`); - } - }); - break; - case 'IMG': - arUrl = element.getAttribute('src'); - chrome.runtime.sendMessage({ type: 'convertArUrlToHttpUrl', arUrl }, response => { - if (response && response.url) { - element.src = response.url; - } else { - console.error(`Failed to load image: ${response.error}`); - } - }); - break; - case 'IFRAME': - arUrl = element.getAttribute('src'); - chrome.runtime.sendMessage({ type: 'convertArUrlToHttpUrl', arUrl }, response => { - if (response && response.url) { - element.src = response.url; - } else { - console.error(`Failed to load image: ${response.error}`); - } - }); - break; - case 'SOURCE': - arUrl = element.getAttribute('src'); - if (element.parentNode.tagName === 'AUDIO') { - chrome.runtime.sendMessage({ type: 'convertArUrlToHttpUrl', arUrl }, response => { - if (response && response.url) { - element.src = response.url; - element.parentNode.load(); // Load the media element with the new source - } else { - console.error(`Failed to load image: ${response.error}`); - } - }); - break; - } else if (element.parentNode.tagName === 'VIDEO') { - chrome.runtime.sendMessage({ type: 'convertArUrlToHttpUrl', arUrl }, response => { - if (response && response.url) { - element.src = response.url; - element.parentNode.load(); // Load the media element with the new source - } else { - console.error(`Failed to load image: ${response.error}`); - } - }); - break; - } else { - console.error('Unexpected parent for source element', element); - } - break; - case 'LINK': - arUrl = element.getAttribute('href'); - chrome.runtime.sendMessage({ type: 'convertArUrlToHttpUrl', arUrl }, response => { - if (response && response.url) { - // Create a clone of the original element - const newLinkEl = element.cloneNode(); - - // Set the new URL to the cloned element - newLinkEl.href = response.url; - - // Replace the old link element with the new one - element.parentNode.replaceChild(newLinkEl, element); - } else { - console.error(`Failed to load link element: ${response.error}`); - } - }); - break; - case 'EMBED': - arUrl = element.getAttribute('src'); - chrome.runtime.sendMessage({ type: 'convertArUrlToHttpUrl', arUrl }, response => { - if (response && response.url) { - element.src = response.url; // Set the new URL - } else { - console.error(`Failed to load embed element: ${response.error}`); - } - }); - break; - case 'OBJECT': - arUrl = element.getAttribute('data'); - chrome.runtime.sendMessage({ type: 'convertArUrlToHttpUrl', arUrl }, response => { - if (response && response.url) { - element.data = response.url; // Set the new URL - } else { - console.error(`Failed to load object: ${response.error}`); - } - }); - break; - default: - console.error('Unexpected element', element); - } - }); -} diff --git a/manifest.json b/manifest.json index 4f5832f..19e67e1 100644 --- a/manifest.json +++ b/manifest.json @@ -1,29 +1,36 @@ -{ - "manifest_version": 3, - "name": "AR.IO WayFinder", - "version": "0.0.11", - "description": "WayFinder (Alpha) streamlines access to the Permaweb through the AR.IO Network and Arweave Name System.", - "permissions": ["storage", "webNavigation", "webRequest"], - "background": { - "service_worker": "background.js" - }, - "host_permissions": [""], - "action": { - "default_popup": "popup.html" - }, - "content_scripts": [ - { - "matches": [""], - "js": ["content.js"] - } - ], - "content_security_policy": { - "extension_pages": "script-src 'self'; object-src 'self';" - }, - "icons": { - "16": "icon16.png", - "48": "icon48.png", - "128": "icon128.png" - } - } - \ No newline at end of file +{ + "manifest_version": 3, + "name": "AR.IO WayFinder", + "version": "0.0.12", + "description": "WayFinder (Alpha) streamlines access to the Permaweb through the AR.IO Network and Arweave Name System.", + "permissions": ["storage", "webNavigation", "webRequest"], + "host_permissions": [""], + "background": { + "service_worker": "background.js", + "type": "module" + }, + "action": { + "default_popup": "popup.html" + }, + "content_scripts": [ + { + "matches": [""], + "js": ["content.js"], + "type": "module" + } + ], + "content_security_policy": { + "extension_pages": "script-src 'self'; object-src 'self';" + }, + "icons": { + "16": "assets/icon16.png", + "48": "assets/icon48.png", + "128": "assets/icon128.png" + }, + "web_accessible_resources": [ + { + "resources": ["**/*"], + "matches": [""] + } + ] +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..e4cfaa0 --- /dev/null +++ b/package.json @@ -0,0 +1,42 @@ +{ + "name": "wayfinder", + "version": "0.0.12", + "description": "WayFinder (alpha) is a simple, open source, Google Chrome extension that intelligently routes users to optimal AR.IO gateways, ensuring streamlined access to the permaweb on Arweave.", + "main": "dist/index.js", + "browser": "dist/index.js", + "type": "module", + "devDependencies": { + "@types/chrome": "^0.0.268", + "@types/node": "^20.12.12", + "@vitejs/plugin-react": "^4.3.1", + "@vitejs/plugin-react-swc": "^3.7.0", + "prettier": "^3.3.1", + "typescript": "^5.4.5", + "vite": "^5.2.10", + "vite-plugin-copy": "^0.1.6", + "vite-plugin-html": "^3.2.2", + "vite-plugin-node-polyfills": "^0.22.0", + "vite-plugin-static-copy": "^1.0.6" + }, + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1", + "clean": "rimraf dist", + "start": "vite preview", + "format:fix": "prettier --write .", + "build": "vite build --config vite.config.js" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/ar-io/wayfinder.git" + }, + "keywords": [], + "author": "", + "license": "AGPL-3.0-only", + "bugs": { + "url": "https://github.com/ar-io/wayfinder/issues" + }, + "homepage": "https://github.com/ar-io/wayfinder#readme", + "dependencies": { + "@ar.io/sdk": "2.0.0-alpha.2" + } +} diff --git a/popup.html b/popup.html deleted file mode 100644 index d14f99a..0000000 --- a/popup.html +++ /dev/null @@ -1,85 +0,0 @@ - - - - - - AR.IO WayFinder - - - - - -
-

About the ar:// protocol

-

- WayFinder uses the ar:// protocol. This is a unique web address schema powered by the AR.IO Network and used to access content stored on the Arweave Permaweb. By using this protocol, users can directly navigate to and interact with decentralized web pages and applications via their ArNS Name or Arweave transaction ID. -

-
-
- - - -
- - - - - - - - - - - - \ No newline at end of file diff --git a/popup.js b/popup.js deleted file mode 100644 index a4cb574..0000000 --- a/popup.js +++ /dev/null @@ -1,462 +0,0 @@ -if(document.readyState === 'loading') { - document.addEventListener('DOMContentLoaded',afterDOMLoaded); -} else { - afterDOMLoaded(); -} - -async function afterDOMLoaded(){ - const gatewayList = document.getElementById('gatewayList'); - const gatewayListTitle = document.getElementById('gatewayListTitle'); - const gatewayListHeader = document.getElementById('gatewayListHeader'); - const refreshGateways = document.getElementById("refreshGateways"); - const showGatewaysBtn = document.getElementById('showGateways'); - const showSettingsBtn = document.getElementById('showSettings'); - const aboutSection = document.getElementById('aboutSection'); - const settingsSection = document.getElementById('settingsSection'); - const settingsListTitle = document.getElementById('settingsListTitle'); - const showHistoryBtn = document.getElementById("showHistory"); - const historyList = document.getElementById("historyList"); - const historyListTitle = document.getElementById("historyListTitle"); - - showGatewaysBtn.addEventListener('click', async function() { - if (gatewayList.style.display === 'block') { - aboutSection.style.display = 'block'; - showSettingsBtn.style.display = 'block'; - showHistoryBtn.style.display = 'block'; - gatewayListHeader.style.display = 'none'; - gatewayListTitle.style.display = 'none'; - gatewayList.style.display = 'none'; - showGatewaysBtn.innerText = 'Gateway Address Registry'; - } else { - gatewayList.innerHTML = ''; - const { garLocal } = await chrome.storage.local.get(["garLocal"]); - const sortedGateways = sortGatewaysByStake(garLocal); - for (const sortedGateway of sortedGateways) { - const gateway = sortedGateway.data; - - // Create a new element for each gateway - const listItem = document.createElement('div'); - listItem.className = 'gateway'; - listItem.setAttribute('data-address', sortedGateway.address); // Binding the address to the row - - // Check if the gateway is blacklisted and apply the blacklisted class - if (await checkIfBlacklisted(sortedGateway.address)) { - listItem.classList.add('blacklisted'); - } - - listItem.onclick = async function() { - await showMoreGatewayInfo(gateway, sortedGateway.address); - }; - - let onlineStatus = '' - if (gateway.online){ - onlineStatus = '' - } - - listItem.innerHTML = ` -
- ${gateway.settings.protocol}://${gateway.settings.fqdn}:${gateway.settings.port} - ${onlineStatus} -
-
- Stake: ${gateway.operatorStake} -
- `; - - gatewayList.appendChild(listItem); - } - document.getElementById('onlineGatewayCount').textContent = (Object.values(garLocal).filter(gateway => gateway.online)).length; - document.getElementById('totalGatewayCount').textContent = Object.keys(garLocal).length; - // Close the modal when the close button is clicked - document.getElementsByClassName('close-btn')[0].onclick = function() { - document.getElementById('gatewayModal').style.display = "none"; - } - - // Also close the modal if clicked outside the modal content - window.onclick = function(event) { - if (event.target == document.getElementById('gatewayModal')) { - document.getElementById('gatewayModal').style.display = "none"; - } - } - - showSettingsBtn.style.display = 'none'; - aboutSection.style.display = 'none'; // hide the "about" section - showHistoryBtn.style.display = 'none'; - showSettingsBtn.style.display = 'hide'; - gatewayListHeader.style.display = 'block'; - gatewayList.style.display = 'block'; - gatewayListTitle.style.display = 'block'; - showGatewaysBtn.innerText = 'Hide Gateway Address Registry'; - } - }); - - refreshGateways.addEventListener("click", async function() { - gatewayList.innerHTML = ''; // use class here - await syncGatewayAddressRegistry(); - gatewayList.innerHTML = ''; - const { garLocal } = await chrome.storage.local.get(["garLocal"]); - const sortedGateways = sortGatewaysByStake(garLocal); - for (const sortedGateway of sortedGateways) { - const gateway = sortedGateway.data; - - // Create a new element for each gateway - const listItem = document.createElement('div'); - listItem.className = 'gateway'; - listItem.setAttribute('data-address', sortedGateway.address); // Binding the address to the row - - // Check if the gateway is blacklisted and apply the blacklisted class - if (await checkIfBlacklisted(sortedGateway.address)) { - listItem.classList.add('blacklisted'); - } - - listItem.onclick = async function() { - await showMoreGatewayInfo(gateway, sortedGateway.address); - }; - - let onlineStatus = '' - if (gateway.online){ - onlineStatus = '' - } - - listItem.innerHTML = ` -
- ${gateway.settings.protocol}://${gateway.settings.fqdn}:${gateway.settings.port} - ${onlineStatus} -
-
- Stake: ${gateway.operatorStake} -
- `; - gatewayList.appendChild(listItem); - } - document.getElementById('onlineGatewayCount').textContent = (Object.values(garLocal).filter(gateway => gateway.online)).length; - document.getElementById('totalGatewayCount').textContent = Object.keys(garLocal).length; - }); - - showHistoryBtn.addEventListener("click", function() { - if(historyList.style.display === "none") { - chrome.storage.local.get("history", function(data) { - const history = data.history || []; - historyList.innerHTML = ''; // Clear previous items - history.forEach(item => { - const listItem = document.createElement('li'); - listItem.innerHTML = `${item.url}${new Date(item.timestamp).toLocaleString()}`; - historyList.appendChild(listItem); - }); - historyList.style.display = 'block'; - historyListTitle.style.display = 'block'; - showHistoryBtn.innerText = 'Hide Usage History'; - showSettingsBtn.style.display = 'none'; - aboutSection.style.display = 'none'; - showSettingsBtn.style.display = 'none'; - showGatewaysBtn.style.display = 'none'; - }); - } else { - historyList.style.display = 'none'; - historyListTitle.style.display = 'none'; - showHistoryBtn.innerText = 'Usage History'; - showSettingsBtn.style.display = 'block'; - aboutSection.style.display = 'block'; - showSettingsBtn.style.display = 'block'; - showGatewaysBtn.style.display = 'block'; - } - }); - - showSettingsBtn.addEventListener('click', function() { - if(settingsSection.style.display === "none") { - aboutSection.style.display = 'none'; // hide the "about" section - showGatewaysBtn.style.display = 'none'; - showHistoryBtn.style.display = 'none'; - settingsSection.style.display = "block"; // show the "settings" section - settingsListTitle.style.display = 'block'; - showSettingsBtn.innerText = 'Hide Settings'; - } else { - aboutSection.style.display = 'block'; // show the "about" section - showGatewaysBtn.style.display = 'block'; - showHistoryBtn.style.display = 'block'; - settingsListTitle.style.display = 'none'; - settingsSection.style.display = "none"; // hide the "settings" sections - showSettingsBtn.innerText = 'Settings'; - } - }); - - const body = document.body; - const themeToggle = document.getElementById("themeToggle"); - themeToggle.addEventListener("change", function() { - const selectedTheme = this.value; - if (selectedTheme === "dark") { - body.classList.remove("light-mode"); - body.classList.add("body"); - } else if (selectedTheme === "light") { - body.classList.remove("body"); - body.classList.add("light-mode"); - } - saveThemeChoice(selectedTheme) - }); - chrome.storage.local.get('theme', function(data) { - if (data.theme) { - document.getElementById('themeToggle').value = data.theme; - if (data.theme === "dark") { - body.classList.remove("light-mode"); - body.classList.add("body"); - } else if (data.theme === "light") { - body.classList.remove("body"); - body.classList.add("light-mode"); - } - } - }); - - const routingToggle = document.getElementById("routingToggle"); - routingToggle.addEventListener("change", function() { - const selectedRoutingMethod = this.value; - saveRoutingMethod(selectedRoutingMethod); - }); - - chrome.storage.local.get('routingMethod', function(data) { - if (data.routingMethod) { - document.getElementById('routingToggle').value = data.routingMethod; - } - }); - - const saveStaticGatewayButton = document.getElementById('saveStaticGateway'); - saveStaticGatewayButton.addEventListener('click', function() { - const gatewayValue = document.getElementById('staticGateway').value; - const result = saveStaticGateway(gatewayValue); - if (!result) { - document.getElementById('staticGateway').value = '' - } - }); - - chrome.storage.local.get('staticGateway', function(data) { - if (data.staticGateway) { - const staticGatewayUrl = `${data.staticGateway.settings.protocol}://${data.staticGateway.settings.fqdn}:${data.staticGateway.settings.port}/` - document.getElementById('staticGateway').value = staticGatewayUrl; - } - }); - - const saveGarCacheURLButton = document.getElementById('saveGarCacheURL'); - saveGarCacheURLButton.addEventListener('click',async function() { - const garCacheURL = document.getElementById('garCacheURL').value; - if (garCacheURL === '') { - const result = saveGarCacheURL(garCacheURL) - document.getElementById('garCacheURL').value = '' - } else if (await isValidGarCacheURL(garCacheURL)) { - const result = saveGarCacheURL(garCacheURL) - } else { - document.getElementById('garCacheURL').value = '' - } - }); - - chrome.storage.local.get('garCacheURL', function(data) { - if (data.garCacheURL) { - document.getElementById('garCacheURL').value = data.garCacheURL; - } - }); -} - -async function syncGatewayAddressRegistry() { - return new Promise((resolve, reject) => { - chrome.runtime.sendMessage({message: "syncGatewayAddressRegistry"}, function(response) { - if (chrome.runtime.lastError) { - // Handle any error that might occur while sending the message - reject(chrome.runtime.lastError); - } else { - resolve(response); - } - }); - }); -} - -function saveThemeChoice(inputValue) { - chrome.storage.local.set({ theme: inputValue }, function() { - alert(`Theme set to ${inputValue}`); -}); -return true; -} - -function saveRoutingMethod(inputValue) { - chrome.storage.local.set({ routingMethod: inputValue }, function() { - alert(`Routing method set to ${inputValue}`); - }); - return true; -} - -function saveStaticGateway(inputValue) { - try { - if (inputValue === '') { - chrome.storage.local.set({ staticGateway: null }) - alert(`Static gateway removed. Back to dynamic gateway selection.`); - return null; - } else { - const url = new URL(inputValue); - const protocol = url.protocol.replace(':', ''); // Removes the trailing colon - const fqdn = url.hostname; - let port = url.port; - - if (!port) { - port = protocol === 'https' ? 443 : 80; // Default port values based on protocol - } - - const staticGateway = { - settings: { - protocol, - fqdn, - port: parseInt(port, 10) - } - }; - - chrome.storage.local.set({ staticGateway: staticGateway }, function() { - alert(`Static gateway saved: ${inputValue}`); - }); - return staticGateway; - } - } catch (error) { - alert(`Invalid URL entered: ${inputValue}`); - } -} - -async function showMoreGatewayInfo(gateway, address) { - console.log(gateway) - // Get modal elements - const modal = document.getElementById('gatewayModal'); - const modalUrl = document.getElementById('modal-gateway-url'); - const modalORR = document.getElementById('modal-gateway-orr'); - // Convert observerRewardRatioWeight to percentage and format to one decimal place - modalORR.textContent = (gateway.weights.observerRewardRatioWeight * 100).toFixed(1) + '%'; - const modalGRR = document.getElementById('modal-gateway-grr'); - // Convert gatewayRewardRatioWeight to percentage and format to one decimal place - modalGRR.textContent = (gateway.weights.gatewayRewardRatioWeight * 100).toFixed(1) + '%'; - const modalGatewayWallet = document.getElementById('modal-gateway-wallet'); - const modalObserverWallet = document.getElementById('modal-observer-wallet'); - const modalStake = document.getElementById('modal-stake'); - const modalStatus = document.getElementById('modal-status'); - const modalStart = document.getElementById('modal-start'); - const modalProperties = document.getElementById('modal-properties'); - const modalNote = document.getElementById('modal-note'); - - // Assign values from the gateway object to modal elements - modalUrl.textContent = `${gateway.settings.protocol}://${gateway.settings.fqdn}:${gateway.settings.port}`; - modalUrl.href = `${gateway.settings.protocol}://${gateway.settings.fqdn}:${gateway.settings.port}`; - modalGatewayWallet.textContent = address.slice(0, 6) + '...'; - modalGatewayWallet.href = `https://viewblock.io/arweave/address/${address}`; - - modalObserverWallet.textContent = gateway.observerWallet.slice(0, 6) + '...'; - modalObserverWallet.href = `https://viewblock.io/arweave/address/${gateway.observerWallet}`; - - modalStake.textContent = gateway.operatorStake; - modalStatus.textContent = gateway.status; - modalStart.textContent = gateway.start; // start block height - - if (gateway.settings.properties) { - modalProperties.textContent = gateway.settings.properties.slice(0, 6) + '...'; - modalProperties.href = `https://viewblock.io/arweave/tx/${gateway.settings.properties}`; - } else { - modalProperties.textContent = 'No properties set'; - modalProperties.removeAttribute('href'); // remove link if no properties - } - - modalNote.textContent = gateway.settings.note || 'No note provided'; - - // Blacklist functionality - const blacklistButton = document.getElementById('blacklistButton'); - - // Check if the gateway is already blacklisted - const isBlacklisted = await checkIfBlacklisted(address); - - if (isBlacklisted) { - blacklistButton.textContent = 'Unblacklist Gateway'; - } else { - blacklistButton.textContent = 'Blacklist Gateway'; - } - - // Toggle blacklist status - blacklistButton.onclick = async function() { - await toggleBlacklist(address); - await showMoreGatewayInfo(gateway, address); - }; - - // Display the modal - modal.style.display = 'block'; -} - -async function checkIfBlacklisted(address) { - // Check from local storage or other data source if the gateway is blacklisted - const { blacklistedGateways = [] } = await chrome.storage.local.get(["blacklistedGateways"]); - return blacklistedGateways.includes(address); -} - -async function toggleBlacklist(address) { - // Get blacklistedGateways from chrome storage - let { blacklistedGateways = [] } = await chrome.storage.local.get(["blacklistedGateways"]); - if (blacklistedGateways.includes(address)) { - // Removing the address from blacklist - blacklistedGateways = blacklistedGateways.filter(gatewayAddress => gatewayAddress !== address); - - // Find the corresponding row and remove the 'blacklisted' class - const gatewayRow = document.querySelector(`.gateway[data-address='${address}']`); - if (gatewayRow) { - gatewayRow.classList.remove('blacklisted'); - } - } else { - // Adding the address to blacklist - blacklistedGateways.push(address); - - // Find the corresponding row and add the 'blacklisted' class - const gatewayRow = document.querySelector(`.gateway[data-address='${address}']`); - if (gatewayRow) { - gatewayRow.classList.add('blacklisted'); - } - } - // Set updated blacklistedGateways back to chrome storage - console.log ("Current black list: ", blacklistedGateways) - chrome.storage.local.set({blacklistedGateways: blacklistedGateways}); -} - -function sortGatewaysByStake(gateways) { - // Convert the object to an array of {address, data} pairs - const gatewayArray = Object.entries(gateways).map(([address, data]) => ({address, data})); - - // Sort the array based on operatorStake - const sortedGateways = gatewayArray.sort((a, b) => b.data.operatorStake - a.data.operatorStake); - - return sortedGateways; -} - -async function isValidGarCacheURL(url) { - try { - // Fetch data from the URL - const response = await fetch(url); - // Check if the response is OK and content type is application/json - if (!response.ok || !response.headers.get("content-type")?.includes("application/json")) { - alert(`Error verifying Gateway Address Registry Cache URL: ${garCacheURL}`); - return false; - } - - // Parse the JSON - const data = await response.json(); - - // Check if the JSON has a "gateways" property and it's an array - if (!data.result && data.gateways && !data.state.gateways) { - alert(`Cannot validate Gateways JSON within this Cache: ${garCacheURL}`); - return false; - } - - // Further validation can be done here based on the expected structure of the GAR JSON object - return true; // URL is a valid GAR cache - } catch (error) { - console.error(`Error verifying Gateway Address Registry Cache URL: ${garCacheURL}`); - console.error(error); - return false; // URL is invalid or there was an error during verification - } -} - -function saveGarCacheURL(url) { - if (url === '') { - chrome.storage.local.set({ garCacheURL: null }) - alert(`GAR Cache URL removed. Using default GAR Cache.`); - } else { - chrome.storage.local.set({ garCacheURL: url }) - alert(`Gateway Address Registry Cache URL set to ${url}`); - } - return true; -} \ No newline at end of file diff --git a/src/background.ts b/src/background.ts new file mode 100644 index 0000000..a691ff5 --- /dev/null +++ b/src/background.ts @@ -0,0 +1,496 @@ +import { IO, Gateway, IO_TESTNET_PROCESS_ID } from "@ar.io/sdk/web"; + +export type OnlineGateway = Gateway & { + online?: boolean; +}; + +// Global variables +let redirectedTabs: Record = {}; // A dictionary to keep track of redirected tabs +const RANDOM_ROUTE_METHOD = "random"; +const STAKE_RANDOM_ROUTE_METHOD = "stakeRandom"; +const HIGHEST_STAKE_ROUTE_METHOD = "highestStake"; +const RANDOM_TOP_FIVE_STAKED_ROUTE_METHOD = "topFiveStake"; +const MAX_HISTORY_ITEMS = 20; + +const defaultGateway: Gateway = { + delegates: {}, + end: 0, + observerWallet: "IPdwa3Mb_9pDD8c2IaJx6aad51Ss-_TfStVwBuhtXMs", + operatorStake: 250000000000, + settings: { + allowDelegatedStaking: true, + autoStake: false, + delegateRewardShareRatio: 30, + fqdn: "ar-io.dev", + label: "AR.IO Test", + minDelegatedStake: 100000000, + note: "Test Gateway operated by PDS for the AR.IO ecosystem.", + port: 443, + properties: "raJgvbFU-YAnku-WsupIdbTsqqGLQiYpGzoqk9SCVgY", + protocol: "https", + }, + start: 1256694, + stats: { + failedConsecutiveEpochs: 0, + passedEpochCount: 114, + submittedEpochCount: 113, + totalEpochParticipationCount: 120, + totalEpochsPrescribedCount: 120, + }, + status: "joined", + totalDelegatedStake: 13868917608, + vaults: {}, + weights: { + stakeWeight: 0, + tenureWeight: 0, + gatewayRewardRatioWeight: 0, + normalizedCompositeWeight: 0, + observerRewardRatioWeight: 0, + compositeWeight: 0, + }, +}; + +// Set default values in Chrome storage +chrome.storage.local.set({ + routingMethod: RANDOM_TOP_FIVE_STAKED_ROUTE_METHOD, +}); +chrome.storage.local.set({ garCache: {} }); +chrome.storage.local.set({ enrichedGar: {} }); +chrome.storage.local.set({ blacklistedGateways: [] }); +chrome.storage.local.set({ processId: IO_TESTNET_PROCESS_ID }); + +console.log("Initialized AR.IO"); +let arIO = IO.init(); + +// Run the check initially when the background script starts +getGatewayAddressRegistry(arIO); + +// Finds requests for ar:// in the browser address bar +chrome.webNavigation.onBeforeNavigate.addListener( + async (details) => { + const url = new URL(details.url); + const arUrl = url.searchParams.get("q"); + if (arUrl && arUrl.startsWith("ar://")) { + const redirectTo = await getRoutableGatewayUrl(arUrl); + if (redirectTo) { + chrome.tabs.update(details.tabId, { url: redirectTo }); + } + } + }, + { url: [{ schemes: ["http", "https"] }] } +); + +// To handle getting the X-Arns-Resolved-Id +chrome.webRequest.onHeadersReceived.addListener( + (details) => { + if (redirectedTabs[details.tabId]) { + const timestamp = new Date().toISOString(); // Current timestamp + const url = new URL(details.url); + for (const header of details.responseHeaders || []) { + if (header.name.toLowerCase() === "x-arns-resolved-id") { + const headerValue = header.value || "undefined"; + console.log("X-Arns-Resolved-Id:", headerValue); + // Save to history + saveToHistory(url.origin, headerValue, timestamp); + // Cleanup: Remove the tabId from redirectedTabs as we've captured the header + delete redirectedTabs[details.tabId]; + break; + } + } + } + }, + { urls: [""] }, + ["responseHeaders"] +); + +// Used if someone clicks the refresh gateways button +chrome.runtime.onMessage.addListener((request, sender, sendResponse) => { + if (request.message === "syncGatewayAddressRegistry") { + getGatewayAddressRegistry(arIO) + .then(() => sendResponse({})) + .catch((error) => { + console.error(error); + sendResponse({ error: "Failed to sync gateway address registry." }); + }); + + return true; // this keeps the message channel open until `sendResponse` is invoked + } +}); + +chrome.runtime.onMessage.addListener((request, sender, sendResponse) => { + if (request.message === "setArIOProcessId") { + reinitalizeArIO() + .then(() => getGatewayAddressRegistry(arIO)) + .then(() => sendResponse({})) + .catch((error) => { + console.error(error); + sendResponse({ + error: + "Failed to reinitialize AR.IO and sync gateway address registry.", + }); + }); + + return true; // this keeps the message channel open until `sendResponse` is invoked + } +}); + +// Used if someone clicks on an ar:// link in a page +chrome.runtime.onMessage.addListener(async (message, sender, sendResponse) => { + if (message.type === "arUrlClicked") { + const arUrl = message.arUrl; + const url = await getRoutableGatewayUrl(arUrl); + if (message.target === "_blank") { + const tab = await chrome.tabs.create({ url }); + if (tab.id !== undefined) { + redirectedTabs[tab.id] = true; + } + } else { + if (sender.tab?.id !== undefined) { + const tab = await chrome.tabs.update(sender.tab.id, { url }); + redirectedTabs[sender.tab.id] = true; + } + } + return true; + } +}); + +// Used if someone requests an ar:// image on a page +chrome.runtime.onMessage.addListener((message, sender, sendResponse) => { + if (message.type === "convertArUrlToHttpUrl") { + const arUrl = message.arUrl; + getRoutableGatewayUrl(arUrl) + .then((url) => { + if (!url) throw new Error("URL is undefined"); + sendResponse({ url }); + }) + .catch((error) => { + console.error("Error in message listener:", error); + sendResponse({ error: error.message }); + }); + + return true; // indicate that the response will be sent asynchronously + } +}); + +// +// Helper functions + +/** + * Check if a gateway is online by sending a HEAD request. + * @param gateway The gateway object to check. + * @returns A promise that resolves to true if the gateway is online, otherwise false. + */ +async function isGatewayOnline(gateway: Gateway): Promise { + const url = `${gateway.settings.protocol}://${gateway.settings.fqdn}:${gateway.settings.port}/`; + const timeoutPromise = new Promise((_, reject) => + setTimeout( + () => reject(new Error(`Request for ${url} timed out after 5 seconds`)), + 5000 + ) + ); + + try { + const response = await Promise.race([ + fetch(url, { method: "HEAD", mode: "no-cors" }), + timeoutPromise, + ]); + return (response as Response).ok; + } catch (error) { + console.log((error as Error).message); // Log the error + return false; + } +} + +/** + * Refresh the online status of all gateways in the cache. + * @returns A promise that resolves to the updated cache. + */ +async function refreshOnlineGateways(): Promise> { + const { garCache } = await chrome.storage.local.get(["garCache"]); + const promises = Object.entries(garCache).map(async ([address, gateway]) => { + const online = await isGatewayOnline(gateway as Gateway); + const onlineGateway: OnlineGateway = { ...(gateway as Gateway), online }; + return { address, gateway: onlineGateway }; + }); + + const results = await Promise.allSettled(promises); + console.log(results); + results.forEach((result) => { + if (result.status === "fulfilled") { + garCache[result.value.address] = result.value.gateway; + } + }); + + return garCache; +} + +/** + * Synchronize the gateway address registry with the cache. + */ +async function getGatewayAddressRegistry(arIO: any): Promise { + try { + const { processId } = await chrome.storage.local.get(["processId"]); + console.log( + "Getting the gateways with the SDK and Process Id: ", + processId + ); + const garCache = await arIO.getGateways(); + await chrome.storage.local.set({ garCache }); + console.log( + `Found ${ + Object.keys(garCache).length + } gateways cached. Syncing availability...` + ); + const enrichedGar = await refreshOnlineGateways(); + await chrome.storage.local.set({ enrichedGar }); + console.log( + `Finished syncing gateway availability. Found ${ + Object.values(enrichedGar).filter((g) => g.online).length + } gateways online.` + ); + } catch (error) { + console.error( + "An error occurred while syncing the Gateway Address Registry:", + (error as Error).message + ); + } +} + +/** + * Get an online gateway based on the configured routing method. + * @returns A promise that resolves to a gateway object. + */ +async function getOnlineGateway(): Promise { + const { staticGateway } = (await chrome.storage.local.get([ + "staticGateway", + ])) as { staticGateway?: Gateway }; + if (staticGateway) { + console.log("Static gateway being used:", staticGateway.settings.fqdn); + return staticGateway; + } + + const { routingMethod } = (await chrome.storage.local.get([ + "routingMethod", + ])) as { routingMethod: string }; + const { enrichedGar } = (await chrome.storage.local.get(["enrichedGar"])) as { + enrichedGar: Record; + }; + const { blacklistedGateways = [] } = (await chrome.storage.local.get([ + "blacklistedGateways", + ])) as { blacklistedGateways: string[] }; + + const filteredGar: Record = Object.fromEntries( + Object.entries(enrichedGar).filter( + ([address]) => !blacklistedGateways.includes(address) + ) + ); + + let gateway: Gateway | null = null; + switch (routingMethod) { + case RANDOM_TOP_FIVE_STAKED_ROUTE_METHOD: + gateway = selectRandomTopFiveStakedGateway(filteredGar); + break; + case STAKE_RANDOM_ROUTE_METHOD: + gateway = selectWeightedGateway(filteredGar); + break; + case RANDOM_ROUTE_METHOD: + gateway = selectRandomGateway(filteredGar); + break; + case HIGHEST_STAKE_ROUTE_METHOD: + gateway = selectHighestStakeGateway(filteredGar); + break; + } + + if (!gateway) { + console.error("There is no valid gateway to use."); + return defaultGateway; + } + + return gateway; +} + +/** + * Save a history entry to local storage. + * @param url The URL accessed. + * @param resolvedId The resolved Arweave transaction ID. + * @param timestamp The timestamp of the access. + */ +function saveToHistory( + url: string, + resolvedId: string, + timestamp: string +): void { + chrome.storage.local.get("history", (data) => { + let history = data.history || []; + history.unshift({ url, resolvedId, timestamp }); // Adds to the start + history = history.slice(0, MAX_HISTORY_ITEMS); // Keep only the last MAX_HISTORY_ITEMS items + chrome.storage.local.set({ history }); + }); +} + +/** + * Select a random gateway from the GAR JSON. + * @param gar The GAR JSON object. + * @returns A random Gateway object or the default gateway if no gateways are online. + */ +function selectRandomGateway( + gar: Record +): OnlineGateway { + const onlineGateways = Object.values(gar).filter((gateway) => gateway.online); + if (onlineGateways.length === 0) { + console.log("No online random gateways available. Using default"); + return defaultGateway; + } + const randomIndex = Math.floor(Math.random() * onlineGateways.length); + return onlineGateways[randomIndex]; +} + +/** + * Select a weighted random gateway based on operator stake. + * @param gar The GAR JSON object. + * @returns A weighted random Gateway object or the default gateway if no gateways are online. + */ +function selectWeightedGateway( + gar: Record +): OnlineGateway { + const onlineGateways = Object.values(gar).filter((gateway) => gateway.online); + const totalStake = onlineGateways.reduce( + (accum, gateway) => accum + gateway.operatorStake, + 0 + ); + let randomNum = Math.random() * totalStake; + for (const gateway of onlineGateways) { + randomNum -= gateway.operatorStake; + if (randomNum <= 0) { + return gateway; + } + } + console.log("No gateways available. Using default."); + return defaultGateway; +} + +/** + * Select the gateway with the highest stake. + * @param gar The GAR JSON object. + * @returns The gateway with the highest stake or the default gateway if no gateways are online. + */ +function selectHighestStakeGateway( + gar: Record +): OnlineGateway { + const maxStake = Math.max( + ...Object.values(gar).map((gateway) => gateway.operatorStake) + ); + const maxStakeGateways = Object.values(gar).filter( + (gateway) => gateway.operatorStake === maxStake && gateway.online + ); + if (maxStakeGateways.length === 0) { + console.log("No online gateways available. Using default."); + return defaultGateway; + } + if (maxStakeGateways.length === 1) { + return maxStakeGateways[0]; + } + const randomIndex = Math.floor(Math.random() * maxStakeGateways.length); + return maxStakeGateways[randomIndex]; +} + +/** + * Select a random gateway from the top five staked gateways. + * @param gar The GAR JSON object. + * @returns A random Gateway object from the top five staked gateways or the default gateway if no gateways are online. + */ +function selectRandomTopFiveStakedGateway( + gar: Record +): OnlineGateway { + const sortedGateways = Object.values(gar) + .filter((gateway) => gateway.online) + .sort((a, b) => b.operatorStake - a.operatorStake); + if (sortedGateways.length === 0) { + console.log("No online gateways available. Using default."); + return defaultGateway; + } + const top5 = sortedGateways.slice(0, Math.min(5, sortedGateways.length)); + const randomIndex = Math.floor(Math.random() * top5.length); + return top5[randomIndex]; +} + +/** + * Convert an ar:// URL to a routable gateway URL. + * @param arUrl The ar:// URL to convert. + * @returns A promise that resolves to the routable gateway URL. + */ +async function getRoutableGatewayUrl(arUrl: string): Promise { + const arUrlParts = arUrl.slice(5).split("/"); + const baseName = arUrlParts[0]; + const path = "/" + arUrlParts.slice(1).join("/"); + const gateway = await getOnlineGateway(); + let redirectTo: string | null = null; + + if (/[a-z0-9_-]{43}/i.test(baseName)) { + redirectTo = `${gateway.settings.protocol}://${gateway.settings.fqdn}:${gateway.settings.port}/${baseName}${path}`; + } else if (baseName.includes(".")) { + const txId = await lookupArweaveTxIdForDomain(baseName); + if (txId) { + redirectTo = `${gateway.settings.protocol}://${gateway.settings.fqdn}:${gateway.settings.port}/${txId}${path}`; + } + } else { + redirectTo = `${gateway.settings.protocol}://${baseName}.${ + gateway.settings.fqdn + }${gateway.settings.port ? `:${gateway.settings.port}` : ""}${path}`; + } + return redirectTo || ""; +} + +/** + * Lookup the Arweave transaction ID for a given domain using DNS TXT records. + * @param domain The domain to lookup. + * @returns A promise that resolves to the Arweave transaction ID or null if not found. + */ +async function lookupArweaveTxIdForDomain( + domain: string +): Promise { + const apiUrl = `https://dns.google/resolve?name=${domain}&type=TXT`; + try { + const response = await fetch(apiUrl); + const data = await response.json(); + if (data.Answer) { + for (const record of data.Answer) { + const txtRecord = record.data; + const match = txtRecord.match(/ARTX ([a-zA-Z0-9_-]{43})/); + if (match) { + return match[1]; + } + } + } + } catch (error) { + console.error( + "Failed to lookup DNS TXT records:", + (error as Error).message + ); + const response = await fetch(apiUrl); + const data = await response.json(); + if (data.Answer) { + for (const record of data.Answer) { + const txtRecord = record.data; + const match = txtRecord.match(/ARTX ([a-zA-Z0-9_-]{43})/); + if (match) { + return match[1]; + } + } + } + } + return null; +} + +async function reinitalizeArIO(): Promise { + try { + const { processId } = await chrome.storage.local.get(["processId"]); + arIO = IO.init({ processId }); + return true; + } catch (err) { + arIO = IO.init(); + console.log("Cannot reinitalize with new AR.IO Process ID. Using default"); + console.log(err); + return false; + } +} diff --git a/src/content.ts b/src/content.ts new file mode 100644 index 0000000..835c0a6 --- /dev/null +++ b/src/content.ts @@ -0,0 +1,136 @@ +if (document.readyState === "loading") { + document.addEventListener("DOMContentLoaded", afterContentDOMLoaded); +} else { + afterContentDOMLoaded(); +} + +async function afterContentDOMLoaded() { + // Gather all elements with `ar://` protocol + const arElements = document.querySelectorAll( + 'a[href^="ar://"], img[src^="ar://"], iframe[src^="ar://"], ' + + 'audio > source[src^="ar://"], video > source[src^="ar://"], ' + + 'link[href^="ar://"], embed[src^="ar://"], object[data^="ar://"]', + ); + + arElements.forEach((element) => { + let arUrl: string | null = null; + switch (element.tagName) { + case "A": + arUrl = (element as HTMLAnchorElement).href; + chrome.runtime.sendMessage( + { type: "convertArUrlToHttpUrl", arUrl }, + (response) => { + if (response && response.url) { + (element as HTMLAnchorElement).href = response.url; + } else { + console.error(`Failed to load URL: ${response.error}`); + } + }, + ); + break; + case "IMG": + arUrl = (element as HTMLImageElement).src; + chrome.runtime.sendMessage( + { type: "convertArUrlToHttpUrl", arUrl }, + (response) => { + if (response && response.url) { + (element as HTMLImageElement).src = response.url; + } else { + console.error(`Failed to load image: ${response.error}`); + } + }, + ); + break; + case "IFRAME": + arUrl = (element as HTMLIFrameElement).src; + chrome.runtime.sendMessage( + { type: "convertArUrlToHttpUrl", arUrl }, + (response) => { + if (response && response.url) { + (element as HTMLIFrameElement).src = response.url; + } else { + console.error(`Failed to load iframe: ${response.error}`); + } + }, + ); + break; + case "SOURCE": + arUrl = (element as HTMLSourceElement).src; + if ( + element.parentNode && + element.parentNode.nodeType === Node.ELEMENT_NODE + ) { + const parentElement = element.parentNode as HTMLMediaElement; + if ( + parentElement.tagName === "AUDIO" || + parentElement.tagName === "VIDEO" + ) { + chrome.runtime.sendMessage( + { type: "convertArUrlToHttpUrl", arUrl }, + (response) => { + if (response && response.url) { + (element as HTMLSourceElement).src = response.url; + parentElement.load(); // Load the media element with the new source + } else { + console.error(`Failed to load source: ${response.error}`); + } + }, + ); + } else { + console.error("Unexpected parent for source element", element); + } + } + break; + case "LINK": + arUrl = (element as HTMLLinkElement).href; + chrome.runtime.sendMessage( + { type: "convertArUrlToHttpUrl", arUrl }, + (response) => { + if (response && response.url) { + // Create a clone of the original element + const newLinkEl = element.cloneNode(true) as HTMLLinkElement; + + // Set the new URL to the cloned element + newLinkEl.href = response.url; + + // Replace the old link element with the new one + if (element.parentNode) { + element.parentNode.replaceChild(newLinkEl, element); + } + } else { + console.error(`Failed to load link element: ${response.error}`); + } + }, + ); + break; + case "EMBED": + arUrl = (element as HTMLEmbedElement).src; + chrome.runtime.sendMessage( + { type: "convertArUrlToHttpUrl", arUrl }, + (response) => { + if (response && response.url) { + (element as HTMLEmbedElement).src = response.url; // Set the new URL + } else { + console.error(`Failed to load embed element: ${response.error}`); + } + }, + ); + break; + case "OBJECT": + arUrl = (element as HTMLObjectElement).data; + chrome.runtime.sendMessage( + { type: "convertArUrlToHttpUrl", arUrl }, + (response) => { + if (response && response.url) { + (element as HTMLObjectElement).data = response.url; // Set the new URL + } else { + console.error(`Failed to load object: ${response.error}`); + } + }, + ); + break; + default: + console.error("Unexpected element", element); + } + }); +} diff --git a/src/popup.html b/src/popup.html new file mode 100644 index 0000000..3a0dd26 --- /dev/null +++ b/src/popup.html @@ -0,0 +1,219 @@ + + + + + + AR.IO WayFinder + + + + + +
+

About the ar:// protocol

+

+ WayFinder uses the ar:// protocol. This is a unique web + address schema powered by the + AR.IO Network + and used to access content stored on the Arweave Permaweb. By using this + protocol, users can directly navigate to and interact with decentralized + web pages and applications via their + ArNS Name + or Arweave transaction ID. +

+
+
+ + + +
+ + + + + + + + + + + + diff --git a/src/popup.ts b/src/popup.ts new file mode 100644 index 0000000..def8e7b --- /dev/null +++ b/src/popup.ts @@ -0,0 +1,616 @@ +import { mIOToken, AoGateway, IO_TESTNET_PROCESS_ID } from "@ar.io/sdk/web"; + +// Check if the document is still loading, if not, call the function directly +if (document.readyState === "loading") { + document.addEventListener("DOMContentLoaded", afterPopupDOMLoaded); +} else { + afterPopupDOMLoaded(); +} + +// Define the function to be called after the DOM is fully loaded +async function afterPopupDOMLoaded(): Promise { + const gatewayList = document.getElementById( + "gatewayList" + ) as HTMLElement | null; + const gatewayListTitle = document.getElementById( + "gatewayListTitle" + ) as HTMLElement | null; + const gatewayListHeader = document.getElementById( + "gatewayListHeader" + ) as HTMLElement | null; + const refreshGateways = document.getElementById( + "refreshGateways" + ) as HTMLElement | null; + const showGatewaysBtn = document.getElementById( + "showGateways" + ) as HTMLElement | null; + const showSettingsBtn = document.getElementById( + "showSettings" + ) as HTMLElement | null; + const aboutSection = document.getElementById( + "aboutSection" + ) as HTMLElement | null; + const settingsSection = document.getElementById( + "settingsSection" + ) as HTMLElement | null; + const settingsListTitle = document.getElementById( + "settingsListTitle" + ) as HTMLElement | null; + const showHistoryBtn = document.getElementById( + "showHistory" + ) as HTMLElement | null; + const historyList = document.getElementById( + "historyList" + ) as HTMLElement | null; + const historyListTitle = document.getElementById( + "historyListTitle" + ) as HTMLElement | null; + const themeToggle = document.getElementById( + "themeToggle" + ) as HTMLSelectElement | null; + const routingToggle = document.getElementById( + "routingToggle" + ) as HTMLSelectElement | null; + const saveStaticGatewayButton = document.getElementById( + "saveStaticGateway" + ) as HTMLElement | null; + const saveArIOProcessIdButton = document.getElementById( + "saveArIOProcessId" + ) as HTMLElement | null; + + if ( + showGatewaysBtn && + aboutSection && + showSettingsBtn && + showHistoryBtn && + gatewayListHeader && + gatewayListTitle && + refreshGateways && + historyList && + historyListTitle && + settingsSection && + settingsListTitle && + themeToggle && + routingToggle && + saveStaticGatewayButton && + saveArIOProcessIdButton && + gatewayList + ) { + showGatewaysBtn.addEventListener("click", async function () { + if (gatewayList.style.display === "block") { + aboutSection.style.display = "block"; + showSettingsBtn.style.display = "block"; + showHistoryBtn.style.display = "block"; + gatewayListHeader.style.display = "none"; + gatewayListTitle.style.display = "none"; + gatewayList.style.display = "none"; + showGatewaysBtn.innerText = "Gateway Address Registry"; + } else { + gatewayList.innerHTML = ""; + const { enrichedGar = {} } = + await chrome.storage.local.get("enrichedGar"); + const sortedGateways = sortGatewaysByStake(enrichedGar); + for (const sortedGateway of sortedGateways) { + const gateway = sortedGateway.data; + + // Create a new element for each gateway + const listItem = document.createElement("div"); + listItem.className = "gateway"; + listItem.setAttribute("data-address", sortedGateway.address); // Binding the address to the row + + // Check if the gateway is blacklisted and apply the blacklisted class + if (await checkIfBlacklisted(sortedGateway.address)) { + listItem.classList.add("blacklisted"); + } + + listItem.onclick = async function () { + await showMoreGatewayInfo(gateway, sortedGateway.address); + }; + + let onlineStatus = + ''; + if (gateway.online) { + onlineStatus = + ''; + } + + listItem.innerHTML = ` +
+ ${gateway.settings.protocol}://${gateway.settings.fqdn}:${gateway.settings.port} + ${onlineStatus} +
+
+ Stake: ${new mIOToken(gateway.operatorStake).toIO()} IO +
+ `; + + gatewayList.appendChild(listItem); + } + const onlineCount = Object.values(enrichedGar).filter( + (gateway: any) => gateway.online + ).length; + document.getElementById("onlineGatewayCount")!.textContent = + `${onlineCount}`; + document.getElementById("totalGatewayCount")!.textContent = + Object.keys(enrichedGar).length.toString(); + + // Close the modal when the close button is clicked + ( + document.getElementsByClassName("close-btn")[0] as HTMLElement + ).onclick = function () { + ( + document.getElementById("gatewayModal") as HTMLElement + ).style.display = "none"; + }; + + // Also close the modal if clicked outside the modal content + window.onclick = function (event) { + if (event.target === document.getElementById("gatewayModal")) { + ( + document.getElementById("gatewayModal") as HTMLElement + ).style.display = "none"; + } + }; + + showSettingsBtn.style.display = "none"; + aboutSection.style.display = "none"; // hide the "about" section + showHistoryBtn.style.display = "none"; + showSettingsBtn.style.display = "hide"; + gatewayListHeader.style.display = "block"; + gatewayList.style.display = "block"; + gatewayListTitle.style.display = "block"; + showGatewaysBtn.innerText = "Hide Gateway Address Registry"; + } + }); + + refreshGateways.addEventListener("click", async function () { + gatewayList.innerHTML = ''; // use class here + await syncGatewayAddressRegistryPopup(); + gatewayList.innerHTML = ""; + const { enrichedGar } = (await chrome.storage.local.get( + "enrichedGar" + )) as { + enrichedGar: Record; + }; + const sortedGateways = sortGatewaysByStake(enrichedGar); + for (const sortedGateway of sortedGateways) { + const gateway = sortedGateway.data; + + // Create a new element for each gateway + const listItem = document.createElement("div"); + listItem.className = "gateway"; + listItem.setAttribute("data-address", sortedGateway.address); // Binding the address to the row + + // Check if the gateway is blacklisted and apply the blacklisted class + if (await checkIfBlacklisted(sortedGateway.address)) { + listItem.classList.add("blacklisted"); + } + + listItem.onclick = async function () { + await showMoreGatewayInfo(gateway, sortedGateway.address); + }; + + let onlineStatus = + ''; + if (gateway.online) { + onlineStatus = + ''; + } + + listItem.innerHTML = ` +
+ ${gateway.settings.protocol}://${gateway.settings.fqdn}:${gateway.settings.port} + ${onlineStatus} +
+
+ Stake: ${new mIOToken(gateway.operatorStake).toIO()} IO +
+ `; + gatewayList.appendChild(listItem); + } + + const onlineCount = Object.values(enrichedGar).filter( + (gateway: any) => gateway.online + ).length; + document.getElementById("onlineGatewayCount")!.textContent = + `${onlineCount}`; + document.getElementById("totalGatewayCount")!.textContent = + Object.keys(enrichedGar).length.toString(); + }); + + showHistoryBtn.addEventListener("click", function () { + if (historyList.style.display === "none") { + chrome.storage.local.get("history", function (data) { + const history = data.history || []; + historyList.innerHTML = ""; // Clear previous items + history.forEach( + (item: { + resolvedId: any; + url: any; + timestamp: string | number | Date; + }) => { + const listItem = document.createElement("li"); + listItem.innerHTML = `${item.url}${new Date( + item.timestamp + ).toLocaleString()}`; + historyList.appendChild(listItem); + } + ); + historyList.style.display = "block"; + historyListTitle.style.display = "block"; + showHistoryBtn.innerText = "Hide Usage History"; + showSettingsBtn.style.display = "none"; + aboutSection.style.display = "none"; + showSettingsBtn.style.display = "none"; + showGatewaysBtn.style.display = "none"; + }); + } else { + historyList.style.display = "none"; + historyListTitle.style.display = "none"; + showHistoryBtn.innerText = "Usage History"; + showSettingsBtn.style.display = "block"; + aboutSection.style.display = "block"; + showSettingsBtn.style.display = "block"; + showGatewaysBtn.style.display = "block"; + } + }); + + showSettingsBtn.addEventListener("click", function () { + if (settingsSection.style.display === "none") { + aboutSection.style.display = "none"; // hide the "about" section + showGatewaysBtn.style.display = "none"; + showHistoryBtn.style.display = "none"; + settingsSection.style.display = "block"; // show the "settings" section + settingsListTitle.style.display = "block"; + showSettingsBtn.innerText = "Hide Settings"; + } else { + aboutSection.style.display = "block"; // show the "about" section + showGatewaysBtn.style.display = "block"; + showHistoryBtn.style.display = "block"; + settingsListTitle.style.display = "none"; + settingsSection.style.display = "none"; // hide the "settings" sections + showSettingsBtn.innerText = "Settings"; + } + }); + + const body = document.body; + + themeToggle.addEventListener("change", function () { + const selectedTheme = (this as HTMLSelectElement).value; + if (selectedTheme === "dark") { + body.classList.remove("light-mode"); + body.classList.add("dark-mode"); + } else if (selectedTheme === "light") { + body.classList.remove("dark-mode"); + body.classList.add("light-mode"); + } + saveThemeChoice(selectedTheme); + }); + chrome.storage.local.get("theme", function (data) { + if (data.theme) { + (document.getElementById("themeToggle") as HTMLSelectElement).value = + data.theme; + if (data.theme === "dark") { + body.classList.remove("light-mode"); + body.classList.add("dark-mode"); + } else if (data.theme === "light") { + body.classList.remove("dark-mode"); + body.classList.add("light-mode"); + } + } + }); + + routingToggle.addEventListener("change", function () { + const selectedRoutingMethod = (this as HTMLSelectElement).value; + saveRoutingMethod(selectedRoutingMethod); + }); + + chrome.storage.local.get("routingMethod", function (data) { + if (data.routingMethod) { + (document.getElementById("routingToggle") as HTMLSelectElement).value = + data.routingMethod; + } + }); + + saveStaticGatewayButton.addEventListener("click", function () { + const gatewayValue = ( + document.getElementById("staticGateway") as HTMLInputElement + ).value; + const result = saveStaticGateway(gatewayValue); + if (!result) { + (document.getElementById("staticGateway") as HTMLInputElement).value = + ""; + } + }); + + chrome.storage.local.get("staticGateway", function (data) { + if (data.staticGateway) { + const staticGatewayUrl = `${data.staticGateway.settings.protocol}://${data.staticGateway.settings.fqdn}:${data.staticGateway.settings.port}/`; + (document.getElementById("staticGateway") as HTMLInputElement).value = + staticGatewayUrl; + } + }); + + saveArIOProcessIdButton.addEventListener("click", async function () { + const arIOProcessId = ( + document.getElementById("arIOProcessId") as HTMLInputElement + ).value; + if (arIOProcessId === "") { + const result = saveArIOProcessId(IO_TESTNET_PROCESS_ID); + (document.getElementById("arIOProcessId") as HTMLInputElement).value = + ""; + return new Promise((resolve, reject) => { + chrome.runtime.sendMessage( + { message: "setArIOProcessId" }, + function (response) { + if (chrome.runtime.lastError) { + // Handle any error that might occur while sending the message + reject(chrome.runtime.lastError); + } else { + resolve(response); + } + } + ); + }); + } else if (isBase64URL(arIOProcessId)) { + const result = saveArIOProcessId(arIOProcessId); + return new Promise((resolve, reject) => { + chrome.runtime.sendMessage( + { message: "setArIOProcessId" }, + function (response) { + if (chrome.runtime.lastError) { + // Handle any error that might occur while sending the message + reject(chrome.runtime.lastError); + } else { + resolve(response); + } + } + ); + }); + } else { + (document.getElementById("arIOProcessId") as HTMLInputElement).value = + ""; + } + }); + + chrome.storage.local.get("processId", function (data) { + if (data.processId) { + (document.getElementById("arIOProcessId") as HTMLInputElement).value = + data.processId; + } + }); + } +} + +async function syncGatewayAddressRegistryPopup() { + return new Promise((resolve, reject) => { + chrome.runtime.sendMessage( + { message: "syncGatewayAddressRegistry" }, + function (response) { + if (chrome.runtime.lastError) { + // Handle any error that might occur while sending the message + reject(chrome.runtime.lastError); + } else { + resolve(response); + } + } + ); + }); +} + +function saveThemeChoice(inputValue: any) { + chrome.storage.local.set({ theme: inputValue }, function () { + alert(`Theme set to ${inputValue}`); + }); + return true; +} + +function saveRoutingMethod(inputValue: any) { + chrome.storage.local.set({ routingMethod: inputValue }, function () { + alert(`Routing method set to ${inputValue}`); + }); + return true; +} + +function saveStaticGateway(inputValue: string | URL) { + try { + if (inputValue === "") { + chrome.storage.local.set({ staticGateway: null }); + alert(`Static gateway removed. Back to dynamic gateway selection.`); + return null; + } else { + const url = new URL(inputValue.toString()); // Ensure inputValue is treated as a string + const protocol = url.protocol.replace(":", ""); // Removes the trailing colon + const fqdn = url.hostname; + let port = url.port; + + if (!port) { + port = (protocol === "https" ? 443 : 80).toString(); // Default port values based on protocol + } + + const staticGateway = { + settings: { + protocol, + fqdn, + port: parseInt(port, 10), + }, + }; + + chrome.storage.local.set({ staticGateway: staticGateway }, function () { + alert(`Static gateway saved: ${inputValue}`); + }); + return staticGateway; + } + } catch (error) { + alert(`Invalid URL entered: ${inputValue}`); + } +} + +async function showMoreGatewayInfo(gateway: AoGateway, address: string) { + // Get modal elements + const modal = document.getElementById("gatewayModal") as HTMLElement; + const modalUrl = document.getElementById( + "modal-gateway-url" + ) as HTMLAnchorElement; + const modalORR = document.getElementById("modal-gateway-orr") as HTMLElement; + const modalGRR = document.getElementById("modal-gateway-grr") as HTMLElement; + const modalGatewayWallet = document.getElementById( + "modal-gateway-wallet" + ) as HTMLAnchorElement; + const modalObserverWallet = document.getElementById( + "modal-observer-wallet" + ) as HTMLAnchorElement; + const modalStake = document.getElementById("modal-stake") as HTMLElement; + const modalStatus = document.getElementById("modal-status") as HTMLElement; + const modalStart = document.getElementById("modal-start") as HTMLElement; + const modalProperties = document.getElementById( + "modal-properties" + ) as HTMLAnchorElement; + const modalNote = document.getElementById("modal-note") as HTMLElement; + + const orr = + gateway.stats.prescribedEpochCount > 0 + ? (gateway.stats.observedEpochCount / + gateway.stats.prescribedEpochCount) * + 100 + : 100; + // Convert observerRewardRatioWeight to percentage and format to one decimal place + modalORR.textContent = `${orr}%`; + + const grr = gateway.stats.totalEpochParticipationCount + ? (gateway.stats.passedEpochCount / + gateway.stats.totalEpochParticipationCount) * + 100 + : 100; + + // Convert gatewayRewardRatioWeight to percentage and format to one decimal place + modalGRR.textContent = `${grr}%`; + + // Assign values from the gateway object to modal elements + modalUrl.textContent = `${gateway.settings.protocol}://${gateway.settings.fqdn}:${gateway.settings.port}`; + modalUrl.href = `${gateway.settings.protocol}://${gateway.settings.fqdn}:${gateway.settings.port}`; + modalGatewayWallet.textContent = address.slice(0, 6) + "..."; + modalGatewayWallet.href = `https://viewblock.io/arweave/address/${address}`; + + modalObserverWallet.textContent = gateway.observerAddress.slice(0, 6) + "..."; + modalObserverWallet.href = `https://viewblock.io/arweave/address/${gateway.observerAddress}`; + + modalStake.textContent = `${new mIOToken(gateway.operatorStake).toIO()} IO`; + modalStatus.textContent = gateway.status; + modalStart.textContent = `${new Date(gateway.startTimestamp).toLocaleDateString()}`; + if (gateway.settings.properties) { + modalProperties.textContent = + gateway.settings.properties.slice(0, 6) + "..."; + modalProperties.href = `https://viewblock.io/arweave/tx/${gateway.settings.properties}`; + } else { + modalProperties.textContent = "No properties set"; + modalProperties.removeAttribute("href"); // remove link if no properties + } + + modalNote.textContent = gateway.settings.note || "No note provided"; + + // Blacklist functionality + const blacklistButton = document.getElementById( + "blacklistButton" + ) as HTMLElement; + + // Check if the gateway is already blacklisted + const isBlacklisted = await checkIfBlacklisted(address); + + if (isBlacklisted) { + blacklistButton.textContent = "Unblacklist Gateway"; + } else { + blacklistButton.textContent = "Blacklist Gateway"; + } + + // Toggle blacklist status + blacklistButton.onclick = async function () { + await toggleBlacklist(address); + await showMoreGatewayInfo(gateway, address); + }; + + // Display the modal + modal.style.display = "block"; +} + +async function checkIfBlacklisted(address: string) { + // Check from local storage or other data source if the gateway is blacklisted + const { blacklistedGateways = [] } = await chrome.storage.local.get([ + "blacklistedGateways", + ]); + return blacklistedGateways.includes(address); +} + +async function toggleBlacklist(address: any) { + // Get blacklistedGateways from chrome storage + let { blacklistedGateways = [] } = await chrome.storage.local.get([ + "blacklistedGateways", + ]); + if (blacklistedGateways.includes(address)) { + // Removing the address from blacklist + blacklistedGateways = blacklistedGateways.filter( + (gatewayAddress: any) => gatewayAddress !== address + ); + + // Find the corresponding row and remove the 'blacklisted' class + const gatewayRow = document.querySelector( + `.gateway[data-address='${address}']` + ); + if (gatewayRow) { + gatewayRow.classList.remove("blacklisted"); + } + } else { + // Adding the address to blacklist + blacklistedGateways.push(address); + + // Find the corresponding row and add the 'blacklisted' class + const gatewayRow = document.querySelector( + `.gateway[data-address='${address}']` + ); + if (gatewayRow) { + gatewayRow.classList.add("blacklisted"); + } + } + // Set updated blacklistedGateways back to chrome storage + console.log("Current black list: ", blacklistedGateways); + chrome.storage.local.set({ blacklistedGateways: blacklistedGateways }); +} + +function sortGatewaysByStake(gateways: { [s: string]: any } | ArrayLike) { + console.log("Gateways before sort: ", gateways); + // check the length + if (gateways === undefined || Object.keys(gateways).length === 0) { + return []; + } + // Convert the object to an array of {address, data} pairs + const gatewayArray = Object.entries(gateways).map(([address, data]) => ({ + address, + data, + })); + + // Sort the array based on operatorStake + const sortedGateways = gatewayArray.sort( + (a, b) => b.data.operatorStake - a.data.operatorStake + ); + + return sortedGateways; +} + +function isBase64URL(address: string): boolean { + const trimmedBase64URL = address.toString().trim(); + const BASE_64_REXEX = new RegExp("^[a-zA-Z0-9-_s+]{43}$"); + return BASE_64_REXEX.test(trimmedBase64URL); +} + +function saveArIOProcessId(processId: string) { + if (processId === "") { + chrome.storage.local.set({ processId: IO_TESTNET_PROCESS_ID }); + alert(`AR.IO Process ID set back to default.`); + } else { + chrome.storage.local.set({ processId: processId }); + alert(`AR.IO Process ID set to ${processId}`); + } + return true; +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..981ff05 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,14 @@ +{ + "compilerOptions": { + "target": "esnext", + "module": "esnext", + "moduleResolution": "bundler", + "esModuleInterop": true, + "strict": true, + "jsx": "preserve", + "sourceMap": true, + "baseUrl": "." + }, + "include": ["src/**/*.ts", "src/**/*.tsx"], + "exclude": ["node_modules"] +} diff --git a/vite.config.js b/vite.config.js new file mode 100644 index 0000000..45e1524 --- /dev/null +++ b/vite.config.js @@ -0,0 +1,57 @@ +import { defineConfig } from "vite"; +import { nodePolyfills } from "vite-plugin-node-polyfills"; +import { viteStaticCopy } from "vite-plugin-static-copy"; +import { resolve } from "path"; + +export default defineConfig({ + plugins: [ + nodePolyfills({ + globals: { + Buffer: true, + global: true, + process: true, + }, + }), + viteStaticCopy({ + targets: [ + { + src: "src/popup.html", + dest: ".", + }, + + { + src: "manifest.json", + dest: ".", + }, + { + src: "assets", + dest: "", + }, + { + src: "package.json", + dest: ".", + }, + ], + }), + ], + build: { + sourcemap: true, + outDir: "dist", + emptyOutDir: true, + rollupOptions: { + input: { + background: "./src/background.ts", + content: "./src/content.ts", + popup: "./src/popup.ts", + }, + output: { + entryFileNames: "[name].js", + chunkFileNames: "[name].js", + assetFileNames: "[name].[ext]", + }, + }, + }, + server: { + port: 3000, + }, +}); diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 0000000..4ec3e55 --- /dev/null +++ b/yarn.lock @@ -0,0 +1,3338 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@ampproject/remapping@^2.2.0": + version "2.3.0" + resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.3.0.tgz#ed441b6fa600072520ce18b43d2c8cc8caecc7f4" + integrity sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw== + dependencies: + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.24" + +"@ar.io/sdk@2.0.0-alpha.2": + version "2.0.0-alpha.2" + resolved "https://registry.yarnpkg.com/@ar.io/sdk/-/sdk-2.0.0-alpha.2.tgz#30cc90ebafb16f700e3a3b27c391794999a7b73e" + integrity sha512-LQ1zRunqJrrshWFHDn22t7k6Mm1Pi85Q4tJZ1oc1af+B7B3FlUKUtYhX5cjshRYSVAooporgR+Lo+enI9O+nkg== + dependencies: + "@permaweb/aoconnect" "^0.0.55" + arbundles "0.11.0" + arweave "1.14.4" + axios "1.7.2" + axios-retry "^4.3.0" + eventemitter3 "^5.0.1" + plimit-lit "^3.0.1" + winston "^3.13.0" + +"@babel/code-frame@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.24.7.tgz#882fd9e09e8ee324e496bd040401c6f046ef4465" + integrity sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA== + dependencies: + "@babel/highlight" "^7.24.7" + picocolors "^1.0.0" + +"@babel/compat-data@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.24.7.tgz#d23bbea508c3883ba8251fb4164982c36ea577ed" + integrity sha512-qJzAIcv03PyaWqxRgO4mSU3lihncDT296vnyuE2O8uA4w3UHWI4S3hgeZd1L8W1Bft40w9JxJ2b412iDUFFRhw== + +"@babel/core@^7.24.5": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.24.7.tgz#b676450141e0b52a3d43bc91da86aa608f950ac4" + integrity sha512-nykK+LEK86ahTkX/3TgauT0ikKoNCfKHEaZYTUVupJdTLzGNvrblu4u6fa7DhZONAltdf8e662t/abY8idrd/g== + dependencies: + "@ampproject/remapping" "^2.2.0" + "@babel/code-frame" "^7.24.7" + "@babel/generator" "^7.24.7" + "@babel/helper-compilation-targets" "^7.24.7" + "@babel/helper-module-transforms" "^7.24.7" + "@babel/helpers" "^7.24.7" + "@babel/parser" "^7.24.7" + "@babel/template" "^7.24.7" + "@babel/traverse" "^7.24.7" + "@babel/types" "^7.24.7" + convert-source-map "^2.0.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.3" + semver "^6.3.1" + +"@babel/generator@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.24.7.tgz#1654d01de20ad66b4b4d99c135471bc654c55e6d" + integrity sha512-oipXieGC3i45Y1A41t4tAqpnEZWgB/lC6Ehh6+rOviR5XWpTtMmLN+fGjz9vOiNRt0p6RtO6DtD0pdU3vpqdSA== + dependencies: + "@babel/types" "^7.24.7" + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.25" + jsesc "^2.5.1" + +"@babel/helper-compilation-targets@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.24.7.tgz#4eb6c4a80d6ffeac25ab8cd9a21b5dfa48d503a9" + integrity sha512-ctSdRHBi20qWOfy27RUb4Fhp07KSJ3sXcuSvTrXrc4aG8NSYDo1ici3Vhg9bg69y5bj0Mr1lh0aeEgTvc12rMg== + dependencies: + "@babel/compat-data" "^7.24.7" + "@babel/helper-validator-option" "^7.24.7" + browserslist "^4.22.2" + lru-cache "^5.1.1" + semver "^6.3.1" + +"@babel/helper-environment-visitor@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.7.tgz#4b31ba9551d1f90781ba83491dd59cf9b269f7d9" + integrity sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ== + dependencies: + "@babel/types" "^7.24.7" + +"@babel/helper-function-name@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.24.7.tgz#75f1e1725742f39ac6584ee0b16d94513da38dd2" + integrity sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA== + dependencies: + "@babel/template" "^7.24.7" + "@babel/types" "^7.24.7" + +"@babel/helper-hoist-variables@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.24.7.tgz#b4ede1cde2fd89436397f30dc9376ee06b0f25ee" + integrity sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ== + dependencies: + "@babel/types" "^7.24.7" + +"@babel/helper-module-imports@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz#f2f980392de5b84c3328fc71d38bd81bbb83042b" + integrity sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA== + dependencies: + "@babel/traverse" "^7.24.7" + "@babel/types" "^7.24.7" + +"@babel/helper-module-transforms@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.24.7.tgz#31b6c9a2930679498db65b685b1698bfd6c7daf8" + integrity sha512-1fuJEwIrp+97rM4RWdO+qrRsZlAeL1lQJoPqtCYWv0NL115XM93hIH4CSRln2w52SqvmY5hqdtauB6QFCDiZNQ== + dependencies: + "@babel/helper-environment-visitor" "^7.24.7" + "@babel/helper-module-imports" "^7.24.7" + "@babel/helper-simple-access" "^7.24.7" + "@babel/helper-split-export-declaration" "^7.24.7" + "@babel/helper-validator-identifier" "^7.24.7" + +"@babel/helper-plugin-utils@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.7.tgz#98c84fe6fe3d0d3ae7bfc3a5e166a46844feb2a0" + integrity sha512-Rq76wjt7yz9AAc1KnlRKNAi/dMSVWgDRx43FHoJEbcYU6xOWaE2dVPwcdTukJrjxS65GITyfbvEYHvkirZ6uEg== + +"@babel/helper-simple-access@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz#bcade8da3aec8ed16b9c4953b74e506b51b5edb3" + integrity sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg== + dependencies: + "@babel/traverse" "^7.24.7" + "@babel/types" "^7.24.7" + +"@babel/helper-split-export-declaration@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz#83949436890e07fa3d6873c61a96e3bbf692d856" + integrity sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA== + dependencies: + "@babel/types" "^7.24.7" + +"@babel/helper-string-parser@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.24.7.tgz#4d2d0f14820ede3b9807ea5fc36dfc8cd7da07f2" + integrity sha512-7MbVt6xrwFQbunH2DNQsAP5sTGxfqQtErvBIvIMi6EQnbgUOuVYanvREcmFrOPhoXBrTtjhhP+lW+o5UfK+tDg== + +"@babel/helper-validator-identifier@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz#75b889cfaf9e35c2aaf42cf0d72c8e91719251db" + integrity sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w== + +"@babel/helper-validator-option@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.24.7.tgz#24c3bb77c7a425d1742eec8fb433b5a1b38e62f6" + integrity sha512-yy1/KvjhV/ZCL+SM7hBrvnZJ3ZuT9OuZgIJAGpPEToANvc3iM6iDvBnRjtElWibHU6n8/LPR/EjX9EtIEYO3pw== + +"@babel/helpers@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.24.7.tgz#aa2ccda29f62185acb5d42fb4a3a1b1082107416" + integrity sha512-NlmJJtvcw72yRJRcnCmGvSi+3jDEg8qFu3z0AFoymmzLx5ERVWyzd9kVXr7Th9/8yIJi2Zc6av4Tqz3wFs8QWg== + dependencies: + "@babel/template" "^7.24.7" + "@babel/types" "^7.24.7" + +"@babel/highlight@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.24.7.tgz#a05ab1df134b286558aae0ed41e6c5f731bf409d" + integrity sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw== + dependencies: + "@babel/helper-validator-identifier" "^7.24.7" + chalk "^2.4.2" + js-tokens "^4.0.0" + picocolors "^1.0.0" + +"@babel/parser@^7.1.0", "@babel/parser@^7.20.7", "@babel/parser@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.7.tgz#9a5226f92f0c5c8ead550b750f5608e766c8ce85" + integrity sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw== + +"@babel/plugin-transform-react-jsx-self@^7.24.5": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.24.7.tgz#66bff0248ea0b549972e733516ffad577477bdab" + integrity sha512-fOPQYbGSgH0HUp4UJO4sMBFjY6DuWq+2i8rixyUMb3CdGixs/gccURvYOAhajBdKDoGajFr3mUq5rH3phtkGzw== + dependencies: + "@babel/helper-plugin-utils" "^7.24.7" + +"@babel/plugin-transform-react-jsx-source@^7.24.1": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.24.7.tgz#1198aab2548ad19582013815c938d3ebd8291ee3" + integrity sha512-J2z+MWzZHVOemyLweMqngXrgGC42jQ//R0KdxqkIz/OrbVIIlhFI3WigZ5fO+nwFvBlncr4MGapd8vTyc7RPNQ== + dependencies: + "@babel/helper-plugin-utils" "^7.24.7" + +"@babel/template@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.24.7.tgz#02efcee317d0609d2c07117cb70ef8fb17ab7315" + integrity sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig== + dependencies: + "@babel/code-frame" "^7.24.7" + "@babel/parser" "^7.24.7" + "@babel/types" "^7.24.7" + +"@babel/traverse@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.24.7.tgz#de2b900163fa741721ba382163fe46a936c40cf5" + integrity sha512-yb65Ed5S/QAcewNPh0nZczy9JdYXkkAbIsEo+P7BE7yO3txAY30Y/oPa3QkQ5It3xVG2kpKMg9MsdxZaO31uKA== + dependencies: + "@babel/code-frame" "^7.24.7" + "@babel/generator" "^7.24.7" + "@babel/helper-environment-visitor" "^7.24.7" + "@babel/helper-function-name" "^7.24.7" + "@babel/helper-hoist-variables" "^7.24.7" + "@babel/helper-split-export-declaration" "^7.24.7" + "@babel/parser" "^7.24.7" + "@babel/types" "^7.24.7" + debug "^4.3.1" + globals "^11.1.0" + +"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.24.7.tgz#6027fe12bc1aa724cd32ab113fb7f1988f1f66f2" + integrity sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q== + dependencies: + "@babel/helper-string-parser" "^7.24.7" + "@babel/helper-validator-identifier" "^7.24.7" + to-fast-properties "^2.0.0" + +"@colors/colors@1.6.0", "@colors/colors@^1.6.0": + version "1.6.0" + resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.6.0.tgz#ec6cd237440700bc23ca23087f513c75508958b0" + integrity sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA== + +"@dabh/diagnostics@^2.0.2": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@dabh/diagnostics/-/diagnostics-2.0.3.tgz#7f7e97ee9a725dffc7808d93668cc984e1dc477a" + integrity sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA== + dependencies: + colorspace "1.1.x" + enabled "2.0.x" + kuler "^2.0.0" + +"@esbuild/aix-ppc64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz#c7184a326533fcdf1b8ee0733e21c713b975575f" + integrity sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ== + +"@esbuild/android-arm64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz#09d9b4357780da9ea3a7dfb833a1f1ff439b4052" + integrity sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A== + +"@esbuild/android-arm@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.21.5.tgz#9b04384fb771926dfa6d7ad04324ecb2ab9b2e28" + integrity sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg== + +"@esbuild/android-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.21.5.tgz#29918ec2db754cedcb6c1b04de8cd6547af6461e" + integrity sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA== + +"@esbuild/darwin-arm64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz#e495b539660e51690f3928af50a76fb0a6ccff2a" + integrity sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ== + +"@esbuild/darwin-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz#c13838fa57372839abdddc91d71542ceea2e1e22" + integrity sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw== + +"@esbuild/freebsd-arm64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz#646b989aa20bf89fd071dd5dbfad69a3542e550e" + integrity sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g== + +"@esbuild/freebsd-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz#aa615cfc80af954d3458906e38ca22c18cf5c261" + integrity sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ== + +"@esbuild/linux-arm64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz#70ac6fa14f5cb7e1f7f887bcffb680ad09922b5b" + integrity sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q== + +"@esbuild/linux-arm@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz#fc6fd11a8aca56c1f6f3894f2bea0479f8f626b9" + integrity sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA== + +"@esbuild/linux-ia32@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz#3271f53b3f93e3d093d518d1649d6d68d346ede2" + integrity sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg== + +"@esbuild/linux-loong64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz#ed62e04238c57026aea831c5a130b73c0f9f26df" + integrity sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg== + +"@esbuild/linux-mips64el@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz#e79b8eb48bf3b106fadec1ac8240fb97b4e64cbe" + integrity sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg== + +"@esbuild/linux-ppc64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz#5f2203860a143b9919d383ef7573521fb154c3e4" + integrity sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w== + +"@esbuild/linux-riscv64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz#07bcafd99322d5af62f618cb9e6a9b7f4bb825dc" + integrity sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA== + +"@esbuild/linux-s390x@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz#b7ccf686751d6a3e44b8627ababc8be3ef62d8de" + integrity sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A== + +"@esbuild/linux-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz#6d8f0c768e070e64309af8004bb94e68ab2bb3b0" + integrity sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ== + +"@esbuild/netbsd-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz#bbe430f60d378ecb88decb219c602667387a6047" + integrity sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg== + +"@esbuild/openbsd-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz#99d1cf2937279560d2104821f5ccce220cb2af70" + integrity sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow== + +"@esbuild/sunos-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz#08741512c10d529566baba837b4fe052c8f3487b" + integrity sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg== + +"@esbuild/win32-arm64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz#675b7385398411240735016144ab2e99a60fc75d" + integrity sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A== + +"@esbuild/win32-ia32@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz#1bfc3ce98aa6ca9a0969e4d2af72144c59c1193b" + integrity sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA== + +"@esbuild/win32-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz#acad351d582d157bb145535db2a6ff53dd514b5c" + integrity sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw== + +"@ethersproject/abstract-provider@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz#b0a8550f88b6bf9d51f90e4795d48294630cb9ef" + integrity sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw== + dependencies: + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/networks" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + "@ethersproject/web" "^5.7.0" + +"@ethersproject/abstract-signer@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz#13f4f32117868452191a4649723cb086d2b596b2" + integrity sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ== + dependencies: + "@ethersproject/abstract-provider" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + +"@ethersproject/address@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.7.0.tgz#19b56c4d74a3b0a46bfdbb6cfcc0a153fc697f37" + integrity sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA== + dependencies: + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/rlp" "^5.7.0" + +"@ethersproject/base64@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.7.0.tgz#ac4ee92aa36c1628173e221d0d01f53692059e1c" + integrity sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ== + dependencies: + "@ethersproject/bytes" "^5.7.0" + +"@ethersproject/basex@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/basex/-/basex-5.7.0.tgz#97034dc7e8938a8ca943ab20f8a5e492ece4020b" + integrity sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + +"@ethersproject/bignumber@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.7.0.tgz#e2f03837f268ba655ffba03a57853e18a18dc9c2" + integrity sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + bn.js "^5.2.1" + +"@ethersproject/bytes@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.7.0.tgz#a00f6ea8d7e7534d6d87f47188af1148d71f155d" + integrity sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A== + dependencies: + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/constants@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.7.0.tgz#df80a9705a7e08984161f09014ea012d1c75295e" + integrity sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA== + dependencies: + "@ethersproject/bignumber" "^5.7.0" + +"@ethersproject/hash@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.7.0.tgz#eb7aca84a588508369562e16e514b539ba5240a7" + integrity sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g== + dependencies: + "@ethersproject/abstract-signer" "^5.7.0" + "@ethersproject/address" "^5.7.0" + "@ethersproject/base64" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + +"@ethersproject/hdnode@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/hdnode/-/hdnode-5.7.0.tgz#e627ddc6b466bc77aebf1a6b9e47405ca5aef9cf" + integrity sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg== + dependencies: + "@ethersproject/abstract-signer" "^5.7.0" + "@ethersproject/basex" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/pbkdf2" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/sha2" "^5.7.0" + "@ethersproject/signing-key" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + "@ethersproject/wordlists" "^5.7.0" + +"@ethersproject/json-wallets@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/json-wallets/-/json-wallets-5.7.0.tgz#5e3355287b548c32b368d91014919ebebddd5360" + integrity sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g== + dependencies: + "@ethersproject/abstract-signer" "^5.7.0" + "@ethersproject/address" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/hdnode" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/pbkdf2" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/random" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + aes-js "3.0.0" + scrypt-js "3.0.1" + +"@ethersproject/keccak256@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.7.0.tgz#3186350c6e1cd6aba7940384ec7d6d9db01f335a" + integrity sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg== + dependencies: + "@ethersproject/bytes" "^5.7.0" + js-sha3 "0.8.0" + +"@ethersproject/logger@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.7.0.tgz#6ce9ae168e74fecf287be17062b590852c311892" + integrity sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig== + +"@ethersproject/networks@^5.7.0": + version "5.7.1" + resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.7.1.tgz#118e1a981d757d45ccea6bb58d9fd3d9db14ead6" + integrity sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ== + dependencies: + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/pbkdf2@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/pbkdf2/-/pbkdf2-5.7.0.tgz#d2267d0a1f6e123f3771007338c47cccd83d3102" + integrity sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/sha2" "^5.7.0" + +"@ethersproject/properties@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.7.0.tgz#a6e12cb0439b878aaf470f1902a176033067ed30" + integrity sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw== + dependencies: + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/providers@^5.7.2": + version "5.7.2" + resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.7.2.tgz#f8b1a4f275d7ce58cf0a2eec222269a08beb18cb" + integrity sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg== + dependencies: + "@ethersproject/abstract-provider" "^5.7.0" + "@ethersproject/abstract-signer" "^5.7.0" + "@ethersproject/address" "^5.7.0" + "@ethersproject/base64" "^5.7.0" + "@ethersproject/basex" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/hash" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/networks" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/random" "^5.7.0" + "@ethersproject/rlp" "^5.7.0" + "@ethersproject/sha2" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + "@ethersproject/web" "^5.7.0" + bech32 "1.1.4" + ws "7.4.6" + +"@ethersproject/random@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/random/-/random-5.7.0.tgz#af19dcbc2484aae078bb03656ec05df66253280c" + integrity sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/rlp@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.7.0.tgz#de39e4d5918b9d74d46de93af80b7685a9c21304" + integrity sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/sha2@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/sha2/-/sha2-5.7.0.tgz#9a5f7a7824ef784f7f7680984e593a800480c9fb" + integrity sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + hash.js "1.1.7" + +"@ethersproject/signing-key@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.7.0.tgz#06b2df39411b00bc57c7c09b01d1e41cf1b16ab3" + integrity sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + bn.js "^5.2.1" + elliptic "6.5.4" + hash.js "1.1.7" + +"@ethersproject/strings@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.7.0.tgz#54c9d2a7c57ae8f1205c88a9d3a56471e14d5ed2" + integrity sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/transactions@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.7.0.tgz#91318fc24063e057885a6af13fdb703e1f993d3b" + integrity sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ== + dependencies: + "@ethersproject/address" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/rlp" "^5.7.0" + "@ethersproject/signing-key" "^5.7.0" + +"@ethersproject/wallet@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/wallet/-/wallet-5.7.0.tgz#4e5d0790d96fe21d61d38fb40324e6c7ef350b2d" + integrity sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA== + dependencies: + "@ethersproject/abstract-provider" "^5.7.0" + "@ethersproject/abstract-signer" "^5.7.0" + "@ethersproject/address" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/hash" "^5.7.0" + "@ethersproject/hdnode" "^5.7.0" + "@ethersproject/json-wallets" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/random" "^5.7.0" + "@ethersproject/signing-key" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + "@ethersproject/wordlists" "^5.7.0" + +"@ethersproject/web@^5.7.0": + version "5.7.1" + resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.7.1.tgz#de1f285b373149bee5928f4eb7bcb87ee5fbb4ae" + integrity sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w== + dependencies: + "@ethersproject/base64" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + +"@ethersproject/wordlists@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/wordlists/-/wordlists-5.7.0.tgz#8fb2c07185d68c3e09eb3bfd6e779ba2774627f5" + integrity sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/hash" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + +"@fastify/busboy@^2.0.0": + version "2.1.1" + resolved "https://registry.yarnpkg.com/@fastify/busboy/-/busboy-2.1.1.tgz#b9da6a878a371829a0502c9b6c1c143ef6663f4d" + integrity sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA== + +"@irys/arweave@^0.0.2": + version "0.0.2" + resolved "https://registry.yarnpkg.com/@irys/arweave/-/arweave-0.0.2.tgz#c0e73eb8c15e323342d33ea92701d4036fd22ae3" + integrity sha512-ddE5h4qXbl0xfGlxrtBIwzflaxZUDlDs43TuT0u1OMfyobHul4AA1VEX72Rpzw2bOh4vzoytSqA1jCM7x9YtHg== + dependencies: + asn1.js "^5.4.1" + async-retry "^1.3.3" + axios "^1.4.0" + base64-js "^1.5.1" + bignumber.js "^9.1.1" + +"@jridgewell/gen-mapping@^0.3.5": + version "0.3.5" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz#dcce6aff74bdf6dad1a95802b69b04a2fcb1fb36" + integrity sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg== + dependencies: + "@jridgewell/set-array" "^1.2.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.24" + +"@jridgewell/resolve-uri@^3.1.0": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" + integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== + +"@jridgewell/set-array@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280" + integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== + +"@jridgewell/source-map@^0.3.3": + version "0.3.6" + resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.6.tgz#9d71ca886e32502eb9362c9a74a46787c36df81a" + integrity sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ== + dependencies: + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.25" + +"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14", "@jridgewell/sourcemap-codec@^1.4.15": + version "1.4.15" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" + integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== + +"@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": + version "0.3.25" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" + integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== + dependencies: + "@jridgewell/resolve-uri" "^3.1.0" + "@jridgewell/sourcemap-codec" "^1.4.14" + +"@noble/ed25519@^1.6.1": + version "1.7.3" + resolved "https://registry.yarnpkg.com/@noble/ed25519/-/ed25519-1.7.3.tgz#57e1677bf6885354b466c38e2b620c62f45a7123" + integrity sha512-iR8GBkDt0Q3GyaVcIu7mSsVIqnFbkbRzGLWlvhwunacoLwt4J3swfKhfaM6rN6WY+TBGoYT1GtT1mIh2/jGbRQ== + +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.3": + version "1.2.8" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + +"@permaweb/ao-scheduler-utils@~0.0.16": + version "0.0.19" + resolved "https://registry.yarnpkg.com/@permaweb/ao-scheduler-utils/-/ao-scheduler-utils-0.0.19.tgz#69d35c19583624ace3f500f53b4b4d73fca883e1" + integrity sha512-xwIe9FqQ1UZxEYWvSGJDONz0xr4vDq2Ny1NeRUiO0dKYoonShN+oI1ULgrHocKOjOPNEgRX70vMCKGLe+3x70A== + dependencies: + lru-cache "^10.2.2" + ramda "^0.30.0" + zod "^3.23.5" + +"@permaweb/aoconnect@^0.0.55": + version "0.0.55" + resolved "https://registry.yarnpkg.com/@permaweb/aoconnect/-/aoconnect-0.0.55.tgz#d856a078d3702154ac58541d09478d25ed3acf2c" + integrity sha512-W2GtLZedVseuDkCKk4CmM9SFmi0DdrMKqvhMBm9xo65z+Mzr/t1TEjMJKRNzEA2qh5IdwM43sWJ5fmbBYLg6TQ== + dependencies: + "@permaweb/ao-scheduler-utils" "~0.0.16" + buffer "^6.0.3" + debug "^4.3.4" + hyper-async "^1.1.2" + mnemonist "^0.39.8" + ramda "^0.29.1" + warp-arbundles "^1.0.4" + zod "^3.22.4" + +"@randlabs/communication-bridge@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@randlabs/communication-bridge/-/communication-bridge-1.0.1.tgz#d1ecfc29157afcbb0ca2d73122d67905eecb5bf3" + integrity sha512-CzS0U8IFfXNK7QaJFE4pjbxDGfPjbXBEsEaCn9FN15F+ouSAEUQkva3Gl66hrkBZOGexKFEWMwUHIDKpZ2hfVg== + +"@randlabs/myalgo-connect@^1.1.2": + version "1.4.2" + resolved "https://registry.yarnpkg.com/@randlabs/myalgo-connect/-/myalgo-connect-1.4.2.tgz#ce3ad97b3889ea21da75852187511d3f6be0fa05" + integrity sha512-K9hEyUi7G8tqOp7kWIALJLVbGCByhilcy6123WfcorxWwiE1sbQupPyIU5f3YdQK6wMjBsyTWiLW52ZBMp7sXA== + dependencies: + "@randlabs/communication-bridge" "1.0.1" + +"@rollup/plugin-inject@^5.0.5": + version "5.0.5" + resolved "https://registry.yarnpkg.com/@rollup/plugin-inject/-/plugin-inject-5.0.5.tgz#616f3a73fe075765f91c5bec90176608bed277a3" + integrity sha512-2+DEJbNBoPROPkgTDNe8/1YXWcqxbN5DTjASVIOx8HS+pITXushyNiBV56RB08zuptzz8gT3YfkqriTBVycepg== + dependencies: + "@rollup/pluginutils" "^5.0.1" + estree-walker "^2.0.2" + magic-string "^0.30.3" + +"@rollup/pluginutils@^4.2.0": + version "4.2.1" + resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-4.2.1.tgz#e6c6c3aba0744edce3fb2074922d3776c0af2a6d" + integrity sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ== + dependencies: + estree-walker "^2.0.1" + picomatch "^2.2.2" + +"@rollup/pluginutils@^5.0.1": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-5.1.0.tgz#7e53eddc8c7f483a4ad0b94afb1f7f5fd3c771e0" + integrity sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g== + dependencies: + "@types/estree" "^1.0.0" + estree-walker "^2.0.2" + picomatch "^2.3.1" + +"@rollup/rollup-android-arm-eabi@4.18.0": + version "4.18.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.18.0.tgz#bbd0e616b2078cd2d68afc9824d1fadb2f2ffd27" + integrity sha512-Tya6xypR10giZV1XzxmH5wr25VcZSncG0pZIjfePT0OVBvqNEurzValetGNarVrGiq66EBVAFn15iYX4w6FKgQ== + +"@rollup/rollup-android-arm64@4.18.0": + version "4.18.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.18.0.tgz#97255ef6384c5f73f4800c0de91f5f6518e21203" + integrity sha512-avCea0RAP03lTsDhEyfy+hpfr85KfyTctMADqHVhLAF3MlIkq83CP8UfAHUssgXTYd+6er6PaAhx/QGv4L1EiA== + +"@rollup/rollup-darwin-arm64@4.18.0": + version "4.18.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.18.0.tgz#b6dd74e117510dfe94541646067b0545b42ff096" + integrity sha512-IWfdwU7KDSm07Ty0PuA/W2JYoZ4iTj3TUQjkVsO/6U+4I1jN5lcR71ZEvRh52sDOERdnNhhHU57UITXz5jC1/w== + +"@rollup/rollup-darwin-x64@4.18.0": + version "4.18.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.18.0.tgz#e07d76de1cec987673e7f3d48ccb8e106d42c05c" + integrity sha512-n2LMsUz7Ynu7DoQrSQkBf8iNrjOGyPLrdSg802vk6XT3FtsgX6JbE8IHRvposskFm9SNxzkLYGSq9QdpLYpRNA== + +"@rollup/rollup-linux-arm-gnueabihf@4.18.0": + version "4.18.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.18.0.tgz#9f1a6d218b560c9d75185af4b8bb42f9f24736b8" + integrity sha512-C/zbRYRXFjWvz9Z4haRxcTdnkPt1BtCkz+7RtBSuNmKzMzp3ZxdM28Mpccn6pt28/UWUCTXa+b0Mx1k3g6NOMA== + +"@rollup/rollup-linux-arm-musleabihf@4.18.0": + version "4.18.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.18.0.tgz#53618b92e6ffb642c7b620e6e528446511330549" + integrity sha512-l3m9ewPgjQSXrUMHg93vt0hYCGnrMOcUpTz6FLtbwljo2HluS4zTXFy2571YQbisTnfTKPZ01u/ukJdQTLGh9A== + +"@rollup/rollup-linux-arm64-gnu@4.18.0": + version "4.18.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.18.0.tgz#99a7ba5e719d4f053761a698f7b52291cefba577" + integrity sha512-rJ5D47d8WD7J+7STKdCUAgmQk49xuFrRi9pZkWoRD1UeSMakbcepWXPF8ycChBoAqs1pb2wzvbY6Q33WmN2ftw== + +"@rollup/rollup-linux-arm64-musl@4.18.0": + version "4.18.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.18.0.tgz#f53db99a45d9bc00ce94db8a35efa7c3c144a58c" + integrity sha512-be6Yx37b24ZwxQ+wOQXXLZqpq4jTckJhtGlWGZs68TgdKXJgw54lUUoFYrg6Zs/kjzAQwEwYbp8JxZVzZLRepQ== + +"@rollup/rollup-linux-powerpc64le-gnu@4.18.0": + version "4.18.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.18.0.tgz#cbb0837408fe081ce3435cf3730e090febafc9bf" + integrity sha512-hNVMQK+qrA9Todu9+wqrXOHxFiD5YmdEi3paj6vP02Kx1hjd2LLYR2eaN7DsEshg09+9uzWi2W18MJDlG0cxJA== + +"@rollup/rollup-linux-riscv64-gnu@4.18.0": + version "4.18.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.18.0.tgz#8ed09c1d1262ada4c38d791a28ae0fea28b80cc9" + integrity sha512-ROCM7i+m1NfdrsmvwSzoxp9HFtmKGHEqu5NNDiZWQtXLA8S5HBCkVvKAxJ8U+CVctHwV2Gb5VUaK7UAkzhDjlg== + +"@rollup/rollup-linux-s390x-gnu@4.18.0": + version "4.18.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.18.0.tgz#938138d3c8e0c96f022252a28441dcfb17afd7ec" + integrity sha512-0UyyRHyDN42QL+NbqevXIIUnKA47A+45WyasO+y2bGJ1mhQrfrtXUpTxCOrfxCR4esV3/RLYyucGVPiUsO8xjg== + +"@rollup/rollup-linux-x64-gnu@4.18.0": + version "4.18.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.18.0.tgz#1a7481137a54740bee1ded4ae5752450f155d942" + integrity sha512-xuglR2rBVHA5UsI8h8UbX4VJ470PtGCf5Vpswh7p2ukaqBGFTnsfzxUBetoWBWymHMxbIG0Cmx7Y9qDZzr648w== + +"@rollup/rollup-linux-x64-musl@4.18.0": + version "4.18.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.18.0.tgz#f1186afc601ac4f4fc25fac4ca15ecbee3a1874d" + integrity sha512-LKaqQL9osY/ir2geuLVvRRs+utWUNilzdE90TpyoX0eNqPzWjRm14oMEE+YLve4k/NAqCdPkGYDaDF5Sw+xBfg== + +"@rollup/rollup-win32-arm64-msvc@4.18.0": + version "4.18.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.18.0.tgz#ed6603e93636a96203c6915be4117245c1bd2daf" + integrity sha512-7J6TkZQFGo9qBKH0pk2cEVSRhJbL6MtfWxth7Y5YmZs57Pi+4x6c2dStAUvaQkHQLnEQv1jzBUW43GvZW8OFqA== + +"@rollup/rollup-win32-ia32-msvc@4.18.0": + version "4.18.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.18.0.tgz#14e0b404b1c25ebe6157a15edb9c46959ba74c54" + integrity sha512-Txjh+IxBPbkUB9+SXZMpv+b/vnTEtFyfWZgJ6iyCmt2tdx0OF5WhFowLmnh8ENGNpfUlUZkdI//4IEmhwPieNg== + +"@rollup/rollup-win32-x64-msvc@4.18.0": + version "4.18.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.18.0.tgz#5d694d345ce36b6ecf657349e03eb87297e68da4" + integrity sha512-UOo5FdvOL0+eIVTgS4tIdbW+TtnBLWg1YBCcU2KWM7nuNwRz9bksDX1bekJJCpu25N1DVWaCwnT39dVQxzqS8g== + +"@swc/core-darwin-arm64@1.6.7": + version "1.6.7" + resolved "https://registry.yarnpkg.com/@swc/core-darwin-arm64/-/core-darwin-arm64-1.6.7.tgz#e98a0da9635297728a97faf7f4e11c46f8dfbb46" + integrity sha512-sNb+ghP2OhZyUjS7E5Mf3PqSvoXJ5gY6GBaH2qp8WQxx9VL7ozC4HVo6vkeFJBN5cmYqUCLnhrM3HU4W+7yMSA== + +"@swc/core-darwin-x64@1.6.7": + version "1.6.7" + resolved "https://registry.yarnpkg.com/@swc/core-darwin-x64/-/core-darwin-x64-1.6.7.tgz#fccd389046a8fe0d8b294f9657b3861046fcd3bb" + integrity sha512-LQwYm/ATYN5fYSYVPMfComPiFo5i8jh75h1ASvNWhXtS+/+k1dq1zXTJWZRuojd5NXgW3bb6mJtJ2evwYIgYbA== + +"@swc/core-linux-arm-gnueabihf@1.6.7": + version "1.6.7" + resolved "https://registry.yarnpkg.com/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.6.7.tgz#f384235e5f14870646157017eb06dfbaed0894c0" + integrity sha512-kEDzVhNci38LX3kdY99t68P2CDf+2QFDk5LawVamXH0iN5DRAO/+wjOhxL8KOHa6wQVqKEt5WrhD+Rrvk/34Yw== + +"@swc/core-linux-arm64-gnu@1.6.7": + version "1.6.7" + resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.6.7.tgz#d2b8c0c6045eecb96bc3f3dfa7fb31b5ab708cdf" + integrity sha512-SyOBUGfl31xLGpIJ/Jd6GKHtkfZyHBXSwFlK7FmPN//MBQLtTBm4ZaWTnWnGo4aRsJwQdXWDKPyqlMBtnIl1nQ== + +"@swc/core-linux-arm64-musl@1.6.7": + version "1.6.7" + resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.6.7.tgz#6ae2a160ba535b1f4747d35a124f410545092abe" + integrity sha512-1fOAXkDFbRfItEdMZPxT3du1QWYhgToa4YsnqTujjE8EqJW8K27hIcHRIkVuzp7PNhq8nLBg0JpJM4g27EWD7g== + +"@swc/core-linux-x64-gnu@1.6.7": + version "1.6.7" + resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.6.7.tgz#6ebcf76fa868321c3b079e5c668c137b9b91df49" + integrity sha512-Gp7uCwPsNO5ATxbyvfTyeNCHUGD9oA+xKMm43G1tWCy+l07gLqWMKp7DIr3L3qPD05TfAVo3OuiOn2abpzOFbw== + +"@swc/core-linux-x64-musl@1.6.7": + version "1.6.7" + resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.6.7.tgz#41531ef3e1c7123d87b7a7a1b984fa2689032621" + integrity sha512-QeruGBZJ15tadqEMQ77ixT/CYGk20MtlS8wmvJiV+Wsb8gPW5LgCjtupzcLLnoQzDG54JGNCeeZ0l/T8NYsOvA== + +"@swc/core-win32-arm64-msvc@1.6.7": + version "1.6.7" + resolved "https://registry.yarnpkg.com/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.6.7.tgz#af0b84a54d01bc3aad12acffa98ebb13fc03c3e6" + integrity sha512-ouRqgSnT95lTCiU/6kJRNS5b1o+p8I/V9jxtL21WUj/JOVhsFmBErqQ0MZyCu514noWiR5BIqOrZXR8C1Knx6Q== + +"@swc/core-win32-ia32-msvc@1.6.7": + version "1.6.7" + resolved "https://registry.yarnpkg.com/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.6.7.tgz#c454851c05c26f67d2edc399e1cde9d074744ce4" + integrity sha512-eZAP/EmJ0IcfgAx6B4/SpSjq3aT8gr0ooktfMqw/w0/5lnNrbMl2v+2kvxcneNcF7bp8VNcYZnoHlsP+LvmVbA== + +"@swc/core-win32-x64-msvc@1.6.7": + version "1.6.7" + resolved "https://registry.yarnpkg.com/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.6.7.tgz#6ee4a3caf3466971e6b5fb2fba4674924507a2de" + integrity sha512-QOdE+7GQg1UQPS6p0KxzJOh/8GLbJ5zI1vqKArCCB0unFqUfKIjYb2TaH0geEBy3w9qtXxe3ZW6hzxtZSS9lDg== + +"@swc/core@^1.5.7": + version "1.6.7" + resolved "https://registry.yarnpkg.com/@swc/core/-/core-1.6.7.tgz#5d113df161fd8ec29ab8837f385240f41315735e" + integrity sha512-BBzORL9qWz5hZqAZ83yn+WNaD54RH5eludjqIOboolFOK/Pw+2l00/H77H4CEBJnzCIBQszsyqtITmrn4evp0g== + dependencies: + "@swc/counter" "^0.1.3" + "@swc/types" "^0.1.9" + optionalDependencies: + "@swc/core-darwin-arm64" "1.6.7" + "@swc/core-darwin-x64" "1.6.7" + "@swc/core-linux-arm-gnueabihf" "1.6.7" + "@swc/core-linux-arm64-gnu" "1.6.7" + "@swc/core-linux-arm64-musl" "1.6.7" + "@swc/core-linux-x64-gnu" "1.6.7" + "@swc/core-linux-x64-musl" "1.6.7" + "@swc/core-win32-arm64-msvc" "1.6.7" + "@swc/core-win32-ia32-msvc" "1.6.7" + "@swc/core-win32-x64-msvc" "1.6.7" + +"@swc/counter@^0.1.3": + version "0.1.3" + resolved "https://registry.yarnpkg.com/@swc/counter/-/counter-0.1.3.tgz#cc7463bd02949611c6329596fccd2b0ec782b0e9" + integrity sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ== + +"@swc/types@^0.1.9": + version "0.1.9" + resolved "https://registry.yarnpkg.com/@swc/types/-/types-0.1.9.tgz#e67cdcc2e4dd74a3cef4474b465eb398e7ae83e2" + integrity sha512-qKnCno++jzcJ4lM4NTfYifm1EFSCeIfKiAHAfkENZAV5Kl9PjJIyd2yeeVv6c/2CckuLyv2NmRC5pv6pm2WQBg== + dependencies: + "@swc/counter" "^0.1.3" + +"@types/babel__core@^7.20.5": + version "7.20.5" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.5.tgz#3df15f27ba85319caa07ba08d0721889bb39c017" + integrity sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA== + dependencies: + "@babel/parser" "^7.20.7" + "@babel/types" "^7.20.7" + "@types/babel__generator" "*" + "@types/babel__template" "*" + "@types/babel__traverse" "*" + +"@types/babel__generator@*": + version "7.6.8" + resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.8.tgz#f836c61f48b1346e7d2b0d93c6dacc5b9535d3ab" + integrity sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw== + dependencies: + "@babel/types" "^7.0.0" + +"@types/babel__template@*": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.4.tgz#5672513701c1b2199bc6dad636a9d7491586766f" + integrity sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A== + dependencies: + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" + +"@types/babel__traverse@*": + version "7.20.6" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.20.6.tgz#8dc9f0ae0f202c08d8d4dab648912c8d6038e3f7" + integrity sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg== + dependencies: + "@babel/types" "^7.20.7" + +"@types/chrome@^0.0.268": + version "0.0.268" + resolved "https://registry.yarnpkg.com/@types/chrome/-/chrome-0.0.268.tgz#d5855546f30c83e181cadd77127a162c25b480d2" + integrity sha512-7N1QH9buudSJ7sI8Pe4mBHJr5oZ48s0hcanI9w3wgijAlv1OZNUZve9JR4x42dn5lJ5Sm87V1JNfnoh10EnQlA== + dependencies: + "@types/filesystem" "*" + "@types/har-format" "*" + +"@types/estree@1.0.5", "@types/estree@^1.0.0": + version "1.0.5" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.5.tgz#a6ce3e556e00fd9895dd872dd172ad0d4bd687f4" + integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw== + +"@types/filesystem@*": + version "0.0.36" + resolved "https://registry.yarnpkg.com/@types/filesystem/-/filesystem-0.0.36.tgz#7227c2d76bfed1b21819db310816c7821d303857" + integrity sha512-vPDXOZuannb9FZdxgHnqSwAG/jvdGM8Wq+6N4D/d80z+D4HWH+bItqsZaVRQykAn6WEVeEkLm2oQigyHtgb0RA== + dependencies: + "@types/filewriter" "*" + +"@types/filewriter@*": + version "0.0.33" + resolved "https://registry.yarnpkg.com/@types/filewriter/-/filewriter-0.0.33.tgz#d9d611db9d9cd99ae4e458de420eeb64ad604ea8" + integrity sha512-xFU8ZXTw4gd358lb2jw25nxY9QAgqn2+bKKjKOYfNCzN4DKCFetK7sPtrlpg66Ywe3vWY9FNxprZawAh9wfJ3g== + +"@types/har-format@*": + version "1.2.15" + resolved "https://registry.yarnpkg.com/@types/har-format/-/har-format-1.2.15.tgz#f352493638c2f89d706438a19a9eb300b493b506" + integrity sha512-RpQH4rXLuvTXKR0zqHq3go0RVXYv/YVqv4TnPH95VbwUxZdQlK1EtcMvQvMpDngHbt13Csh9Z4qT9AbkiQH5BA== + +"@types/node@^20.12.12": + version "20.14.1" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.14.1.tgz#2434dbcb1f039e31f2c0e9969da93f52cf6348f3" + integrity sha512-T2MzSGEu+ysB/FkWfqmhV3PLyQlowdptmmgD20C6QxsS8Fmv5SjpZ1ayXaEC0S21/h5UJ9iA6W/5vSNU5l00OA== + dependencies: + undici-types "~5.26.4" + +"@types/triple-beam@^1.3.2": + version "1.3.5" + resolved "https://registry.yarnpkg.com/@types/triple-beam/-/triple-beam-1.3.5.tgz#74fef9ffbaa198eb8b588be029f38b00299caa2c" + integrity sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw== + +"@vitejs/plugin-react-swc@^3.7.0": + version "3.7.0" + resolved "https://registry.yarnpkg.com/@vitejs/plugin-react-swc/-/plugin-react-swc-3.7.0.tgz#e456c0a6d7f562268e1d231af9ac46b86ef47d88" + integrity sha512-yrknSb3Dci6svCd/qhHqhFPDSw0QtjumcqdKMoNNzmOl5lMXTTiqzjWtG4Qask2HdvvzaNgSunbQGet8/GrKdA== + dependencies: + "@swc/core" "^1.5.7" + +"@vitejs/plugin-react@^4.3.1": + version "4.3.1" + resolved "https://registry.yarnpkg.com/@vitejs/plugin-react/-/plugin-react-4.3.1.tgz#d0be6594051ded8957df555ff07a991fb618b48e" + integrity sha512-m/V2syj5CuVnaxcUJOQRel/Wr31FFXRFlnOoq1TVtkCxsY5veGMTEmpWHndrhB2U8ScHtCQB1e+4hWYExQc6Lg== + dependencies: + "@babel/core" "^7.24.5" + "@babel/plugin-transform-react-jsx-self" "^7.24.5" + "@babel/plugin-transform-react-jsx-source" "^7.24.1" + "@types/babel__core" "^7.20.5" + react-refresh "^0.14.2" + +acorn@^8.8.2: + version "8.12.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.12.1.tgz#71616bdccbe25e27a54439e0046e89ca76df2248" + integrity sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg== + +aes-js@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-3.0.0.tgz#e21df10ad6c2053295bcbb8dab40b09dbea87e4d" + integrity sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw== + +algo-msgpack-with-bigint@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/algo-msgpack-with-bigint/-/algo-msgpack-with-bigint-2.1.1.tgz#38bb717220525b3ff42232eefdcd9efb9ad405d6" + integrity sha512-F1tGh056XczEaEAqu7s+hlZUDWwOBT70Eq0lfMpBP2YguSQVyxRbprLq5rELXKQOyOaixTWYhMeMQMzP0U5FoQ== + +algosdk@^1.13.1: + version "1.24.1" + resolved "https://registry.yarnpkg.com/algosdk/-/algosdk-1.24.1.tgz#afc4102457ae0c38a32de6b84f4d713aedfc9e89" + integrity sha512-9moZxdqeJ6GdE4N6fA/GlUP4LrbLZMYcYkt141J4Ss68OfEgH9qW0wBuZ3ZOKEx/xjc5bg7mLP2Gjg7nwrkmww== + dependencies: + algo-msgpack-with-bigint "^2.1.1" + buffer "^6.0.2" + cross-fetch "^3.1.5" + hi-base32 "^0.5.1" + js-sha256 "^0.9.0" + js-sha3 "^0.8.0" + js-sha512 "^0.8.0" + json-bigint "^1.0.0" + tweetnacl "^1.0.3" + vlq "^2.0.4" + +ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +anymatch@~3.1.2: + version "3.1.3" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +arbundles@0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/arbundles/-/arbundles-0.11.0.tgz#2a8bbc142aae6c56588dffd8cd4b20b931a4e578" + integrity sha512-8U4u5TjbD14mBO9bJkUfynVrHztBGtvYcMx2E5Yuyu/iiSRByJDFHfCINAY3+zvllkTipbPjTP5XlACJQIuRcw== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/hash" "^5.7.0" + "@ethersproject/providers" "^5.7.2" + "@ethersproject/signing-key" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + "@ethersproject/wallet" "^5.7.0" + "@irys/arweave" "^0.0.2" + "@noble/ed25519" "^1.6.1" + base64url "^3.0.1" + bs58 "^4.0.1" + keccak "^3.0.2" + secp256k1 "^5.0.0" + optionalDependencies: + "@randlabs/myalgo-connect" "^1.1.2" + algosdk "^1.13.1" + arweave-stream-tx "^1.1.0" + multistream "^4.1.0" + tmp-promise "^3.0.2" + +arconnect@^0.4.2: + version "0.4.2" + resolved "https://registry.yarnpkg.com/arconnect/-/arconnect-0.4.2.tgz#83de7638fb46183e82d7ec7efb5594c5f7cdc806" + integrity sha512-Jkpd4QL3TVqnd3U683gzXmZUVqBUy17DdJDuL/3D9rkysLgX6ymJ2e+sR+xyZF5Rh42CBqDXWNMmCjBXeP7Gbw== + dependencies: + arweave "^1.10.13" + +arweave-stream-tx@^1.1.0: + version "1.2.2" + resolved "https://registry.yarnpkg.com/arweave-stream-tx/-/arweave-stream-tx-1.2.2.tgz#2d5c66554301baacd02586a152fbb198b422112f" + integrity sha512-bNt9rj0hbAEzoUZEF2s6WJbIz8nasZlZpxIw03Xm8fzb9gRiiZlZGW3lxQLjfc9Z0VRUWDzwtqoYeEoB/JDToQ== + dependencies: + exponential-backoff "^3.1.0" + +arweave@1.14.4: + version "1.14.4" + resolved "https://registry.yarnpkg.com/arweave/-/arweave-1.14.4.tgz#5ba22136aa0e7fd9495258a3931fb770c9d6bf21" + integrity sha512-tmqU9fug8XAmFETYwgUhLaD3WKav5DaM4p1vgJpEj/Px2ORPPMikwnSySlFymmL2qgRh2ZBcZsg11+RXPPGLsA== + dependencies: + arconnect "^0.4.2" + asn1.js "^5.4.1" + base64-js "^1.5.1" + bignumber.js "^9.0.2" + +arweave@^1.10.13, arweave@^1.13.7: + version "1.15.1" + resolved "https://registry.yarnpkg.com/arweave/-/arweave-1.15.1.tgz#c6183136b20980c81a8cb77ce6fd9fb333e1a174" + integrity sha512-rT7FOwqdudd5npqp4xOYdDT2035LtpcqePjwirh4wjRiEtVsz1FZkRiM2Yj+fOAwYzOm/hNG0GDOipDSaiEGGQ== + dependencies: + arconnect "^0.4.2" + asn1.js "^5.4.1" + base64-js "^1.5.1" + bignumber.js "^9.0.2" + +asn1.js@^4.10.1: + version "4.10.1" + resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.10.1.tgz#b9c2bf5805f1e64aadeed6df3a2bfafb5a73f5a0" + integrity sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw== + dependencies: + bn.js "^4.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + +asn1.js@^5.4.1: + version "5.4.1" + resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-5.4.1.tgz#11a980b84ebb91781ce35b0fdc2ee294e3783f07" + integrity sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA== + dependencies: + bn.js "^4.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + safer-buffer "^2.1.0" + +assert@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/assert/-/assert-2.1.0.tgz#6d92a238d05dc02e7427c881fb8be81c8448b2dd" + integrity sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw== + dependencies: + call-bind "^1.0.2" + is-nan "^1.3.2" + object-is "^1.1.5" + object.assign "^4.1.4" + util "^0.12.5" + +async-retry@^1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/async-retry/-/async-retry-1.3.3.tgz#0e7f36c04d8478e7a58bdbed80cedf977785f280" + integrity sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw== + dependencies: + retry "0.13.1" + +async@^3.2.3: + version "3.2.5" + resolved "https://registry.yarnpkg.com/async/-/async-3.2.5.tgz#ebd52a8fdaf7a2289a24df399f8d8485c8a46b66" + integrity sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg== + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== + +available-typed-arrays@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz#a5cc375d6a03c2efc87a553f3e0b1522def14846" + integrity sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ== + dependencies: + possible-typed-array-names "^1.0.0" + +axios-retry@^4.3.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/axios-retry/-/axios-retry-4.4.0.tgz#2df4b9647652e3a4032891001d97bb493607e4aa" + integrity sha512-yewTKjzl6jSgc+2M7FCJ3LxRGgL1iiXHcj+E6h6xie6H1mTHr7yqaUroWIvVXG1UKSPwGDXxV05YxtGvrD6Paw== + dependencies: + is-retry-allowed "^2.2.0" + +axios@1.7.2, axios@^1.4.0: + version "1.7.2" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.7.2.tgz#b625db8a7051fbea61c35a3cbb3a1daa7b9c7621" + integrity sha512-2A8QhOMrbomlDuiLeK9XibIBzuHeRcqqNOHp0Cyp5EoJ1IFDh+XZH3A6BkXtv0K4gFGCI0Y4BM7B1wOEi0Rmgw== + dependencies: + follow-redirects "^1.15.6" + form-data "^4.0.0" + proxy-from-env "^1.1.0" + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +base-x@^3.0.2: + version "3.0.9" + resolved "https://registry.yarnpkg.com/base-x/-/base-x-3.0.9.tgz#6349aaabb58526332de9f60995e548a53fe21320" + integrity sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ== + dependencies: + safe-buffer "^5.0.1" + +base64-js@^1.3.1, base64-js@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + +base64url@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/base64url/-/base64url-3.0.1.tgz#6399d572e2bc3f90a9a8b22d5dbb0a32d33f788d" + integrity sha512-ir1UPr3dkwexU7FdV8qBBbNDRUhMmIekYMFZfi+C/sLNnRESKPl23nB9b2pltqfOQNnGzsDdId90AEtG5tCx4A== + +bech32@1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/bech32/-/bech32-1.1.4.tgz#e38c9f37bf179b8eb16ae3a772b40c356d4832e9" + integrity sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ== + +bignumber.js@^9.0.0, bignumber.js@^9.0.2, bignumber.js@^9.1.1: + version "9.1.2" + resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.1.2.tgz#b7c4242259c008903b13707983b5f4bbd31eda0c" + integrity sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug== + +binary-extensions@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" + integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== + +bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.9: + version "4.12.0" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" + integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== + +bn.js@^5.0.0, bn.js@^5.2.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70" + integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== + +boolbase@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" + integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww== + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +brace-expansion@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" + integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== + dependencies: + balanced-match "^1.0.0" + +braces@^3.0.3, braces@~3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" + integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== + dependencies: + fill-range "^7.1.1" + +brorand@^1.0.1, brorand@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" + integrity sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w== + +browser-resolve@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-2.0.0.tgz#99b7304cb392f8d73dba741bb2d7da28c6d7842b" + integrity sha512-7sWsQlYL2rGLy2IWm8WL8DCTJvYLc/qlOnsakDac87SOoCd16WLsaAMdCiAqsTNHIe+SXfaqyxyo6THoWqs8WQ== + dependencies: + resolve "^1.17.0" + +browserify-aes@^1.0.4, browserify-aes@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" + integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== + dependencies: + buffer-xor "^1.0.3" + cipher-base "^1.0.0" + create-hash "^1.1.0" + evp_bytestokey "^1.0.3" + inherits "^2.0.1" + safe-buffer "^5.0.1" + +browserify-cipher@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0" + integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w== + dependencies: + browserify-aes "^1.0.4" + browserify-des "^1.0.0" + evp_bytestokey "^1.0.0" + +browserify-des@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c" + integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A== + dependencies: + cipher-base "^1.0.1" + des.js "^1.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +browserify-rsa@^4.0.0, browserify-rsa@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.1.0.tgz#b2fd06b5b75ae297f7ce2dc651f918f5be158c8d" + integrity sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog== + dependencies: + bn.js "^5.0.0" + randombytes "^2.0.1" + +browserify-sign@^4.0.0: + version "4.2.3" + resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.2.3.tgz#7afe4c01ec7ee59a89a558a4b75bd85ae62d4208" + integrity sha512-JWCZW6SKhfhjJxO8Tyiiy+XYB7cqd2S5/+WeYHsKdNKFlCBhKbblba1A/HN/90YwtxKc8tCErjffZl++UNmGiw== + dependencies: + bn.js "^5.2.1" + browserify-rsa "^4.1.0" + create-hash "^1.2.0" + create-hmac "^1.1.7" + elliptic "^6.5.5" + hash-base "~3.0" + inherits "^2.0.4" + parse-asn1 "^5.1.7" + readable-stream "^2.3.8" + safe-buffer "^5.2.1" + +browserify-zlib@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f" + integrity sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA== + dependencies: + pako "~1.0.5" + +browserslist@^4.22.2: + version "4.23.1" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.23.1.tgz#ce4af0534b3d37db5c1a4ca98b9080f985041e96" + integrity sha512-TUfofFo/KsK/bWZ9TWQ5O26tsWW4Uhmt8IYklbnUa70udB6P2wA7w7o4PY4muaEPBQaAX+CEnmmIA41NVHtPVw== + dependencies: + caniuse-lite "^1.0.30001629" + electron-to-chromium "^1.4.796" + node-releases "^2.0.14" + update-browserslist-db "^1.0.16" + +bs58@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/bs58/-/bs58-4.0.1.tgz#be161e76c354f6f788ae4071f63f34e8c4f0a42a" + integrity sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw== + dependencies: + base-x "^3.0.2" + +buffer-from@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== + +buffer-xor@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" + integrity sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ== + +buffer@^5.7.1: + version "5.7.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" + integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.1.13" + +buffer@^6.0.2, buffer@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" + integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.2.1" + +builtin-status-codes@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" + integrity sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ== + +call-bind@^1.0.0, call-bind@^1.0.2, call-bind@^1.0.5, call-bind@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9" + integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w== + dependencies: + es-define-property "^1.0.0" + es-errors "^1.3.0" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" + set-function-length "^1.2.1" + +camel-case@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-4.1.2.tgz#9728072a954f805228225a6deea6b38461e1bd5a" + integrity sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw== + dependencies: + pascal-case "^3.1.2" + tslib "^2.0.3" + +caniuse-lite@^1.0.30001629: + version "1.0.30001640" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001640.tgz#32c467d4bf1f1a0faa63fc793c2ba81169e7652f" + integrity sha512-lA4VMpW0PSUrFnkmVuEKBUovSWKhj7puyCg8StBChgu298N1AtuF1sKWEvfDuimSEDbhlb/KqPKC3fs1HbuQUA== + +chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + 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" + +chalk@^4.0.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chokidar@^3.5.3: + version "3.6.0" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" + integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + +cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" + integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +clean-css@^5.2.2: + version "5.3.3" + resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-5.3.3.tgz#b330653cd3bd6b75009cc25c714cae7b93351ccd" + integrity sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg== + dependencies: + source-map "~0.6.0" + +color-convert@^1.9.0, color-convert@^1.9.3: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== + +color-name@^1.0.0, color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +color-string@^1.6.0: + version "1.9.1" + resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.9.1.tgz#4467f9146f036f855b764dfb5bf8582bf342c7a4" + integrity sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg== + dependencies: + color-name "^1.0.0" + simple-swizzle "^0.2.2" + +color@^3.1.3: + version "3.2.1" + resolved "https://registry.yarnpkg.com/color/-/color-3.2.1.tgz#3544dc198caf4490c3ecc9a790b54fe9ff45e164" + integrity sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA== + dependencies: + color-convert "^1.9.3" + color-string "^1.6.0" + +colorette@^2.0.16: + version "2.0.20" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" + integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== + +colorspace@1.1.x: + version "1.1.4" + resolved "https://registry.yarnpkg.com/colorspace/-/colorspace-1.1.4.tgz#8d442d1186152f60453bf8070cd66eb364e59243" + integrity sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w== + dependencies: + color "^3.1.3" + text-hex "1.0.x" + +combined-stream@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + +commander@^2.20.0: + version "2.20.3" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + +commander@^8.3.0: + version "8.3.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66" + integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +connect-history-api-fallback@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz#8b32089359308d111115d81cad3fceab888f97bc" + integrity sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg== + +consola@^2.15.3: + version "2.15.3" + resolved "https://registry.yarnpkg.com/consola/-/consola-2.15.3.tgz#2e11f98d6a4be71ff72e0bdf07bd23e12cb61550" + integrity sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw== + +console-browserify@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336" + integrity sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA== + +constants-browserify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" + integrity sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ== + +convert-source-map@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" + integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== + +core-util-is@~1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" + integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== + +create-ecdh@^4.0.0: + version "4.0.4" + resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.4.tgz#d6e7f4bffa66736085a0762fd3a632684dabcc4e" + integrity sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A== + dependencies: + bn.js "^4.1.0" + elliptic "^6.5.3" + +create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" + integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== + dependencies: + cipher-base "^1.0.1" + inherits "^2.0.1" + md5.js "^1.3.4" + ripemd160 "^2.0.1" + sha.js "^2.4.0" + +create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" + integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== + dependencies: + cipher-base "^1.0.3" + create-hash "^1.1.0" + inherits "^2.0.1" + ripemd160 "^2.0.0" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +create-require@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" + integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== + +cross-fetch@^3.1.5: + version "3.1.8" + resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.8.tgz#0327eba65fd68a7d119f8fb2bf9334a1a7956f82" + integrity sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg== + dependencies: + node-fetch "^2.6.12" + +crypto-browserify@^3.11.0: + version "3.12.0" + resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" + integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg== + dependencies: + browserify-cipher "^1.0.0" + browserify-sign "^4.0.0" + create-ecdh "^4.0.0" + create-hash "^1.1.0" + create-hmac "^1.1.0" + diffie-hellman "^5.0.0" + inherits "^2.0.1" + pbkdf2 "^3.0.3" + public-encrypt "^4.0.0" + randombytes "^2.0.0" + randomfill "^1.0.3" + +css-select@^4.2.1: + version "4.3.0" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-4.3.0.tgz#db7129b2846662fd8628cfc496abb2b59e41529b" + integrity sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ== + dependencies: + boolbase "^1.0.0" + css-what "^6.0.1" + domhandler "^4.3.1" + domutils "^2.8.0" + nth-check "^2.0.1" + +css-what@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-6.1.0.tgz#fb5effcf76f1ddea2c81bdfaa4de44e79bac70f4" + integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw== + +debug@^4.1.0, debug@^4.3.1, debug@^4.3.4: + version "4.3.5" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.5.tgz#e83444eceb9fedd4a1da56d671ae2446a01a6e1e" + integrity sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg== + dependencies: + ms "2.1.2" + +define-data-property@^1.0.1, define-data-property@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" + integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== + dependencies: + es-define-property "^1.0.0" + es-errors "^1.3.0" + gopd "^1.0.1" + +define-properties@^1.1.3, define-properties@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" + integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== + dependencies: + define-data-property "^1.0.1" + has-property-descriptors "^1.0.0" + object-keys "^1.1.1" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== + +des.js@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.1.0.tgz#1d37f5766f3bbff4ee9638e871a8768c173b81da" + integrity sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg== + dependencies: + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + +diffie-hellman@^5.0.0: + version "5.0.3" + resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" + integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg== + dependencies: + bn.js "^4.1.0" + miller-rabin "^4.0.0" + randombytes "^2.0.0" + +dom-serializer@^1.0.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-1.4.1.tgz#de5d41b1aea290215dc45a6dae8adcf1d32e2d30" + integrity sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag== + dependencies: + domelementtype "^2.0.1" + domhandler "^4.2.0" + entities "^2.0.0" + +domain-browser@^4.22.0: + version "4.23.0" + resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-4.23.0.tgz#427ebb91efcb070f05cffdfb8a4e9a6c25f8c94b" + integrity sha512-ArzcM/II1wCCujdCNyQjXrAFwS4mrLh4C7DZWlaI8mdh7h3BfKdNd3bKXITfl2PT9FtfQqaGvhi1vPRQPimjGA== + +domelementtype@^2.0.1, domelementtype@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d" + integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== + +domhandler@^4.2.0, domhandler@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.3.1.tgz#8d792033416f59d68bc03a5aa7b018c1ca89279c" + integrity sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ== + dependencies: + domelementtype "^2.2.0" + +domutils@^2.8.0: + version "2.8.0" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.8.0.tgz#4437def5db6e2d1f5d6ee859bd95ca7d02048135" + integrity sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A== + dependencies: + dom-serializer "^1.0.1" + domelementtype "^2.2.0" + domhandler "^4.2.0" + +dot-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-3.0.4.tgz#9b2b670d00a431667a8a75ba29cd1b98809ce751" + integrity sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w== + dependencies: + no-case "^3.0.4" + tslib "^2.0.3" + +dotenv-expand@^8.0.2: + version "8.0.3" + resolved "https://registry.yarnpkg.com/dotenv-expand/-/dotenv-expand-8.0.3.tgz#29016757455bcc748469c83a19b36aaf2b83dd6e" + integrity sha512-SErOMvge0ZUyWd5B0NXMQlDkN+8r+HhVUsxgOO7IoPDOdDRD2JjExpN6y3KnFR66jsJMwSn1pqIivhU5rcJiNg== + +dotenv@^16.0.0: + version "16.4.5" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.4.5.tgz#cdd3b3b604cb327e286b4762e13502f717cb099f" + integrity sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg== + +ejs@^3.1.6: + version "3.1.10" + resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.1.10.tgz#69ab8358b14e896f80cc39e62087b88500c3ac3b" + integrity sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA== + dependencies: + jake "^10.8.5" + +electron-to-chromium@^1.4.796: + version "1.4.816" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.816.tgz#3624649d1e7fde5cdbadf59d31a524245d8ee85f" + integrity sha512-EKH5X5oqC6hLmiS7/vYtZHZFTNdhsYG5NVPRN6Yn0kQHNBlT59+xSM8HBy66P5fxWpKgZbPqb+diC64ng295Jw== + +elliptic@6.5.4: + version "6.5.4" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" + integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== + dependencies: + bn.js "^4.11.9" + brorand "^1.1.0" + hash.js "^1.0.0" + hmac-drbg "^1.0.1" + inherits "^2.0.4" + minimalistic-assert "^1.0.1" + minimalistic-crypto-utils "^1.0.1" + +elliptic@^6.5.3, elliptic@^6.5.4, elliptic@^6.5.5: + version "6.5.5" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.5.tgz#c715e09f78b6923977610d4c2346d6ce22e6dded" + integrity sha512-7EjbcmUm17NQFu4Pmgmq2olYMj8nwMnpcddByChSUjArp8F5DQWcIcpriwO4ZToLNAJig0yiyjswfyGNje/ixw== + dependencies: + bn.js "^4.11.9" + brorand "^1.1.0" + hash.js "^1.0.0" + hmac-drbg "^1.0.1" + inherits "^2.0.4" + minimalistic-assert "^1.0.1" + minimalistic-crypto-utils "^1.0.1" + +enabled@2.0.x: + version "2.0.0" + resolved "https://registry.yarnpkg.com/enabled/-/enabled-2.0.0.tgz#f9dd92ec2d6f4bbc0d5d1e64e21d61cd4665e7c2" + integrity sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ== + +entities@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" + integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== + +es-define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.0.tgz#c7faefbdff8b2696cf5f46921edfb77cc4ba3845" + integrity sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ== + dependencies: + get-intrinsic "^1.2.4" + +es-errors@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" + integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== + +esbuild@^0.21.3: + version "0.21.5" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.21.5.tgz#9ca301b120922959b766360d8ac830da0d02997d" + integrity sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw== + optionalDependencies: + "@esbuild/aix-ppc64" "0.21.5" + "@esbuild/android-arm" "0.21.5" + "@esbuild/android-arm64" "0.21.5" + "@esbuild/android-x64" "0.21.5" + "@esbuild/darwin-arm64" "0.21.5" + "@esbuild/darwin-x64" "0.21.5" + "@esbuild/freebsd-arm64" "0.21.5" + "@esbuild/freebsd-x64" "0.21.5" + "@esbuild/linux-arm" "0.21.5" + "@esbuild/linux-arm64" "0.21.5" + "@esbuild/linux-ia32" "0.21.5" + "@esbuild/linux-loong64" "0.21.5" + "@esbuild/linux-mips64el" "0.21.5" + "@esbuild/linux-ppc64" "0.21.5" + "@esbuild/linux-riscv64" "0.21.5" + "@esbuild/linux-s390x" "0.21.5" + "@esbuild/linux-x64" "0.21.5" + "@esbuild/netbsd-x64" "0.21.5" + "@esbuild/openbsd-x64" "0.21.5" + "@esbuild/sunos-x64" "0.21.5" + "@esbuild/win32-arm64" "0.21.5" + "@esbuild/win32-ia32" "0.21.5" + "@esbuild/win32-x64" "0.21.5" + +escalade@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.2.tgz#54076e9ab29ea5bf3d8f1ed62acffbb88272df27" + integrity sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA== + +escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== + +estree-walker@^2.0.1, estree-walker@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac" + integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== + +eventemitter3@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-5.0.1.tgz#53f5ffd0a492ac800721bb42c66b841de96423c4" + integrity sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA== + +events@^3.0.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" + integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== + +evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" + integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== + dependencies: + md5.js "^1.3.4" + safe-buffer "^5.1.1" + +exponential-backoff@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/exponential-backoff/-/exponential-backoff-3.1.1.tgz#64ac7526fe341ab18a39016cd22c787d01e00bf6" + integrity sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw== + +fast-glob@^3.2.11, fast-glob@^3.2.7: + version "3.3.2" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" + integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + +fastq@^1.6.0: + version "1.17.1" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.17.1.tgz#2a523f07a4e7b1e81a42b91b8bf2254107753b47" + integrity sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w== + dependencies: + reusify "^1.0.4" + +fecha@^4.2.0: + version "4.2.3" + resolved "https://registry.yarnpkg.com/fecha/-/fecha-4.2.3.tgz#4d9ccdbc61e8629b259fdca67e65891448d569fd" + integrity sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw== + +filelist@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/filelist/-/filelist-1.0.4.tgz#f78978a1e944775ff9e62e744424f215e58352b5" + integrity sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q== + dependencies: + minimatch "^5.0.1" + +fill-range@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" + integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== + dependencies: + to-regex-range "^5.0.1" + +find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +fn.name@1.x.x: + version "1.1.0" + resolved "https://registry.yarnpkg.com/fn.name/-/fn.name-1.1.0.tgz#26cad8017967aea8731bc42961d04a3d5988accc" + integrity sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw== + +follow-redirects@^1.15.6: + version "1.15.6" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.6.tgz#7f815c0cda4249c74ff09e95ef97c23b5fd0399b" + integrity sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA== + +for-each@^0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" + integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== + dependencies: + is-callable "^1.1.3" + +form-data@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" + integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + +fs-extra@^10.0.1: + version "10.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf" + integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fs-extra@^11.1.0: + version "11.2.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.2.0.tgz#e70e17dfad64232287d01929399e0ea7c86b0e5b" + integrity sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fsevents@~2.3.2, fsevents@~2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== + +function-bind@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== + +gensync@^1.0.0-beta.2: + version "1.0.0-beta.2" + resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" + integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== + +get-intrinsic@^1.1.3, get-intrinsic@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd" + integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ== + dependencies: + es-errors "^1.3.0" + function-bind "^1.1.2" + has-proto "^1.0.1" + has-symbols "^1.0.3" + hasown "^2.0.0" + +glob-parent@^5.1.2, glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + +gopd@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" + integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== + dependencies: + get-intrinsic "^1.1.3" + +graceful-fs@^4.1.6, graceful-fs@^4.2.0: + version "4.2.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" + integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== + dependencies: + es-define-property "^1.0.0" + +has-proto@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.3.tgz#b31ddfe9b0e6e9914536a6ab286426d0214f77fd" + integrity sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q== + +has-symbols@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" + integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== + +has-tostringtag@^1.0.0, has-tostringtag@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc" + integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== + dependencies: + has-symbols "^1.0.3" + +hash-base@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33" + integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA== + dependencies: + inherits "^2.0.4" + readable-stream "^3.6.0" + safe-buffer "^5.2.0" + +hash-base@~3.0: + version "3.0.4" + resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.0.4.tgz#5fc8686847ecd73499403319a6b0a3f3f6ae4918" + integrity sha512-EeeoJKjTyt868liAlVmcv2ZsUfGHlE3Q+BICOXcZiwN3osr5Q/zFGYmTJpoIzuaSTAwndFy+GqhEwlU4L3j4Ow== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +hash.js@1.1.7, hash.js@^1.0.0, hash.js@^1.0.3: + version "1.1.7" + resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" + integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== + dependencies: + inherits "^2.0.3" + minimalistic-assert "^1.0.1" + +hasown@^2.0.0, hasown@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" + integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== + dependencies: + function-bind "^1.1.2" + +he@1.2.0, he@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" + integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== + +hi-base32@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/hi-base32/-/hi-base32-0.5.1.tgz#1279f2ddae2673219ea5870c2121d2a33132857e" + integrity sha512-EmBBpvdYh/4XxsnUybsPag6VikPYnN30td+vQk+GI3qpahVEG9+gTkG0aXVxTjBqQ5T6ijbWIu77O+C5WFWsnA== + +hmac-drbg@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" + integrity sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg== + dependencies: + hash.js "^1.0.3" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.1" + +html-minifier-terser@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz#bfc818934cc07918f6b3669f5774ecdfd48f32ab" + integrity sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw== + dependencies: + camel-case "^4.1.2" + clean-css "^5.2.2" + commander "^8.3.0" + he "^1.2.0" + param-case "^3.0.4" + relateurl "^0.2.7" + terser "^5.10.0" + +https-browserify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" + integrity sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg== + +hyper-async@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/hyper-async/-/hyper-async-1.1.2.tgz#b9a83be36e726bface6f4a5b84f1a1a25bf19e6a" + integrity sha512-cnpOgKa+5FZOaccTtjduac1FrZuSc38/ftCp3vYJdUMt+7c+uvGDKLDK4MTNK8D3aFjIeveVrPcSgUPvzZLopg== + +ieee754@^1.1.13, ieee754@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + +inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3, inherits@~2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +is-arguments@^1.0.4: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" + integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-arrayish@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" + integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-callable@^1.1.3: + version "1.2.7" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" + integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== + +is-core-module@^2.13.0: + version "2.14.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.14.0.tgz#43b8ef9f46a6a08888db67b1ffd4ec9e3dfd59d1" + integrity sha512-a5dFJih5ZLYlRtDc0dZWP7RiKr6xIKzmn/oAYCDvdLThadVgyJwlaoQPmRtMSpz+rk0OGAgIu+TcM9HUF0fk1A== + dependencies: + hasown "^2.0.2" + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + +is-generator-function@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72" + integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== + dependencies: + has-tostringtag "^1.0.0" + +is-glob@^4.0.1, is-glob@~4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-nan@^1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/is-nan/-/is-nan-1.3.2.tgz#043a54adea31748b55b6cd4e09aadafa69bd9e1d" + integrity sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-retry-allowed@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-2.2.0.tgz#88f34cbd236e043e71b6932d09b0c65fb7b4d71d" + integrity sha512-XVm7LOeLpTW4jV19QSH38vkswxoLud8sQ57YwJVTPWdiaI9I8keEhGFpBlslyVsgdQy4Opg8QOLb8YRgsyZiQg== + +is-stream@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" + integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== + +is-typed-array@^1.1.3: + version "1.1.13" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.13.tgz#d6c5ca56df62334959322d7d7dd1cca50debe229" + integrity sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw== + dependencies: + which-typed-array "^1.1.14" + +isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== + +isomorphic-timers-promises@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/isomorphic-timers-promises/-/isomorphic-timers-promises-1.0.1.tgz#e4137c24dbc54892de8abae3a4b5c1ffff381598" + integrity sha512-u4sej9B1LPSxTGKB/HiuzvEQnXH0ECYkSVQU39koSwmFAxhlEAFl9RdTvLv4TOTQUgBS5O3O5fwUxk6byBZ+IQ== + +jake@^10.8.5: + version "10.9.1" + resolved "https://registry.yarnpkg.com/jake/-/jake-10.9.1.tgz#8dc96b7fcc41cb19aa502af506da4e1d56f5e62b" + integrity sha512-61btcOHNnLnsOdtLgA5efqQWjnSi/vow5HbI7HMdKKWqvrKR1bLK3BPlJn9gcSaP2ewuamUSMB5XEy76KUIS2w== + dependencies: + async "^3.2.3" + chalk "^4.0.2" + filelist "^1.0.4" + minimatch "^3.1.2" + +js-sha256@^0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/js-sha256/-/js-sha256-0.9.0.tgz#0b89ac166583e91ef9123644bd3c5334ce9d0966" + integrity sha512-sga3MHh9sgQN2+pJ9VYZ+1LPwXOxuBJBA5nrR5/ofPfuiJBE2hnjsaN8se8JznOmGLN2p49Pe5U/ttafcs/apA== + +js-sha3@0.8.0, js-sha3@^0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840" + integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q== + +js-sha512@^0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/js-sha512/-/js-sha512-0.8.0.tgz#dd22db8d02756faccf19f218e3ed61ec8249f7d4" + integrity sha512-PWsmefG6Jkodqt+ePTvBZCSMFgN7Clckjd0O7su3I0+BW2QWUTJNzjktHsztGLhncP2h8mcF9V9Y2Ha59pAViQ== + +js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + +json-bigint@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/json-bigint/-/json-bigint-1.0.0.tgz#ae547823ac0cad8398667f8cd9ef4730f5b01ff1" + integrity sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ== + dependencies: + bignumber.js "^9.0.0" + +json5@^2.2.3: + version "2.2.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== + +jsonfile@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" + integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== + dependencies: + universalify "^2.0.0" + optionalDependencies: + graceful-fs "^4.1.6" + +keccak@^3.0.2: + version "3.0.4" + resolved "https://registry.yarnpkg.com/keccak/-/keccak-3.0.4.tgz#edc09b89e633c0549da444432ecf062ffadee86d" + integrity sha512-3vKuW0jV8J3XNTzvfyicFR5qvxrSAGl7KIhvgOu5cmWwM7tZRj3fMbj/pfIf4be7aznbc+prBWGjywox/g2Y6Q== + dependencies: + node-addon-api "^2.0.0" + node-gyp-build "^4.2.0" + readable-stream "^3.6.0" + +kuler@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/kuler/-/kuler-2.0.0.tgz#e2c570a3800388fb44407e851531c1d670b061b3" + integrity sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A== + +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + +logform@^2.3.2, logform@^2.4.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/logform/-/logform-2.6.0.tgz#8c82a983f05d6eaeb2d75e3decae7a768b2bf9b5" + integrity sha512-1ulHeNPp6k/LD8H91o7VYFBng5i1BDE7HoKxVbZiGFidS1Rj65qcywLxX+pVfAPoQJEjRdvKcusKwOupHCVOVQ== + dependencies: + "@colors/colors" "1.6.0" + "@types/triple-beam" "^1.3.2" + fecha "^4.2.0" + ms "^2.1.1" + safe-stable-stringify "^2.3.1" + triple-beam "^1.3.0" + +lower-case@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.2.tgz#6fa237c63dbdc4a82ca0fd882e4722dc5e634e28" + integrity sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg== + dependencies: + tslib "^2.0.3" + +lru-cache@^10.2.2: + version "10.2.2" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.2.2.tgz#48206bc114c1252940c41b25b41af5b545aca878" + integrity sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ== + +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" + +magic-string@^0.30.3: + version "0.30.10" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.10.tgz#123d9c41a0cb5640c892b041d4cfb3bd0aa4b39e" + integrity sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ== + dependencies: + "@jridgewell/sourcemap-codec" "^1.4.15" + +md5.js@^1.3.4: + version "1.3.5" + resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" + integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +merge2@^1.3.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +micromatch@^4.0.4: + version "4.0.7" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.7.tgz#33e8190d9fe474a9895525f5618eee136d46c2e5" + integrity sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q== + dependencies: + braces "^3.0.3" + picomatch "^2.3.1" + +miller-rabin@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" + integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA== + dependencies: + bn.js "^4.0.0" + brorand "^1.0.1" + +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-types@^2.1.12: + version "2.1.35" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + +minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== + +minimalistic-crypto-utils@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" + integrity sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg== + +minimatch@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minimatch@^5.0.1: + version "5.1.6" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96" + integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== + dependencies: + brace-expansion "^2.0.1" + +mnemonist@^0.39.8: + version "0.39.8" + resolved "https://registry.yarnpkg.com/mnemonist/-/mnemonist-0.39.8.tgz#9078cd8386081afd986cca34b52b5d84ea7a4d38" + integrity sha512-vyWo2K3fjrUw8YeeZ1zF0fy6Mu59RHokURlld8ymdUPjMlD9EC9ov1/YPqTgqRvUN9nTr3Gqfz29LYAmu0PHPQ== + dependencies: + obliterator "^2.0.1" + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +ms@^2.1.1: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +multistream@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/multistream/-/multistream-4.1.0.tgz#7bf00dfd119556fbc153cff3de4c6d477909f5a8" + integrity sha512-J1XDiAmmNpRCBfIWJv+n0ymC4ABcf/Pl+5YvC5B/D2f/2+8PtHvCNxMPKiQcZyi922Hq69J2YOpb1pTywfifyw== + dependencies: + once "^1.4.0" + readable-stream "^3.6.0" + +nanoid@^3.3.7: + version "3.3.7" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" + integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== + +no-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d" + integrity sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg== + dependencies: + lower-case "^2.0.2" + tslib "^2.0.3" + +node-addon-api@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-2.0.2.tgz#432cfa82962ce494b132e9d72a15b29f71ff5d32" + integrity sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA== + +node-addon-api@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-5.1.0.tgz#49da1ca055e109a23d537e9de43c09cca21eb762" + integrity sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA== + +node-fetch@^2.6.12: + version "2.7.0" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" + integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== + dependencies: + whatwg-url "^5.0.0" + +node-gyp-build@^4.2.0: + version "4.8.1" + resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.8.1.tgz#976d3ad905e71b76086f4f0b0d3637fe79b6cda5" + integrity sha512-OSs33Z9yWr148JZcbZd5WiAXhh/n9z8TxQcdMhIOlpN9AhWpLfvVFO73+m77bBABQMaY9XSvIa+qk0jlI7Gcaw== + +node-html-parser@^5.3.3: + version "5.4.2" + resolved "https://registry.yarnpkg.com/node-html-parser/-/node-html-parser-5.4.2.tgz#93e004038c17af80226c942336990a0eaed8136a" + integrity sha512-RaBPP3+51hPne/OolXxcz89iYvQvKOydaqoePpOgXcrOKZhjVIzmpKZz+Hd/RBO2/zN2q6CNJhQzucVz+u3Jyw== + dependencies: + css-select "^4.2.1" + he "1.2.0" + +node-releases@^2.0.14: + version "2.0.14" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.14.tgz#2ffb053bceb8b2be8495ece1ab6ce600c4461b0b" + integrity sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw== + +node-stdlib-browser@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/node-stdlib-browser/-/node-stdlib-browser-1.2.0.tgz#5ddcfdf4063b88fb282979a1aa6ddab9728d5e4c" + integrity sha512-VSjFxUhRhkyed8AtLwSCkMrJRfQ3e2lGtG3sP6FEgaLKBBbxM/dLfjRe1+iLhjvyLFW3tBQ8+c0pcOtXGbAZJg== + dependencies: + assert "^2.0.0" + browser-resolve "^2.0.0" + browserify-zlib "^0.2.0" + buffer "^5.7.1" + console-browserify "^1.1.0" + constants-browserify "^1.0.0" + create-require "^1.1.1" + crypto-browserify "^3.11.0" + domain-browser "^4.22.0" + events "^3.0.0" + https-browserify "^1.0.0" + isomorphic-timers-promises "^1.0.1" + os-browserify "^0.3.0" + path-browserify "^1.0.1" + pkg-dir "^5.0.0" + process "^0.11.10" + punycode "^1.4.1" + querystring-es3 "^0.2.1" + readable-stream "^3.6.0" + stream-browserify "^3.0.0" + stream-http "^3.2.0" + string_decoder "^1.0.0" + timers-browserify "^2.0.4" + tty-browserify "0.0.1" + url "^0.11.0" + util "^0.12.4" + vm-browserify "^1.0.1" + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +nth-check@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.1.1.tgz#c9eab428effce36cd6b92c924bdb000ef1f1ed1d" + integrity sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w== + dependencies: + boolbase "^1.0.0" + +object-inspect@^1.13.1: + version "1.13.2" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.2.tgz#dea0088467fb991e67af4058147a24824a3043ff" + integrity sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g== + +object-is@^1.1.5: + version "1.1.6" + resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.6.tgz#1a6a53aed2dd8f7e6775ff870bea58545956ab07" + integrity sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + +object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object.assign@^4.1.4: + version "4.1.5" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.5.tgz#3a833f9ab7fdb80fc9e8d2300c803d216d8fdbb0" + integrity sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ== + dependencies: + call-bind "^1.0.5" + define-properties "^1.2.1" + has-symbols "^1.0.3" + object-keys "^1.1.1" + +obliterator@^2.0.1: + version "2.0.4" + resolved "https://registry.yarnpkg.com/obliterator/-/obliterator-2.0.4.tgz#fa650e019b2d075d745e44f1effeb13a2adbe816" + integrity sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ== + +once@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + +one-time@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/one-time/-/one-time-1.0.0.tgz#e06bc174aed214ed58edede573b433bbf827cb45" + integrity sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g== + dependencies: + fn.name "1.x.x" + +os-browserify@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" + integrity sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A== + +p-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + +pako@~1.0.5: + version "1.0.11" + resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" + integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== + +param-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/param-case/-/param-case-3.0.4.tgz#7d17fe4aa12bde34d4a77d91acfb6219caad01c5" + integrity sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A== + dependencies: + dot-case "^3.0.4" + tslib "^2.0.3" + +parse-asn1@^5.0.0, parse-asn1@^5.1.7: + version "5.1.7" + resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.7.tgz#73cdaaa822125f9647165625eb45f8a051d2df06" + integrity sha512-CTM5kuWR3sx9IFamcl5ErfPl6ea/N8IYwiJ+vpeB2g+1iknv7zBl5uPwbMbRVznRVbrNY6lGuDoE5b30grmbqg== + dependencies: + asn1.js "^4.10.1" + browserify-aes "^1.2.0" + evp_bytestokey "^1.0.3" + hash-base "~3.0" + pbkdf2 "^3.1.2" + safe-buffer "^5.2.1" + +pascal-case@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/pascal-case/-/pascal-case-3.1.2.tgz#b48e0ef2b98e205e7c1dae747d0b1508237660eb" + integrity sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g== + dependencies: + no-case "^3.0.4" + tslib "^2.0.3" + +path-browserify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-1.0.1.tgz#d98454a9c3753d5790860f16f68867b9e46be1fd" + integrity sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g== + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +pathe@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/pathe/-/pathe-0.2.0.tgz#30fd7bbe0a0d91f0e60bae621f5d19e9e225c339" + integrity sha512-sTitTPYnn23esFR3RlqYBWn4c45WGeLcsKzQiUpXJAyfcWkolvlYpV8FLo7JishK946oQwMFUCHXQ9AjGPKExw== + +pbkdf2@^3.0.3, pbkdf2@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.2.tgz#dd822aa0887580e52f1a039dc3eda108efae3075" + integrity sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA== + dependencies: + create-hash "^1.1.2" + create-hmac "^1.1.4" + ripemd160 "^2.0.1" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +picocolors@^1.0.0, picocolors@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.1.tgz#a8ad579b571952f0e5d25892de5445bcfe25aaa1" + integrity sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew== + +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.2, picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +pkg-dir@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-5.0.0.tgz#a02d6aebe6ba133a928f74aec20bafdfe6b8e760" + integrity sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA== + dependencies: + find-up "^5.0.0" + +plimit-lit@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/plimit-lit/-/plimit-lit-3.0.1.tgz#45a2aee1a7249aa9c2eafc67b6a27bc927e3aa39" + integrity sha512-EyTTdP5LMX6WbHihG8R9w6DS+c3pyMpeKooOFuGDCyuVBogQjYNtoYwKLRD6hM1+VkHzGcfIuyLoWi6l5JA3iA== + dependencies: + queue-lit "^3.0.0" + +possible-typed-array-names@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz#89bb63c6fada2c3e90adc4a647beeeb39cc7bf8f" + integrity sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q== + +postcss@^8.4.39: + version "8.4.39" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.39.tgz#aa3c94998b61d3a9c259efa51db4b392e1bde0e3" + integrity sha512-0vzE+lAiG7hZl1/9I8yzKLx3aR9Xbof3fBHKunvMfOCYAtMhrsnccJY2iTURb9EZd5+pLuiNV9/c/GZJOHsgIw== + dependencies: + nanoid "^3.3.7" + picocolors "^1.0.1" + source-map-js "^1.2.0" + +prettier@^3.3.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.3.1.tgz#e68935518dd90bb7ec4821ba970e68f8de16e1ac" + integrity sha512-7CAwy5dRsxs8PHXT3twixW9/OEll8MLE0VRPCJyl7CkS6VHGPSlsVaWTiASPTyGyYRyApxlaWTzwUxVNrhcwDg== + +process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + +process@^0.11.10: + version "0.11.10" + resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" + integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== + +proxy-from-env@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" + integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== + +public-encrypt@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0" + integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q== + dependencies: + bn.js "^4.1.0" + browserify-rsa "^4.0.0" + create-hash "^1.1.0" + parse-asn1 "^5.0.0" + randombytes "^2.0.1" + safe-buffer "^5.1.2" + +punycode@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + integrity sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ== + +qs@^6.11.2: + version "6.12.2" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.12.2.tgz#5443b587f3bf73ac68968de491e5b25bafe04478" + integrity sha512-x+NLUpx9SYrcwXtX7ob1gnkSems4i/mGZX5SlYxwIau6RrUSODO89TR/XDGGpn5RPWSYIB+aSfuSlV5+CmbTBg== + dependencies: + side-channel "^1.0.6" + +querystring-es3@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" + integrity sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA== + +queue-lit@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/queue-lit/-/queue-lit-3.0.0.tgz#5062f815e49c28759a2dc12124ab1723d563b932" + integrity sha512-iyVL2X5G58kICVGLW/nseYmdHxBoAp2Gav16H23NPtIllyEJ+UheHlYZqBjO+lJHRYoZRSrX7chH8tMrH9MB/A== + +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + +ramda@^0.29.1: + version "0.29.1" + resolved "https://registry.yarnpkg.com/ramda/-/ramda-0.29.1.tgz#408a6165b9555b7ba2fc62555804b6c5a2eca196" + integrity sha512-OfxIeWzd4xdUNxlWhgFazxsA/nl3mS4/jGZI5n00uWOoSSFRhC1b6gl6xvmzUamgmqELraWp0J/qqVlXYPDPyA== + +ramda@^0.30.0: + version "0.30.1" + resolved "https://registry.yarnpkg.com/ramda/-/ramda-0.30.1.tgz#7108ac95673062b060025052cd5143ae8fc605bf" + integrity sha512-tEF5I22zJnuclswcZMc8bDIrwRHRzf+NqVEmqg50ShAZMP7MWeR/RGDthfM/p+BlqvF2fXAzpn8i+SJcYD3alw== + +randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5: + version "2.1.0" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + +randomfill@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458" + integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw== + dependencies: + randombytes "^2.0.5" + safe-buffer "^5.1.0" + +react-refresh@^0.14.2: + version "0.14.2" + resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.14.2.tgz#3833da01ce32da470f1f936b9d477da5c7028bf9" + integrity sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA== + +readable-stream@^2.3.8: + version "2.3.8" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" + integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +readable-stream@^3.4.0, readable-stream@^3.5.0, readable-stream@^3.6.0: + version "3.6.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + +relateurl@^0.2.7: + version "0.2.7" + resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" + integrity sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog== + +resolve@^1.17.0: + version "1.22.8" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" + integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== + dependencies: + is-core-module "^2.13.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +retry@0.13.1: + version "0.13.1" + resolved "https://registry.yarnpkg.com/retry/-/retry-0.13.1.tgz#185b1587acf67919d63b357349e03537b2484658" + integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== + +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +ripemd160@^2.0.0, ripemd160@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" + integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + +rollup@^4.13.0: + version "4.18.0" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.18.0.tgz#497f60f0c5308e4602cf41136339fbf87d5f5dda" + integrity sha512-QmJz14PX3rzbJCN1SG4Xe/bAAX2a6NpCP8ab2vfu2GiUr8AQcr2nCV/oEO3yneFarB67zk8ShlIyWb2LGTb3Sg== + dependencies: + "@types/estree" "1.0.5" + optionalDependencies: + "@rollup/rollup-android-arm-eabi" "4.18.0" + "@rollup/rollup-android-arm64" "4.18.0" + "@rollup/rollup-darwin-arm64" "4.18.0" + "@rollup/rollup-darwin-x64" "4.18.0" + "@rollup/rollup-linux-arm-gnueabihf" "4.18.0" + "@rollup/rollup-linux-arm-musleabihf" "4.18.0" + "@rollup/rollup-linux-arm64-gnu" "4.18.0" + "@rollup/rollup-linux-arm64-musl" "4.18.0" + "@rollup/rollup-linux-powerpc64le-gnu" "4.18.0" + "@rollup/rollup-linux-riscv64-gnu" "4.18.0" + "@rollup/rollup-linux-s390x-gnu" "4.18.0" + "@rollup/rollup-linux-x64-gnu" "4.18.0" + "@rollup/rollup-linux-x64-musl" "4.18.0" + "@rollup/rollup-win32-arm64-msvc" "4.18.0" + "@rollup/rollup-win32-ia32-msvc" "4.18.0" + "@rollup/rollup-win32-x64-msvc" "4.18.0" + fsevents "~2.3.2" + +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@^5.2.1, safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +safe-stable-stringify@^2.3.1: + version "2.4.3" + resolved "https://registry.yarnpkg.com/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz#138c84b6f6edb3db5f8ef3ef7115b8f55ccbf886" + integrity sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g== + +safer-buffer@^2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +scrypt-js@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/scrypt-js/-/scrypt-js-3.0.1.tgz#d314a57c2aef69d1ad98a138a21fe9eafa9ee312" + integrity sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA== + +secp256k1@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-5.0.0.tgz#be6f0c8c7722e2481e9773336d351de8cddd12f7" + integrity sha512-TKWX8xvoGHrxVdqbYeZM9w+izTF4b9z3NhSaDkdn81btvuh+ivbIMGT/zQvDtTFWhRlThpoz6LEYTr7n8A5GcA== + dependencies: + elliptic "^6.5.4" + node-addon-api "^5.0.0" + node-gyp-build "^4.2.0" + +semver@^6.3.1: + version "6.3.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== + +set-function-length@^1.2.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" + integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== + dependencies: + define-data-property "^1.1.4" + es-errors "^1.3.0" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" + gopd "^1.0.1" + has-property-descriptors "^1.0.2" + +setimmediate@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== + +sha.js@^2.4.0, sha.js@^2.4.8: + version "2.4.11" + resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" + integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +side-channel@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.6.tgz#abd25fb7cd24baf45466406b1096b7831c9215f2" + integrity sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA== + dependencies: + call-bind "^1.0.7" + es-errors "^1.3.0" + get-intrinsic "^1.2.4" + object-inspect "^1.13.1" + +simple-swizzle@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" + integrity sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg== + dependencies: + is-arrayish "^0.3.1" + +source-map-js@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.0.tgz#16b809c162517b5b8c3e7dcd315a2a5c2612b2af" + integrity sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg== + +source-map-support@~0.5.20: + version "0.5.21" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" + integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map@^0.6.0, source-map@~0.6.0: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +stack-trace@0.0.x: + version "0.0.10" + resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0" + integrity sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg== + +stream-browserify@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-3.0.0.tgz#22b0a2850cdf6503e73085da1fc7b7d0c2122f2f" + integrity sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA== + dependencies: + inherits "~2.0.4" + readable-stream "^3.5.0" + +stream-http@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-3.2.0.tgz#1872dfcf24cb15752677e40e5c3f9cc1926028b5" + integrity sha512-Oq1bLqisTyK3TSCXpPbT4sdeYNdmyZJv1LxpEm2vu1ZhK89kSE5YXwZc3cWk0MagGaKriBh9mCFbVGtO+vY29A== + dependencies: + builtin-status-codes "^3.0.0" + inherits "^2.0.4" + readable-stream "^3.6.0" + xtend "^4.0.2" + +string_decoder@^1.0.0, string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + +terser@^5.10.0: + version "5.31.1" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.31.1.tgz#735de3c987dd671e95190e6b98cfe2f07f3cf0d4" + integrity sha512-37upzU1+viGvuFtBo9NPufCb9dwM0+l9hMxYyWfBA+fbwrPqNJAhbZ6W47bBFnZHKHTUBnMvi87434qq+qnxOg== + dependencies: + "@jridgewell/source-map" "^0.3.3" + acorn "^8.8.2" + commander "^2.20.0" + source-map-support "~0.5.20" + +text-hex@1.0.x: + version "1.0.0" + resolved "https://registry.yarnpkg.com/text-hex/-/text-hex-1.0.0.tgz#69dc9c1b17446ee79a92bf5b884bb4b9127506f5" + integrity sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg== + +timers-browserify@^2.0.4: + version "2.0.12" + resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.12.tgz#44a45c11fbf407f34f97bccd1577c652361b00ee" + integrity sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ== + dependencies: + setimmediate "^1.0.4" + +tmp-promise@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/tmp-promise/-/tmp-promise-3.0.3.tgz#60a1a1cc98c988674fcbfd23b6e3367bdeac4ce7" + integrity sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ== + dependencies: + tmp "^0.2.0" + +tmp@^0.2.0: + version "0.2.3" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.3.tgz#eb783cc22bc1e8bebd0671476d46ea4eb32a79ae" + integrity sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w== + +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== + +triple-beam@^1.3.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/triple-beam/-/triple-beam-1.4.1.tgz#6fde70271dc6e5d73ca0c3b24e2d92afb7441984" + integrity sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg== + +tslib@^2.0.3: + version "2.6.3" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.3.tgz#0438f810ad7a9edcde7a241c3d80db693c8cbfe0" + integrity sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ== + +tty-browserify@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.1.tgz#3f05251ee17904dfd0677546670db9651682b811" + integrity sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw== + +tweetnacl@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-1.0.3.tgz#ac0af71680458d8a6378d0d0d050ab1407d35596" + integrity sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw== + +typescript@^5.4.5: + version "5.4.5" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.4.5.tgz#42ccef2c571fdbd0f6718b1d1f5e6e5ef006f611" + integrity sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ== + +undici-types@~5.26.4: + version "5.26.5" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" + integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== + +undici@^5.19.1: + version "5.28.4" + resolved "https://registry.yarnpkg.com/undici/-/undici-5.28.4.tgz#6b280408edb6a1a604a9b20340f45b422e373068" + integrity sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g== + dependencies: + "@fastify/busboy" "^2.0.0" + +universalify@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.1.tgz#168efc2180964e6386d061e094df61afe239b18d" + integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw== + +update-browserslist-db@^1.0.16: + version "1.1.0" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz#7ca61c0d8650766090728046e416a8cde682859e" + integrity sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ== + dependencies: + escalade "^3.1.2" + picocolors "^1.0.1" + +url@^0.11.0: + version "0.11.3" + resolved "https://registry.yarnpkg.com/url/-/url-0.11.3.tgz#6f495f4b935de40ce4a0a52faee8954244f3d3ad" + integrity sha512-6hxOLGfZASQK/cijlZnZJTq8OXAkt/3YGfQX45vvMYXpZoo8NdWZcY73K108Jf759lS1Bv/8wXnHDTSz17dSRw== + dependencies: + punycode "^1.4.1" + qs "^6.11.2" + +util-deprecate@^1.0.1, util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== + +util@^0.12.4, util@^0.12.5: + version "0.12.5" + resolved "https://registry.yarnpkg.com/util/-/util-0.12.5.tgz#5f17a6059b73db61a875668781a1c2b136bd6fbc" + integrity sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA== + dependencies: + inherits "^2.0.3" + is-arguments "^1.0.4" + is-generator-function "^1.0.7" + is-typed-array "^1.1.3" + which-typed-array "^1.1.2" + +vite-plugin-copy@^0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/vite-plugin-copy/-/vite-plugin-copy-0.1.6.tgz#863ee81f7771b099122d24b954725d8e7e604a80" + integrity sha512-bqIaefZOE2Jx8P5wJuHKL5GzCERa/pcwdUQWaocyTNXgalN2xkxXH7LmqRJ34V2OlKF2F9E/zj0zITS7U6PpUg== + dependencies: + fast-glob "^3.2.7" + +vite-plugin-html@^3.2.2: + version "3.2.2" + resolved "https://registry.yarnpkg.com/vite-plugin-html/-/vite-plugin-html-3.2.2.tgz#661834fa09015d3fda48ba694dbaa809396f5f7a" + integrity sha512-vb9C9kcdzcIo/Oc3CLZVS03dL5pDlOFuhGlZYDCJ840BhWl/0nGeZWf3Qy7NlOayscY4Cm/QRgULCQkEZige5Q== + dependencies: + "@rollup/pluginutils" "^4.2.0" + colorette "^2.0.16" + connect-history-api-fallback "^1.6.0" + consola "^2.15.3" + dotenv "^16.0.0" + dotenv-expand "^8.0.2" + ejs "^3.1.6" + fast-glob "^3.2.11" + fs-extra "^10.0.1" + html-minifier-terser "^6.1.0" + node-html-parser "^5.3.3" + pathe "^0.2.0" + +vite-plugin-node-polyfills@^0.22.0: + version "0.22.0" + resolved "https://registry.yarnpkg.com/vite-plugin-node-polyfills/-/vite-plugin-node-polyfills-0.22.0.tgz#d0afcf82eb985fc02244620d7cec1ddd1c6e0864" + integrity sha512-F+G3LjiGbG8QpbH9bZ//GSBr9i1InSTkaulfUHFa9jkLqVGORFBoqc2A/Yu5Mmh1kNAbiAeKeK+6aaQUf3x0JA== + dependencies: + "@rollup/plugin-inject" "^5.0.5" + node-stdlib-browser "^1.2.0" + +vite-plugin-static-copy@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/vite-plugin-static-copy/-/vite-plugin-static-copy-1.0.6.tgz#ff457c16e8cfa564472aafd1698790ac89d05508" + integrity sha512-3uSvsMwDVFZRitqoWHj0t4137Kz7UynnJeq1EZlRW7e25h2068fyIZX4ORCCOAkfp1FklGxJNVJBkBOD+PZIew== + dependencies: + chokidar "^3.5.3" + fast-glob "^3.2.11" + fs-extra "^11.1.0" + picocolors "^1.0.0" + +vite@^5.2.10: + version "5.3.3" + resolved "https://registry.yarnpkg.com/vite/-/vite-5.3.3.tgz#5265b1f0a825b3b6564c2d07524777c83e3c04c2" + integrity sha512-NPQdeCU0Dv2z5fu+ULotpuq5yfCS1BzKUIPhNbP3YBfAMGJXbt2nS+sbTFu+qchaqWTD+H3JK++nRwr6XIcp6A== + dependencies: + esbuild "^0.21.3" + postcss "^8.4.39" + rollup "^4.13.0" + optionalDependencies: + fsevents "~2.3.3" + +vlq@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/vlq/-/vlq-2.0.4.tgz#6057b85729245b9829e3cc7755f95b228d4fe041" + integrity sha512-aodjPa2wPQFkra1G8CzJBTHXhgk3EVSwxSWXNPr1fgdFLUb8kvLV1iEb6rFgasIsjP82HWI6dsb5Io26DDnasA== + +vm-browserify@^1.0.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" + integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ== + +warp-arbundles@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/warp-arbundles/-/warp-arbundles-1.0.4.tgz#10c0cd662ab41b0dabad9159c7110f43425cc5cc" + integrity sha512-KeRac/EJ7VOK+v5+PSMh2SrzpCKOAFnJICLlqZWt6qPkDCzVwcrNE5wFxOlEk5U170ewMDAB3e86UHUblevXpw== + dependencies: + arweave "^1.13.7" + base64url "^3.0.1" + buffer "^6.0.3" + warp-isomorphic "^1.0.7" + +warp-isomorphic@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/warp-isomorphic/-/warp-isomorphic-1.0.7.tgz#abf1ee7bce44bec7c6b97547859e614876869aa7" + integrity sha512-fXHbUXwdYqPm9fRPz8mjv5ndPco09aMQuTe4kXfymzOq8V6F3DLsg9cIafxvjms9/mc6eijzkLBJ63yjEENEjA== + dependencies: + buffer "^6.0.3" + undici "^5.19.1" + +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== + +whatwg-url@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" + integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== + dependencies: + tr46 "~0.0.3" + webidl-conversions "^3.0.0" + +which-typed-array@^1.1.14, which-typed-array@^1.1.2: + version "1.1.15" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.15.tgz#264859e9b11a649b388bfaaf4f767df1f779b38d" + integrity sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA== + dependencies: + available-typed-arrays "^1.0.7" + call-bind "^1.0.7" + for-each "^0.3.3" + gopd "^1.0.1" + has-tostringtag "^1.0.2" + +winston-transport@^4.7.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/winston-transport/-/winston-transport-4.7.0.tgz#e302e6889e6ccb7f383b926df6936a5b781bd1f0" + integrity sha512-ajBj65K5I7denzer2IYW6+2bNIVqLGDHqDw3Ow8Ohh+vdW+rv4MZ6eiDvHoKhfJFZ2auyN8byXieDDJ96ViONg== + dependencies: + logform "^2.3.2" + readable-stream "^3.6.0" + triple-beam "^1.3.0" + +winston@^3.13.0: + version "3.13.0" + resolved "https://registry.yarnpkg.com/winston/-/winston-3.13.0.tgz#e76c0d722f78e04838158c61adc1287201de7ce3" + integrity sha512-rwidmA1w3SE4j0E5MuIufFhyJPBDG7Nu71RkZor1p2+qHvJSZ9GYDA81AyleQcZbh/+V6HjeBdfnTZJm9rSeQQ== + dependencies: + "@colors/colors" "^1.6.0" + "@dabh/diagnostics" "^2.0.2" + async "^3.2.3" + is-stream "^2.0.0" + logform "^2.4.0" + one-time "^1.0.0" + readable-stream "^3.4.0" + safe-stable-stringify "^2.3.1" + stack-trace "0.0.x" + triple-beam "^1.3.0" + winston-transport "^4.7.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + +ws@7.4.6: + version "7.4.6" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c" + integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A== + +xtend@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" + integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== + +yallist@^3.0.2: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== + +zod@^3.22.4, zod@^3.23.5: + version "3.23.8" + resolved "https://registry.yarnpkg.com/zod/-/zod-3.23.8.tgz#e37b957b5d52079769fb8097099b592f0ef4067d" + integrity sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==